Repository navigation
Releases: XiaMo233M/Stronghold-Protocol-Forge
Release list
v0.19.1-0.3.1
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)
卫戍协议 · 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(tagv0.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.jsre-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
(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
卫戍协议 · 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(tagv0.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_FIELDS37 → 38:pack.json的顶层键闭集多一格。SERVER_MODULE_USES6 → 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_ASSET6 条):全部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 MBapp/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)。
⭐ 顺手修掉的一个旧毛病:中文文件名编码
上一版(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.js4 个、shared/morph.js2 个),同样是既存问题。
后续进展: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
⚠️ 升级后若图标 / 立绘 / 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.js16 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(id412695667)一个字节没碰,
本次**没有删除...
v0.18.5-0.2.6
⚠️ 升级后若图标 / 立绘 / 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(id412059648)一个字节没碰,
本次没有删除任何资产。
v0.18.4-0.2.6 — 修好上一版的大厅 UI 回归
⚠️ 升级后图标 / 立绘 / 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规矩补进四个语言包;en100 % / 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 个)。**文件集与内容一致、解压结果相...
v0.18.3-0.2.6
⚠️ 本版(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规矩补进四个语言包;en100 % / 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/ `启动编辑器...
v0.18.3-0.2.5
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
**补丁版:把从来没跑过的两套浏览器 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.js5 条纯单测钉住它)。改前on=false/error=null,改后on=true, calls=9, fps=200,自检打印NVIDIA GeForce RTX 5070 Ti (D3D11)。
验证实况(不是「全绿」,两套 E2E 此前从无基线)
- 静态检查对基线:
eslint0 errors / 218 warnings ·tsc --checkJs6 errors(shared/formProjection.js4 +shared/morph.js2)·check:imports3 处(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
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),不用改配置。本包用正斜杠/的路径分隔。
如实说明两条
- 官方战场场景需要先跑提取步骤才有资产:官方 3D 棋盘、部分官方 HUD 图标、两个敌人模型与 39 个召唤物模型要从本地明日方舟客户端提取。没有资产时游戏优雅退化为程序化(2D)战场,不会崩 —— 完整包已带
data/local-assets.json与public/assets/local/的 3D 棋盘贴图。 #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。