@linxin666/dsh-pet 0.3.17 → 0.3.19
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/README.i18n.yaml +2 -2
- package/README.md +16 -1
- package/README.zh.md +16 -1
- package/assets/blue-throated-bee-eater/pet.json +204 -0
- package/assets/blue-throated-bee-eater/previews/failed.gif +0 -0
- package/assets/blue-throated-bee-eater/previews/idle.gif +0 -0
- package/assets/blue-throated-bee-eater/previews/jumping.gif +0 -0
- package/assets/blue-throated-bee-eater/previews/review.gif +0 -0
- package/assets/blue-throated-bee-eater/previews/running-left.gif +0 -0
- package/assets/blue-throated-bee-eater/previews/running-right.gif +0 -0
- package/assets/blue-throated-bee-eater/previews/running.gif +0 -0
- package/assets/blue-throated-bee-eater/previews/waiting.gif +0 -0
- package/assets/blue-throated-bee-eater/previews/waving.gif +0 -0
- package/assets/blue-throated-bee-eater/spritesheet.webp +0 -0
- package/assets/blue-throated-bee-eater/voice.json +13 -0
- package/contracts/pet-manifest-v2.schema.json +84 -0
- package/lib/client.js +176 -27
- package/lib/client.js.map +1 -1
- package/lib/index.js +170 -6
- package/lib/types/client/gameplay-hud.d.ts +2 -0
- package/lib/types/client/gameplay-hud.d.ts.map +1 -1
- package/lib/types/client/gameplay-hud.js +65 -12
- package/lib/types/client/index.d.ts +0 -6
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +25 -2
- package/lib/types/client/locales.d.ts +7 -3
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/locales.js +7 -3
- package/lib/types/client/renderers/Frames2dVisualMount.d.ts.map +1 -1
- package/lib/types/client/renderers/Frames2dVisualMount.js +5 -1
- package/lib/types/client/renderers/frames2d.d.ts +25 -0
- package/lib/types/client/renderers/frames2d.d.ts.map +1 -1
- package/lib/types/client/renderers/frames2d.js +84 -7
- package/lib/types/manifest-v2.d.ts +45 -0
- package/lib/types/manifest-v2.d.ts.map +1 -1
- package/lib/types/manifest-v2.js +139 -1
- package/lib/types/persist.d.ts +1 -1
- package/lib/types/persist.d.ts.map +1 -1
- package/lib/types/persist.js +1 -1
- package/lib/types/registry.d.ts +22 -0
- package/lib/types/registry.d.ts.map +1 -1
- package/lib/types/registry.js +45 -1
- package/package.json +2 -1
- package/src/client/gameplay-hud.test.tsx +64 -0
- package/src/client/gameplay-hud.tsx +109 -21
- package/src/client/index.ts +26 -2
- package/src/client/locales.ts +7 -3
- package/src/client/pet.module.css +31 -1
- package/src/client/renderers/Frames2dVisualMount.tsx +5 -1
- package/src/client/renderers/frames2d.test.ts +43 -0
- package/src/client/renderers/frames2d.ts +100 -7
- package/src/manifest-v2.ts +167 -1
- package/src/persist.ts +1 -1
- package/src/registry.test.ts +19 -5
- package/src/registry.ts +66 -1
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
3
|
# after editing either side, bring the other along and re-record with:
|
|
4
4
|
# node scripts/verify-docs.mjs --write <dir>
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: f19d0d949df444336ce190e997225d1c055f44f0
|
|
6
|
+
README.zh.md: 6cfd8504d95081b9399f1dc132c6854228515879
|
package/README.md
CHANGED
|
@@ -164,7 +164,9 @@ Model licensing: the official Live2D sample models (Hiyori, Haru, and friends) a
|
|
|
164
164
|
|
|
165
165
|
Frames2d pets ship directory-style frame sequences instead of an atlas: `thumb/<track>/<frame>.webp`, with per-frame durations from an optional `_<ms>` filename tail or the track's `frameMs` list (default 200 ms, bounds 16–5000). The manifest maps the activity phases onto tracks; a `drag` track follows the chrome's drag gesture, and non-looping tracks settle into their `fallback` (default the idle track), so intro/loop splits (sleep-intro → sleep) are plain manifest data.
|
|
166
166
|
|
|
167
|
-
A frames2d
|
|
167
|
+
A frames2d block may also declare **skins**: an optional array of `{ id, label, idleTrack }` entries. Selecting a skin swaps the pet's base idle target (the idle phase, unmapped phases and every fallback back to idle) onto `idleTrack`, so the resting look changes while gameplay tracks (shy/work/sleep…) stay attached to the default assets. Each skin may further declare `clickActions` — probability-rolled tap reactions exclusive to that skin (`{ track, probability, phrases? }`): while the skin is active, a tap rolls each action in declared order and plays the winner's track once on a hit, falling back to the plain click boost on a miss (never the default touch zones).
|
|
168
|
+
|
|
169
|
+
A frames2d pet may declare a `gameplay` block — an opt-in mini-game layer generalized from the miku desktop pet: decaying stat bars (`stats` with per-minute decay, a working variant and an idle variant), the unified treat (小鱼干) currency — gameplay income and shop spending ride the same panel treat stock (capped at 20): `work` success, `passiveIncome` and lottery prizes grant treats, and shop items are priced and paid in treats, with no separate wallet page — a weighted `idleDirector` (rolls an act every `intervalMs`, `maxMiss` forces one after consecutive idle rolls), `touch` zones inside a `hitBox` (roll branches with effects, a track hold and phrase bubbles), a `work` loop (host-adjudicated ticks with success/fail result tracks), a `sleep` loop (lazy stat restore), `passiveIncome`, and a `shop` whose items carry effects or tiered lotteries. All rolls and bookkeeping are host-authoritative (`POST /api/pet/gameplay/*`); state persists per pet in `pet.json` and settles lazily on the treats-economy discipline. The browser half renders the menu card (stat bars, work/sleep toggles, skin picker, shop grid) automatically for any pet that declares the block. The sprite display size range is 32–1024 px.
|
|
168
170
|
|
|
169
171
|
The **Miku pet** (contributed by stushansusu under MIT; Hatsune Miku character rights belong to Crypton Future Media under the Piapro Character License — see THIRD_PARTY_NOTICES.md) is the reference frames2d gameplay pet. It ships through the **Workshop** only (not the npm bundle): install it from the Workshop's pet list and it lands in `$DSH_HOME/pets/miku/`.
|
|
170
172
|
|
|
@@ -204,6 +206,8 @@ Host-side sibling plugins can push one structured announcement through the `pet`
|
|
|
204
206
|
|
|
205
207
|
| Registry id | Selector label | Source |
|
|
206
208
|
|---|---|---|
|
|
209
|
+
| `blue-throated-bee-eater` | 蓝喉蜂虎 | Companion art contributed by the repository contributor under Apache-2.0 (12 AI-illustrated pose references in the palette of the blue-throated-bee-eater skin; composed by docs/archive/blue-throated-bee-eater-pet/gen-pet.py with per-track standalone poses: perched, flight, front hover, waving, landing, droop, tilt, review; ship 小蜜蜂 as the treat name) |
|
|
210
|
+
| `jyn` | 女仆鲸鱼娘 | Frames2d gameplay pet (contributed by stushansusu under MIT): maid-whale desktop pet with work/sleep/touch gameplay and three selectable skins (暗夜鎏金 / 蓝海霓裳 / 冰晶公主), each with a probability-rolled click action; 暗夜鎏金 also swaps its own rest loop into the sleep gameplay | (docs(dsh-pet): list three jyn skins in the registry rows and re-record pairing)
|
|
207
211
|
| `ouo-neko` | OUO Neko | Pink-sakura cat-eared companion contributed by `Pessimist0906` under MIT |
|
|
208
212
|
| `whale-girl` | 鲸鱼娘(原版) | The repository's original whale-girl atlas |
|
|
209
213
|
| `whale-girl-refined` | 鲸鱼娘(精致版) | An AI-assisted derivative with repaired and refined details, based on the whale-girl design direction |
|
|
@@ -224,6 +228,16 @@ Sprite pets use 8-column atlases with 192×208 cells generated by the [hatch-pet
|
|
|
224
228
|
|---|---|---|---|
|
|
225
229
|
|  |  |  |   |
|
|
226
230
|
|
|
231
|
+
The built-in **Blue-throated Bee-eater** pet carries the same preview set:
|
|
232
|
+
|
|
233
|
+
| idle | waiting | running | jumping |
|
|
234
|
+
|---|---|---|---|
|
|
235
|
+
|  |  |  |  |
|
|
236
|
+
|
|
237
|
+
| waving | review | failed | move left/right |
|
|
238
|
+
|---|---|---|---|
|
|
239
|
+
|  |  |  |   |
|
|
240
|
+
|
|
227
241
|
The community **Starry Doll** pet (Workshop-only, contributed by Theater-ahyeon under CC-BY-NC-SA-4.0) ships the same preview set:
|
|
228
242
|
|
|
229
243
|
| idle | waiting | running | jumping |
|
|
@@ -259,6 +273,7 @@ dsh-pet/
|
|
|
259
273
|
|-- assets/whale/ # built-in original whale-girl (manifest + atlas + previews)
|
|
260
274
|
|-- assets/whale-refined/ # built-in refined whale-girl registry variant
|
|
261
275
|
|-- assets/ouo-neko/ # built-in OUO Neko v2 pet (11-row atlas + previews)
|
|
276
|
+
|-- assets/blue-throated-bee-eater/ # built-in Blue-throated Bee-eater pet (9-row atlas + previews)
|
|
262
277
|
`-- cordis.patch.yml # bundle patch: inserts the pet plugin row
|
|
263
278
|
```
|
|
264
279
|
|
package/README.zh.md
CHANGED
|
@@ -164,7 +164,9 @@ Live2D 清单把七个活动相位映射到模型的动作组:
|
|
|
164
164
|
|
|
165
165
|
frames2d 宠物不用图集,直接交付目录式帧序列:`thumb/<track>/<frame>.webp`,帧时长取文件名 `_<ms>` 尾缀或轨道的 `frameMs` 列表(默认 200ms,范围 16–5000)。清单把七个活动相位映射到轨道;`drag` 轨道跟随外壳的拖拽手势;非循环轨道播完进入 `fallback`(默认 idle 轨道),入睡/睡熟这类"引子 + 循环"拆分(sleep-intro → sleep)就是纯清单数据。
|
|
166
166
|
|
|
167
|
-
frames2d
|
|
167
|
+
frames2d 块还可声明 **skins**(皮肤):可选的 `{ id, label, idleTrack }` 数组。选中某皮肤后,宠物"回待机"的目标(idle 相位、未映射相位、以及一切回 idle 的 fallback)都切到该皮肤的 `idleTrack`——休息外观随皮肤切换,而玩法轨道(shy/work/sleep…)仍挂在默认资产上。每个皮肤还可声明 `clickActions`——仅对该皮肤生效的概率掷骰点击反应(`{ track, probability, phrases? }`):皮肤激活时点击按声明顺序依次掷骰,命中则播一次命中轨道,未命中回落普通点击加成(绝不落入默认触摸分区)。
|
|
168
|
+
|
|
169
|
+
frames2d 宠物可声明 `gameplay` 块——从 miku 桌宠泛化而来的可选玩法层:属性条(`stats`,按分钟衰减,另有打工中与空闲变体)、统一的小鱼干货币(玩法收入与商店支出都走宠物面板那条小鱼干库存,上限 20 条:`work` 成功、`passiveIncome` 与彩票奖品发放小鱼干,商品也以小鱼干标价扣款,无独立钱包页)、加权 `idleDirector`(每 `intervalMs` 掷骰演出小动作,连续落空 `maxMiss` 次必演)、`hitBox` 内的 `touch` 触摸分区(分支掷骰:效果 + 轨道保持 + 台词气泡)、`work` 打工循环(宿主裁决 tick,成功/失败结果轨道)、`sleep` 睡觉循环(惰性恢复)、`passiveIncome` 被动收入,以及 `shop` 商店(商品可带效果或分档抽奖)。所有掷骰与记账由宿主权威裁决(`POST /api/pet/gameplay/*`),状态按宠物持久化在 `pet.json`,沿用小鱼干经济的惰性结算纪律。浏览器半侧为声明了该块的宠物自动渲染玩法菜单卡(属性条、打工/睡觉开关、皮肤选择、商店网格)。精灵显示尺寸范围为 32–1024 px。
|
|
168
170
|
|
|
169
171
|
**Miku 宠物**(stushansusu 涂山苏苏以 MIT 贡献;初音未来角色权利归 Crypton Future Media,受 Piapro 角色许可约束——见 THIRD_PARTY_NOTICES.md)是 frames2d 玩法的参考实现。它只经**创意工坊**分发(不打进 npm 包):从工坊宠物列表安装后落在 `$DSH_HOME/pets/miku/`。
|
|
170
172
|
|
|
@@ -204,6 +206,8 @@ frames2d 宠物可声明 `gameplay` 块——从 miku 桌宠泛化而来的可
|
|
|
204
206
|
|
|
205
207
|
| 注册表 id | 选择器名称 | 来源 |
|
|
206
208
|
|---|---|---|
|
|
209
|
+
| `blue-throated-bee-eater` | 蓝喉蜂虎 | 贡献者以 Apache-2.0 贡献的伙伴插画(12 张同角色 AI 立绘素材,配色取蓝喉蜂虎皮肤同源;由 docs/archive/blue-throated-bee-eater-pet/gen-pet.py 组装,各轨道独立姿态:栖枝/飞行/正面悬停/挥翅/降落/垂头/歪头/昂首;饲料以「小蜜蜂」命名) |
|
|
210
|
+
| `jyn` | 女仆鲸鱼娘 | frames2d 玩法宠物(stushansusu 以 MIT 贡献):带打工/睡觉/触摸玩法与三款可选皮肤(暗夜鎏金 / 蓝海霓裳 / 冰晶公主)的女仆鲸鱼同桌宠,每款皮肤各带一个概率掷骰点击动作;暗夜鎏金另将专属休息循环换入睡觉玩法 | (docs(dsh-pet): list three jyn skins in the registry rows and re-record pairing)
|
|
207
211
|
| `ouo-neko` | OUO Neko | `Pessimist0906` 以 MIT 许可证贡献的粉色樱花猫耳伙伴 |
|
|
208
212
|
| `whale-girl` | 鲸鱼娘(原版) | 仓库原有的鲸鱼娘图集 |
|
|
209
213
|
| `whale-girl-refined` | 鲸鱼娘(精致版) | 以鲸鱼娘设计方向为基础,经 AI 辅助二次创作、修复和细节精修的衍生版本 |
|
|
@@ -224,6 +228,16 @@ Miku 宠物有意不随包内置:它是 frames2d 玩法宠物,经创意工
|
|
|
224
228
|
|---|---|---|---|
|
|
225
229
|
|  |  |  |   |
|
|
226
230
|
|
|
231
|
+
内置的**蓝喉蜂虎**宠物随附同一套状态预览:
|
|
232
|
+
|
|
233
|
+
| idle | waiting | running | jumping |
|
|
234
|
+
|---|---|---|---|
|
|
235
|
+
|  |  |  |  |
|
|
236
|
+
|
|
237
|
+
| waving | review | failed | 左右移动 |
|
|
238
|
+
|---|---|---|---|
|
|
239
|
+
|  |  |  |   |
|
|
240
|
+
|
|
227
241
|
社区贡献的**星夜人偶**宠物(仅经创意工坊分发,Theater-ahyeon 以 CC-BY-NC-SA-4.0 贡献)随附同一套状态预览:
|
|
228
242
|
|
|
229
243
|
| idle | waiting | running | jumping |
|
|
@@ -259,6 +273,7 @@ dsh-pet/
|
|
|
259
273
|
|-- assets/whale/ # 内置原版鲸鱼娘(manifest + 图集 + 预览)
|
|
260
274
|
|-- assets/whale-refined/ # 内置精致版鲸鱼娘注册表变体
|
|
261
275
|
|-- assets/ouo-neko/ # 内置 OUO Neko v2 宠物(11 行图集 + 预览)
|
|
276
|
+
|-- assets/blue-throated-bee-eater/ # 内置蓝喉蜂虎宠物(9 行图集 + 预览)
|
|
262
277
|
`-- cordis.patch.yml # bundle 补丁:插入宠物插件行
|
|
263
278
|
```
|
|
264
279
|
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://schemas.linxin666.org/dsh-pet/pet-manifest-v2.schema.json",
|
|
3
|
+
"petManifestVersion": 2,
|
|
4
|
+
"id": "blue-throated-bee-eater",
|
|
5
|
+
"displayName": "蓝喉蜂虎",
|
|
6
|
+
"author": "dsh-web",
|
|
7
|
+
"version": "1.0.0",
|
|
8
|
+
"description": "A chibi flat-illustration Blue-throated Bee-eater (Merops philippinus): azure throat, teal-green plumage and a chestnut crown, matched to the blue-throated-bee-eater skin palette. A perch-loving flyer that waves its wing, hops to catch bees and tilts its head to review your code.",
|
|
9
|
+
"license": "Apache-2.0",
|
|
10
|
+
"renderer": "sprite2d",
|
|
11
|
+
"sprite2d": {
|
|
12
|
+
"spritesheetPath": "spritesheet.webp",
|
|
13
|
+
"cell": {
|
|
14
|
+
"width": 192,
|
|
15
|
+
"height": 208
|
|
16
|
+
},
|
|
17
|
+
"columns": 8,
|
|
18
|
+
"atlasRows": 9,
|
|
19
|
+
"frames": [
|
|
20
|
+
6,
|
|
21
|
+
8,
|
|
22
|
+
8,
|
|
23
|
+
4,
|
|
24
|
+
5,
|
|
25
|
+
8,
|
|
26
|
+
6,
|
|
27
|
+
6,
|
|
28
|
+
6
|
|
29
|
+
],
|
|
30
|
+
"tracks": {
|
|
31
|
+
"idle": {
|
|
32
|
+
"durations": [
|
|
33
|
+
500,
|
|
34
|
+
500,
|
|
35
|
+
600,
|
|
36
|
+
500,
|
|
37
|
+
500,
|
|
38
|
+
600
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
"running-right": {
|
|
42
|
+
"durations": [
|
|
43
|
+
300,
|
|
44
|
+
300,
|
|
45
|
+
300,
|
|
46
|
+
300,
|
|
47
|
+
300,
|
|
48
|
+
300,
|
|
49
|
+
300,
|
|
50
|
+
400
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"running-left": {
|
|
54
|
+
"durations": [
|
|
55
|
+
300,
|
|
56
|
+
300,
|
|
57
|
+
300,
|
|
58
|
+
300,
|
|
59
|
+
300,
|
|
60
|
+
300,
|
|
61
|
+
300,
|
|
62
|
+
400
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
"waving": {
|
|
66
|
+
"durations": [
|
|
67
|
+
450,
|
|
68
|
+
450,
|
|
69
|
+
450,
|
|
70
|
+
450
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
"jumping": {
|
|
74
|
+
"durations": [
|
|
75
|
+
400,
|
|
76
|
+
400,
|
|
77
|
+
400,
|
|
78
|
+
450,
|
|
79
|
+
450
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
"failed": {
|
|
83
|
+
"durations": [
|
|
84
|
+
550,
|
|
85
|
+
550,
|
|
86
|
+
550,
|
|
87
|
+
600,
|
|
88
|
+
650,
|
|
89
|
+
700,
|
|
90
|
+
550,
|
|
91
|
+
550
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
"waiting": {
|
|
95
|
+
"durations": [
|
|
96
|
+
550,
|
|
97
|
+
550,
|
|
98
|
+
600,
|
|
99
|
+
550,
|
|
100
|
+
550,
|
|
101
|
+
600
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
"running": {
|
|
105
|
+
"durations": [
|
|
106
|
+
330,
|
|
107
|
+
330,
|
|
108
|
+
330,
|
|
109
|
+
330,
|
|
110
|
+
330,
|
|
111
|
+
400
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
"review": {
|
|
115
|
+
"durations": [
|
|
116
|
+
650,
|
|
117
|
+
650,
|
|
118
|
+
650,
|
|
119
|
+
650,
|
|
120
|
+
650,
|
|
121
|
+
650
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"sequences": {
|
|
127
|
+
"idle": [
|
|
128
|
+
"idle",
|
|
129
|
+
"waving",
|
|
130
|
+
"idle",
|
|
131
|
+
"waiting",
|
|
132
|
+
"idle",
|
|
133
|
+
"idle"
|
|
134
|
+
],
|
|
135
|
+
"waiting": [
|
|
136
|
+
"waiting",
|
|
137
|
+
"idle",
|
|
138
|
+
"waving",
|
|
139
|
+
"waiting",
|
|
140
|
+
"idle",
|
|
141
|
+
"waiting"
|
|
142
|
+
],
|
|
143
|
+
"thinking": [
|
|
144
|
+
"waiting",
|
|
145
|
+
"running",
|
|
146
|
+
"idle",
|
|
147
|
+
"running",
|
|
148
|
+
"waiting",
|
|
149
|
+
"running"
|
|
150
|
+
],
|
|
151
|
+
"tool": [
|
|
152
|
+
"running-right",
|
|
153
|
+
"running",
|
|
154
|
+
"running-left",
|
|
155
|
+
"running",
|
|
156
|
+
"running-right"
|
|
157
|
+
],
|
|
158
|
+
"review": [
|
|
159
|
+
"review",
|
|
160
|
+
"waiting",
|
|
161
|
+
"review",
|
|
162
|
+
"running",
|
|
163
|
+
"review",
|
|
164
|
+
"idle"
|
|
165
|
+
],
|
|
166
|
+
"done": [
|
|
167
|
+
"jumping",
|
|
168
|
+
"waving",
|
|
169
|
+
"idle",
|
|
170
|
+
"waving",
|
|
171
|
+
"idle",
|
|
172
|
+
"waving"
|
|
173
|
+
],
|
|
174
|
+
"failed": [
|
|
175
|
+
"failed",
|
|
176
|
+
"waiting",
|
|
177
|
+
"failed",
|
|
178
|
+
"idle",
|
|
179
|
+
"waiting",
|
|
180
|
+
"failed"
|
|
181
|
+
]
|
|
182
|
+
},
|
|
183
|
+
"remarks": {
|
|
184
|
+
"pet": [
|
|
185
|
+
"挠挠头顶的栗红羽冠……舒服。",
|
|
186
|
+
"喉咙的湛蓝是向晴空借的颜色。",
|
|
187
|
+
"(警惕地看了看你手里有没有蜜蜂。)"
|
|
188
|
+
],
|
|
189
|
+
"petCooldown": [
|
|
190
|
+
"刚刚才挠过啦。",
|
|
191
|
+
"羽冠要留给我自己理。"
|
|
192
|
+
],
|
|
193
|
+
"feed": [
|
|
194
|
+
"嘿嘿,小蜜蜂!谢啦!",
|
|
195
|
+
"最爱的小蜜蜂来啦~"
|
|
196
|
+
],
|
|
197
|
+
"feedCooldown": [
|
|
198
|
+
"吃饱啦,翅膀都收起来了。"
|
|
199
|
+
],
|
|
200
|
+
"noTreats": [
|
|
201
|
+
"小蜜蜂没了……那我自己去抓两只吧。"
|
|
202
|
+
]
|
|
203
|
+
}
|
|
204
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -319,6 +319,90 @@
|
|
|
319
319
|
"done": { "type": "string", "minLength": 1 },
|
|
320
320
|
"failed": { "type": "string", "minLength": 1 }
|
|
321
321
|
}
|
|
322
|
+
},
|
|
323
|
+
"skins": {
|
|
324
|
+
"type": "array",
|
|
325
|
+
"minItems": 1,
|
|
326
|
+
"maxItems": 16,
|
|
327
|
+
"description": "Optional selectable skins: each swaps the base idle target (idle phase, unmapped phases and every fallback back to idle) to its own looping idle track. Gameplay tracks (shy/work/sleep...) are not replaced.",
|
|
328
|
+
"items": {
|
|
329
|
+
"type": "object",
|
|
330
|
+
"additionalProperties": false,
|
|
331
|
+
"required": [
|
|
332
|
+
"id",
|
|
333
|
+
"label",
|
|
334
|
+
"idleTrack"
|
|
335
|
+
],
|
|
336
|
+
"properties": {
|
|
337
|
+
"id": {
|
|
338
|
+
"type": "string",
|
|
339
|
+
"minLength": 1,
|
|
340
|
+
"maxLength": 24,
|
|
341
|
+
"pattern": "^[a-z0-9][a-z0-9-]*$",
|
|
342
|
+
"description": "Lowercase kebab skin id."
|
|
343
|
+
},
|
|
344
|
+
"label": {
|
|
345
|
+
"type": "string",
|
|
346
|
+
"minLength": 1,
|
|
347
|
+
"maxLength": 40,
|
|
348
|
+
"description": "User-facing skin name."
|
|
349
|
+
},
|
|
350
|
+
"idleTrack": {
|
|
351
|
+
"type": "string",
|
|
352
|
+
"minLength": 1,
|
|
353
|
+
"description": "A declared looping track that becomes the base idle while selected."
|
|
354
|
+
},
|
|
355
|
+
"clickActions": {
|
|
356
|
+
"type": "array",
|
|
357
|
+
"minItems": 1,
|
|
358
|
+
"maxItems": 8,
|
|
359
|
+
"description": "Optional click-triggered actions exclusive to this skin: while selected, a tap rolls each action by probability (in order) and plays its track once if hit; misses fall through to the regular touch zones.",
|
|
360
|
+
"items": {
|
|
361
|
+
"type": "object",
|
|
362
|
+
"additionalProperties": false,
|
|
363
|
+
"required": [
|
|
364
|
+
"track",
|
|
365
|
+
"probability"
|
|
366
|
+
],
|
|
367
|
+
"properties": {
|
|
368
|
+
"track": {
|
|
369
|
+
"type": "string",
|
|
370
|
+
"minLength": 1,
|
|
371
|
+
"description": "A declared track played once on hit (usually non-looping)."
|
|
372
|
+
},
|
|
373
|
+
"probability": {
|
|
374
|
+
"type": "number",
|
|
375
|
+
"exclusiveMinimum": 0,
|
|
376
|
+
"maximum": 1,
|
|
377
|
+
"description": "Hit probability for this action."
|
|
378
|
+
},
|
|
379
|
+
"phrases": {
|
|
380
|
+
"type": "array",
|
|
381
|
+
"minItems": 1,
|
|
382
|
+
"maxItems": 5,
|
|
383
|
+
"items": {
|
|
384
|
+
"type": "string",
|
|
385
|
+
"minLength": 1,
|
|
386
|
+
"maxLength": 120
|
|
387
|
+
},
|
|
388
|
+
"description": "Optional lines spoken when the action fires."
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
},
|
|
393
|
+
"gameplayTracks": {
|
|
394
|
+
"type": "object",
|
|
395
|
+
"minProperties": 1,
|
|
396
|
+
"maxProperties": 8,
|
|
397
|
+
"description": "Optional gameplay-state overrides: gameplay state name (e.g. 'sleep' or 'work') -> a declared frames2d track swapped in while this skin is selected (e.g. a skin variant of the sleep loop).",
|
|
398
|
+
"additionalProperties": {
|
|
399
|
+
"type": "string",
|
|
400
|
+
"minLength": 1,
|
|
401
|
+
"description": "A declared frames2d track."
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
322
406
|
}
|
|
323
407
|
}
|
|
324
408
|
},
|