《明日方舟》季节性自走棋塔防玩法「卫戍协议:盟约」的非官方同人复刻:浏览器即开即玩,单人或 1–4 人联机合作。
Important
- 本项目是玩家自制的非官方同人作品,与上海鹰角网络科技有限公司(Hypergryph)、Yostar 及其关联方没有任何关系,未获其授权或认可。
- 《明日方舟》及「卫戍协议」相关的名称、角色、美术、音乐、音效、文本与数据等素材,版权归原权利人所有。这些素材不适用本项目的 GPL-3.0 许可证;GPL 只覆盖本项目自己编写的代码。
- 仅供学习交流与个人非商业使用。严禁任何形式的盈利,包括但不限于:售卖本项目或整合包、付费下载或付费分发、收费服务器或收费代开、广告 / 打赏 / 会员等变现方式,以及其他任何商业用途。
- 仓库源码不包含游戏的美术与音频素材(只有由官方数据表生成的数据和几张游戏截图,同样不适用 GPL);Releases 中的整合包为了方便玩家附带了素材,下载即视为同意本声明。请勿将素材用于本项目以外的用途或单独再分发。完整条款见 NOTICE.md。
- 权利人如认为本项目侵犯其权益,请通过 Issue 联系,我们会立即删除相关内容。
- 本项目按「现状」提供,不提供任何担保,使用风险自负。
English summary: below.
| 同盟房间 | 策略轮选 | 休整期(商店 / 盟约) |
|---|---|---|
![]() |
![]() |
![]() |
| 部署方向轮盘 | 作战 | 最终攻势 |
![]() |
![]() |
![]() |
- 声明 · 简介 · 功能一览
- 快速开始:整合包 · 从源码运行 · 系统要求 · 端口与配置 · 局域网联机
- 联机方式 · 操作 · 文档 · 开发与测试 · 项目结构
- 许可证 · 致谢与数据来源 · 贡献
「卫戍协议:盟约」是自走棋 + 塔防:休整期在调度中心招募干员、摆阵、配装备,作战期干员自动部署,迎击从红门涌来的敌人,漏过去的敌人扣目标生命值。本项目在浏览器里复刻了这一玩法,规则和数值尽量对照官方数据表与 PRTS 核对。
- 独立模拟(单人)与同盟模拟(1–4 人合作,没有 PvP;空位可以加 AI 队友)。
- 服务器是一个 Node.js 程序,战斗在各玩家的浏览器里模拟(和官方一样),服务器只管经济与回合,一台低功耗小主机就能开服。
- 当前版本 0.1.1:修复了首个公开版本(0.1.0)发布后玩家反馈的问题,详见 CHANGELOG.md。仍有少数规则按推断实现,与官方不一致的地方欢迎在 Issue 里反馈。
- 完整的一局:确认本局信息 → 策略轮选(40 名策略)→ 14 回合 → 结算称号;险境及以上满足条件时进入第 15 回合「隐秘核心」。
- 4 种难度:标准 / 险境 / 绝境 / 终极,独立与同盟各一套参数,均取自官方数据。
- 休整期:招募、刷新、冻结、升级调度中心;整备区与临时整备区;从整备区拖到棋盘部署,用方向轮盘选择朝向。同盟模拟的卡池共用。
- 晋升精锐:3 名同名干员自动合成精锐,并获得一次高一阶的免费招募。
- 干员与调配:112 名可招募干员(+ 精锐)及其技能、天赋和特质;开局前可以为每名干员选择携带的技能(283 个技能全部手工实现)和精锐的模组。
- 盟约与层数:23 个盟约(8 个势力核心盟约 + 附加盟约),层数整局保留,每个盟约最多 999 层。
- 装备与机变:装备与法术,同名装备合成、特定组合赋予盟约效果;已配发的装备锁定在干员身上。部分回合开始前有机变选卡(装备、资金、干员、层数、悬赏等)。
- 自动作战:技能按官方「技能策略」自动释放;按接触半径阻挡,阻挡者倒下时由接触的干员接替;元素损伤与元素爆发;召唤物由玩家手动摆放;推开 / 拉拽按力度与重量计算;被击倒的干员留在原地显示再部署倒计时。
- 地形与敌人:阻隔工事、射击台、源石流吹风机、沼泽、排气格栅、涨潮等地形装置;空中与近地悬浮敌人、悬赏敌人。
- 联防:有人漏怪、又有人完美作战时,完美作战的队友带着阵容帮忙拦截漏掉的敌人。
- 最终攻势与隐秘核心:两人共享一个战场,全队共同削减同一条领袖血条;10 个敌方领袖,巨型领袖约 5×3 格的受击范围,以及官方的限伤规则。
- 结算称号:卫戍之星、不朽盟约、坚若磐石等 6 个称号。
- 断线重连:同盟模拟断线后 10 分钟内重新打开页面即可回到原座位,掉线期间按原阵容自动作战,也可以「暂离」交给 AI 托管;独立模拟 24 小时内可以回来继续(同一个浏览器)。
- 交互细节:漏怪时顶栏的目标生命值实时减少(结算时确定);点选、拖放和配发装备都按地上的方格;购买、升级和机变选卡都需要点两次确认;只有一名玩家时除作战外不计时。
- 画面与声音:真实 Spine 小人、官方 BGM 与音效、表情(6 套 × 6 个)、作战特效;可选的官方 3D 棋盘(需要从本机客户端提取贴图)。
- 手机与电脑:触摸拖拽、长按查看详情,推荐横屏;设置里可以调低画质。
整合包里已经包含代码、运行依赖和全部美术 / 音频(含官方 3D 棋盘贴图),解压就能玩,不需要再下载任何东西。
- 安装 Node.js 22 或 24(LTS)
- Windows:在 PowerShell 里运行
winget install OpenJS.NodeJS.LTS,或到 https://nodejs.org/zh-cn/download 下载安装包。 - macOS:
brew install node@22,或到官网下载安装包。 - Linux:发行版的包管理器、nvm 或 fnm。
- Windows:在 PowerShell 里运行
- 下载:在 Releases 页面下载最新版本(v0.1.1)的整合包(zip),解压到一个路径较短的文件夹(Windows 上建议不要放在 OneDrive 同步的目录里)。
- 启动
- Windows:双击
scripts\start-windows.bat。如果弹出「安全警告」,点「运行」;Windows 防火墙弹窗请勾选「专用网络」并允许。 - macOS / Linux:在解压出的文件夹里运行
./scripts/start.sh(或bash scripts/start.sh)。
- Windows:双击
- 浏览器会自动打开
http://localhost:3000。窗口里列出的局域网地址可以直接发给同一网络的朋友。关闭窗口(或按Ctrl+C)即停止服务器。
git clone https://github.com/sganggs/Stronghold-Protocol.git
cd Stronghold-Protocol
npm install # 安装依赖(postinstall 会把 pixi / preact / three 复制到 public/vendor)
npm run setup # 检查环境,并从公开镜像下载约 250 MB 美术 / 音频(可中断,再次运行会续传)
npm start # 启动服务器:http://localhost:3000也可以直接运行启动脚本(Windows scripts\start-windows.bat,macOS / Linux scripts/start.sh):首次会自动安装依赖、下载素材,然后启动服务器并打开浏览器。
- 官方 3D 棋盘需要从本机的《明日方舟》PC 客户端提取贴图(Windows 原生客户端、macOS 的 CrossOver 或 PlayCover)。
npm run setup检测到客户端时会询问是否提取(需要 Python 3.8+,依赖装在项目内的.venv-extract,不影响系统);之后可以用node tools/setup.mjs --local重新提取,或用--game "<…/StreamingAssets/AB/Windows>"指定路径。没有客户端时自动使用 2D 棋盘,其他功能不受影响。 - 素材下载优先使用 GitHub,失败时自动改用 jsDelivr 镜像。
npm run doctor(即node tools/doctor.mjs)可以随时诊断:Node 版本、素材是否完整、端口占用、局域网地址和防火墙。
| 项目 | 要求 |
|---|---|
| 开服的电脑 | Windows / macOS / Linux,Node.js 22 或 24(LTS);磁盘约 400–500 MB(素材、依赖与可选的本地提取贴图);内存空闲约 100 MB,每局再加几 MB |
| 玩家 | 支持 WebGL 的现代浏览器(Chrome / Edge / Firefox / Safari 最新版),电脑、手机或平板(横屏) |
| 网络 | 首次进入游戏时,每位玩家要从开服的电脑下载几十 MB 素材(之后走浏览器缓存);对局中流量很小 |
显卡较弱时可以在「设置」里调低画质,或在网址后加 ?board=2d(强制 2D 棋盘)/ ?render=fallback(不用 WebGL 的简化画面)。
默认监听 TCP 3000。换端口:启动脚本加 --port 3001,或设置环境变量 PORT。
| 环境变量 | 默认 | 说明 |
|---|---|---|
PORT |
3000 |
监听端口 |
HOST |
0.0.0.0 |
监听地址(127.0.0.1 = 只允许本机,放在反向代理后面时使用) |
SP_COMBAT |
client |
client:各玩家浏览器模拟自己的战斗(服务器负载极低);server:由服务器模拟并推流 |
SP_VERIFY |
off |
服务器复算客户端上报的战斗结果:off / sample(约 1/8 抽查)/ all(全部复算,更耗 CPU) |
TRUST_PROXY |
auto |
是否信任 X-Forwarded-For 等转发头:auto 只信任来自本机 / 内网的代理;1 总是;0 从不 |
DEBUG |
空 | 设为任意值输出详细日志 |
SP_NO_BROWSER |
空 | 设为 1 时启动脚本不自动打开浏览器 |
设置方式:macOS / Linux PORT=8080 npm start;PowerShell $env:PORT=8080; npm start;cmd set "PORT=8080" && npm start。健康检查:GET /healthz。
- 打开页面 → 输入昵称 → 同盟模拟 → 创建房间。房主选择难度,可以添加 / 移除 AI 队友。
- 把 4 位字母的同盟密钥,或「复制链接」得到的
http://<地址>:3000/?room=密钥发给朋友。 - 所有人点「准备就绪」后房主开始。
- 同一 Wi-Fi / 路由器下的朋友打开启动窗口里列出的地址(形如
http://192.168.x.x:3000)即可。打不开时多半是防火墙:Windows 首次启动时在弹窗中允许「专用网络」,或运行npm run doctor查看具体命令;访客 Wi-Fi 常开启「AP 隔离」,也会导致连不上。
刷新页面或断线后,同盟模拟 10 分钟内、独立模拟 24 小时内重新打开即可回到原座位。服务器把房间和对局都保存在内存里,重启服务器会结束所有对局。
朋友不在同一个局域网时,下面是几类常见做法,按自己的情况选一种即可。这里只做简单介绍,提到的工具和服务只是举例,本项目与它们没有任何关系,也不做推荐;具体的安装、费用和使用规则请以各自的官方说明为准。部署细节(防火墙、开机自启、反向代理与 HTTPS、Docker)见 docs/DEPLOY.md。
| 方式 | 怎么做 | 适合 |
|---|---|---|
| 同一局域网直连 | 把启动窗口里的局域网地址发给朋友 | 同一个家、宿舍或网吧 |
| 组网工具(虚拟局域网) | 例如 Tailscale、ZeroTier、EasyTier、蒲公英:开服的人和朋友都安装同一个工具并加入同一个网络,朋友用开服电脑的虚拟 IP 访问 http://<虚拟 IP>:3000 |
固定的几个熟人;不暴露到公网。朋友也要装客户端,部分工具需要注册账号;跨地区时可能走中继而变慢 |
| 内网穿透 / 隧道 | 只有开服的人运行客户端,朋友直接打开网址。例如自建的 frp(需要一台有公网 IP 的服务器)、Cloudflare 的 cloudflared tunnel --url http://localhost:3000(临时地址,每次启动都会变;国内访问延迟可能较高)、国内的樱花 frp 一类公共穿透服务(通常需要实名,大陆节点承载网页可能有备案要求) |
不想改路由器、没有公网 IP;免费线路带宽小时,首次加载素材会慢一些 |
| 云服务器 / VPS 直接部署 | 在 VPS 上运行整合包,或用仓库自带的 Dockerfile;用 Caddy / Nginx 加上 HTTPS。选离玩家近、线路好的地区(面向大陆玩家时,境外机房要关注回程线路,否则晚高峰延迟可能很高;大陆服务器绑定域名需要 ICP 备案) |
想长期开服、玩家分布在不同地区 |
通用注意事项:
- 游戏是单个常驻 Node.js 进程 + WebSocket(路径
/ws),只能跑一个实例,必须部署在域名根路径;Vercel 之类的 Serverless 平台和 GitHub Pages 之类的静态托管都不适用。反向代理要转发 WebSocket 升级。 - 游戏没有账号系统,知道地址的人都能进来。请只把地址发给朋友,不要公开发布,也不要搭建公开大厅;这同时能降低素材版权方面的风险。
- 有公网 IPv4 时也可以在路由器上做端口转发,但这会把家里的电脑直接暴露在公网上,优先考虑上面的方式。
| 操作 | 方法 |
|---|---|
| 购买 / 升级调度中心 / 机变选卡 | 点一次选中,再点一次确认(D 升级) |
| 部署 / 移动干员 | 从整备区拖到棋盘格 → 出现方向轮盘 → 往上 / 右 / 下 / 左滑动选择朝向后松手;松在中心或点「✕ 点击取消」取消。拖动时模型在指针 / 手指下,指针所在的格子就是落点 |
| 调整朝向 | 把干员拖回它自己的格子,再选方向 |
| 出售 / 撤退 / 销毁装备 | 点击单位所在的格子 → 底部按钮「出售 +1」「撤退」;也可以把棋盘上的干员拖回整备区撤退。整备区里的装备与法术只能「销毁」,已配发的装备锁定在干员身上(干员出售或合成精锐时退回整备区) |
| 装备 | 把装备拖到干员所在的格子上(每人 2 件;满了会弹出替换窗口,被替换的一件会被销毁);法术拖到地块上并选方向 |
| 查看详情 | 右键或长按单位 / 卡牌(属性为实时数值,高于基础值为绿色、低于为红色) |
| 快捷键 | R 刷新 · F 冻结 · D 升级 · Space 准备就绪 · Esc 取消 / 关闭 |
| 方向轮盘键盘操作 | 方向键预览 · Enter 确认 · Esc 取消 |
| 暂停(独立模拟) | 作战中(含最终攻势 / 隐秘核心)点顶栏的「暂停」或按 Space,再点「继续作战」(或 Space)继续;同盟模拟的作战不能暂停 |
| 表情 | 左下角「交流」,左右滑动(或方向键)换主题,冷却 1 秒 |
| 观战 | 自己的作战结束后(或休整期)点左侧队友头像 →「前往查看」 |
完整的规则、数值和小技巧见 docs/PLAYING.md(游戏内左下角也有「玩法说明」)。
| 文档 | 内容 |
|---|---|
| CHANGELOG.md | 更新记录:每个版本修复了什么、哪些反馈经核实不是问题 |
| docs/PLAYING.md | 玩法指南:流程、经济、招募与晋升、摆阵、联防、盟约、最终攻势、结算称号 |
| docs/DEPLOY.md | 部署指南:Windows 开服与开机自启、防火墙、组网 / 隧道、反向代理与 HTTPS、Docker、systemd、排错 |
| docs/DESIGN.md | 架构与契约(英文):技术栈、目录分工、网络协议、渲染与 UI、各次试玩后的规则修订 |
| docs/SIM.md | 战斗模拟引擎参考(英文):钩子、技能描述格式、职业默认行为 |
| docs/META.md | 对局与经济引擎(英文):回合流程、商店、联防、最终攻势的实现细节 |
| docs/DATA.md | 由官方数据表生成的游戏数据(英文) |
| docs/ASSETS.md | 素材来源、目录结构与清单(英文) |
| docs/BALANCE.md | 难度模型与测量(英文) |
| docs/research/ | 官方规则、数据与界面的调研记录 |
npm run dev # node --watch:改动服务器代码后自动重启
node --test # 单元 + 集成测试(约 3170 项;缺少素材 / 浏览器的用例会自动跳过)
SP_E2E=1 node --test test/ui/mock.e2e.test.js # 浏览器端到端测试,需要本机 Chrome(CHROME_PATH 可指定路径)
SP_REAL_E2E=1 node --test test/ui/real.e2e.test.js # 需要 Chrome + 已下载的素材
RENDER_E2E=1 node --test 'test/render/*.browser.test.js' # 渲染测试,部分需要本地提取的棋盘贴图- 游戏数据由
npm run build-data(tools/build-data.mjs)从官方数据表生成,不要手工修改data/*.json。 - GitHub Actions(.github/workflows/ci.yml)在 Ubuntu 与 Windows、Node 22 / 24 上运行
npm ci、node --test和服务器冒烟测试。
| 路径 | 内容 |
|---|---|
server/ |
Node HTTP 静态服务 + WebSocket(/ws)、大厅、对局引擎(match/)、战斗模拟(sim/,浏览器与服务器共用) |
shared/ |
前后端共用的常量与网络协议 |
public/ |
浏览器客户端(原生 ES 模块,PixiJS + pixi-spine、three.js 3D 棋盘、Preact + htm UI) |
data/ |
由官方数据表生成的游戏数据与素材清单 assets.json |
tools/ |
setup.mjs / doctor.mjs、素材下载 fetch-assets.mjs、数据构建、本地提取 local-extract/ |
scripts/ |
启动脚本(Windows / macOS / Linux)、Windows 开机自启 |
docs/ |
文档与调研 |
test/ |
node:test 测试 |
- 代码:本项目自己编写的代码以 GPL-3.0-or-later 发布,全文见 LICENSE;另附一条 GPL 第 7 条的附加许可,允许与 pixi-spine 中的 Spine Runtimes 组合分发(见 NOTICE.md)。
- 游戏素材不在许可范围内:《明日方舟》相关的美术、音乐、音效、文本与数据等版权归原权利人所有,不适用 GPL,使用限制见上方的声明和 NOTICE.md。
- 第三方组件各自遵循其许可证:通过 npm 安装的库(整合包的
node_modules中附带各自的许可证文件)、tools/local-extract/aklz4.py的算法(BSD-3-Clause),以及字体等,清单与许可证全文见 THIRD-PARTY-NOTICES.md。
- 游戏数据:Kengxxiao/ArknightsGameData。
- 素材来源:yuanyan3060/ArknightsGameResource、fexli/ArknightsResource、isHarryh/Ark-Models、ArknightsAssets/ArknightsAssets2;字体来自 TimWangZi/The-font-of-Arknights 与 Google Fonts(Noto Sans SC)。详见 docs/ASSETS.md。
- 规则核对参考:PRTS 明日方舟中文 Wiki。
- LZ4AK 解包:
tools/local-extract/aklz4.py的算法来自 isHarryh/Ark-Unpacker(BSD-3-Clause,经 MooncellWiki/UnityPy);解析 Unity 资源使用 UnityPy(MIT)。 - 库:PixiJS(MIT)、pixi-spine(MIT;其中包含的 Spine Runtime 另受 Spine Runtimes License 约束)、three.js(MIT)、Preact + htm(MIT)、ws(MIT)。
感谢以上项目的作者与维护者,以及鹰角网络带来的这款游戏。
欢迎提 Issue 反馈 bug、与官方规则不一致的地方或改进建议,也欢迎提交 Pull Request:
- 提交前请运行
node --test,并同步更新相关文档;文档使用简体中文,代码与注释使用英文。 - 提交的代码将以 GPL-3.0-or-later 发布。
- 请不要提交任何游戏素材文件(
public/assets/等目录已被.gitignore排除)。 - 本项目坚持非商业:请不要提交广告、付费、打赏等任何形式的变现功能。
An unofficial, non-commercial fan remake of Arknights' seasonal auto-chess tower-defense mode Stronghold Protocol: Covenant, played in the browser: solo, or 1–4 player co-op (AI teammates can fill seats). Combat is simulated in each player's browser, so a low-power PC can host.
- Run: download the all-in-one bundle from Releases, install Node.js 22 or 24, then double-click
scripts\start-windows.bat(Windows) or run./scripts/start.sh(macOS / Linux) and open http://localhost:3000. From source:npm install && npm run setup && npm start(setup downloads ~250 MB of art from public mirrors; the official 3D board needs a local Arknights client to extract, otherwise the 2D board is used). - Play with friends: create a co-op room and share the 4-letter key or the
?room=KEYlink. On a LAN, use the address printed at start; otherwise use a virtual-LAN tool, a tunnel or a VPS — see docs/DEPLOY.md. - Disclaimer: not affiliated with or endorsed by Hypergryph or Yostar. All Arknights names, art, audio, text and data are © their respective owners and are not covered by this project's GPL licence. For study and personal non-commercial use only — no selling, paid distribution, paid servers or monetisation of any kind. Content will be removed on request of the rights holders. Provided "as is", without warranty.
- License: code GPL-3.0-or-later (LICENSE); game assets excluded.





