Skip to content

Releases: XiaMo233M/Stronghold-Protocol-Forge

v0.19.1-0.3.1

Choose a tag to compare

@XiaMo233M XiaMo233M released this 19 Oct 14:12

0.19.1-0.3.1 — 2026-10-19

整包跟到上游 0.3.1。 UPSTREAM_VERSION 由 '0.3.0' 抬到 '0.3.1';APP_VERSION 不动
(0.19.1)—— 这一版只跟随上游,按 shared/constants.js 那条口径:只跟随上游的版本保持 APP_VERSION、
移动 UPSTREAM_VERSION。发行 tag 是 v0.19.1-0.3.1。PLUGIN_API 抬到 { current: 2, min: 1 }
(旧包仍按 min 装得上);PROTOCOL_VERSION(2)与 MOD_API_VERSION(1)一个都没动 ——
推送帧的形状没变,golden 一个场景都没移动。

上游 0.3.0 → 0.3.1 是 215 个提交 / 537 个文件。下面按「玩家能看见什么」分组。

皮肤(docs/SKINS.md)

  • 渲染层补上整块皮肤呈现:skinOf / applyInfo / setMe / setSkins / refreshSkins,以及
    boss 搭档的只读准备视图(syncReadOnlyPrepUnits)—— 皮肤是视图模型的一部分,换了就丢掉重建,
    正在跑的战斗不重启播放
  • 设置里多了一行**「显示其他玩家的皮肤」:关掉时别的座位**的棋子画成干员自己的模型;
    没有主人的单位(装置、敌人)本来也没皮肤可丢。刻意的不对称:你画什么是你的选择,别人画什么是他们的
  • 四个同步引擎里的第四个:room.skins { skins }(ui/loadoutSync.js 的 installSkinsSync)。
    与另外三个不同,它任何相位都收 —— 外观是纯客户端的事

