Skip to content

Releases: strawberry0321/dsh-gal

v2.3.2

Choose a tag to compare

@strawberry0321 strawberry0321 released this 30 Sep 13:51

2.3.2

修掉「官方桌面端(新版 DSH)里挂件完全不显示」—— 根因不在宿主,而在注入通道。

根因

插件原来只用 ctx.webServer.tapIndex 注入客户端脚本。官方桌面端不渲染 HTTP index:
dsh-app://app/ 返回的是打包好的静态 dsh-web-frontend/dist/index.html,只往里面塞一个
__DSH_BOOT_READY__ 占位,再用宿主经 IPC 下发的 boot payload 兑现它。
所以 tapIndex 的产物只出现在 HTTP 渲染的 index 里(也就是只对 web 形态有效),
桌面端页面从未加载过 /dsh-gal/client.js:挂件 DOM 从未创建,重启多少次都一样,
而宿主那半边的路由(/dsh-gal/client.js、/api/*、/asset/*)全部 200。

改了什么

  • 两条注入通道都挂:
    • ctx.on('webserver/index-inject', …) 推一行
      { kind: 'script-src', placement: 'body', src: '/dsh-gal/client.js' } —— 官方桌面端读的就是这张表
      (由 collectIndexInjections() 在宿主启动时采集一次,随 boot payload 冻结下发);
    • tapIndex 保留,web / HTTP 形态照旧。
      幂等:表里已有这一行就不再推,也不会动别人的行。
  • 启动失败不再静默:root 起始是 visibility:hidden,而只有 renderAll() 最后一行才显形,
    原来 bootstrap 之后的任何一步抛错都会留下一个永久隐形、控制台也没有提示的挂件。
    现在整个启动过程都在 try/catch 里,失败时写明原因(控制台 + 挂件框内)并显形。
  • 失败后把 document 交还:window.__dshGalWidget 原来是 true,同文档首败后无法重试;
    现在带 failed 标记,并把上一次留下的半成品根节点清掉再挂。

验证

verify.mjs 174 项(新增:结构化行幂等 / 不误伤他人行 / 非数组不抛、
boot 全量兜底、失败可见、守卫交还)。另外对着已装的官方构建核了一遍链路:
前端 bundle 里确实有 "script-src" 的行应用器(含 __DSH_BOOT_READY__ / dshDesktopBoot)、
宿主 dsh-host-webserver 里 collectIndexInjections() 逐字符就是 emit("webserver/index-inject", table)、
renderIndex() 是先渲染结构化行再跑 tap(所以 tap 只在没有 <script src> 标签时才补,不会加载两次)、
文档没有 CSP(blob: 图片与音频不受限)、行种类是固定六种(未知种类宿主会抛错)。

安装

dsh plugin --profile desktop add C:\path\to\dsh-gal.tgz

装完完全退出 DSH Desktop 再启动(托盘退出,不是刷新页面):注入表在应用启动时冻结,
刷新只会拿到同一份旧表,挂件不会出现。用旧的 tgz 重装会把 2.3.2 的修复覆盖掉。

角色素材包

shigure-pack.zip(時雨,动画立绘)/ mashiro-pack.zip(精简版,推荐)
/ mashiro-pack-full.zip(完整版:原台词过于伤感,不建议使用)/ noir-pack.zip / karuha-pack.zip
—— 与上一版逐字节相同,只是跟着最新版 Release 走。

v2.3.1

Choose a tag to compare

@strawberry0321 strawberry0321 released this 27 Sep 10:22

2.3.1

立绘现在可以和语音逐句配对:文件名主干相同就配对(sigu_drama_0001.webp ↔ sigu_drama_0001.ogg),
点击立绘时播哪句就演哪句,动作直接是逐帧渲染的动画 WebP(GIF 也行)。
没有同名素材的资源包(包括所有旧包)行为完全不变,仍然随机抽一张。

改了什么(约 50 行,lib/packs.js / lib/index.js / lib/client.js)

  • /api/next 改成先抽语音、再取立绘:命中同名素材就用它,否则退回原来的 pickSprite()
  • 新增 WebP 头解析(VP8X / VP8 / VP8L):动画立绘的宽高比从文件头读出来,
    否则盒子会被拉成正方形(这是本轮最隐蔽的一个坑)
  • 同一块屏幕只挂一个挂件:页面里嵌套了同样被注入的文档时,不再叠出"第二具身体"
  • 资源包格式没有变化:不需要新字段、新目录,也不用给 script.csv 加列
    (见 docs/customize.md 的「语音 ↔ 动作绑定」)

新增角色包

shigure-pack.zip —— 時雨(Nekopara Vol.0):89 段动作 + 90 条语音 + 中日台词表。
立绘由 FreeMote.NET 无头渲染 E-mote 模型逐帧得到,口型按语音包络驱动。
派生自商业游戏,仅供自用。

验证

verify.mjs 170 项(新增一组 5 项:WebP 头解析、路由端同名配对、跨包配对、
只配一半的包、旧包零影响);新增 scripts/binding-selftest.mjs,在真实资源包上复核
(时雨 89/90 条配对且图都能读、旧包全部走随机抽)。
另外拿渲染任务表 + PIL 复验了一遍成品包:89/89 条台词在「台词表 / 立绘 / 语音」三方同名、
90 张立绘画布 360×450、抽样 270 帧无空帧、重复帧去重与打包脚本声明一致。

安装

下载下面的 dsh-gal.tgz(不带版本号的那个,永远指向最新版):

dsh plugin --profile desktop add C:\path\to\dsh-gal.tgz

装完重启 DSH Desktop,然后刷新页面。已经在用旧版的直接装这个覆盖,配置和素材包都保留。

角色素材包

shigure-pack.zip(時雨,动画立绘)/ mashiro-pack.zip(精简版,推荐)
/ mashiro-pack-full.zip(完整版:原台词过于伤感,不建议使用)/ noir-pack.zip / karuha-pack.zip
—— 除時雨外都与上一版逐字节相同,只是跟着最新版 Release 走。

v2.2.2

Choose a tag to compare

@strawberry0321 strawberry0321 released this 12 Sep 07:09

2.2.2

修一个"新建对话页点立绘,语音响、立绘不动;在设定里换立绘包也不变,聊一句才变"的问题。

原因:和 2.2.1 是同一类 —— 页面繁忙时浏览器会饿死优先级最低的图片请求。
语音上次已经改走 fetch(高优先级,实测 1–3ms),但立绘当时还是
new Image() 预载 + onload 才换 src:请求卡在那里,onload 一直不来,
于是"换图"这件事被推迟到下一次消息、连接松开之后才落地。设定面板换包也一样 ——
配置存下来了,只是画面在等一个迟迟不到的图片加载。

改了什么

  • 立绘不再等图片加载:先按原 URL 直连渲染兜底,再用 fetch 拿到的 blob: 覆盖;
    布局也改成立刻重排(盒子几何本来就来自 /api/next 的数据,不该等解码)
  • 对话框底图、设定图标一并走同一条字节缓存路径(同一个病根)
  • 每个图位用 artToken 认领,迟到的 blob 不会覆盖更新的图
  • 取不到字节时退回原来的直连方式,不会白屏、不会静音

验证

新增 scripts/sprite-starve-probe.mjs:在无头浏览器里把所有非 blob: 的图片源
一律拦下不落地
,再用真实指针事件点立绘、真实下拉框换立绘包,从 canvas 读回画面颜色。

boot         src=blob:…  画面=a1(包内默认)  尺寸/裁切=441.188px / -44.1187px
click        src=blob:…  画面=a2(换了)      尺寸/裁切=441.188px / -44.1187px
pack-switch  src=blob:…  画面=b1(新包)      尺寸/裁切=352.95px / 0px
直接图片请求被饿死:5 次

同一个探针跑修复前的源码:三行全是"画面=空",连尺寸都不动 —— 正是报告里的症状。
verify.mjs 165 项(新增一组,覆盖这条链路)。

安装

下载下面的 dsh-gal.tgz(不带版本号的那个,永远指向最新版):

dsh plugin --profile desktop add C:\path\to\dsh-gal.tgz

该指令是适配DSH Desktop的,网页端安装见主页(依旧建议直接交给dsh安装,没那么多繁琐步骤)
装完重启 DSH Desktop,然后刷新页面。已经在用旧版的直接装这个覆盖,配置和素材包都保留。

角色素材包

mashiro-pack.zip(精简版,推荐)/ mashiro-pack-full.zip(完整版:原台词过于伤感,不建议使用)
noir-pack.zip
karuha-pack.zip
角色图片见首页底部角色介绍(持续更新ing)
如果遇到台词翻译不对或内容错误可以自行打开音效包的script.csv文件,直接修改即可,想对立绘和音效进行添加,直接拖拽进sprites和voices文件夹,删除则直接删除即可(台词表可删可不删,不影响)

v2.2.1

Choose a tag to compare

@strawberry0321 strawberry0321 released this 12 Sep 05:40

2.2.1

修一个"有台词、没声音"的问题,顺带修掉它的另一半:十秒后声音自己冒出来。

改了什么

  • 语音字节改走 fetch,用 blob 播放,彻底绕开被堵的媒体队列
  • 抽到台词就开始预取字节,新页面第一次点击就有现成数据;设定音效在启动时预热
  • 5 秒还加载不出来就放弃这一句(按无声处理),不会再出现十秒后突然自己响
  • 不再静默吞异常:播放被拒 / 解码失败 / 字节读取失败都会在控制台说明原因
  • 页面隐藏时暂停轮询,少抢连接

自检 verify.mjs 161 项(新增 5 项覆盖这条链路)。

安装

下载下面的 dsh-gal.tgz(不带版本号的那个,永远指向最新版):

dsh plugin --profile desktop add C:\path\to\dsh-gal.tgz

装完重启 DSH Desktop,然后刷新页面。

角色素材包

mashiro-pack.zip(精简版,推荐)/ mashiro-pack-full.zip(完整版:原台词过于伤感,不建议使用)
/ noir-pack.zip / karuha-pack.zip —— 内容与上一版逐字节相同,只是跟着最新版 Release 走。

v2.2.0

Choose a tag to compare

@strawberry0321 strawberry0321 released this 12 Sep 04:35

2.2.0

语音抽取默认改成「洗牌池」。

原来的做法是每次独立随机抽,公平但会聚集:noir 里 185 条语音共用同一句「……。」,
于是这句话占到全部点击的 13.6%——40 次点击里平均听到 5.51 次;neri 池子小,
40 次点击里有一半的会话某句会出现 3 次以上。

现在的做法:把整个语音包洗成一轮,逐条不放回地播,一轮放完自动重洗,
新一轮不会拿上一轮结尾那句开头。实测 相邻重复 0 次,400 次点击里任何一句最多出现 1 次;
池子小(比如只放了几条)时自动退化成"每轮全过一遍",40 次点击里每条出现次数之差 ≤ 1。

  • 设定面板「3 语音语言」下新增 语音顺序:洗牌池(默认)/ 纯随机,点一下切换,立刻生效。
  • 新增可选的 weights.json(放在语音包目录里):让某几句多放、少放或不播。
    键可以是语音文件名(mas0033)或台词原文(……。,完全匹配);值 3 三倍、
    0.25 四分之一、0 不播。只写要调的那几条,其余默认 1;比率精确(实测 4.998:1 / 4.00:1)。
    文件缺失或语法错误按 1 处理,不会报错、也不会让某句消失。
  • 没有做任何自动去重或标点归一化——……。 和 …… 依然各算各的(按你的要求)。
  • 立绘抽取没有改,仍是原来的规则。
  • 自检 verify.mjs 156 项(新增 10 项覆盖洗牌池、权重与小池子退化)。

安装

下载下面的 dsh-gal.tgz(不带版本号的那个,永远指向最新版):

dsh plugin --profile desktop add C:\path\to\dsh-gal.tgz

装完重启 DSH Desktop。

角色素材包

  • mashiro-pack.zip —— Mashiro 精简版(推荐):37 张立绘 + 135 条语音,台词已逐条筛过,
    去掉了求死、告别、哭泣一类过重的段落。装出来的包 id 是 Mashiro。
  • mashiro-pack-full.zip —— Mashiro 完整版:原台词过于伤感,不建议使用,只作留存。
    296 条语音原样保留,包 id 是 Mashiro-full,和精简版可以同时装,在设定面板里分开选。
  • noir-pack.zip —— noir音效
  • karuha-pack.zip —— Karuha(立绘已左右镜像)

解压到 %USERPROFILE%\.dsh\dsh-gal\packs\,刷新页面即可在设定面板里选用。

v2.1.0

Choose a tag to compare

@strawberry0321 strawberry0321 released this 12 Sep 03:57

2.1.0

新角色:Mashiro(立绘已整套左右镜像,默认立绘 large_mashiro_00face.png)
—— mashiro-pack.zip:37 张立绘 + 296 条语音 + 台词对照表。

素材包的文件夹现在中英日都认:包里放 立绘 / 语音(或 立ち絵 / ボイス)就行,
不用为了插件改名;台词表在包目录或语音目录里都能找到。英文的 sprites / voices 仍然优先,
已有素材包不受影响。

新增镜像工具:scripts/mirror-sprites.mjs —— 无损左右镜像一整套立绘
(解码 → 逐行翻转 → 重新编码,写完逐像素回验;镜像两次即还原),
只处理 8 位非隔行 PNG,遇到调色板 / 16 位 / 隔行图直接报错而不是悄悄改坏。

自检 verify.mjs 146 项(新增中英日目录名、同存时英文优先)。安装与升级方式不变。

安装

下载下面的 dsh-gal.tgz(不带版本号的那个,永远指向最新版):

dsh plugin --profile desktop add C:\path\to\dsh-gal.tgz

装完重启 DSH Desktop。

角色素材包

  • mashiro-pack.zip —— Mashiro(立绘已左右镜像)
  • noir-pack.zip —— noir音效
  • karuha-pack.zip —— Karuha(立绘已左右镜像)

解压到 %USERPROFILE%\.dsh\dsh-gal\packs\,刷新页面即可在设定面板里选用。

v2.0.1

Choose a tag to compare

@strawberry0321 strawberry0321 released this 12 Sep 03:39

2.0.1

修一个「素材换了、画面没换」的问题。

现象:把镜像后的素材包放进 %USERPROFILE%\.dsh\dsh-gal\packs\、删掉旧目录、重启 DSH,
立绘还是镜像前那张。

原因:磁盘上的字节是对的,插件也没有换目录——立绘 / 语音路由按 URL 缓存 7 天,
而替换包里的文件文件名没变,URL 也就没变,于是浏览器一直拿缓存里那张旧图。
重启 DSH 不会动浏览器缓存,普通刷新也不会。

修法:立绘与语音的 URL 带上文件版本号(修改时间 + 字节数)——
换了内容就是换了地址,必定重新下载;内容没变的素材照旧走缓存。
不带版本号的请求一律 no-store,不会再被钉在浏览器里。

自带素材、设定面板、配置格式都没变。自检 verify.mjs 144 项(新增 5 项覆盖这条)。

已经装过 2.0.0 的话

升级到 2.0.1 并重启 DSH Desktop;页面刷新一次(Ctrl+F5 更稳)即可看到新素材。
临时救急也可以直接 Ctrl+F5——旧图只是浏览器缓存。

安装

下载下面的 dsh-gal.tgz(不带版本号的那个,永远指向最新版):

dsh plugin --profile desktop add C:\path\to\dsh-gal.tgz

装完重启 DSH Desktop。

角色素材包

  • noir-pack.zip —— noir音效
  • karuha-pack.zip —— Karuha(立绘已左右镜像)

解压到 %USERPROFILE%\.dsh\dsh-gal\packs\,刷新页面即可在设定面板里选用。