dsh-wisp 1.26.0 → 1.28.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.
- package/README.md +84 -0
- package/assets/canon/eat.webp +0 -0
- package/assets/classic/eat.webp +0 -0
- package/assets/deepsea/eat.webp +0 -0
- package/assets/night/eat.webp +0 -0
- package/assets/pajama/eat.webp +0 -0
- package/build.mjs +1 -1
- package/lib/client.js +363 -53
- package/lib/client.template.js +358 -53
- package/package.json +1 -1
- package/tools/assets.mjs +1 -1
- package/tools/smoke.mjs +80 -6
- package/verify-wisp.mjs +294 -15
package/README.md
CHANGED
|
@@ -448,6 +448,90 @@ node tools/audit-log.mjs --confirm <manifest> # 生成后:并入代理登
|
|
|
448
448
|
|
|
449
449
|
## 变更
|
|
450
450
|
|
|
451
|
+
### 1.28.0
|
|
452
|
+
|
|
453
|
+
- **菜单不再是 19 个同级条目。** 原来 6 个动作 + 4 个开关 + 4 个角落 + 5 套皮肤全平铺,
|
|
454
|
+
只有三行**不可点**的小标题当分区 —— 那不是结构,是排版。
|
|
455
|
+
|
|
456
|
+
现在顶层 **7 项**,其余收进**可折叠分组**(点一下在原地展开/收起,带
|
|
457
|
+
`aria-expanded`):
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
关于她…
|
|
461
|
+
动作一览…
|
|
462
|
+
▸ 外观 5 套皮肤 + 放大 / 缩小
|
|
463
|
+
▸ 行为 说句话 / 睡一会儿 / 自己溜达 / 跟随状态 / 跑完撒花 / 饿了会说话
|
|
464
|
+
▸ 位置 四个角落
|
|
465
|
+
版本与更新
|
|
466
|
+
先躲起来
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
新手势打开菜单时分组一律收起(**展开动作不能被自己的重开清掉** —— 这条写错过一次:
|
|
470
|
+
清状态原来放在 `closeMenu()` 里,而"在原地重开"正是先 close 再 open,于是刚展开的分组
|
|
471
|
+
立刻被自己收回去)。
|
|
472
|
+
|
|
473
|
+
- **两个真弹窗**(不再是塞进菜单的长条目):
|
|
474
|
+
|
|
475
|
+
- **「关于她」** —— 她是谁、为什么长这样(社区规范:深蓝渐变长直发 / 大圆环呆毛 /
|
|
476
|
+
鲸鳍耳 / 女仆装)、白米饭的来由、这一版做了什么、版本号,以及"非官方同人、与官方无关"
|
|
477
|
+
和社区项目的出处。**介绍写进插件里**,别人装完不用翻仓库;
|
|
478
|
+
- **「动作一览」** —— 当前皮肤八个动作的缩略图 + 中文名,**点一下就让她当场做给你看**
|
|
479
|
+
(先关弹窗再摆姿势,否则弹窗正好盖着她)。预览用一个到期时间挡住稳态轮询
|
|
480
|
+
(`previewUntil`),所以刚摆的表情不会在同一轮里被算回去。
|
|
481
|
+
|
|
482
|
+
三种关法:**×** / **Esc** / **点背景**。关掉即从 DOM 移除,不常驻、不参与轮询。
|
|
483
|
+
|
|
484
|
+
- **修掉两个真 bug**:
|
|
485
|
+
|
|
486
|
+
- 文档级 Esc 监听原本每次开弹窗都挂一个、而且**摘不掉**(清理函数是个空壳)——
|
|
487
|
+
改成全程只有一个,随实例销毁;
|
|
488
|
+
- 点预览格或点背景关掉弹窗后**焦点掉进 `<body>`** ✗(下一按 Enter 打不开菜单了)。
|
|
489
|
+
现在关弹窗一律把焦点交还给她 —— 这条是**真浏览器冒烟**抓到的,假 DOM 看不出来。
|
|
490
|
+
|
|
491
|
+
- 预检 400 → **410 项**,冒烟 46 → **53 项**(真浏览器里新增:分组能展开、展开后菜单仍在
|
|
492
|
+
视口内、关于弹窗真的在屏幕上、动作一览八张图**真的解码完成 8/8**、点格子会关弹窗并摆姿势)。
|
|
493
|
+
|
|
494
|
+
- 这一轮踩的坑(都记在这里,免得下次重演):
|
|
495
|
+
1. 简化 DOM **不会汇总子节点的 `textContent`** —— 分组名、弹窗段落、页脚都因此读成空串,
|
|
496
|
+
改成"文本写在带类名的元素上";
|
|
497
|
+
2. 替身的 `find()` / `all()` **会把已移除的节点也返回**,判断"弹窗关没关"必须显式认
|
|
498
|
+
`removed`;
|
|
499
|
+
3. 替身的 `all('wisp-menu-item')` 是**类名精确匹配**,多挂一个类就选不中了 ——
|
|
500
|
+
分组标记因此改放 `dataset`;
|
|
501
|
+
4. 测试里用了文件后半部分才定义的 helper(`ctxEvent`)→ TDZ,把整段套件截断过一次;
|
|
502
|
+
5. 冒烟里新插入的检查放在键盘段**之前**会扰动它依赖的焦点状态 → 挪到键盘段之后。
|
|
503
|
+
|
|
504
|
+
### 1.27.0
|
|
505
|
+
|
|
506
|
+
### 1.27.0
|
|
507
|
+
|
|
508
|
+
- **第八个情绪 `eat`:干饭。** 五套皮肤各一张,双手捧着一碗白米饭,眯眼笑。
|
|
509
|
+
|
|
510
|
+
这是社区设定里最像"她"的一条 —— **白米饭是算力的唯一硬通货**。台词照这个底色写了 12 句
|
|
511
|
+
(白米饭才是硬通货 / 先干一碗再想复杂的事 / 才不是特意帮你,只是吃饱了顺手活动一下手指 /
|
|
512
|
+
算力不够了得补点碳水 / 这碗不算加餐,算基础设施 / 吃饱了才有力气摸鱼 …)。
|
|
513
|
+
|
|
514
|
+
- **行为:她饿了会说。** 连续活动满 `hungerMs`(默认 **45 分钟**)就捧碗出来说一句,
|
|
515
|
+
5.2 秒后自己回去。判据和久坐提醒共用同一套"还在动"的判定,但含义相反 ——
|
|
516
|
+
久坐是提醒**你**起来,干饭是提醒**她自己**补碳。
|
|
517
|
+
|
|
518
|
+
- 计时基准取 `max(lastMealAt, activeSince)`:**离开很久回来之后不会一进门就喊饿**
|
|
519
|
+
(那一段已经结束了,该从零开始算);
|
|
520
|
+
- 不连着说:一顿之后要再过一整个间隔;
|
|
521
|
+
- 两种关法:`hungerMs: 0`,或菜单里新增的「**饿了会说话**」开关(`hungry: false`);
|
|
522
|
+
- `doctor().hunger` 报告 `{ enabled, everyMs, lastMealAt }` ——
|
|
523
|
+
不用猜"她为什么突然捧碗"。
|
|
524
|
+
|
|
525
|
+
- 情绪数 7 → **8**,素材 35 → **40 张**;菜单 18 → **19 项**(固定 13 → 14)。
|
|
526
|
+
预检 383 → **400 项**。
|
|
527
|
+
|
|
528
|
+
吃过的坑记一笔:新加的测试踩了两次同样的 TDZ(用了文件后半部分才定义的
|
|
529
|
+
`ctxEvent` / `rightClickOnHer`),以及把 harness 的 `el.dispatch()` 写成了浏览器的
|
|
530
|
+
`el.dispatchEvent()`;还有一条是"上一步结束时她还在吃"被误判成"关不掉" ——
|
|
531
|
+
和久坐那节一样,收尾要先推进一段让瞬时状态结束。
|
|
532
|
+
|
|
533
|
+
### 1.26.0
|
|
534
|
+
|
|
451
535
|
### 1.26.0
|
|
452
536
|
|
|
453
537
|
- **检查更新改为同时读两个源,取版本号更高的那个**(npm 注册表 + GitHub 的 package.json)。
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/build.mjs
CHANGED
|
@@ -45,7 +45,7 @@ const assetsDir = resolve(here, flagValue('--from', 'assets'))
|
|
|
45
45
|
const templatePath = join(here, 'lib', 'client.template.js')
|
|
46
46
|
const outPath = join(here, 'lib', 'client.js')
|
|
47
47
|
|
|
48
|
-
const MOODS = ['idle', 'happy', 'sleepy', 'work', 'attn', 'poked', 'proud']
|
|
48
|
+
const MOODS = ['idle', 'happy', 'sleepy', 'work', 'attn', 'poked', 'proud', 'eat']
|
|
49
49
|
|
|
50
50
|
/* 皮肤 = assets/ 下的一个子目录,里面是这套皮肤的 <mood>[_tier].webp。
|
|
51
51
|
如果没有子目录含精灵图,就把 assets/ 本身当作一个名为 default 的皮肤 ——
|