音效与素材

  • 攻击 / 受击音效改成按池引用(上游 #680):单位条目只记 pools: { attack: … },
    音高 / 延迟 / 音量只存一份在 audio.sfx.pools(941 个池、484 个单位)
  • 官方表的大小上限与形状校验接上(tools/assets/cache.mjs 的 maxBytes / validate):
    坏表不再被当成「已经下过」永远复用;原子写换成唯一临时名 + finally 清理
  • data/local-assets.json 与 public/assets/local 换成上游 0.3.1 完整包那一批(1697 条)

测试房间

  • welcome 带 testMode;聊天、席位上限、host 迁移、观战、限流、审计在测试房间里都有独立口径
  • 观战座的 g.test 先交给 applyTestCommand 再拒 —— 它要写审计并占限流格子,
    在入口直接拒会让它既不进日志也不占格子

战斗与装备

  • 流形战斗:attack 循环换成 combat clip,技能循环也换成它(我先前把这段当成死代码删过,已恢复)
  • 装备拆卸(unequip: "allow"):两条开关来源(房间规则优先,其次模块层 behaviour),
    「不是已装备」与「找不到」分开报;临时整备区仍是 5 格窗口(两处都满就 HAND_FULL)
  • 装备位策略统一到一个对局入口(matchSlotPolicy):plus 档下变形同构体不占格、
    每名干员最多一件、顶替只挑真占格的那一件
  • 详情面板的 EQUIP n/2 与盟约链按这一页的形态档位算;「卸下」按钮只看调用方给没给 onUnquip

插件

  • PLUGIN_API 到 2;工作室多两条控制台路由(/studio/api/console/options 与 /console/build),
    表面表与 docs/PLUGIN-API.md 跟着重生成
  • runner.js 转出 loadBrowserSim(工作室控制台自己拿浏览器侧的战斗模拟器)
  • 工坊:一个目录如果自己声明了 plugin.json,它是插件示例、不是坏包(静默跳过)
  • 补回 items.js 的 unequipAllowed(shared/modSurface.js 里那一条是工坊包声明依赖的公开面)

其它

  • tools/assets/plan.mjs 取上游 0.3.1,并把我们 fork 的 voiceLang / voiceLangs 合回去 ——
    上游把它换成了 VOICE_OPTIONAL_TREES(voiceEn / voiceKr / voiceNative),两套并存:
    我们这套按「干员各选一套」用,上游那套按「整棵树换一套」用。默认配音仍是 jp(0.9.0 业主决定)
  • 头像解析链的精确键提前到后缀之前(跟上游 chessPortraitUrl / chessAvatarUrl)
  • 调配同步:休整期提交带显式默认值(「把某一格改回默认」必须把默认值发出去,
    只从 entries 里删掉那一格服务端会保留原来那份)
  • 派生模组 trait 时补 modeOnly / rangeExpand(GitHub #700 的中文读数)
  • Match 里那次多余的、无参数的 GameData 构造删掉(它把带 mod 层选项的那一次整个覆盖了)

验证

node --test(串行)  11178 项 · 0 失败(18 项按环境跳过:真实浏览器 / 真实网络)
npm run ci           setup / test / smoke / lint / imports / typecheck 全部 ok
npm run golden       全部场景 match(0 移动)
i18n                 2416 msgids × 4 语言 · 100 %

已知限制

  • 联网的 fetch-assets 需要 node --use-env-proxy + HTTPS_PROXY(Node 的 fetch 不读系统代理)
  • 本地素材提取(tools/local-extract)需要 Python + UnityPy 与本机客户端;没有客户端时
    从完整包复制 public/assets/local 与 data/local-assets.json 即可
  • 8 个 test/mod*.test.mjs 改用 .test.js:仓库已声明 type: module,而 npm test 的 glob 只收 .test.js
    —— 它们此前从未被执行过

发行包:src.zip 源码整包 · win-x64.zip Windows 便携包(含四语配音)· voices-cn-en-kr.zip 单独配音包。

安装见 docs/DEPLOY.md。

v0.19.1-0.3.0(上游 0.3.0)

Choose a tag to compare

@XiaMo233M XiaMo233M released this 17 Oct 11:05

卫戍协议 · Forge —— v0.19.1(上游 0.3.0)

本仓库 0.19.1 + 上游游戏本体 0.3.0。APP_VERSION = '0.19.1'、UPSTREAM_VERSION = '0.3.0';
PROTOCOL_VERSION(2)与 MOD_API_VERSION(1)一个都没动。

本次四个包都对应 commit b19da9c8(tag v0.19.1-0.3.0,git status --porcelain 为空)。

⚠️ 这一版的修复都不在 0.19.0 的包里。 包与 tag 一一对应:
0.19.0 ↔ 37e16197(v0.19.0-0.3.0)· 0.19.1 ↔ b19da9c8(v0.19.1-0.3.0)。
手上是 0.19.0 的包,需要重新下载这一版。


这个项目是什么

以 mod 核心 + 创意工坊为主体的卫戍协议,附带上游的特色功能。 我们是自己的 fork:
有自己的 mod 层(pack.json 契约、装载器、校验器)和自己的创意工坊服务(编辑器、包索引、投稿到入库);
上游游戏本体是承载这些能力的底座。


这一版做了什么

一句话:把上游 0.3.0 合入时只落了一半的东西补齐,并把一批测试与文档对齐到代码的真实行为。
没有任何玩法改动;PROTOCOL_VERSION(2)与 MOD_API_VERSION(1)均未动;golden 基线一条没动。

一、补完「只落了一半」的三处设置

这三处在 0.3.0 合入时留在了 *.rej 里,症状各不相同,第三处最隐蔽:

  • 设置「秘术师能量」(mysticEnergy):渲染侧当时已经齐了(默认关、live 生效、HUD 读得到),
    而设置侧四样全缺 —— 存储键、归一化、对话框里的开关、四语文案。
    结果就是设置页里根本看不到这一格,功能等于不存在。本版补齐四样,逐条与既有的「弹药数量」同形。
  • 设置「外观插件」区块(CosmeticSection):整个区块没搬进来。
    ⚠️ 这不是依赖缺失 —— 该函数用到的 14 个符号本仓 14 个都在(3 个已 import、11 个只是没 import);
    那 11 个名字全在 public/js/content.js / ui/toasts.js / ui/pluginTag.js 里。
    本版把区块照上游逐字补入,并按上游次序挂在「快捷键」与「诊断」之间。
  • ⭐ 房间音乐不切换(lastBgmKey 的两处赋值):refreshBgm() 在、main.js 的订阅在、注释也在,
    只有 lastBgmKey 的初始化和赋值缺了 ⇒ 那个 if (this.lastBgmKey != null) 恒假
    ⇒ 房间外观套到达之后,音乐从不换曲。
    ⚠️ 这个最隐蔽:函数、订阅、注释全都在,只有赋值缺了 ⇒ 很容易被当成「设计如此」而不是 bug。
    本版补上那两行。

二、设置「官方特效」控件这才真的能改

officialFx 的读写链路上缺了 3 行赋值 ⇒ 设置里那个控件动了不生效。本版补落(ae2bf42e)。

三、四语种

node tools/i18n.mjs check --all --strict → 四语各 2101 msgids used, 2101 translated (100 %),
0 missing / 0 errors。

口径说明:这里的 2101 是 tools/i18n.mjs check --all --strict 输出的
2101 msgids used, 2101 translated (100 %) —— 统计的是代码里用 t() 实际引用的条目,
不是语言包文件的键总数(键总数里还含尚未被引用的条目,它们不影响覆盖率判据)。
⚠️ 本次新增的 6 个条目里,「本服务器安装了 {n} 个插件」代码里没有 t() 调用
(只有 4 处注释提到它,上游亦然)⇒ 不计入 这 2101 条。

四、测试与文档对齐(不改运行行为)

  • 相机:issue602 用 prep 带(取景矩形的上界 = GEO.HAND_ROW = 7,普通带是 9)而不是普通带;bigmap-client 记录
    D29 之后 prep 与 pen 共用同一条带(与上游 0.3.0 同形),并加了反向断言防回退。
  • runner.js 的 SIM_DATA_FILES 改成从 simLoader.js re-export(两份内容逐字节相同,
    且没有任何外部代码从 runner.js 导入它)。
  • raid-body-window:解码 bodyKeys() 改用引擎的 COLS(GEO.CANVAS_COLS = 33)。
    原先硬编码 21(那是测试自己造的 21 列场景宽度)⇒ 同一个 15 格矩形被解成三段互不连通的格。
  • studio/trial:不再断言 Node 的 child.killed —— Windows 上 taskkill /T /F 已经杀干净,
    那个内部标志恒为 false;改成验「进程真的没了(process.kill(pid, 0) → ESRCH)」+「额度回到 0」。
  • plugins/ui:只对真正的意图键断言,并反向断言「C2S 里确实还有非对局消息」。
  • packServerSurface:把「包可见白名单」(4 个 SP_*)与「引擎私有」(SP_CSP / SP_MATCH_HOST /
    SP_PLUGIN_SCRIPTS)拆成两份归类,并断言引擎读到的等于两者之并、且互不相交。
  • .gitignore:补 5 条锚定条目,让「worktree 用符号链接共享这些目录」的形态也被忽略。
  • formNames.js:用生成器重跑(补上 enemy_9011_acrefr)。
  • 文档:promptCitations 抓到的 30 处行号漂移 + 4 处成员引用不符,全部对齐到真正含该成员的那一行。

兼容性(实测,不是保证)

闭集与 0.19.0 一致,一个都没变:

闭集 数量
PACK_FIELDS(pack.json 字段) 38
CLIENT_PANEL_SLOTS(client.panels 槽位) 10
SERVER_MODULE_USES(服务端模块用途) 7

PROTOCOL_VERSION = 2、MOD_API_VERSION = 1,均未变 ⇒ 已有的包与插件不需要改。


⚠️ 升级须知:内容集身份 cs 会变

server/plugins/identity.js 的 computeVanillaContent 把 app 放进
contentHashOf({ app, sim, data, … }),而 shared/plugins/identity.js 的 contentHashInput
明确含 app: String(app)。

⇒ 换版本号 = 换内容集身份 cs,与 CACHE_NAME 同一思路(换版即换缓存名),是设计而非缺陷。
换版后首次会全部重新计算一次;这不影响玩法。

实测(同一个确定性合成输入):

APP_VERSION=0.19.0 → cs = aefa6e90b1c2411ff0dd098d1b6a863ad1ddf18174cf90cb28ee90bff0452b60
APP_VERSION=0.19.1 → cs = d8050e8b5cc2cf0dab838f3f0d2a851614ec7ae88ddcfbc87d58d8cd50a75dc7

⚠️ 诚实局限:这一点只核到 identity 那条链
(server/plugins/identity.js:121 → shared/plugins/identity.js:96),
未做全仓验证「抬版本是否影响持久化数据」。


测试与基线(实测)

  • 全量 node --test:10169 tests · 10146 pass · 6 fail · 17 skipped。
    ⚠️ 这 6 条里 5 条是下面的「打包白名单」已知项,1 条是已知 flaky —— 没有一条是本版引入且稳定复现的。
  • golden --jobs 4:六族全 match(roster 49 · bonds 46 · fields 22 · matches 21 · standins 10 · diy 140),
    ok · 47733 ms · EXIT=0。未使用 golden:update —— 战斗基线一条没动。

已知问题(不粉饰)

  • 打包白名单不含作者资源(5 条测试红:plugin-package ×3 · plugins/registry:296 ·
    update-package:402):plugins/README.md、docs/PLUGIN-*.md、tools/plugin.mjs 等在
    isPlayerFile 白名单之外。改的是发行包内容,需单独拍板,本版未动。
  • ⚠️ 一条时序型 flaky:test/ui/plugins-content.test.js:372
    「a content set still loading when the b.start comes (a reconnect): the authority once it is there」。
    失败形态 TypeError: Cannot read properties of undefined (reading 'authoritative');
    实测单独重跑 3 次 1 红 2 绿,0.19.0 之前的 run6 就已记录 ⇒ 非本版引入,待单独修。
    本版没有动它(单独改它属「为变绿而动测试」)—— 记档,不是忽略。
  • 插件语音素材坏了 ⇒ 该槽没有声音:voice 的 fallback 语义是
    「所选配音语言缺这句 ⇒ 用默认配音同名的文件」(上游 0.3.0 的 voiceLine 逐字同义),
    不覆盖「插件素材坏了」;bgm / sfx 走 mediaUrl 回落、voice 不走,上游亦然。
    要不要补「插件坏了回落到安装版」作为一个独立特性,待定
    (副作用:回落会掩盖插件作者的错误 ⇒ 需「能播 + 仍有 onFailed 报告」)。
  • 82 个 *.rej 里 30 个对应补丁仍未落(实测:已落 12 · 部分落 37 · 未落 30 · 无可判行 3;
    基准 18389f88。本版之后当前工作区是 29 ⇒ 随每笔补落递减)。
    且已发布的 0.19.0 包里带着 62 个:那是 scripts/make-windows-bundle.mjs:78 的
    SKIP_TRACKED = ['test/'] —— 打包复制全部 git 跟踪文件、只略过 test/,
    所以 82 个里 test/ 之外的 62 个跟着进了包。
    ⚠️ 而 src.zip 里是全部 82 个(src 带的是全部 git 跟踪文件,不只 62 个)。
    ⚠️ 不是 npm 白名单(isPlayerFile 只判 38 个)—— 两个口径不同,别混。
    ⚠️ 这些 .rej 不是垃圾,是「还没实现的部分」的索引 —— 所以本版有意保留它们、没有清掉。

致谢与来源

  • 上游游戏本体:sganggs/Stronghold-Protocol —— 卫戍协议:盟约
  • 本仓库:非商业的粉丝重制,遵循上游的许可与声明(见 NOTICE.md / THIRD-PARTY-NOTICES.md)

v0.19.0-0.3.0

Choose a tag to compare

@XiaMo233M XiaMo233M released this 16 Oct 15:46

卫戍协议 · Forge —— v0.19.0(上游 0.3.0)

本仓库 0.19.0 + 上游游戏本体 0.3.0。APP_VERSION = '0.19.0'、UPSTREAM_VERSION = '0.3.0';
PROTOCOL_VERSION(2)与 MOD_API_VERSION(1)一个都没动。

本次四个包都对应 commit 37e16197(tag v0.19.0-0.3.0,git status --porcelain 为空)。


这个项目是什么

以 mod 核心 + 创意工坊为主体的卫戍协议,附带上游的特色功能。

这不是「上游的汉化版」或「上游的整合包」—— 我们是自己的 fork:有自己的 mod 层
(pack.json 契约、装载器、校验器)和自己的创意工坊服务(编辑器、包索引、投稿到入库)。
上游游戏本体是我们承载这些能力的底座,不是我们的身份。

具体说,这一版你能拿到的是:一个能写包、能装包、能改到相当深度的 mod 平台,
一个成熟的工坊编辑器,以及一份完整可玩的上游游戏。


这一版最重要的三件事

一、创意工坊与 mod 层(主体)

能装什么:符合 pack.json 契约的工坊包 —— 内容包、覆盖包、皮肤、语音、界面面板、整屏界面、
服务端模块、乃至第二种对局玩法。

能改到什么程度(都是本版实测的闭集数):

契约面 本版
面板挂载点 client.panels[].slot 10 个(4 个浮层 + 6 个组件宿主)
kit 白名单 KIT_IMPORT_FILES 22 条
pack.json 顶层键 PACK_FIELDS 38 格
服务端模块挂载点 SERVER_MODULE_USES 7 种

声明面:panels · screens · theme · i18n · matchKinds · server.modules[].lane · server.room.hold

二、吃进上游 0.3.0(插件系统 + 官方战斗特效)

玩家能直接看到这部分,但它是"次":上游这一版带来两套能力 —— 插件系统(一个自带入口的功能包)
与官方战斗特效的提取格式。整份合入是 909 个文件 / +119621 −9324 行(以 git diff 为准)。

三、四语种 100%

合入时漏掉的译文一次补齐:en / ja / ko / zh-TW 各 +540 条,
现在四语各自 代码实际引用的 2096 条 msgid、翻译 100 %(0 missing / 0 errors)—— 并修回了合入过程中被误删的
「撤退选中干员」「出售选中干员」两条界面文案。

口径说明:这里的 2096 是 tools/i18n.mjs check --all --strict 输出的
2096 msgids used, 2096 translated (100 %) —— 统计的是代码里用 t() 实际引用的条目,
不是语言包文件的键总数(键总数里还含尚未被引用的条目,它们不影响覆盖率判据)。


mod 作者要看的(本次新增能力)

本版从下游 fork 吸收、并落进引擎的四格声明面(每条都有设计稿与判据):

  • §28.54 pack.json.matchKinds —— 第二种对局的声明面,不是分派表:管理器不认玩法名,
    host.matchKinds() 只交出冻结的只读数据,判定住在包自己的 matchClass 包装器里。
  • §28.55 client.screens[] —— 包可以自带整屏界面({ id, route, module, order?, styles?, data?, messages? })。
  • §28.56 server.modules[].lane —— 服务端模块多一种挂载点,包自带一条 WebSocket 通道(通道由宿主开)。
  • §28.57 server.room.hold —— 房间侧的新声明面:空席房间的回收裁决。

契约面扩大(都是实测数):

  • kit 白名单 20 → 22 条:新开 @sim/body.js 与 @sim/professions.js;
    官方 ops kit 的 8 条一条不少(@ops/ 按文件准入,不按前缀)。
  • PACK_FIELDS 37 → 38:pack.json 的顶层键闭集多一格。
  • SERVER_MODULE_USES 6 → 7:尾巴就是上面那条 lane。

兼容性(实测,不是保证)

口径是合入前后的对照(同一批包,改前跑一遍、改后跑一遍,比结果):

  • 线上真包闸门(.github/pack-compat.mjs):我方包 --mine-only(34 条)⇒ {"VALID":34}、exit 0;
    全量 functional(58 条)⇒ {"VALID":58,"NO_PACK_JSON":1,"ZIP_REFUSED":1}、exit 0。
  • 本机 mod 库 before/after(91 条共同 id):class 变化 0 · errors/warnings 变化 0 ·
    firstErrorCode 变化 0 · sha256 变化 0。
  • 官方素材派生(GAME_ASSET 6 条):全部 pack-clean,前后一字未变。

⇒ 结论按实测写:未发现兼容性回归(不是「零回归」—— 那是对未测面的断言)。


下载哪个

包 适合谁 本版大小
…-win-x64.zip 大多数人:自带 Node,解压双击 启动游戏.bat 即玩,不联网也能玩 874,720,632 B
…-update.zip 已经在玩 0.18.6 的人:解压覆盖即可,不用重下 800+ MB 120,361,649 B
…-voices-cn-en-kr.zip 想听 中/英/韩 配音的人(主包默认带 日语配音) 212,041,380 B
…-src.zip 想看代码 / 自己构建的人 24,721,761 B

四语配音怎么齐:完整包默认带日语配音,语言包再补 中文 / 英文 / 韩文,两条合起来就是四语齐全。

本次完整包 874,720,632 B —— 比上一版(777,696,590 B)大 12.48 %(+97.0 MB)。
多出来的体积几乎全部来自这一版补进的官方素材:官方战斗特效
(public/assets/local/fx/,12534 个文件 / 184.8 MB 未压缩)与战场场景/模型
(public/assets/local/scene/、local/mesh/)—— 那是本来就该在包里、上一版漏掉的东西,
不是程序膨胀;除去这批素材,程序与其余素材只增加了约 7.5 MB。

⭐ 本次完整包补齐官方素材:战斗特效 12534 文件 + 战场场景 45 文件

上游 0.3.0 的官方战斗特效与战场场景素材此前没有随包发行 —— 包里缺
public/assets/local/fx/、public/assets/local/scene/、public/assets/local/mesh/ 及其清单元数据,
游戏里因此看不到这批特效与场景。本版的完整包与升级包都已补齐:

  • app/public/assets/local/fx/ —— 12534 个文件(mesh 1279 · prefabs 4518 · tex 6735 …),未压缩 184.8 MB
  • app/public/assets/local/scene/ —— 补齐 45 个战场场景文件
    (act1autochess_m01..m07 / act2autochess_m01..m04 的 env.png,以及 TX_AutochessSand_*、
    TX_Syracuse_metro_*、TX_KXMR_*、TX_LMZ_*、TX_LMC_common_* 等贴图),
    另有 51 个同名文件同步为更新的提取版本(场景元数据新增 lightEncoding 与 env 字段)
  • app/public/assets/local/mesh/trap_110/ —— 补齐 5 个模型文件(prefab.json、materials.json、
    .obj 与两张贴图)
  • app/data/local-fx.json · app/data/local-assets.json —— 素材清单元数据(引擎靠它们才知道哪些文件该被采用)

⇒ 已经在玩 0.18.6 的同学,请用新的升级包(120,361,649 B),它会把这批素材一起补上。

⚠️ 已知行为变更

本节记两条会影响包与玩法的行为变更 —— 都已在 0.19.0 之内,请按新语义调整。

1. 临时整备区不再有容量上限

自上游 0.3.0 起,临时整备区(temp)从「有界 5 格」改为「无界队列」 ——
上游 docs/PLAYING.md 的「位置上限」一节逐字写明:新获得的单位进入可扩容的临时整备区,
只显示前面的 5 格,超出的排队保留,腾出显示位后自动补上,不会因为超过 15 个而丢失。

也就是说:5 格是显示窗口,不是容量上限。

⇒ ⚠️ 如果你的包或玩法依赖「临时整备区满 ⇒ 拒绝」这条行为,它会变 ——
过去「手牌与临时都满 ⇒ HAND_FULL 原子拒绝」这条分支在 0.3.0 之后不再可达(临时永远收得下)。
请按新语义调整:放不下只影响"看得见几格",不影响"收不收得下"。

2. 休整期(prep)相机视野变宽

0.19.0 起,prep 相机的视野带与 pen 相同:bandFor('prep') 从 [6,13] 变成 [6,18],
boardArea('prep') 也从一块变成两块(普通区 + pen 区)。

即:休整期能看见右上角的下一轮敌人与两道红闸。

依据:上游维护者 2026-10-15 的决定(基于官方游戏录像)—— 休整期下一轮敌人与两道红闸就在
prep 视野的右上角,所以 🔍▶▶ 应该「移到已经看得见的东西上」。
这取代了旧规则「pen 只给自己的相机」(playtest #2 item 6)。

⚠️ 若你的包/玩法依赖「prep 相机只显示第 6–13 行」的行为,请注意它会变。

⭐ 顺手修掉的一个旧毛病:中文文件名编码

上一版(0.18.6)的 zip 里,中文文件名是用系统代码页(GBK)写的,而且没有置 UTF-8 标志位 ——
在非中文系统上解压时,启动游戏.bat 会变成 ������Ϸ.bat 这样的乱码名,玩家根本不知道该双击哪个。

本版全部条目都置了 UTF-8 标志位(37652 条全置),任何语言的系统解压出来都是正确的
启动游戏.bat / 启动编辑器.bat / 安装工坊包.bat。如果你以前在非中文系统上遇到过乱码,这次会好。


已知问题(不粉饰)

  • 74 条既存测试红:全量 node --test ⇒ 10273 tests · 10181 pass · 74 fail · 18 skipped。
    ⚠️ 这 74 条不是本版引入的 —— 把本版改动整份移开、在同一个 HEAD 上重跑,得到逐条同名的失败用例。
    也就是说它们在 0.3.0 合入时就已存在,本版既没加重也没修掉。
  • 6 条 typecheck 错:tools/ci.mjs 的 setup/smoke/lint/imports 四步 ok,
    typecheck 报 6 个既存 TS 错(shared/formProjection.js 4 个、shared/morph.js 2 个),同样是既存问题。

后续进展:tag 之后的修复(已在 main 上,将随下一版发布)已大幅收敛既存红,
并清掉了那 6 条 typecheck 错。这些修复不在本版的包里 —— 本版对应 37e16197,
上面那组数字是它当时的实测值。


致谢与来源

  • 上游游戏本体:sganggs/Stronghold-Protocol —— 卫戍协议:盟约
    (Stronghold Protocol: Alliance)。本仓库完整包含上游 0.3.0。
  • 下游 fork:jiangjiangze 的部分能力(matchKinds / client.screens / server.modules[].lane /
    server.room.hold 四格声明面)已被吸收回上游。
  • 素材版权:游戏美术、角色语音等素材版权归原作者 / 发行方所有。本项目是非官方、非盈利的同人作品,
    严禁用于任何盈利目的。详见包内 NOTICE.md 与 THIRD-PARTY-NOTICES.md。
  • 各语言配音、字体与第三方库的完整来源清单见 THIRD-PARTY-NOTICES.md。

v0.18.6-0.2.6

Choose a tag to compare

@XiaMo233M XiaMo233M released this 14 Oct 15:55

⚠️ 升级后若图标 / 立绘 / 3D 场景没出来:先按 Ctrl+Shift+R 强制刷新;仍然不行 ⇒ 地址栏站点设置里「清除此站点数据」后重开页面。

这条是 0.18.5 修掉的 Service Worker 素材劫持留下的应急文案,本版(0.18.6)继续带着那三道闸:缓存名带版本号 + SW 激活时删掉全部旧名缓存;服务器不再声明资源包时页面主动注销该 SW 并清掉它的缓存;未带 ~hash 的 /assets/** 仍是 no-cache + ETag(带指纹的仍 immutable)。换包 / 换版后如果浏览器里还留着上一版那份旧 SW,Ctrl+Shift+R 仍是最快的解除方式。


v0.18.6-0.2.6 — 工坊包可复用官方 ops kit(4 条按文件白名单)+ 口径数据通道 §28.51

本仓库 0.18.6 + 上游游戏本体 0.2.6。APP_VERSION = '0.18.6'、UPSTREAM_VERSION = '0.2.6';
PROTOCOL_VERSION(2)、MOD_API_VERSION(1)一个都没动。

⭐ 本次五个包都对应 commit fc4b80c7
(fc4b80c712df3485f3dfcc28cdf87ca9459d37e5,= origin/main,git status --porcelain 为空)。

本版两件事

⭐ 一、为「复用官方 ops kit」开放按文件白名单(@ops/ 加 4 条)

要解决的问题:工坊包 rimbilliton(雷姆必拓)的 4 张棋子卡就是 4 名官方干员换皮,作者的 kit 是极薄的委派
—— import opShwaz from '@ops/op-shwaz.js' 之后调 opShwaz.char_340_shwaz(bb, chess)。而 @ops/ 此前
不在任何白名单里(shared/kitImports.js 的两个前缀只有 @kit/ 与 @sim/),装载器与校验器同源地
(同一份 kitImportIssues)把这 4 个 kit 逐个拒掉 —— 校验器报的是 error(errors = 4),包本身还能装,
但那 4 名干员的战斗行为缺失。

为什么不能内联:当时唯一「不改引擎」的出路是内联,实测那条路的传递闭包是 18 个文件 / 513 KB
(sim/content/tokens.js 召唤物注册表 107 KB、sim/ai.js 索敌 58 KB、sim/simdata.js、sim/professions.js
与 shared/i18n.js 浏览器 i18n 运行时 25 KB)。那不是「搬几个 helper」,是把引擎子系统在包内冻结一份
—— 引擎日后更新它们时包仍跑旧副本,而且没有任何东西会报(冻结快照 + 静默漂移)。

改了什么:4 行,不是一个前缀

  • shared/kitImports.js 的 KIT_IMPORT_FILES 加四行:@ops/op-shwaz.js · @ops/op-ray.js ·
    @ops/op-aglna2.js · @ops/op-thumpy.js → server/sim/content/kits/ops/op-*.js。
  • KIT_IMPORT_PREFIXES 里加了 @ops/,因为浏览器那张 import map 是按前缀生成的(kitImportMap(),
    public/index.html 同步加了 "@ops/": "/sim/content/kits/ops/"),而且错误文案必须能说「模块名未开放
    (前缀合法)」而不是「未知前缀」。
  • 准入判据始终是那张表:@ops/op-siege.js、@ops/op-chen.js 这类同前缀、未列名的文件今天仍然被拒
    —— 这正是「按文件开」与「开前缀」的分界线。
  • 能力面没变:不开 @ops/ 整个前缀、不新增任何能力、MOD_API_VERSION 不抬(仍是 1)。
  • 这 4 条两端都不需要改写文件,也不用把它复制进包:服务端把它窄重写成 file: URL 之后 import,该文件
    自己的相对 import 由 Node 按它的真实路径原样解析;浏览器按 import map 取
    /sim/content/kits/ops/op-shwaz.js,它自己的 ../../../body.js 原样解析成 /sim/body.js。所以
    rewriteKitImports 一个字都没动。

⭐ 二、口径数据通道(§28.51):包可携带作者自撰的口径数值

包此前只有两条路:content 新增记录、overrides 替换官方记录。作者要让「同一名干员在满练度下的
口径数值」也随包走时,没有通道 —— 本版加第 15 张数据表 variants。

  • pack.json 写 content:["variants"],包内放 variants.json。它是三层闭枚举
    { <轴>: { <数据文件>: { <记录 id>: <字段级补丁> } } }:轴必须在 pack.json.variants 里声明过
    (VARIANTS_UNDECLARED_AXIS),文件必须是加载器认识的数据表(VARIANTS_UNKNOWN_FILE,且不许补
    variants 自己),补丁只能改目标记录已有的键(VARIANTS_UNKNOWN_KEY,与 overrides 同一套闭合世界)。
  • 语义是「覆盖、不追加」:补丁只落在已有记录上,id 不存在时报 VARIANTS_TARGET_MISSING 而不被创建
    —— 口径表不能发明记录。新增记录仍然只有 content,替换官方记录仍然只有 overrides。
  • 只在装载期生效:补丁在 applyWorkshop 里合进数据,不接管运行时练度开关 —— 房间里点不点满练度、
    走哪条轴,仍由原有的运行时开关与 pack.json.variants 声明决定,本通道没有改它。
  • 判据:test/workshopVariantsData.test.js 16 pass / 0 fail(红 15 → 绿 16)。

上一版的两件事继续带着(SW 自愈 + 界面换新)

修 Service Worker 素材劫持(0.18.5)

根因:根作用域的 Service Worker 一次注册就永久接管 /assets、/fonts、/media。它对这三个前缀
只从「本地导入过的字节」回答,命不中一律 412 且绝不回源;缓存名不带版本、激活时也不清旧
⇒ 换包 / 换版本后,浏览器里那份 SW 永不退场 ⇒ 表现就是立绘 / 盟约图 / 3D 场景大片空白(强刷才好)。

三道闸:

# 闸 做法
① 缓存名带版本 CACHE_NAME 带本版版本号;SW 激活时删掉所有旧名缓存
② 自愈阀 服务器不再声明资源包时,页面主动注销该 SW 并清掉它的缓存
③ 不再误导长缓存 未带 ~hash 的 /assets/** 改 no-cache + ETag;带指纹的仍是 immutable

应急文案(保留):升级后若图标 / 立绘 / 3D 场景没出来,先 Ctrl+Shift+R;
仍不行 ⇒ 站点设置里清除此站点数据后重开页面。

界面按第三方 UI 包 20261014 换新(0.18.5)

口径:包版作底、本仓库的增量追加在末尾。
份量:5 个文件整份替换 + 8 个新增 + 3 个 patch feature 手工落。

我们独有的七项全部移植:座席上限滑杆 · 快速匹配 · 房间模组回显 · 助战 · 聊天 · 添加 AI 队友 · i18n 包装。

包版带来的新能力:大厅自定义 BGM · 异形屏适配 · 成就奖杯 · 名片立绘。
⚠️ 名片立绘需要协议 room.card,本仓库尚无 ⇒ 该模块静默不启用(不是坏了,是没开)。

协议未动

  • PROTOCOL_VERSION = 2、MOD_API_VERSION = 1 一字未动。
  • room.setSeatCap / room.queue / room.addBot / chat.msg 与 pack.json 的字段集一字未动
    (variants 是新增的包内数据表,走的是既有的 content 声明,不是新协议消息)。
  • ⇒ 现有 mod 的装 / 卸 / 声明 / 对局行为照旧;没有改游戏规则,不需要 golden:update。

判据

冻结树全量:8867 tests / 8862 pass / fail 0 / skipped 5(node --test --test-concurrency=2,exit 0)。

真包 node tools/workshop-validate.mjs:0 error / VALID;口径表 32 条记录 / 4019 个值 /
与官方口径不一致 0
。

@ops/ 那一刀的「先红后绿」:加这四行之前 test/kitImports.test.js 的
--test-name-pattern='按文件开放官方 ops kit' 是 4 个 failure(失败信息就是
@ops/op-shwaz.js 必须在 KIT_IMPORT_FILES 里… 与 未知前缀 "@ops/");加完之后 41 pass / 0 fail。

基线

项 值
引擎主树 HEAD fc4b80c712df3485f3dfcc28cdf87ca9459d37e5
origin/main(本地实引) fc4b80c712df3485f3dfcc28cdf87ca9459d37e5
git status --porcelain 0(无未跟踪项)
发行 tag v0.18.6-0.2.6(annotated)
推送方式 git push origin refs/tags/v0.18.6-0.2.6(只推这一个 tag,未用 --tags);无 force / rebase / reset / amend

五包校验值(冻结实测 · 全部对应 fc4b80c7)

本次发 5 个资产,构建树冻结在 fc4b80c7。字节 / sha256 在冻结后独立复算,
并逐个从线上用 Range: bytes=0-1048575 回核(五个全 HTTP 206、size 与本地逐项相等):

# 资产 文件名 字节 sha256 zip 内文件数
① 完整包 / Windows 便携(四国语音 + 全部美术 1725 + 自带 node.exe + editor\) Stronghold-Protocol-Forge-0.18.6-0.2.6-win-x64.zip 777,696,590 5987fbdb69f0fa5da05f13a295a2486cfda88b396d577a15185939ff64355ab5 24,628
② 语音补充包(补齐 cn / en / kr) Stronghold-Protocol-Forge-0.18.6-0.2.6-voices-cn-en-kr.zip 212,041,380 1240200c2a99e8bf8e30e6073617958257faa72882bd2a2e1becaf1706bd0628 7,785
③ 源码包(含 editor/) Stronghold-Protocol-Forge-0.18.6-0.2.6-src.zip 18,173,048 9e6c37faa8ee475157f956cd573b616361b0ba73f2a796e6e1f122f659cc350f 1,804
④ 日语精简包(只带 jp 语音、不含美术;根层带 启动游戏.bat) Stronghold-Protocol-Forge-0.18.6-0.2.6-lite-jp.zip 105,551,874 bbd7499a7739f125f0757dff4d07ffcf4bc53f73031ecf054f4271db4c2d4be4 9,290
⑤ 增量更新包(从 v0.18.5-0.2.6 覆盖上来) Stronghold-Protocol-Forge-0.18.6-0.2.6-update.zip 964,707 775ade315d6531819ad219829697eccc8eea4812fa51db1e01a2d97c9aac9416 20

① 的自核:出包日志报 24,628 个文件 / 1043.4 MB,其中游戏本体(git ls-files 全部 958 个跟踪文件、
略过 test/)、素材与前端库 17,798 个文件、生产依赖 5,861 个文件、便携版 Node v22.23.3;
写出 app\MANIFEST.json(6,825 个程序文件的大小与 sha256)。包内 node\node.exe、app\editor\
(43 个文件)、根层 启动游戏.bat / 启动编辑器.bat / 安装工坊包.bat、app\MANIFEST.json 全部在位;
四国语音 cn 2,688 / en 2,548 / jp 2,688 / kr 2,548;本地美术 1725 个。

③ 的 src 包文件集 == git ls-files(1,804 个,实测逐一对齐)。

冻结点包「解压后真起服务」的冒烟(① / ④ / ⑤ 各自 4 项接口,全 200):
/healthz(ok:true、app 报 0.18.6)、/(含 <html)、/index.html、/vendor/pixi.min.js。
⑤ 走的是真实升级路径:解上一版 v0.18.5-0.2.6 的 -win-x64 完整包 → 覆盖 ⑤ → 起服务,
app\UPDATE.json 在位、app\package.json 的 release 由 0.18.5-0.2.6 变成 0.18.6-0.2.6,
随后 /healthz 报 app: 0.18.6。

怎么装

  • 完整包(Windows 便携):解压 → 根层双击 启动游戏.bat(启动编辑器.bat 开工坊编辑器、
    安装工坊包.bat 装包)→ 浏览器自动打开 http://localhost:3000。自带 Node 运行时与 editor\,
    目标机不需要装 Node;自带四国语音与全部美术,不用再跑 npm run setup,也不用叠补充包。
  • 日语精简包:解压 → 根层双击 启动游戏.bat;需要系统 Node 22+,第一次启动跑 npm run setup
    下载约 550 MB 素材;语音只有 jp。官方 3D 棋盘场景与少数 HUD / 替身模型来自本机客户端
    (没有就用 2D 棋盘与相似替身)。
  • 要四国语音又要小体积:把 voices-cn-en-kr.zip 解压叠到日语精简包上(补齐 cn / en / kr;默认语种
    仍是 jp),覆盖同名文件即可。
  • 源码包:不含美术(仓库里本就没有美术字节);装上后按 README.md 走 npm ci 与 npm run setup。
  • 增量更新包:给已装 v0.18.5-0.2.6 的人 —— 解压后把 app\ 覆盖到旧安装的 app\(同名覆盖),
    你原有的美术与设置不动。不要把它叠到 v0.18.4-0.2.6 或更早的版本上(版本对不上)。
  • 联机:建房后分享 4 位房间码或 ?room=KEY 链接;局域网用启动时打印的地址,否则用虚拟局域网 / 隧道 / VPS
    —— 见 docs/DEPLOY.md。

如实说明

  • 本版动了什么:shared/kitImports.js 的 KIT_IMPORT_FILES 加 4 行 + KIT_IMPORT_PREFIXES 加
    @ops/(浏览器 import map 同步),以及口径数据通道 variants(shared/workshop.js 的校验与装载、
    编辑器与 CLI 的 CHECK_KINDS / checkKindLabel)。没有新协议消息、没有改游戏规则、没有 golden:update。
  • 为什么开这 4 条而不是开前缀:内联那条路的传递闭包是 18 个文件 / 513 KB(召唤物注册表 / 索敌 AI /
    simdata / 职业表 / i18n 运行时)。把它复制进包=把引擎子系统在包内冻结一份,引擎日后更新时包仍跑旧副本,
    而且没有任何东西会报。按文件开这 4 条,包拿到的是引擎同一份实现,不产生静默漂移。
  • 口径表不能发明记录:variants 只落已有记录,id 不存在报 VARIANTS_TARGET_MISSING 而不被创建;
    新增记录仍然只有 content,替换官方记录仍然只有 overrides。只在装载期生效,不接管运行时练度开关。
  • 协议未动:PROTOCOL_VERSION = 2、MOD_API_VERSION = 1,room.setSeatCap / room.queue /
    room.addBot / chat.msg 与既有 pack.json 字段集一字未动 ⇒ 现有 mod 装 / 卸 / 声明 / 对局行为照旧。
  • 判据:冻结树上全量 8867 tests / 8862 pass / fail 0 / skipped 5(--test-concurrency=2)。
  • 资产的产出与核验口径:① 由仓库自带 scripts/make-windows-bundle.mjs(--all-dubs --release 0.18.6-0.2.6)
    出便携目录后压 zip;② 由 scripts/make-voice-pack.mjs --langs=cn,en,kr 产出(7,784 个文件);
    ③ 由 git archive 于冻结树 fc4b80c7 导出(文件集 == git ls-files,1804 个);
    ④ 由 tools/package.mjs --lite 出精简树后补入 public/assets/audio/voice/jp/** 再压 zip
    (打包器自报 personal-info scan: 730 files, home paths only (no account name to refuse)、checks: ok);
    ⑤ 由 scripts/make-update-package.mjs 产出(起点 = v0.18.5-0.2.6 的 -win-x64 包)。
    打包脚本一个字节没改。
  • zip 目录条目(如实说明):本次 ① 2386 个、② 3 个、③ 84 个、⑤ 11 个、④ 0 个;
    上表「zip 内文件数」一律按文件口径计(不含目录条目)。① 的 27014 条目 / 2386 目录 / 24628 文件、
    ② 的 7788 / 3 / 7785 与上一版逐项相同。文件集与解压结果一致。
  • 本地美术(1725 个文件):官方素材,由 tools/local-extract/extract.py 从本机《明日方舟》客户端提取;
    仅本地、不随源码分发(public/assets/ 在 .gitignore,仓库里一个美术字节都没有)。
    构成(本机实测):ui/ 1208、module/ 137、spine/ 126、scene/ 92、map/ 77、guide/ 38、
    emoticon/ 36、mesh/ 10、projectiles/ 1 ⇒ 合计 1725。
    日语精简包与源码包都不带 public/assets/local/**,也不带 data/local-assets.json。
  • 资产命名统一:五个资产都按仓库既定形式 Stronghold-Protocol-Forge-<forge>-<upstream>-<kind>.zip
    (kind ∈ win-x64 / voices-cn-en-kr / src / lite-jp / update)。
  • 资产只走 release,不进 git:五个包都只写在 E:\destop\harness_1\_up\pkg-0186\ 下。
    完整包 777,696,590 字节(约 741 MiB)远超 GitHub 单文件 100 MB 限制,只能作为 release 资产分发。
  • 没有动上一版:tag v0.18.5-0.2.6 与它对应的 release(id 412695667)一个字节没碰,
    本次**没有删除...
Read more

v0.18.5-0.2.6

Choose a tag to compare

@XiaMo233M XiaMo233M released this 14 Oct 12:32

⚠️ 升级后若图标 / 立绘 / 3D 场景没出来:先按 Ctrl+Shift+R 强制刷新;仍然不行 ⇒ 地址栏站点设置里「清除此站点数据」后重开页面。

本版(0.18.5)已经把上一版那个 Service Worker 素材劫持修掉了,而且是三道闸一起上的:缓存名带本版版本号 + SW 激活时删掉全部旧名缓存;服务器不再声明资源包时页面主动注销该 SW 并清掉它的缓存;未带 ~hash 的 /assets/** 不再吃一天长缓存(改 no-cache + ETag,带指纹的仍是 immutable)。上面两步仍然建议照做一次 —— 换包 / 换版后如果浏览器里还留着上一版那份旧 SW,Ctrl+Shift+R 仍是最快的解除方式。


v0.18.5-0.2.6 — 修 Service Worker 素材劫持 + 大厅界面按第三方 UI 包 20261014 换新

本仓库 0.18.5 + 上游游戏本体 0.2.6。APP_VERSION = '0.18.5'、UPSTREAM_VERSION = '0.2.6';
PROTOCOL_VERSION(2)、MOD_API_VERSION(1)一个都没动。

⭐ 本次五个包都对应 commit 8985e23f
(8985e23ff5bc6a0678d5391f25d920510389b225,= origin/main,git status --porcelain 为空)。

本版两件事

⭐ 一、修 Service Worker 素材劫持(本版最重要的一条)

根因:根作用域的 Service Worker 一次注册就永久接管 /assets、/fonts、/media。
它对这三个前缀只从「本地导入过的字节」回答,命不中一律 412 且绝不回源;
缓存名不带版本、激活时也不清旧 ⇒ 换包 / 换版本后,浏览器里那份 SW 永不退场
⇒ 表现就是立绘 / 盟约图 / 3D 场景大片空白(强刷才好)。

三道闸:

# 闸 做法
① 缓存名带版本 CACHE_NAME 带本版版本号;SW 激活时删掉所有旧名缓存
② 自愈阀 服务器不再声明资源包时,页面主动注销该 SW 并清掉它的缓存
③ 不再误导长缓存 未带 ~hash 的 /assets/** 改 no-cache + ETag;带指纹的仍是 immutable

应急文案(保留):升级后若图标 / 立绘 / 3D 场景没出来,先 Ctrl+Shift+R;
仍不行 ⇒ 站点设置里清除此站点数据后重开页面。

⭐ 二、界面按第三方 UI 包 20261014 换新

口径:包版作底、本仓库的增量追加在末尾。
份量:5 个文件整份替换 + 8 个新增 + 3 个 patch feature 手工落。

我们独有的七项全部移植:座席上限滑杆 · 快速匹配 · 房间模组回显 · 助战 · 聊天 · 添加 AI 队友 · i18n 包装。

包版带来的新能力:大厅自定义 BGM · 异形屏适配 · 成就奖杯 · 名片立绘。
⚠️ 名片立绘需要协议 room.card,本仓库尚无 ⇒ 该模块静默不启用(不是坏了,是没开)。

协议未动

  • PROTOCOL_VERSION = 2、MOD_API_VERSION = 1 一字未动。
  • room.setSeatCap / room.queue / room.addBot / chat.msg 与 pack.json 的字段集一字未动。
  • ⇒ mod 的装 / 卸 / 声明 / 对局行为照旧。

对现有 mod 的影响(实测口径)

站点上 14 个包里 7 个碰 UI / 7 个不碰。本版变的只是客户端 UI 类名与 CSS 底:

  • 站点现有包没有一个被改坏;
  • theme-night 实测仍生效;
  • plugin-pack 的面板 404 改前同样存在,不是本轮引入的。

判据

冻结树全量:8841 tests / 8836 pass / fail 0 / skipped 5(node --test --test-concurrency=2,16.2 分钟)。

基线

项 值
引擎主树 HEAD 8985e23ff5bc6a0678d5391f25d920510389b225
origin/main(本地实引) 8985e23ff5bc6a0678d5391f25d920510389b225
git status --porcelain 0(无未跟踪项)
发行 tag v0.18.5-0.2.6(annotated;tag 对象 a407d66f5bb4fa6e0346b8013d2b8a5484b6b1b1 → commit 8985e23ff5bc6a0678d5391f25d920510389b225)
远端 tag 实引 git ls-remote --tags → a407d66f5bb4fa6e0346b8013d2b8a5484b6b1b1(refs/tags/v0.18.5-0.2.6)/ 8985e23ff5bc6a0678d5391f25d920510389b225(^{})
推送方式 git push origin refs/tags/v0.18.5-0.2.6(只推这一个 tag,未用 --tags);无 force / rebase / reset / amend

五包校验值(冻结实测 · 全部对应 8985e23f)

本次发 5 个资产,构建树冻结在 8985e23f。字节 / sha256 在冻结后独立复算,
并逐个从线上用 Range: bytes=0-1048575 回核(五个全 HTTP 206、size 与本地逐项相等):

# 资产 文件名 字节 sha256 zip 内文件数
① 完整包 / Windows 便携(四国语音 + 全部美术 1725 + 自带 node.exe + editor\) Stronghold-Protocol-Forge-0.18.5-0.2.6-win-x64.zip 777,678,230 9f5dac2e3c0bbef81ccba01b46a7d1b9a039fc310e3a28fabe758f2500e4831e 24,628
② 语音补充包(补齐 cn / en / kr) Stronghold-Protocol-Forge-0.18.5-0.2.6-voices-cn-en-kr.zip 212,041,380 39e4ba860c487766bb47f759773ab24c22dc68d54d16dfe1dfe3d0862a6f010b 7,785
③ 源码包(含 editor/) Stronghold-Protocol-Forge-0.18.5-0.2.6-src.zip 18,144,946 d48058ca05f8f557fa8ed31f56660ae6edbfb8a7d150731986ac2939df0c2bda 1,803
④ 日语精简包(只带 jp 语音、不含美术;根层带 启动游戏.bat) Stronghold-Protocol-Forge-0.18.5-0.2.6-lite-jp.zip 105,542,915 88bdde6ca9613940cfde6e63c9b3a1f84d30e7274c2b493499abad5c18385150 9,290
⑤ 增量更新包(从 v0.18.4-0.2.6 覆盖上来) Stronghold-Protocol-Forge-0.18.5-0.2.6-update.zip 1,089,467 ff57c057a22eb21d5016b4ae2541e0bdd5a6ce0d4a8480d77179e4d4a5a4bcbc 40

① 的自核:出包日志报 24,628 个文件 / 1043.4 MB,其中游戏本体(git ls-files 全部 958 个跟踪文件、
略过 test/)、素材与前端库 17,798 个文件、生产依赖 5,861 个文件、便携版 Node v22.23.3;
写出 app\MANIFEST.json(6,825 个程序文件的大小与 sha256)。包内 node\node.exe、app\editor\
(43 个文件)、根层 启动游戏.bat / 启动编辑器.bat / 安装工坊包.bat、app\MANIFEST.json 全部在位;
本地美术 1725 个。

③ 的 src 包文件集 == git ls-files(1,803 个,实测逐一对齐)。

冻结点包「解压后真起服务」的冒烟(① / ④ / ⑤ 各自 4 项接口,全 200):
/healthz(ok:true、app 报 0.18.5)、/(7,481 B,含 <html)、/index.html(7,481 B)、
/vendor/pixi.min.js(456,133 B)。⑤ 走的是真实升级路径:解上一版 v0.18.4-0.2.6 的 -win-x64 完整包
→ 覆盖 ⑤ → 起服务,app\UPDATE.json 在位、app\package.json 的 release 由 0.18.4-0.2.6 变成
0.18.5-0.2.6,随后 /healthz 报 app: 0.18.5。

怎么装

  • 完整包(Windows 便携):解压 → 根层双击 启动游戏.bat(启动编辑器.bat 开工坊编辑器、
    安装工坊包.bat 装包)→ 浏览器自动打开 http://localhost:3000。自带 Node 运行时与 editor\,
    目标机不需要装 Node;自带四国语音与全部美术,不用再跑 npm run setup,也不用叠补充包。
  • 日语精简包:解压 → 根层双击 启动游戏.bat;需要系统 Node 22+,第一次启动跑 npm run setup
    下载约 550 MB 素材;语音只有 jp。官方 3D 棋盘场景与少数 HUD / 替身模型来自本机客户端
    (没有就用 2D 棋盘与相似替身)。
  • 要四国语音又要小体积:把 voices-cn-en-kr.zip 解压叠到日语精简包上(补齐 cn / en / kr;默认语种
    仍是 jp),覆盖同名文件即可。
  • 源码包:不含美术(仓库里本就没有美术字节);装上后按 README.md 走 npm ci 与 npm run setup。
  • 增量更新包:给已装 v0.18.4-0.2.6 的人 —— 解压后把 app\ 覆盖到旧安装的 app\(同名覆盖),
    你原有的美术与设置不动。不要把它叠到 v0.18.3-0.2.6 或更早的版本上(版本对不上)。
  • 联机:建房后分享 4 位房间码或 ?room=KEY 链接;局域网用启动时打印的地址,否则用虚拟局域网 / 隧道 / VPS
    —— 见 docs/DEPLOY.md。

如实说明

  • 这次修的是什么(根因):根作用域 SW 一次注册就永久接管 /assets、/fonts、/media,命不中一律
    412 且绝不回源,缓存名不带版本、激活也不清旧 ⇒ 换包 / 换版后浏览器里那份永不退场 ⇒ 立绘 / 盟约图 /
    3D 场景大片空白。三道闸见上(带版本 CACHE_NAME + 激活清旧 / 服务器不再声明资源包时页面自愈注销并清缓存 /
    未带 ~hash 的 /assets/** 改 no-cache + ETag,带指纹仍 immutable)。
  • 界面换新口径:包版作底、本仓库增量追加在末尾;5 个文件整份替换 + 8 个新增 + 3 个 patch feature 手工落;
    我们独有的七项(座席上限滑杆 / 快速匹配 / 房间模组回显 / 助战 / 聊天 / 添加 AI 队友 / i18n 包装)全部移植。
  • ⚠️ optional/room-card(名片立绘)本版未装:它需要协议 room.card,本仓库尚无 ⇒ 该模块静默不启用;
    它是新增增强、不是丢失的功能,记为以后可选(装它要动 shared/protocol.js + server/lobby.js 并重启,
    与「本版不动协议」冲突,所以不做)。
  • 协议未动:PROTOCOL_VERSION = 2、MOD_API_VERSION = 1,room.setSeatCap / room.queue /
    room.addBot / chat.msg 与 pack.json 字段集一字未动 ⇒ mod 装 / 卸 / 声明 / 对局行为照旧。
  • 对站点现有 mod 的实测口径:14 个包里 7 个碰 UI / 7 个不碰;变的只是客户端 UI 类名与 CSS 底;
    站点现有包没有一个被改坏(theme-night 实测仍生效;plugin-pack 的面板 404 改前同样存在、非本轮)。
  • 未点击验证的一项(如实标注):七项里的**「房间模组回显」本机没有做点击流实测** —— 本机服务器
    当时没有声明工坊包,无从触发。口径是「已移植、未点击验证」,不写成「已实测」。
  • 判据:冻结树上全量 8841 tests / 8836 pass / fail 0 / skipped 5(--test-concurrency=2,16.2 分钟)。
  • 资产的产出与核验口径:① 由仓库自带 scripts/make-windows-bundle.mjs(--all-dubs --release 0.18.5-0.2.6)
    出便携目录后压 zip;② 由 scripts/make-voice-pack.mjs --langs=cn,en,kr 产出(7,784 个文件);
    ③ 由 git archive 于冻结树 8985e23f 导出(文件集 == git ls-files,1803 个);
    ④ 由 tools/package.mjs --lite 出精简树后补入 public/assets/audio/voice/jp/** 再压 zip
    (打包器自报 personal-info scan: 730 files, home paths only (no account name to refuse)、checks: ok);
    ⑤ 由 scripts/make-update-package.mjs 产出(起点 = v0.18.4-0.2.6 的 -win-x64 包)。
    打包脚本一个字节没改。
  • zip 目录条目的一处差异(如实说明):本次 ③ 带 84 个目录条目、④ 13 个、⑤ 17 个、② 3 个、
    ① 2386 个;上表「zip 内文件数」一律按文件口径计(不含目录条目),与上一版同口径可比。
    文件集与解压结果一致。
  • 本地美术(1725 个文件):官方素材,由 tools/local-extract/extract.py 从本机《明日方舟》客户端提取;
    仅本地、不随源码分发(public/assets/ 在 .gitignore,仓库里一个美术字节都没有)。
    构成(本机实测):ui/ 1208、module/ 137、spine/ 126、scene/ 92、map/ 77、guide/ 38、
    emoticon/ 36、mesh/ 10、projectiles/ 1 ⇒ 合计 1725。
    日语精简包与源码包都不带 public/assets/local/**,也不带 data/local-assets.json。
    没有客户端时优雅退化 —— 用程序化 2D 棋盘与相似替身,玩法不受影响。
  • 资产命名统一:五个资产都按仓库既定形式 Stronghold-Protocol-Forge-<forge>-<upstream>-<kind>.zip
    (kind ∈ win-x64 / voices-cn-en-kr / src / lite-jp / update)。
  • 资产只走 release,不进 git:五个包都只写在 E:\destop\harness_1\_up\pkg-0185\ 下。
    完整包 777,678,230 字节(约 741 MiB)远超 GitHub 单文件 100 MB 限制,只能作为 release 资产分发。
  • 没有动上一版:tag v0.18.4-0.2.6 与它对应的 release(id 412059648)一个字节没碰,
    本次没有删除任何资产。

v0.18.4-0.2.6 — 修好上一版的大厅 UI 回归

Choose a tag to compare

@XiaMo233M XiaMo233M released this 13 Oct 20:00

⚠️ 升级后图标 / 立绘 / 3D 场景空白? 先按 Ctrl+Shift+R 强制刷新;仍然不行 ⇒ 地址栏站点设置里「清除此站点数据」后重开页面。

这一版(0.18.4)带一个已知缺陷:资源 Service Worker 装过一次就会一直留在浏览器里。它对 /assets、/fonts、/media 只从「本地导入过的字节」回答,命不中一律 412 且绝不回源 —— 于是立绘、盟约图、3D 场景会同时空白,只有上面两步能解除(换包/换版本都不自愈)。0.18.5 已修:缓存名带版本、SW 激活时删掉旧缓存;服务器不再声明资源包时页面会主动注销它并清掉缓存。


v0.18.4-0.2.6 — 修好上一版的大厅 UI 回归

本仓库 0.18.4 + 上游游戏本体 0.2.6。APP_VERSION 由 0.18.3 抬到 0.18.4;
UPSTREAM_VERSION 仍 '0.2.6';PROTOCOL_VERSION(2)、MOD_API_VERSION(1)一个都没动。

⭐ 本次五个包都对应 commit 7a311a21
(7a311a21894a4df6301d88af88e3ae8fca442b66,= origin/main,git status --porcelain 为空;
出包前后各核一次 rev-parse HEAD + status --porcelain,两次都未变)。

这次修的是什么

上一版(v0.18.3-0.2.6)把第三方 UI 包的 CSS 反向追加到引擎规则之后 —— 包版规则靠后生效,
于是大厅两栏塌成单列、文本框大小不一、座席滑杆被压窄。

本版按该 UI 包自己的 AGENTS.md 正规安装:5 个文件整份替换 + 把我们的本地改动逐条移植
进包版 + CSS 以包版为底、我们的增量追加末尾。

基线

项 值
引擎主树 HEAD 7a311a21894a4df6301d88af88e3ae8fca442b66
origin/main(本地实引) 7a311a21894a4df6301d88af88e3ae8fca442b66
远端实引 git ls-remote origin refs/heads/main 7a311a21894a4df6301d88af88e3ae8fca442b66
git status --porcelain 0(无未跟踪项)
发行 tag v0.18.4-0.2.6(annotated;tag 对象 3ddaa6ecd50fa0bb1ee7ef887cf28faf3f20537c,指向 7a311a21894a4df6301d88af88e3ae8fca442b66)
远端 tag 实引 git ls-remote --tags → 3ddaa6ecd50fa0bb1ee7ef887cf28faf3f20537c
推送方式 git push origin refs/tags/v0.18.4-0.2.6(只推这一个 tag,未用 --tags);无 force / rebase / reset / amend

上游这一版带来了什么(0.2.6,本版沿用)

上游 0.2.6 是 93 个文件 / +5750 −254 行 / 58 个提交(以 git diff v0.2.5 v0.2.6 为准;上游更新包
UPDATE.json 只记 67 个文件,一律以 diff 为准)。

规则面只有一条(魂灵之影只落在场上的部署格,#557 / PR #558),其余全是流量、渲染与界面:

  • 减轻开服电脑的流量:静音时不下载背景音乐;1 KB 以上的 WebSocket 消息压缩(permessage-deflate,
    不做服务端 context takeover);素材地址带内容哈希长期缓存;brotli;教程图改用 WebP;
    /healthz?traffic=1 与诊断里的下载量行。
  • 画面:官方场景光照改回官方值(#549);显示官方场景时补画射击台 / 特制水上平台 / 封印的地面(#569);
    单位多时缓存画面裁切与残影的修正(#542)。
  • 界面/流程:最后一个还没选策略的玩家不再看到可点的「跳过」(PR #546);每回合开始按部署顺序重播
    入场动画与落地音(PR #416);设置新增「弹药数量」(PR #552,默认关)。

逐条的依据、实测数字与 [ASSUMED] 标记写在 docs/history/0.2.6.md(我们这边是 §33)。

我们怎么吃的:四批,各自有判据(0.2.6 进场时的口径)

批 内容 判据
① 美术资源批 上游缺的 114 个本地客户端文件落进 public/assets/local/**;data/local-assets.json 同步更新 与完整资源包逐文件同哈希(本机共 1725 个文件);11 个战场逐个 headless Edge 真渲染,pageerror 0 / console error 0 / HTTP≥400 0
② 服务器流量层 取上游新增的 shared/assetPaths.js 与 server/http/{assetIndex,assetViews,traffic}.js 及四个测试;index / routes / static / websocket / config / files / media 留我们的骨架、接上游的能力 test/{asset-index,asset-paths,traffic,ws-compression} 全绿 + 既有全量 fail 0
③ 客户端渲染与设置层 §33.5–§33.11;render/{spine,impostor,materials}.js、render/app/tune.js、screens/bandDraft.js、ui/guide.js、ui/fieldHost.js、ui/gameLogic/phases.js、server/sim/**/op-wisdel.js、tools/local-extract/extract.py 与上游逐字节相同直接取;render/units.js、board3d/{scene,layout}.js、ui/settings.js、ui/gameLogic/settings.js 做三方合并 test/render 661 条 / 0 红、test/ui 843 条 / 0 红、六族 golden 一次没动、全量 fail 0
④ 文档与版本次 UPSTREAM_VERSION 抬号、CHANGELOG.md、README.md、docs/DESIGN.md 章节表与版本段落、docs/history/0.2.6.md(§33)、docs/prompts/* 基线声明 test/docs-paths.test.js + test/promptBaseline.test.js + 牙证明(见下)

牙证明(判据真的会红,不是摆设):把 UPSTREAM_VERSION 改回 '0.2.5' ⇒ test/docs-paths.test.js
当场红;把 README.md「本仓库当前的底座」改回 0.2.5 ⇒ test/promptBaseline.test.js 红并点名 README.md:638;
把 lobby.js 里 seatCapRange 的接线去掉 ⇒ test/roomSeatCap.test.js 红(max: 4 对 max: 20)。

我们保留 / 增强的(一条都没丢)

  • mod 层 §28:shared/{workshop,modSurface,enabled,packForms}.js、server/{lobby,modModules}.js
    本版一个字没改;形态增量通道(formsFor,§28.29) 在上游整份重写的 render/units.js 里重新贴回。
  • 工坊与大厅那一层:ui/{transitions,hubBackdrop,matchFlow,protocolScene}.js、screens/sweep.js、
    public/css/** 的我方增量保留;本版按 UI 包 AGENTS.md 重装后,大厅 / 房间 / 编队三页
    pageerror 0、console error 0。
  • UI-Hub 与六类分类:站点与 hub 面的既有分类(实用 / 拓展包 / 游戏玩法 等用途分类)与 UI-Hub 接线不动。
  • 以新为准:站点内容面的「以新为准」口径不变(新件覆盖旧件、旧件转 superseded、零删除)。
  • i18n 走管线,不照抄文件:我们的语言包比上游多 122 个键,直接拿上游 json 会整片删掉。
    上游本版新增的两条(「弹药数量」与它的说明)按 tools/i18n.mjs 规矩补进四个语言包;en 100 % / 0 errors。
  • 协议与包接口面不动:PROTOCOL_VERSION 仍 2、MOD_API_VERSION 仍 1。

本地美术(1725 个文件)说明

  • 来源:官方素材,由 tools/local-extract/extract.py 从本机《明日方舟》客户端提取。
  • 分发口径:仅本地、不随源码分发。public/assets/ 在 .gitignore 里(.gitignore:10),
    仓库里一个美术字节都没有。只有完整包带上它们;源码树 / 仓库永远不含。
  • 构成(本机实测):public/assets/local/ui/ 1208、module/ 137、spine/ 126(enemy/ 6 + token/ 120)、
    scene/ 92、map/ 77、guide/ 38、emoticon/ 36、mesh/ 10、projectiles/ 1 ⇒ 合计 1725。
  • 配套清单:data/local-assets.json(75 个组 / 1658 条资源条目);完整包同时带上这份 json。
    日语精简包与源码包都不带 public/assets/local/**,也不带 data/local-assets.json。
  • 没有客户端时:优雅退化 —— 用程序化 2D 棋盘与相似替身,玩法不受影响。

五包校验值(冻结实测 · 全部对应 7a311a21)

本次发 5 个资产,构建树冻结在 7a311a21。字节 / sha256 / 文件数在冻结后独立复算,
并逐个从线上用 Range: bytes=0-1048575 回核(五个全 HTTP 206、size 与本地逐项相等):

# 资产 文件名 字节 sha256 zip 内文件数
① 完整包 / Windows 便携(四国语音 + 全部美术 1725 + 自带 node.exe + editor\) Stronghold-Protocol-Forge-0.18.4-0.2.6-win-x64.zip 777,632,776 f5462cf0a50cd5940c6164ea655079f377e2acfc1c425477d64d8b23acc9b1c2 24,620
② 语音补充包(补齐 cn / en / kr) Stronghold-Protocol-Forge-0.18.4-0.2.6-voices-cn-en-kr.zip 212,041,380 496baf1f414263de2a6a914bc2157cbca856f22e7ebe070fcac3a30e14d3e03d 7,785
③ 源码包(含 editor/) Stronghold-Protocol-Forge-0.18.4-0.2.6-src.zip 17,925,225 d4ae9bd2975261380828da928670b033989f3c407da3233f11ae100b01b530dc 1,794
④ 日语精简包(只带 jp 语音、不含美术;根层带 启动游戏.bat) Stronghold-Protocol-Forge-0.18.4-0.2.6-lite-jp.zip 106,276,734 1f94d97d9bfaad285eddfb75b4eea63abfe44016115f85f8ba8e27f45fecc53a 9,282
⑤ 增量更新包(从 v0.18.3-0.2.6 覆盖上来) Stronghold-Protocol-Forge-0.18.4-0.2.6-update.zip 820,841 39e475ffb3e148b533868606d17bc16bb4e0b520ea4f3a0547e326eb56e3af64 29

① 的自核:包内 node\node.exe、app\editor\(45 条目)、根层 启动游戏.bat / 启动编辑器.bat /
安装工坊包.bat、README-开箱即用.md、app\MANIFEST.json 全部在位;本地美术 1725 个;
四国语音 cn 2688 / jp 2688 / en 2548 / kr 2548。关键文件与主树 sha256 SAME:
shared/constants.js、server/http/traffic.js、public/js/render/spine.js、public/js/render/units.js、
data/local-assets.json(app/package.json 按设计不同 —— 出包阶段会重写 script 表并盖上
release="0.18.4-0.2.6")。包内 shared/constants.js 实物读出 APP_VERSION = '0.18.4'、
UPSTREAM_VERSION = '0.2.6'。

五个包都做了「解压后真起服务」的冒烟(① 14/14、④ 11/11、⑤ 12/12,全绿):
/healthz(200 且 ok:true)、/mods/catalog.json、/api/rooms、/data/assets.json(1,793,145 B)全 200;
① 的本地美术 200 且 sha256 与主树一致;④ 美术 404 而 jp 语音 200(cn 语音 404)。
⑤ 走的是真实升级路径:解上一版 -win-x64 完整包 → 覆盖 ⑤ → 起服务,服务端自己打出
[update] 正在应用更新包 v0.18.4(适用于 v0.18.3-0.2.6)… → 已更新到 v0.18.4:6817 个文件校验通过,删除 0 个旧文件,
随后四接口全绿。

与 0.10.0 的口径差异(重要)

项 0.10.0(旧口径) 本次 v0.18.4-0.2.6
完整包里的语音 只有 jp(约 85.2 MB) 四国语音全量自带:cn / jp / en / kr
voices-cn-en-kr.zip 的角色 主分发路径 补齐型:给「只带 jp」的日语精简包补上 cn / en / kr
小体积包 lite(无美术、无语音) 日语精简包:带 jp 语音、不含美术
资产集 2 个:-update.zip + -src.zip 5 个:完整包(Windows 便携)+ 语音补充包 + 源码包 + 日语精简包 + 增量更新包

⇒ 完整包解压即四国语音齐,不必再叠补充包;「日语精简包 + 语音补充包」叠放后,语音集与完整包一致。

  • 完整包与 lite 包的 MANIFEST.json 各列 6817 / 6589 个文件(美术由 npm run setup 管理,故不入 MANIFEST
    —— 与工具口径一致);两包 MANIFEST 不同是因为 lite 按设计不含 editor/ 与部分目录。
  • 完整包含 public/assets/local/** 1725 个,且逐个 sha256 与主树相同;日语精简包与源码包 0 个。
  • 完整包内中文文件名由 Windows tar 写入,用**本地代码页(CP936)**且未置 UTF-8 标志位
    —— 与 0.18.2 / 0.18.3-0.2.5 一致。

怎么装

  • 完整包(Windows 便携):解压 → 根层双击 启动游戏.bat(启动编辑器.bat 开工坊编辑器、
    安装工坊包.bat 装包)→ 浏览器自动打开 http://localhost:3000。自带 Node 运行时与 editor\,
    目标机不需要装 Node;自带四国语音与全部美术,不用再跑 npm run setup,也不用叠补充包。
  • 日语精简包:解压 → 根层双击 启动游戏.bat;需要系统 Node 22+,第一次启动跑 npm run setup
    下载约 550 MB 素材;语音只有 jp。官方 3D 棋盘场景与少数 HUD / 替身模型来自本机客户端
    (没有就用 2D 棋盘与相似替身)。
  • 要四国语音又要小体积:把 voices-cn-en-kr.zip 解压叠到日语精简包上(补齐 cn / en / kr;默认语种
    仍是 jp),覆盖同名文件即可。
  • 源码包:不含美术(仓库里本就没有美术字节);装上后按 README.md 走 npm ci 与 npm run setup。
  • 增量更新包:给已装 v0.18.3-0.2.6 的人 —— 解压后把 app\ 覆盖到旧安装的 app\(同名覆盖),
    你原有的美术与设置不动。不要把它叠到 v0.18.3-0.2.5 上(那是上一版的起点,版本对不上)。
  • 联机:建房后分享 4 位房间码或 ?room=KEY 链接;局域网用启动时打印的地址,否则用虚拟局域网 / 隧道 / VPS
    —— 见 docs/DEPLOY.md。

如实说明

  • 这次修的是什么(根因):上一版把第三方 UI 包的 CSS 反向追加到引擎规则之后(包版规则靠后生效)
    ⇒ 大厅两栏塌成单列、文本框大小不一、座席滑杆被压窄;本版按 UI 包自己的 AGENTS.md 正规安装
    (5 个文件整份替换 + 把我们的本地改动逐条移植进包版 + CSS 以包版为底、我们的增量追加末尾)。
  • 协议未动:保我们的 room.setSeatCap;包版 room.setMaxSeats 控件自动隐藏,已替换为我们的滑杆。
  • 包版删掉的「添加 AI 队友」入口我们补回了(只补入口,发既有的 room.addBot / room.removeBot,
    协议与服务端一字未动)。
  • 7 个 compat 垫片里 3 个不再与包原件逐字节相同(public/js/ui/accounts.js、public/js/ui/matchmaking.js
    各加 t() 包装;shared/randomMode.js 用 N_())—— 因为本仓库 test/i18n.test.js 扫全量、
    界面中文必须走 t() / N_();其余 4 个逐字节相同。
  • optional/room-card(名片干员同步)本版未装:需改 shared/protocol.js + server/lobby.js 并重启
    ⇒ 与「本版不动协议」冲突,且它是新增增强、不是丢失的功能 ⇒ 记为以后可选。
  • 5 处断言改动只针对旧 DOM 形状与被包版取代的文案 / 事实表,行为断言一条未放松。
  • 判据:冻结树上全量 8816 tests / 8811 pass / fail 0 / skipped 5(--test-concurrency=2)。
  • 资产的产出与核验口径:① 由仓库自带 scripts/make-windows-bundle.mjs
    (--all-dubs --release 0.18.4-0.2.6)出便携目录后压 zip;② 由 scripts/make-voice-pack.mjs --langs=cn,en,kr
    产出;③ 由 git archive 于冻结树 7a311a21 导出(文件集 == git ls-files,1794 个);
    ④ 由 tools/package.mjs --lite 出精简树后补入 public/assets/audio/voice/jp/**(2688 个文件)
    与根层三个说明文件再压 zip;⑤ 由 scripts/make-update-package.mjs 产出(起点 = v0.18.3-0.2.6 的
    -win-x64 包)。打包脚本一个字节没改。
  • zip 目录条目的一处差异(如实说明):③ 与 ④ 的 zip 由 Windows tar(bsdtar)封装,带目录条目
    (③ 84 个、④ 746 个);上一版这两个包由不写目录条目的封装产出(0 个)。**文件集与内容一致、解压结果相...
Read more

v0.18.3-0.2.6

Choose a tag to compare

@XiaMo233M XiaMo233M released this 13 Oct 14:19

⚠️ 本版(0.18.3-0.2.6)大厅 UI 有回归(两栏塌成单列 / 文本框大小不一 / 座席滑杆被压窄),资产已下架,请用 v0.18.4-0.2.6。

v0.18.3-0.2.6 — 底座抬到上游 0.2.6

本仓库 0.18.3 + 上游游戏本体 0.2.6。shared/constants.js 的 UPSTREAM_VERSION 由 '0.2.5' 抬到
'0.2.6';APP_VERSION(0.18.3)、PROTOCOL_VERSION(2)、MOD_API_VERSION(1)一个都没动 ——
上游这一版没有改推送帧的形状,也没有改包能写的接口面。

本文件即 v0.18.3-0.2.6 的 release 正文。打 tag / 建 release / 传资产在业主明确授权后执行。

基线

项 值
引擎主树 HEAD c09886455aabbb47d0f93a81af852207903ea532
origin/main(fetch 后本地实引) c09886455aabbb47d0f93a81af852207903ea532
远端实引 git ls-remote origin refs/heads/main c09886455aabbb47d0f93a81af852207903ea532
对齐方式 git merge --ff-only origin/main(8d3e1b90 → c0988645,ff 成功,无 force/rebase/reset)
git status --porcelain 0(无未跟踪项)
发版后 main tip 2303e44de7adf7fd8855e635087a09faaf9b2a6b
推后远端实引 git ls-remote origin refs/heads/main 2303e44de7adf7fd8855e635087a09faaf9b2a6b(与本地一致)
并入方式 3 次 git merge --no-ff:readme-engine(4 笔) → knife24-pkggate(1 笔) → knife23-i18n(3 笔);每笔都是 origin/main 的直系后代,推送全部快进,无 force / rebase / reset / amend
发行 tag v0.18.3-0.2.6(annotated;tag 对象 a6a8ddf0985bf43ffc472401c1e94ce0d79348f0,指向 2303e44de7adf7fd8855e635087a09faaf9b2a6b)
远端 tag 实引 git ls-remote --tags → a6a8ddf0… / peeled 2303e44d…

上游这一版带来了什么

上游 0.2.6 是 93 个文件 / +5750 −254 行 / 58 个提交(以 git diff v0.2.5 v0.2.6 为准;上游更新包
UPDATE.json 只记 67 个文件,一律以 diff 为准)。

规则面只有一条(魂灵之影只落在场上的部署格,#557 / PR #558),其余全是流量、渲染与界面:

  • 减轻开服电脑的流量:静音时不下载背景音乐;1 KB 以上的 WebSocket 消息压缩(permessage-deflate,
    不做服务端 context takeover);素材地址带内容哈希长期缓存;brotli;教程图改用 WebP;
    /healthz?traffic=1 与诊断里的下载量行。
  • 画面:官方场景光照改回官方值(#549);显示官方场景时补画射击台 / 特制水上平台 / 封印的地面(#569);
    单位多时缓存画面裁切与残影的修正(#542)。
  • 界面/流程:最后一个还没选策略的玩家不再看到可点的「跳过」(PR #546);每回合开始按部署顺序重播
    入场动画与落地音(PR #416);设置新增「弹药数量」(PR #552,默认关)。

逐条的依据、实测数字与 [ASSUMED] 标记写在 docs/history/0.2.6.md(我们这边是 §33;上游自己那一章是
它的 §31,我们的章节号是全局的,已用到 §32)。

我们怎么吃的:四批,各自有判据

上游那一版同时动了资源、服务器、客户端渲染与文档,我们的树在这些方向上各有自己的改动,所以没有整份照搬,
按四条互不重叠的线进场,每条线都真跑判据(不是「文件在、行为是旧的」):

批 内容 判据
① 美术资源批 上游缺的 114 个本地客户端文件落进 public/assets/local/**;data/local-assets.json 同步更新;各战场官方场景可提取 与完整资源包逐文件同哈希(本机共 1725 个文件);11 个战场逐个 headless Edge 真渲染,pageerror 0 / console error 0 / HTTP≥400 0
② 服务器流量层 取上游新增的 shared/assetPaths.js 与 server/http/{assetIndex,assetViews,traffic}.js 及四个测试;index / routes / static / websocket / config / files / media 留我们的骨架、接上游的能力 test/{asset-index,asset-paths,traffic,ws-compression} 全绿 + 既有全量 fail 0
③ 客户端渲染与设置层 §33.5–§33.11 那几件事;render/{spine,impostor,materials}.js、render/app/tune.js、screens/bandDraft.js、ui/guide.js、ui/fieldHost.js、ui/gameLogic/phases.js、server/sim/**/op-wisdel.js、tools/local-extract/extract.py 与上游逐字节相同直接取;render/units.js、board3d/{scene,layout}.js、ui/settings.js、ui/gameLogic/settings.js 做三方合并 test/render 661 条 / 0 红、test/ui 843 条 / 0 红、六族 golden 一次没动、全量 fail 0
④ 文档与版本次 UPSTREAM_VERSION 抬号、CHANGELOG.md、README.md、docs/DESIGN.md 章节表与版本段落、docs/history/0.2.6.md(§33)、docs/prompts/* 基线声明 test/docs-paths.test.js + test/promptBaseline.test.js + 牙证明(见下)

接线层也必须一起走:test/render 的两条判据只认 0.2.6 的 render/app.js,而「落地音」需要
audio.js deployCue、回合开始重播需要 screens/game.js 接 roundStartReplay、ui/gameLogic.js 要转发
deployOrder —— 这几件在上游那一版里同属一条改动,漏一件判据就红。

牙证明(判据真的会红,不是摆设):把 UPSTREAM_VERSION 改回 '0.2.5' ⇒ test/docs-paths.test.js
当场红;把 README.md「本仓库当前的底座」改回 0.2.5 ⇒ test/promptBaseline.test.js 红并点名 README.md:638;
把 lobby.js 里 seatCapRange 的接线去掉 ⇒ test/roomSeatCap.test.js 红(max: 4 对 max: 20)。

我们保留 / 增强的(一条都没丢)

  • mod 层 §28:shared/{workshop,modSurface,enabled,packForms}.js、server/{lobby,modModules}.js
    本版一个字没改;形态增量通道(formsFor,§28.29) 在上游整份重写的 render/units.js 里重新贴回
    (上游为底 + 我方那三处)。
  • 工坊与大厅那一层:ui/{transitions,hubBackdrop,matchFlow,protocolScene}.js、screens/sweep.js、
    public/css/** 未改。0.2.6 换了客户端渲染底层,所以专门做了 **「UI-B × 0.2.6 联跑」**复验:
    大厅 / 房间 / 编队三页 pageerror 0、console error 0,五件独有功能(座位上限滑杆、快速匹配、
    助战入口、房间模组回显、聊天)逐项实测在位可用,四个导出仍在,三视口预算(1440×900 / 1366×768 /
    1280×720)全 GREEN。
  • UI-Hub 与六类分类:站点与 hub 面的既有分类(实用 / 拓展包 / 游戏玩法 等用途分类)与 UI-Hub 接线不动。
  • 以新为准:站点内容面的「以新为准」口径不变(新件覆盖旧件、旧件转 superseded、零删除)。
  • i18n 走管线,不照抄文件:我们的语言包比上游多 122 个键,直接拿上游 json 会整片删掉。上游本版新增的
    两条(「弹药数量」与它的说明)按 tools/i18n.mjs 规矩补进四个语言包;en 100 % / 0 errors。
  • 协议与包接口面不动:PROTOCOL_VERSION 仍 2、MOD_API_VERSION 仍 1。

本地美术(1725 个文件)说明

  • 来源:官方素材,由 tools/local-extract/extract.py 从本机《明日方舟》客户端提取。

  • 分发口径:仅本地、不随源码分发。public/assets/ 在 .gitignore 里(.gitignore:10),
    仓库里一个美术字节都没有。只有完整包带上它们;源码树 / 仓库永远不含。

  • 构成(本机实测):

    子树 文件数
    public/assets/local/ui/ 1208
    public/assets/local/module/ 137
    public/assets/local/spine/(enemy/ 6 + token/ 120) 126
    public/assets/local/scene/ 92
    public/assets/local/map/ 77
    public/assets/local/guide/(19 张 .png + 19 张 .webp) 38
    public/assets/local/emoticon/ 36
    public/assets/local/mesh/ 10
    public/assets/local/projectiles/ 1
    合计 1725

    另有两处细节:spine/token/ 是 40 个 token 目录 × 3 个文件(.skel + .atlas + .png)= 120;
    scene/ 覆盖 12 个目录 / 11 个战场(92 个文件,含 scene/tex/)。

  • 配套清单:data/local-assets.json(75 个组 / 1658 条资源条目)逐条指向这些文件;
    完整包同时带上这份 json。日语精简包与源码包都不带 public/assets/local/**,也不带 data/local-assets.json。

  • 没有客户端时:优雅退化 —— 用程序化 2D 棋盘与相似替身,玩法不受影响。

五包校验值(冻结实测)

本次发 5 个资产,构建树冻结在 19b0e8ef(= c44f04c3 + 语音包说明文案一笔,功能等价)。字节 / sha256 / 文件数在冻结后独立复算,并逐个从线上用 Range: bytes=0-1048575 回核(五个全 HTTP 206、size 与本地逐项相等):

# 资产 文件名 字节 sha256 zip 内文件数
① 完整包 / Windows 便携(四国语音 + 全部美术 1725 + 自带 node.exe + editor\) Stronghold-Protocol-Forge-0.18.3-0.2.6-win-x64.zip 777,596,572 1541fcc840ded04edf0497ff2cd6a055534485818a345266abff4f815356c498 24,613
② 语音补充包(补齐 cn / en / kr) Stronghold-Protocol-Forge-0.18.3-0.2.6-voices-cn-en-kr.zip 212,041,380 da73ecb161d418c7f3d418fd6bdadb6ef05316fca4476e7c26948d6611fb310c 7,785
③ 源码包(含 editor/) Stronghold-Protocol-Forge-0.18.3-0.2.6-src.zip 18,149,877 ad71f301376dfa9b555a0c2f62e1f6a0b8377bd471849af4ea8630c7aa7022a3 1,788
④ 日语精简包(只带 jp 语音、不含美术) Stronghold-Protocol-Forge-0.18.3-0.2.6-lite-jp.zip 105,464,601 f204b91fb069bce324b84ccac7b9a4a6c24e3c9fbf397c0fb84a2d249548dc49 9,275
⑤ 增量更新包(从 v0.18.3-0.2.5 覆盖上来) Stronghold-Protocol-Forge-0.18.3-0.2.6-update.zip 264,200,101 76d1fdcec6f4edfc79b2d2db2f504edd5631e95a11c3f42d1210afee69d1ff33 7,974

与 0.10.0 的口径差异(重要)

项 0.10.0(旧口径) 本次 v0.18.3-0.2.6
完整包里的语音 只有 jp(约 85.2 MB) 四国语音全量自带:cn / jp / en / kr
voices-cn-en-kr.zip 的角色 主分发路径:不装它就没有 cn / en / kr 补齐型:给「只带 jp」的日语精简包补上 cn / en / kr
小体积包 lite(无美术、无语音) 日语精简包:带 jp 语音、不含美术
资产集 2 个:-update.zip + -src.zip 5 个:完整包(Windows 便携)+ 语音补充包 + 源码包 + 日语精简包 + 增量更新包

⇒ 完整包解压即四国语音齐,不必再叠补充包;「日语精简包 + 语音补充包」叠放后,语音集与完整包一致。

  • 完整包与(本次不发布的)lite 包的 MANIFEST.json 逐字节相同:0dbc62dea70db13dba3e6cba630c7f3dbaf2e73540d5455c158fe2a0b10726a1
    (app: 0.18.3,各列 6582 个文件;美术由 npm run setup 管理,故不入 MANIFEST —— 与工具口径一致)。
  • 完整包含 public/assets/local/** 1725 个,且逐个 sha256 与主树相同;日语精简包与源码包 0 个。
  • 关键文件自核(zip 内解出后与主树比对):shared/constants.js、server/http/traffic.js、
    public/js/render/spine.js、public/js/render/units.js、data/local-assets.json 全部 SAME;
    package.json 按设计不同(出包阶段按 tools/package.mjs 规则重写 script 表,版本号仍是 0.18.3)。
  • 包内 shared/constants.js 实物读出 UPSTREAM_VERSION = '0.2.6'。

怎么装

  • 完整包(Windows 便携):解压 → 根层双击 启动游戏.bat(启动编辑器.bat 开工坊编辑器、
    安装工坊包.bat 装包)→ 浏览器自动打开 http://localhost:3000。自带 Node 运行时与 editor\,
    目标机不需要装 Node;自带四国语音与全部美术,不用再跑 npm run setup,也不用叠补充包。
  • 日语精简包:解压 → 根层双击 启动游戏.bat;需要系统 Node 22+,第一次启动跑 npm run setup
    下载约 550 MB 素材;语音只有 jp。官方 3D 棋盘场景与少数 HUD / 替身模型来自本机客户端
    (没有就用 2D 棋盘与相似替身)。
  • 要四国语音又要小体积:把 voices-cn-en-kr.zip 解压叠到日语精简包上(补齐 cn / en / kr;默认语种
    仍是 jp),覆盖同名文件即可。
  • 源码包:不含美术(仓库里本就没有美术字节);装上后按 README.md 走 npm ci 与 npm run setup。
  • 增量更新包:给已装 v0.18.3-0.2.5 的人 —— 解压后把 app\ 覆盖到旧安装的 app\(同名覆盖),
    你原有的美术与设置不动。
  • 联机:建房后分享 4 位房间码或 ?room=KEY 链接;局域网用启动时打印的地址,否则用虚拟局域网 / 隧道 / VPS
    —— 见 docs/DEPLOY.md。

如实说明

  • 出包时的个人账号名检查:tools/package.mjs 默认会拿本机账号名扫一遍出货文件。本机账号名恰好是
    Administrator,而 scripts/install-service-windows.ps1:39 里有 PowerShell 内建角色常量
    WindowsBuiltinRole]::Administrator —— 撞名,是误报。证据:该文件的 blob 在 ff 前后逐字节相同
    (be892e3c…,2026-10-06 起未改),且独立核对确认全量出货文件(18500 个)与 lite 出货文件(715 个)里
    只有这一处出现该字符串,没有家目录路径。因此出包时按工具自带的办法设了 SP_PACKAGE_SCAN_USER=0
    (只跳过「OS 账号名」这一项,家目录路径检查与 node_modules 扫描照常;各包最终都报
    home paths only (no account name to refuse) / checks: ok)。这条要在报告里点名。
  • 资产的产出与核验口径:① 由仓库自带 scripts/make-windows-bundle.mjs(--all-dubs --release 0.18.3-0.2.6)
    出便携目录后压 zip;② 由 scripts/make-voice-pack.mjs --langs=cn,en,kr 产出;③ 由 git archive 于冻结树
    19b0e8ef 导出(内容 == git ls-files);⑤ 由 scripts/make-update-package.mjs 产出(起点 = v0.18.3-0.2.5 的
    -win-x64 包)。五个包都做了「解压后真起服务」的冒烟:/healthz、/mods/catalog.json、/api/rooms、
    /data/assets.json 全 200,① 的本地美术 200 且 sha 与主树一致;⑤ 走的是真实升级路径
    (0.2.5 安装 16,694 个 app 文件 → 覆盖后 24,605 个 → 起服务四接口全绿)。
  • 资产命名已统一:五个资产都按仓库既定形式 Stronghold-Protocol-Forge-<forge>-<upstream>-<kind>.zip
    (kind ∈ win-x64 / voices-cn-en-kr / src / lite-jp / update),与 v0.2.0 → v0.18.3-0.2.5
    的全部历史 release 一致。(上一版把④⑤之外的包名省了上游段,本版已纠正。)
  • 玩家包格式已回到官方便携格式:根层 启动游戏.bat / `启动编辑器...
Read more

v0.18.3-0.2.5

Choose a tag to compare

@XiaMo233M XiaMo233M released this 13 Oct 05:01

v0.18.3-0.2.5 — 四个包第一次包含「创意工坊说明」

本仓库 0.18.3 + 上游游戏本体 0.2.5(上游这一版没有改动)。

这一版的要点

① 创意工坊说明随包发出(业主原话:「发布四个包,并且包含创意工坊说明」)

此前四个包里一个字都没教人做包 —— 包内有 200 KB 级的 docs/WORKSHOP.md,那是规则不是入门,
而且界面里没有任何一句话指向它。现在包里带上完整入门层:

想知道什么 包内位置
四步做一个包(复制模板 → 改三处 → 导出 → 上传) app/docs/START-HERE.md
报的错码是什么意思 app/docs/errors.md
只想换一张立绘 app/docs/task-01-换个立绘.md
想加一名新干员 app/docs/task-02-加个干员.md
可复制的模板包本体(真跑过:装载器 packs=1 errors=0、校验器 VALID、导出 575 B 且 pack.json 在根) app/docs/my-first-pack/
字段的完整定义、所有能改的位置 app/docs/WORKSHOP.md

包内入口两处:包根 README-开箱即用.md 新增「做自己的工坊包(创意工坊说明在这里)」一节,
以及打开 app/workshop/ 就能看到的 README.md 首行。同步纪律写在 START-HERE.md 顶部:
这一份与源码仓库的 BEGINNER.md 同源,改一边要改另一边。

② 界面改进

业主说过「界面没优化过就一起优化」。侦察结论是界面改过一轮,但真缺口三处,本版都补上了:

  • A5(回报最高) 新增 十条错误码白话表(EMPTY_PACK / PACK_ID_COLLISION / ASSETS_NEED_LICENSE /
    PACK_ID_MISMATCH / PACK_UNKNOWN_FIELD / BAD_API_TYPE / ART_NEEDS_ASSETS / TRAIT_GRANT_BAD_SHAPE /
    TRAIT_GRANT_EMPTY / TRAIT_GRANT_UNKNOWN_BOND),每条「一句人话 + 一条修法」,在包管理页与干员页两条
    渲染路径上接线。查不到就回落显示 [CODE] 原文,绝不静默 —— 引擎里有一百多条码,没进表的那些不能让
    作者看到一片空白。
  • B1 包管理页新增 「校验这个包」 按钮:第 3 层「真引擎装载」第一次在界面上可达(此前只有
    加载器接受 / 已被拒绝 两个徽标,没有「按一下给我结论」这个动作)。它调的是与
    node tools/workshop-validate.mjs 同一个函数——判据本体搬进了 shared/workshopValidate.mjs,
    所以「界面说装得上、命令行说装不上」结构上不可能发生。只读:不写任何文件、不改 pack.json。
  • A1 包管理页的「说明」面板给五份文档入口(服务端早就把 /docs/**.md 只读地挂出来了,界面一直没链)。
  • A2 九个页面顶栏共用加 「帮助(五分钟上手)」。
  • A3 导出按钮改成 「导出投稿件」,并补一句「这个 zip 的形状就是站点要的:pack.json 直接躺在
    最外层,不要手工重压」—— 堵住「我要不要再套一层文件夹」那个死结。
  • A4 覆盖同名包(--force) 改成 「覆盖机器上同名的包(危险:会先删掉 workshop/<包id>/ 里已有的那一份)」。
  • A6 「以模板新建」的副标题补上它不是「改官方那位」:换官方干员的立绘 / 数值走
    「包管理 → 覆盖官方记录」。
  • 一处订正:Mods 仓 README.md 那句「在游戏的工坊界面能看到它」与代码不符
    (public/js/screens/ 的 24 个屏里没有工坊屏),已改成实况:看启动日志 [workshop] applied <n> pack(s)
    与游戏内容变没变;改完必须重启服务器。

保留的既有能力一条没动:保存元数据 / 导出 / 导入 / 试玩 / 覆盖同名包 / 一键补 license / 加载器徽标,
9 页与包管理页全部照旧。仍然零依赖、单文件、无前端构建、无外链 CDN·字体·图片、内网可用。

③ 校验器同源

判据原先整个住在 tools/workshop-validate.mjs,而那是维护者工具(不在 tools/package.mjs 的
PLAYER_TOOLS 里、不随玩家包发出)—— 编辑器服务端 import 它会当场崩,所以界面拿不到第 3 层。
本版把判据搬进 shared/workshopValidate.mjs,CLI 变成薄包装。--json 的报告形状与字段一字未改,
只加了一层 checks[] 给界面用;收尾还加了一条计数自检(同一件事被数两遍会当场抛错,而不是安静地
给一个翻倍的总数)。

四个资产

资产 字节 sha256
Stronghold-Protocol-Forge-0.18.3-0.2.5-win-x64.zip 514,517,893 f8e20aad18d991bf533c902ceec81209f0937bcab321dc2c8ba567f0bfe622e2
Stronghold-Protocol-Forge-0.18.3-0.2.5-update.zip 824,252 0502caa44f4cfcac608f127d5ea9a61304747c62257d08983992ed2ab397fb0f
Stronghold-Protocol-Forge-0.18.3-0.2.5-src.zip 17,821,281 f553b9917a190db9ed1cdc0b23556a3d1069ad7080a84edbf93eae9e6c1e69bf
Stronghold-Protocol-Forge-0.18.3-0.2.5-voices-cn-en-kr.zip 212,041,192 6a3ce15486402e84c110b78e06fa4c608eff7c0b3e2200885e0bbf37c6570481

怎么装

  • 升级包:基于 v0.18.2-0.2.5 的完整包(这是它唯一的基准),解压覆盖到现有安装即可
    (app/UPDATE.json 说明从哪来、到哪去,启动时自动校验)。内容:37 个 app 文件 + 1 个包根文件
    (README-开箱即用.md),并写明 1 个不再需要的旧文件。
  • 完整包:解压后双击 启动游戏.bat 开服,双击 启动编辑器.bat 开工坊编辑器。
    包内只带日语配音(与 0.18.2 相同);中文 / 英文 / 韩文配音走语言包。
  • 语言包:解压后把 voice\ 覆盖到 app\public\assets\audio\voice\ 就装好了,不用改配置
    (zip 内条目名是正斜杠,voice/cn/…)。没装也能玩:选了没装的配音时会回落到默认配音那一句。
  • 源码包:git archive 自最终的 main(6b6c8dcb),git 仓库本身不在包内。

如实说明

  • 官方战场(3D 棋盘的场景)需要本机客户端提取:没有客户端时优雅退化为程序化战场(金属地块),
    玩法不受影响。本机已经提取过的资产会自动进完整包 —— 本次打包机上没有《明日方舟》客户端,
    所以这一版的完整包不含 public/assets/local/scene/,和 0.18.2 一致
    (本机已有的 public/assets/local/** 与 data/local-assets.json 照常随包发出)。
  • 三份示例夹具包(docs/examples/clementia / demo-workshop / kit-demo)是给校验器用的冻结基线,
    它们的哈希被三条测试钉着;所以可复制的模板包另放 app/docs/my-first-pack/,一个字节都没动那三份。
  • #470 本版有意拒(不在这一版范围内)。
  • 完整包内文件名由 Windows 的 tar 写入,**中文名用的是本地代码页(CP936)**且未置 UTF-8 标志位
    —— 与 0.18.2 及更早版本一致(解压出来是对的,只有用程序读条目名时才需要按 CP936 解)。

v0.18.2-0.2.5

Choose a tag to compare

@XiaMo233M XiaMo233M released this 13 Oct 03:24

**补丁版:把从来没跑过的两套浏览器 E2E 真跑一遍,并修掉渲染套件挡住它们的那处基座缺陷。**上游游戏本体仍是 0.2.5。

这一版改了什么

  • 渲染测试基座按平台选 GPU 后端:test/render/{board3d,fieldview,recovery}.browser.test.js 原先硬编码 --use-angle=metal(macOS 的 ANGLE 后端)。Windows 上 ANGLE 因此回落到 Microsoft Basic Render Driver(WARP 软件),产品自己的 webgl2Available()(要 failIfMajorPerformanceCaveat 上下文)拒绝它 ⇒ 3D 棋盘 on:false 而 error 为空,38 条 board3d 判据只报一句 3D board on ()。三处启动参数改用仓库里早就有的 gpuArgs();断言一个字没动。
  • 新增基座自检 test/helpers/gpu.mjs:开跑前建一个 failIfMajorPerformanceCaveat 上下文并读出 UNMASKED_RENDERER_WEBGL,拿不到或后端是 WARP / SwiftShader / llvmpipe 就点名后端当场失败(test/render/gpu-harness.test.js 5 条纯单测钉住它)。改前 on=false/error=null,改后 on=true, calls=9, fps=200,自检打印 NVIDIA GeForce RTX 5070 Ti (D3D11)。

验证实况(不是「全绿」,两套 E2E 此前从无基线)

  • 静态检查对基线:eslint 0 errors / 218 warnings · tsc --checkJs 6 errors(shared/formProjection.js 4 + shared/morph.js 2)· check:imports 3 处(server/sim/nodeData.js 的 node:fs/path/url)—— 与基线逐条一致。
  • RENDER_E2E:修基座前 150 条 102 过 / 47 红 → 修后 141 过 / 8 红。SP_E2E:231 条 202 过 / 28 红(这一套不经 gpuArgs())。
  • 75 条红逐条归因:把同一批文件拿到上游 v0.2.5(cf7a940)的树上、同一台机器、同一套基座再跑一遍 —— 渲染侧 8 条在上游报的是同一句断言(fieldview 那两条是 50 fps 门线上的阈值抖动:49.5 / 49.9 / 42.2 fps 来回翻);SP 侧同 10 个文件上游也红 21 条,我们多出的集中在 loadout(本仓库 0.7.1 起的多语言配音会让浏览器把没播的配音标成 ERR_ABORTED,而上游后来那条「页面零请求错误」判据只认空数组 —— 本仓库自己的 kitimports 判据反而显式过滤 ERR_ABORTED)。没有一条能归到本版引入的回退。
  • 全量 node --test --test-concurrency=4:8648 条 / fail 0 / skipped 6;golden 六族全 match(roster 49 · bonds 46 · fields 22 · matches 20 · standins 10 · diy 140,未用 golden:update);mod 闸门 exit 0(packs/ 8 个 + demo/ 3 个全部装上)。

⚠️ 官方战场场景:需要先提取

没有本机《明日方舟》客户端就提不出官方战场场景(本版实测):node tools/setup.mjs --scenes 退出码 0 并报「没有本机客户端,不能提取战场场景(贴图仍取自客户端)」;python tools/local-extract/fetch_scenes.py 退出码 0、33/33 个包、落盘 29,714,076 字节;extract.py --only scene 退出码 2(材质与网格取自客户端),加 --game 指向下载目录也只落盘 0 个文件。

没有提取时游戏照常运行:3D 棋盘优雅退化为程序化金属地块。有客户端的电脑跑一次 node tools/setup.mjs --scenes 即可,之后再打包,完整包会自动带上已提取的本地资产(实测 v0.18.1-0.2.5 完整包内 app/public/assets/local/** = 1611 个文件 / 70.3 MB,app/data/local-assets.json 在位)—— 也就是谁有客户端谁提取,他打出的完整包就自带战场。

怎么装

  • 完整包 …-win-x64.zip:解压 → 双击 启动游戏.bat(内置 Node 22,目标机器什么都不用装)。包里只带日语一套干员配音(清单的默认配音是 jp)。
  • 其余配音 …-voices-cn-en-kr.zip:解压后把 voice/ 覆盖到 app/public/assets/audio/voice/(正斜杠)。装好后 设置 → 配音语言 选全局默认,任何干员的 干员详情 → 配音 还能单独换一种。没装也能玩(自动回退默认配音)。
  • 升级包 …-update.zip:基准是 v0.18.1-0.2.5 —— 只适用于从 0.18.1 升上来。停服 → 解压覆盖到既有目录 → 再启动(首次启动会清掉新版本删掉的文件并校验安装)。从更早版本升请用完整包。
  • 源码包 …-src.zip:git archive 于本次发布的提交 3da89318dcf6f29553600afc79a60f2e9ec6797c。

四资产

文件 字节 sha256
Stronghold-Protocol-Forge-0.18.2-0.2.5-win-x64.zip 514,468,801 86c93b593532361cef71f8ee63879053e03b3d9864c982e305fb664192bcbdad
Stronghold-Protocol-Forge-0.18.2-0.2.5-update.zip 523,388 1151c5aa3399c9ea4abeaf74f91ef183cd39f2627670bf8b53d5d475774fec03
Stronghold-Protocol-Forge-0.18.2-0.2.5-src.zip 17,769,008 2f97d1f6cbe922b9325099c9b9045fc605655b90dffda2d30f221b9ae23f259f
Stronghold-Protocol-Forge-0.18.2-0.2.5-voices-cn-en-kr.zip 212,041,192 4101d08a77e2b6966c552fd994cfc3deefbf403a3989d46790d4d3e7466819be

说明

  • 本项目是玩家自制的非官方同人作品,与 Hypergryph / Yostar 无任何关系;素材版权归原权利人,严禁任何形式的盈利。详见 NOTICE.md。
  • 上游游戏本体 0.2.5,发行 tag 读作 v<Forge>-<上游>。
  • #470(商店装备槽偏置之外的核心盟约优先 / 骑士戒律接入两条)有意拒,未实现也未读取。

v0.18.1-0.2.5

Choose a tag to compare

@XiaMo233M XiaMo233M released this 12 Oct 22:15

Stronghold-Protocol-Forge v0.18.1-0.2.5

v0.18.0-0.2.5 的补丁版:把那一版的资产里没有的三笔补齐。本仓库自己的版本是 0.18.1,上游游戏本体仍是 0.2.5(底座没动),发行 tag 把两半都写出来。

和 0.18.0 的关系:0.18.0 那次发布时,池权重数据、落上游 0.2.5 的 test/match/pool.test.js 与三笔文档欠账都还没进包 —— 0.18.0-0.2.5 的完整包里跑的仍是旧的池权重与旧的打包脚本。要这三笔就装这一版;只用 0.18.0 也能玩,只是这几笔缺失。

本版补齐的三笔

① 池权重数据 + 判据 + golden 重算(上游 0.2.5 的 PR #497)

  • tools/build-data.mjs 与上游 0.2.5 逐字节一致:pool_equip_rockr 由「4 件均匀」改为路标月报 #2 实测的八件加权(维式重锤 10 / 战栗维式重锤 2 / 坚固维式重锤 2 / 加速维式重锤 2 / 灼燃维式重锤 2 / 有限加速器 1 / 护盾无人机 4 / 激光发射器 4),pool_char_pinus 由 45/45/10 改为 10/10/3。
  • data/choices.json 由 node tools/build-data.mjs --offline 重跑生成(未手改产物):16 个池里只有这 2 个变。
  • test/match/pool.test.js 落上游 0.2.5 的版本:单跑 11 条真绿(不是跳过)。
  • 六族 golden 里只有 matches 变、恰好 6 个场景移动:coop2-NORMAL-1-coverage-standins · coop2-NORMAL-3 · coop2-NORMAL-8-serverrun · coop3-ABYSS-5 · coop4-ABYSS-7 · coop4-FUNNY-6。没有用 golden:update —— 在仓库外生成六份、校验定义集与移动集合后才拷回;场景 id 与 about / fast 逐字不变,UNEXPECTED 0 / PENDING 0。其余五族逐字节未动。

② 三笔欠账

  • 打包脚本加「工作区必须干净」守卫:make-windows-bundle.mjs 与 make-update-package.mjs 共用一份实现 —— 清单来自 git ls-files、内容来自磁盘,有未提交改动就拒绝打包(--allow-dirty 显式放行并打印风险)。这就是为什么这一版的包与 tag 对得上。
  • docs/WORKSHOP.md 的历史双编号收掉:目标引擎(target)一节由 §1.23 改号为 §1.26(§1.23 归「逐格加开关」),并新增守卫断言「无重号编号标题」—— 判据钉在号上,因为重号的两节标题文字必然不同。顺带把两处闭集数字按实测改准(顶层键 34 → 35)。
  • docs/img/*.svg 的 5 处陈旧 / 矛盾修正:cap-01-layers.svg 的「上游 0.2.4」→ 0.2.5、「behaviour(表空)」→ 实况 4 格、补 target 与依赖 / 互斥、「mod 仓库(25 条)」→ 以 mods/index.json 为准(实测 30);cap-02 的「顶层键 32」→ 35;cap-03 的「今天 3 个包」→ 8。

③ 两份 README 与 mods 仓库

  • 引擎仓库 README.md:「Forge 现在能干什么」补四行已合入的面(特质授予盟约 §28.49 / 宿主 lane §28.44·45 / target §28.46 / 依赖与互斥 §28.48)与登记册一行(§28.47,注明编辑器未接);「还不能做什么」写明编辑器未接登记册、server.modules[].channels 不存在、没有热重载三条;能力图与能力总表按实况对齐。
  • mods 仓库 README.md / SKILL.md / AGENTS.md / UPLOAD.md:trait.grantsBonds 由「在途 / 未合入」改为已可用(§19.7,三个读取点都调同一份判据)。

四个资产

资产 字节数 sha256
Stronghold-Protocol-Forge-0.18.1-0.2.5-win-x64.zip 514463531 3a04a653f47a531f4e31a9381132542db240bca6ef8a6c6bc699af47a7dc0cf7
Stronghold-Protocol-Forge-0.18.1-0.2.5-update.zip 903667 6bab27343da7b781bd1e8c24a75309f6e391773f6e6d55ba7189f9d0fbeb6aa9
Stronghold-Protocol-Forge-0.18.1-0.2.5-src.zip 17759233 036e04bc681878c4626b72f683efdca9759555753aaa61c0443a0404c8a17e55
Stronghold-Protocol-Forge-0.18.1-0.2.5-voices-cn-en-kr.zip 212041192 6f7d3b013c08a148c4e7786743a8393bc540638204f3745e1d4b31ee55be72d9

怎么装

  • 完整包(…-win-x64.zip):解压,双击「启动游戏.bat」开服(编辑器是「启动编辑器.bat」)。只带日语一套配音,其余语种见下面的语言补充包。
  • 更新包(…-update.zip):基于 0.18.0(v0.18.0-0.2.5 的完整包)⇒ 先停服,把它解压覆盖到已有的 0.18.0 目录上再启动。首次启动会删掉新版本不再需要的旧文件并校验安装。从 0.17.0 及更早升上来的,走 0.18.0 那次发布的更新包先到 0.18.0,再用本包。
  • 源码包(…-src.zip):git archive 出的对应源码,无顶层文件夹。
  • 语言补充包(…-voices-cn-en-kr.zip):解压覆盖到 app/public/assets/audio/voice/ 即可(含 voice/cn、voice/en、voice/kr),不用改配置。本包用正斜杠 / 的路径分隔。

如实说明两条

  1. 官方战场场景需要先跑提取步骤才有资产:官方 3D 棋盘、部分官方 HUD 图标、两个敌人模型与 39 个召唤物模型要从本地明日方舟客户端提取。没有资产时游戏优雅退化为程序化(2D)战场,不会崩 —— 完整包已带 data/local-assets.json 与 public/assets/local/ 的 3D 棋盘贴图。
  2. #470 有意拒(明文偏离,官方优先):上游 0.2.5 把「枯朽战士沉默时死亡不留污染秽蚀」的理由改述成维护者的实机回忆,并自己写明它与 PRTS / 游戏内文字「不可沉默」相反。我方按「官方优先」保留旧行为 —— 这两个键可被沉默、沉默状态下死亡不留污染秽蚀,并已用一条具名测试钉住(test/content/enemies_bosses.test.js)。这是本版唯一一处有意与官方不同的调整。

门槛(发布前全绿)

node --test --test-concurrency=4 8642 条 / 8636 通过 / 0 失败 / 6 跳过(263.5 s,两轮一致)· npm run golden exit 0(六份语料 49 / 46 / 22 / 20 / 10 / 140 全部 match)· version / promptBaseline / promptCitations 14 条 · docs-consistency / docs-paths 36 条 · windows-bundle 21 条 · mod 闸门 tools/check-packs.mjs --engine … exit 0。