明日方舟「卫戍协议:盟约」非官方同人复刻:浏览器自走棋塔防,单人或 1–4 人联机合作(非商业)
JavaScript
1,650
1,534 commits
updated Oct 19, 2026
《明日方舟》季节性自走棋塔防玩法「卫戍协议:盟约」的非官方同人复刻:浏览器即开即玩,单人或 1–4 人联机合作。
[!IMPORTANT]
- 本项目是玩家自制的非官方同人作品,与上海鹰角网络科技有限公司(Hypergryph)、Yostar 及其关联方没有任何关系,未获其授权或认可。
- 《明日方舟》及「卫戍协议」相关的名称、角色、美术、音乐、音效、文本与数据等素材,版权归原权利人所有。这些素材不适用本项目的 GPL-3.0 许可证;GPL 只覆盖本项目自己编写的代码。
- 仅供学习交流与个人非商业使用。严禁任何形式的盈利,包括但不限于:售卖本项目或整合包、付费下载或付费分发、收费服务器或收费代开、广告 / 打赏 / 会员等变现方式,以及其他任何商业用途。
- 仓库源码不包含游戏的美术与音频素材(只有由官方数据表生成的数据和几张游戏截图,同样不适用 GPL);Releases 中的完整包为了方便玩家附带了素材(精简包不带,首次启动时从公开镜像下载),下载即视为同意本声明。请勿将素材用于本项目以外的用途或单独再分发。完整条款见 NOTICE.md。
- 权利人如认为本项目侵犯其权益,请通过 Issue 联系,我们会立即删除相关内容。
- 本项目按「现状」提供,不提供任何担保,使用风险自负。
English summary: below.
| 同盟房间 | 策略轮选 | 休整期(商店 / 盟约) |
|---|---|---|
![]() | ![]() | ![]() |
| 部署方向轮盘 | 作战 | 最终攻势 |
![]() | ![]() | ![]() |
「卫戍协议:盟约」是自走棋 + 塔防:休整期在调度中心招募干员、摆阵、配装备,作战期干员自动部署,迎击从红门涌来的敌人,漏过去的敌人扣目标生命值。本项目在浏览器里复刻了这一玩法,规则和数值尽量对照官方数据表与 PRTS 核对。
Releases 里有两种整合包,代码和运行依赖完全相同,二选一;已经装好 0.2.x 的,升级时只下载更新包即可:
Stronghold-Protocol-v<版本>.zip(约 800 MB,解压后约 1.16 GB):附带全部美术 / 音频(含中文、日文、英文、韩文和本土语言的干员语音、官方 3D 棋盘贴图、各战场的官方场景和官方战斗特效),解压就能玩,不需要再下载任何东西。推荐。Stronghold-Protocol-v<版本>-lite.zip(约 25 MB):不带素材,第一次启动时自动从公开镜像下载美术、Spine 模型、音频、字体、表情和「玩法说明」教程图(约 720 MB,可中断,再次启动会续传);官方 3D 棋盘等本地客户端素材不在其中(见下面的「本地客户端素材」;各战场的官方场景可以用 node tools/setup.mjs --scenes 在本机下载并提取)。适合下载大文件不方便的情况。Stronghold-Protocol-v<版本>-update.zip(0.2.1 起提供,大小看改动多少,通常只有几 MB):只含比之前的 0.2.x 版本改动过的文件,用来把已经装好的 0.2.x(完整包或精简包装的都行)升级到新版本,不用重新下载整个包。用法:先停止服务器(关掉窗口;装了开机自启的运行 scripts\install-service-windows.ps1 -Stop),把 zip 里 Stronghold-Protocol 文件夹的全部内容合并到安装文件夹、覆盖同名文件(Windows 资源管理器里复制粘贴即可;macOS 不要用访达拖放,它会整个替换文件夹,请用 unzip -o,见 docs/DEPLOY.md 第 1.5 节),再照常启动。启动时会先核对全部程序文件、删除新版本不再用的旧文件,然后正常运行;如果这个文件夹不是更新包对应的版本(例如 0.1.x,或者程序文件被改过),会提示下载完整包,服务器不启动。全新安装请用完整包或精简包。两种包都包含运行和部署文件,以及插件作者需要的工具、模板、Schemas、插件文档和战斗测试助手。完整开发测试与设计文档仍在源码仓库里。
winget install OpenJS.NodeJS.LTS,或到 https://nodejs.org/zh-cn/download 下载安装包。brew install node@22,或到官网下载安装包。scripts\start-windows.bat。如果弹出「安全警告」,点「运行」;Windows 防火墙弹窗请勾选「专用网络」并允许。./scripts/start.sh(或 bash scripts/start.sh)。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 # 检查环境,并从公开镜像下载约 720 MB 美术 / 音频(可中断,再次运行会续传)
npm start # 启动服务器:http://localhost:3000
也可以直接运行启动脚本(Windows scripts\start-windows.bat,macOS / Linux scripts/start.sh):首次会自动安装依赖、下载素材,然后启动服务器并打开浏览器。
npm run setup 检测到客户端时会询问是否提取(需要 Python 3.8+,依赖装在项目内的 .venv-extract,不影响系统);之后可以用 node tools/setup.mjs --local 重新提取,或用 --game "<…/StreamingAssets/AB/Windows>" 指定路径。没有客户端时游戏照常运行,这几样换成替代样式:2D 棋盘、样式相近的图标、染色的普通源石虫、召唤物头像。表情和「玩法说明」的教程图随上面的素材一起从公开镜像下载,不需要客户端。没有客户端的服务器(例如 Linux VPS)也可以从同一版本的整合包(完整包;精简包没有)里复制 public/assets/local/ 和 data/local-assets.json,见 docs/DEPLOY.md 的「本地客户端素材」。npm run doctor(即 node tools/doctor.mjs)可以随时诊断:Node 版本、素材是否完整、端口占用、局域网地址和防火墙。| 项目 | 要求 |
|---|---|
| 开服的电脑 | Windows / macOS / Linux,Node.js 22 或 24(LTS);磁盘约 1.2–1.4 GB(素材、依赖与本地提取的贴图、场景和特效:完整包解压后约 1.16 GB);内存空闲约 100 MB,每局再加几 MB |
| 玩家 | 支持 WebGL 的现代浏览器(Chrome / Edge / Firefox / Safari 最新版),电脑、手机或平板(横屏) |
| 网络 | 首次进入游戏时,每位玩家要从开服的电脑下载几十 MB 素材(之后走浏览器缓存);对局中流量很小。已有素材的玩家可以在标题画面点「导入素材包」(「下载完整素材」旁边),从素材包 zip、完整包 zip 或自己的 public/assets 文件夹导入,这部分美术不再从开服的电脑下载;需要 HTTPS 或 localhost(docs/DEPLOY.md 2.5 节)。0.3.0 的素材包 Stronghold-Protocol-v0.3.0-assets.zip 由维护者另行提供下载,不在 Releases 附件里 |
显卡较弱时可以在「设置」里调低画质,或在网址后加 ?board=2d(强制 2D 棋盘)/ ?render=fallback(不用 WebGL 的简化画面)。
默认监听 TCP 3000。换端口:启动脚本加 --port 3001,或设置环境变量 PORT。
| 环境变量 | 默认 | 说明 |
|---|---|---|
PORT | 3000 | 监听端口 |
HOST | :: | 监听地址。默认 :: 是双栈:同一个端口同时接受 IPv6 和 IPv4;0.0.0.0 = 只 IPv4;127.0.0.1 = 只允许本机,放在反向代理后面时使用 |
SP_COMBAT | client | client:各玩家浏览器模拟自己的战斗(服务器负载极低);server:由服务器模拟并推流 |
SP_VERIFY | off | 服务器复算客户端上报的战斗结果:off / sample(约 1/8 抽查)/ all(全部复算,更耗 CPU) |
SP_BOT_REHEARSAL | 不设(服务器试算) | 仅 host 让房主浏览器帮 AI 队友试算布阵(同源 Worker,只回候选序号);不设或 server 仍由服务器试算。房主无法完成时服务器用同一批候选接手。玩法插件房间始终由服务器试算。真人「AI 托管」和正式战斗不受影响 |
TRUST_PROXY | auto | 是否信任 X-Forwarded-For 等转发头:auto 只信任来自本机 / 内网的代理;1 总是;0 从不 |
DEBUG | 空 | 设为任意值输出详细日志 |
SP_NO_BROWSER | 空 | 设为 1 时启动脚本不自动打开浏览器 |
SP_BOT_EMOTES | 空 | AI 队友的对局表情回应(战斗、整备、合成、联防、收礼时即刻的 m.emote 广播);设为 0 时整体关闭 |
SP_ASSET_INDEX | 空 | 素材地址带内容哈希、浏览器长期缓存(0.2.6 起默认开启,哈希存在 .cache/asset-hashes.json);设为 0 时关闭,素材清单原样下发 |
设置方式:macOS / Linux PORT=8080 npm start;PowerShell $env:PORT=8080; npm start;cmd set "PORT=8080" && npm start。健康检查:GET /healthz。
http://<地址>:3000/?room=密钥 发给朋友。http://192.168.x.x:3000)即可。打不开时多半是防火墙:Windows 首次启动时在弹窗中允许「专用网络」,或运行 npm run doctor 查看具体命令;访客 Wi-Fi 常开启「AP 隔离」,也会导致连不上。刷新页面或断线后,同盟模拟 10 分钟内、独立模拟 24 小时内重新打开即可回到原座位。服务器把房间和对局都保存在内存里,重启服务器会结束所有对局。
0.3.0 开发版已支持插件;不开插件时按原版游玩。
plugins/,或用 node tools/plugin.mjs install <zip路径或HTTPS地址> 安装;远程地址需带 --sha256。工作台也支持从社区目录安装和导入 Forge 工坊包。服主可在 plugins/config.json 限定可用插件。Studio: 行的地址,使用 /studio/ 插件工作台选模板、按官方名称选目标、拖放素材、实时预览、试一场并回放,最后打包分享。工作台限本机和局域网,修改需要钥匙。脚本执行默认关闭。服主可以用 SP_PLUGIN_SCRIPTS=sandbox 开启沙箱脚本(或启动时加 --scripts sandbox;Windows 双击 scripts\start-windows-sandbox.bat);原生受信任模式还需审查、固定锁文件哈希和玩家同意,公网部署需 trusted-force。开服设置见 部署指南,作者从插件新手指南开始,格式与限制见插件参考,接口列表见插件 API 表。
朋友不在同一个局域网时,下面是几类常见做法,按自己的情况选一种即可。这里只做简单介绍,提到的工具和服务只是举例,本项目与它们没有任何关系,也不做推荐;具体的安装、费用和使用规则请以各自的官方说明为准。部署细节(防火墙、开机自启、反向代理与 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 备案) | 想长期开服、玩家分布在不同地区 |
通用注意事项:
/ws),只能跑一个实例,必须部署在域名根路径;Vercel 之类的 Serverless 平台和 GitHub Pages 之类的静态托管都不适用。反向代理要转发 WebSocket 升级。| 操作 | 方法 |
|---|---|
| 购买 / 升级调度中心 / 机变选卡 | 点一次选中,再点一次确认(D 升级) |
| 部署 / 移动干员 | 从整备区拖到棋盘格 → 出现方向轮盘 → 往上 / 右 / 下 / 左滑动选择朝向后松手;松在中心或点「✕ 点击取消」取消。拖动时指针 / 手指所在的格子就是落点,能放下时模型直接站在这一格上(不能放下时跟在指针下) |
| 调整朝向 | 把干员拖回它自己的格子,再选方向 |
| 出售 / 撤退 / 销毁装备 | 点击单位所在的格子 → 底部按钮「出售 +1」「撤退」;也可以把棋盘上的干员拖回整备区撤退。整备区里的装备与法术只能「销毁」,已配发的装备锁定在干员身上(干员出售或合成精锐时退回整备区) |
| 装备 | 把装备拖到干员所在的格子上(每人 2 件;满了会弹出替换窗口,被替换的一件会被销毁);法术拖到地块上并选方向 |
| 查看详情 | 右键或长按单位 / 卡牌(属性为实时数值,高于基础值为绿色、低于为红色) |
| 快捷键 | W 购买鼠标指向的商品(无需点击) · R 刷新 · F 冻结 · D 升级 · Q 撤退 / X 出售鼠标指向的干员(无需点击) · Space 准备就绪 · Esc 取消 / 关闭;除 Esc 外都可以在「设置 → 快捷键」里改成别的键(玩法指南 §11) |
| 方向轮盘键盘操作 | 方向键预览 · Enter 确认 · Esc 取消 |
| 暂停(独立模拟) | 作战中(含最终攻势 / 隐秘核心)点顶栏的「暂停」或按 Space,再点「继续作战」(或 Space)继续;同盟模拟的作战不能暂停 |
| 表情 | 左下角「交流」,左右滑动(或方向键)换主题,冷却 1 秒 |
| 观战 | 自己的作战结束后(或休整期)点左侧队友头像 →「前往查看」;不参战的朋友可以在大厅输入同盟密钥点「观战」(每个同盟最多 2 名观战者,本作新增) |
| 统计(本机) | 标题画面右上角、大厅、等待室的「统计」:胜率、策略通过率、称号、战斗累计和对局记录(点一行回看结算页);只存在本机浏览器里,可以导出 / 导入,没清完第一个回合就退出的对局不计入统计(玩法指南 §12) |
完整的规则、数值和小技巧见 docs/PLAYING.md(游戏内左下角也有「玩法说明」)。
| 文档 | 内容 |
|---|---|
| CHANGELOG.md | 更新记录:每个版本修复了什么、哪些反馈经核实不是问题 |
| docs/PLAYING.md | 玩法指南:流程、经济、招募与晋升、摆阵、联防、盟约、最终攻势、结算称号 |
| docs/PLUGINS.md · docs/PLUGIN-GUIDE.md | 插件格式、安装与服主策略;中文工作台入门、DSL 和对战试验 |
| docs/DEPLOY.md | 部署指南:Windows 开服与开机自启、防火墙、组网 / 隧道、反向代理与 HTTPS、Docker、systemd、排错 |
| docs/WINDOWS.md | Windows 便携包:怎么打一份「零安装」包(scripts/make-windows-bundle.mjs)、包里放了什么、授权注意事项 |
| docs/DESIGN.md | 架构与契约(英文):索引,按章节号找到文件;现行规则在 docs/design/(范围与目录分工、坐标与时间、战斗引擎、对局、网络协议、渲染与 UI),各次试玩和各版本的规则修订与依据在 docs/history/ |
| docs/ARCHITECTURE.md | 代码地图(英文):服务器、联机协议和前后端共用的战斗模拟,0.2.0 重构后的目录,数据流,黄金结果与导入边界,常见改动从哪里入手 |
| CONTRIBUTING.md | 参与贡献:准备环境、运行测试、忠实原则、提交与 PR 约定、怎样添加自选干员(中文,末尾附英文摘要) |
| docs/SIM.md | 战斗模拟引擎参考(英文):钩子、技能描述格式、职业默认行为 |
| docs/META.md | 对局与经济引擎(英文):回合流程、商店、联防、最终攻势的实现细节 |
| docs/DATA.md | 由官方数据表生成的游戏数据(英文) |
| docs/ASSETS.md | 素材来源、目录结构与清单(英文) |
| docs/I18N.md | 界面语言(英文):界面文字、游戏文本与服务器消息怎样翻译,覆盖范围;添加一种语言只需在 public/i18n/ 放一个语言文件(社区翻译步骤见「Adding a language」,内容包格式见 docs/PACKS.md) |
| docs/BALANCE.md | 难度模型与测量(英文) |
| docs/research/ | 官方规则、数据与界面的调研记录 |
npm run dev # node --watch:改动服务器代码后自动重启
npm test # 单元 + 集成测试(约 3170 项;缺少素材 / 浏览器的用例会自动跳过;不带文件的 node --test 会把 test/ 下的辅助模块和夹具也当测试跑)
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' # 渲染测试,部分需要本地提取的棋盘贴图
GOLDEN_FULL=1 node --test test/golden.test.js # 黄金结果:固定种子的整套战斗与人机对局摘要(默认只跑快速子集)
node tools/perfbench.mjs --cpu 1,4,6 --profile # 真实战斗的帧耗时基准(Chrome 降速 CPU 近似中低端手机),需要 Chrome + 已下载的素材
npm run build-data(tools/build-data.mjs)从官方数据表生成,不要手工修改 data/*.json。/dev/battle-perf.html 在浏览器里跑一场真实战斗(对局用的战斗运行器、模拟和渲染),实时显示帧率与逐帧耗时;在手机上打开后点击「开始测量(10 秒)」,生成的报告可以复制后附在反馈中。用到的战斗来自 node tools/capture-specs.mjs 从固定种子的机器人对局里截取的数据(public/dev/perf/)。test/golden/*.json;有意改变玩法时运行 npm run golden:update,检查差异后随改动一起提交(见 test/golden/README.md)。npm ci、npm test 和服务器冒烟测试。| 路径 | 内容 |
|---|---|
server/ | 入口 index.js;Node HTTP 静态服务 + WebSocket(/ws,代码在 http/)、大厅、对局引擎(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 测试 |
node_modules 中附带各自的许可证文件)、tools/local-extract/aklz4.py 的算法(BSD-3-Clause),以及字体等,清单与许可证全文见 THIRD-PARTY-NOTICES.md。tools/local-extract/aklz4.py 的算法来自 isHarryh/Ark-Unpacker(BSD-3-Clause,经 MooncellWiki/UnityPy);解析 Unity 资源使用 UnityPy(MIT)。感谢以上项目的作者与维护者,以及鹰角网络带来的这款游戏。
欢迎提 Issue 反馈 bug、与官方规则不一致的地方或改进建议,也欢迎提交 Pull Request:
npm test,并同步更新相关文档;文档使用简体中文,代码与注释使用英文。public/assets/ 等目录已被 .gitignore 排除)。An unofficial, non-commercial fan remake of Arknights' seasonal auto-chess tower-defense mode Stronghold Protocol: Alliance, 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.
Stronghold-Protocol-v<version>.zip (~800 MB, all the art inside, the Chinese, Japanese, English, Korean and own-language operator voices, the official battlefield scenes and the official battle effects included) from Releases — or the lite one, …-lite.zip (~25 MB), which downloads the art (~720 MB) on its first start; from 0.2.1 on, …-update.zip holds only the files changed since the earlier 0.2.x releases: stop the server, extract it over an existing 0.2.x folder and start again (the first start deletes the files the new version dropped and verifies the install) — 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 ~720 MB of art from public mirrors, the emotes and the how-to-play pages included; the official 3D board, some official HUD icons, two enemy models and 39 summon models are extracted from a local Arknights client — without one the game uses the 2D board and look-alike stand-ins (the summons show their avatars), and a server can copy public/assets/local/ and data/local-assets.json from the full bundle of the same version).?room=KEY link. On a LAN, use the address printed at start; otherwise use a virtual-LAN tool, a tunnel or a VPS — see docs/DEPLOY.md.808 followers · starred Oct 2026
507 followers · starred Oct 2026
64 followers · starred Oct 2026
明日方舟「卫戍协议:盟约」非官方同人复刻:浏览器自走棋塔防,单人或 1–4 人联机合作(非商业)
JavaScript
1,650
1,534 commits
updated Oct 19, 2026
《明日方舟》季节性自走棋塔防玩法「卫戍协议:盟约」的非官方同人复刻:浏览器即开即玩,单人或 1–4 人联机合作。
[!IMPORTANT]
- 本项目是玩家自制的非官方同人作品,与上海鹰角网络科技有限公司(Hypergryph)、Yostar 及其关联方没有任何关系,未获其授权或认可。
- 《明日方舟》及「卫戍协议」相关的名称、角色、美术、音乐、音效、文本与数据等素材,版权归原权利人所有。这些素材不适用本项目的 GPL-3.0 许可证;GPL 只覆盖本项目自己编写的代码。
- 仅供学习交流与个人非商业使用。严禁任何形式的盈利,包括但不限于:售卖本项目或整合包、付费下载或付费分发、收费服务器或收费代开、广告 / 打赏 / 会员等变现方式,以及其他任何商业用途。
- 仓库源码不包含游戏的美术与音频素材(只有由官方数据表生成的数据和几张游戏截图,同样不适用 GPL);Releases 中的完整包为了方便玩家附带了素材(精简包不带,首次启动时从公开镜像下载),下载即视为同意本声明。请勿将素材用于本项目以外的用途或单独再分发。完整条款见 NOTICE.md。
- 权利人如认为本项目侵犯其权益,请通过 Issue 联系,我们会立即删除相关内容。
- 本项目按「现状」提供,不提供任何担保,使用风险自负。
English summary: below.
| 同盟房间 | 策略轮选 | 休整期(商店 / 盟约) |
|---|---|---|
![]() | ![]() | ![]() |
| 部署方向轮盘 | 作战 | 最终攻势 |
![]() | ![]() | ![]() |
「卫戍协议:盟约」是自走棋 + 塔防:休整期在调度中心招募干员、摆阵、配装备,作战期干员自动部署,迎击从红门涌来的敌人,漏过去的敌人扣目标生命值。本项目在浏览器里复刻了这一玩法,规则和数值尽量对照官方数据表与 PRTS 核对。
Releases 里有两种整合包,代码和运行依赖完全相同,二选一;已经装好 0.2.x 的,升级时只下载更新包即可:
Stronghold-Protocol-v<版本>.zip(约 800 MB,解压后约 1.16 GB):附带全部美术 / 音频(含中文、日文、英文、韩文和本土语言的干员语音、官方 3D 棋盘贴图、各战场的官方场景和官方战斗特效),解压就能玩,不需要再下载任何东西。推荐。Stronghold-Protocol-v<版本>-lite.zip(约 25 MB):不带素材,第一次启动时自动从公开镜像下载美术、Spine 模型、音频、字体、表情和「玩法说明」教程图(约 720 MB,可中断,再次启动会续传);官方 3D 棋盘等本地客户端素材不在其中(见下面的「本地客户端素材」;各战场的官方场景可以用 node tools/setup.mjs --scenes 在本机下载并提取)。适合下载大文件不方便的情况。Stronghold-Protocol-v<版本>-update.zip(0.2.1 起提供,大小看改动多少,通常只有几 MB):只含比之前的 0.2.x 版本改动过的文件,用来把已经装好的 0.2.x(完整包或精简包装的都行)升级到新版本,不用重新下载整个包。用法:先停止服务器(关掉窗口;装了开机自启的运行 scripts\install-service-windows.ps1 -Stop),把 zip 里 Stronghold-Protocol 文件夹的全部内容合并到安装文件夹、覆盖同名文件(Windows 资源管理器里复制粘贴即可;macOS 不要用访达拖放,它会整个替换文件夹,请用 unzip -o,见 docs/DEPLOY.md 第 1.5 节),再照常启动。启动时会先核对全部程序文件、删除新版本不再用的旧文件,然后正常运行;如果这个文件夹不是更新包对应的版本(例如 0.1.x,或者程序文件被改过),会提示下载完整包,服务器不启动。全新安装请用完整包或精简包。两种包都包含运行和部署文件,以及插件作者需要的工具、模板、Schemas、插件文档和战斗测试助手。完整开发测试与设计文档仍在源码仓库里。
winget install OpenJS.NodeJS.LTS,或到 https://nodejs.org/zh-cn/download 下载安装包。brew install node@22,或到官网下载安装包。scripts\start-windows.bat。如果弹出「安全警告」,点「运行」;Windows 防火墙弹窗请勾选「专用网络」并允许。./scripts/start.sh(或 bash scripts/start.sh)。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 # 检查环境,并从公开镜像下载约 720 MB 美术 / 音频(可中断,再次运行会续传)
npm start # 启动服务器:http://localhost:3000
也可以直接运行启动脚本(Windows scripts\start-windows.bat,macOS / Linux scripts/start.sh):首次会自动安装依赖、下载素材,然后启动服务器并打开浏览器。
npm run setup 检测到客户端时会询问是否提取(需要 Python 3.8+,依赖装在项目内的 .venv-extract,不影响系统);之后可以用 node tools/setup.mjs --local 重新提取,或用 --game "<…/StreamingAssets/AB/Windows>" 指定路径。没有客户端时游戏照常运行,这几样换成替代样式:2D 棋盘、样式相近的图标、染色的普通源石虫、召唤物头像。表情和「玩法说明」的教程图随上面的素材一起从公开镜像下载,不需要客户端。没有客户端的服务器(例如 Linux VPS)也可以从同一版本的整合包(完整包;精简包没有)里复制 public/assets/local/ 和 data/local-assets.json,见 docs/DEPLOY.md 的「本地客户端素材」。npm run doctor(即 node tools/doctor.mjs)可以随时诊断:Node 版本、素材是否完整、端口占用、局域网地址和防火墙。| 项目 | 要求 |
|---|---|
| 开服的电脑 | Windows / macOS / Linux,Node.js 22 或 24(LTS);磁盘约 1.2–1.4 GB(素材、依赖与本地提取的贴图、场景和特效:完整包解压后约 1.16 GB);内存空闲约 100 MB,每局再加几 MB |
| 玩家 | 支持 WebGL 的现代浏览器(Chrome / Edge / Firefox / Safari 最新版),电脑、手机或平板(横屏) |
| 网络 | 首次进入游戏时,每位玩家要从开服的电脑下载几十 MB 素材(之后走浏览器缓存);对局中流量很小。已有素材的玩家可以在标题画面点「导入素材包」(「下载完整素材」旁边),从素材包 zip、完整包 zip 或自己的 public/assets 文件夹导入,这部分美术不再从开服的电脑下载;需要 HTTPS 或 localhost(docs/DEPLOY.md 2.5 节)。0.3.0 的素材包 Stronghold-Protocol-v0.3.0-assets.zip 由维护者另行提供下载,不在 Releases 附件里 |
显卡较弱时可以在「设置」里调低画质,或在网址后加 ?board=2d(强制 2D 棋盘)/ ?render=fallback(不用 WebGL 的简化画面)。
默认监听 TCP 3000。换端口:启动脚本加 --port 3001,或设置环境变量 PORT。
| 环境变量 | 默认 | 说明 |
|---|---|---|
PORT | 3000 | 监听端口 |
HOST | :: | 监听地址。默认 :: 是双栈:同一个端口同时接受 IPv6 和 IPv4;0.0.0.0 = 只 IPv4;127.0.0.1 = 只允许本机,放在反向代理后面时使用 |
SP_COMBAT | client | client:各玩家浏览器模拟自己的战斗(服务器负载极低);server:由服务器模拟并推流 |
SP_VERIFY | off | 服务器复算客户端上报的战斗结果:off / sample(约 1/8 抽查)/ all(全部复算,更耗 CPU) |
SP_BOT_REHEARSAL | 不设(服务器试算) | 仅 host 让房主浏览器帮 AI 队友试算布阵(同源 Worker,只回候选序号);不设或 server 仍由服务器试算。房主无法完成时服务器用同一批候选接手。玩法插件房间始终由服务器试算。真人「AI 托管」和正式战斗不受影响 |
TRUST_PROXY | auto | 是否信任 X-Forwarded-For 等转发头:auto 只信任来自本机 / 内网的代理;1 总是;0 从不 |
DEBUG | 空 | 设为任意值输出详细日志 |
SP_NO_BROWSER | 空 | 设为 1 时启动脚本不自动打开浏览器 |
SP_BOT_EMOTES | 空 | AI 队友的对局表情回应(战斗、整备、合成、联防、收礼时即刻的 m.emote 广播);设为 0 时整体关闭 |
SP_ASSET_INDEX | 空 | 素材地址带内容哈希、浏览器长期缓存(0.2.6 起默认开启,哈希存在 .cache/asset-hashes.json);设为 0 时关闭,素材清单原样下发 |
设置方式:macOS / Linux PORT=8080 npm start;PowerShell $env:PORT=8080; npm start;cmd set "PORT=8080" && npm start。健康检查:GET /healthz。
http://<地址>:3000/?room=密钥 发给朋友。http://192.168.x.x:3000)即可。打不开时多半是防火墙:Windows 首次启动时在弹窗中允许「专用网络」,或运行 npm run doctor 查看具体命令;访客 Wi-Fi 常开启「AP 隔离」,也会导致连不上。刷新页面或断线后,同盟模拟 10 分钟内、独立模拟 24 小时内重新打开即可回到原座位。服务器把房间和对局都保存在内存里,重启服务器会结束所有对局。
0.3.0 开发版已支持插件;不开插件时按原版游玩。
plugins/,或用 node tools/plugin.mjs install <zip路径或HTTPS地址> 安装;远程地址需带 --sha256。工作台也支持从社区目录安装和导入 Forge 工坊包。服主可在 plugins/config.json 限定可用插件。Studio: 行的地址,使用 /studio/ 插件工作台选模板、按官方名称选目标、拖放素材、实时预览、试一场并回放,最后打包分享。工作台限本机和局域网,修改需要钥匙。脚本执行默认关闭。服主可以用 SP_PLUGIN_SCRIPTS=sandbox 开启沙箱脚本(或启动时加 --scripts sandbox;Windows 双击 scripts\start-windows-sandbox.bat);原生受信任模式还需审查、固定锁文件哈希和玩家同意,公网部署需 trusted-force。开服设置见 部署指南,作者从插件新手指南开始,格式与限制见插件参考,接口列表见插件 API 表。
朋友不在同一个局域网时,下面是几类常见做法,按自己的情况选一种即可。这里只做简单介绍,提到的工具和服务只是举例,本项目与它们没有任何关系,也不做推荐;具体的安装、费用和使用规则请以各自的官方说明为准。部署细节(防火墙、开机自启、反向代理与 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 备案) | 想长期开服、玩家分布在不同地区 |
通用注意事项:
/ws),只能跑一个实例,必须部署在域名根路径;Vercel 之类的 Serverless 平台和 GitHub Pages 之类的静态托管都不适用。反向代理要转发 WebSocket 升级。| 操作 | 方法 |
|---|---|
| 购买 / 升级调度中心 / 机变选卡 | 点一次选中,再点一次确认(D 升级) |
| 部署 / 移动干员 | 从整备区拖到棋盘格 → 出现方向轮盘 → 往上 / 右 / 下 / 左滑动选择朝向后松手;松在中心或点「✕ 点击取消」取消。拖动时指针 / 手指所在的格子就是落点,能放下时模型直接站在这一格上(不能放下时跟在指针下) |
| 调整朝向 | 把干员拖回它自己的格子,再选方向 |
| 出售 / 撤退 / 销毁装备 | 点击单位所在的格子 → 底部按钮「出售 +1」「撤退」;也可以把棋盘上的干员拖回整备区撤退。整备区里的装备与法术只能「销毁」,已配发的装备锁定在干员身上(干员出售或合成精锐时退回整备区) |
| 装备 | 把装备拖到干员所在的格子上(每人 2 件;满了会弹出替换窗口,被替换的一件会被销毁);法术拖到地块上并选方向 |
| 查看详情 | 右键或长按单位 / 卡牌(属性为实时数值,高于基础值为绿色、低于为红色) |
| 快捷键 | W 购买鼠标指向的商品(无需点击) · R 刷新 · F 冻结 · D 升级 · Q 撤退 / X 出售鼠标指向的干员(无需点击) · Space 准备就绪 · Esc 取消 / 关闭;除 Esc 外都可以在「设置 → 快捷键」里改成别的键(玩法指南 §11) |
| 方向轮盘键盘操作 | 方向键预览 · Enter 确认 · Esc 取消 |
| 暂停(独立模拟) | 作战中(含最终攻势 / 隐秘核心)点顶栏的「暂停」或按 Space,再点「继续作战」(或 Space)继续;同盟模拟的作战不能暂停 |
| 表情 | 左下角「交流」,左右滑动(或方向键)换主题,冷却 1 秒 |
| 观战 | 自己的作战结束后(或休整期)点左侧队友头像 →「前往查看」;不参战的朋友可以在大厅输入同盟密钥点「观战」(每个同盟最多 2 名观战者,本作新增) |
| 统计(本机) | 标题画面右上角、大厅、等待室的「统计」:胜率、策略通过率、称号、战斗累计和对局记录(点一行回看结算页);只存在本机浏览器里,可以导出 / 导入,没清完第一个回合就退出的对局不计入统计(玩法指南 §12) |
完整的规则、数值和小技巧见 docs/PLAYING.md(游戏内左下角也有「玩法说明」)。
| 文档 | 内容 |
|---|---|
| CHANGELOG.md | 更新记录:每个版本修复了什么、哪些反馈经核实不是问题 |
| docs/PLAYING.md | 玩法指南:流程、经济、招募与晋升、摆阵、联防、盟约、最终攻势、结算称号 |
| docs/PLUGINS.md · docs/PLUGIN-GUIDE.md | 插件格式、安装与服主策略;中文工作台入门、DSL 和对战试验 |
| docs/DEPLOY.md | 部署指南:Windows 开服与开机自启、防火墙、组网 / 隧道、反向代理与 HTTPS、Docker、systemd、排错 |
| docs/WINDOWS.md | Windows 便携包:怎么打一份「零安装」包(scripts/make-windows-bundle.mjs)、包里放了什么、授权注意事项 |
| docs/DESIGN.md | 架构与契约(英文):索引,按章节号找到文件;现行规则在 docs/design/(范围与目录分工、坐标与时间、战斗引擎、对局、网络协议、渲染与 UI),各次试玩和各版本的规则修订与依据在 docs/history/ |
| docs/ARCHITECTURE.md | 代码地图(英文):服务器、联机协议和前后端共用的战斗模拟,0.2.0 重构后的目录,数据流,黄金结果与导入边界,常见改动从哪里入手 |
| CONTRIBUTING.md | 参与贡献:准备环境、运行测试、忠实原则、提交与 PR 约定、怎样添加自选干员(中文,末尾附英文摘要) |
| docs/SIM.md | 战斗模拟引擎参考(英文):钩子、技能描述格式、职业默认行为 |
| docs/META.md | 对局与经济引擎(英文):回合流程、商店、联防、最终攻势的实现细节 |
| docs/DATA.md | 由官方数据表生成的游戏数据(英文) |
| docs/ASSETS.md | 素材来源、目录结构与清单(英文) |
| docs/I18N.md | 界面语言(英文):界面文字、游戏文本与服务器消息怎样翻译,覆盖范围;添加一种语言只需在 public/i18n/ 放一个语言文件(社区翻译步骤见「Adding a language」,内容包格式见 docs/PACKS.md) |
| docs/BALANCE.md | 难度模型与测量(英文) |
| docs/research/ | 官方规则、数据与界面的调研记录 |
npm run dev # node --watch:改动服务器代码后自动重启
npm test # 单元 + 集成测试(约 3170 项;缺少素材 / 浏览器的用例会自动跳过;不带文件的 node --test 会把 test/ 下的辅助模块和夹具也当测试跑)
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' # 渲染测试,部分需要本地提取的棋盘贴图
GOLDEN_FULL=1 node --test test/golden.test.js # 黄金结果:固定种子的整套战斗与人机对局摘要(默认只跑快速子集)
node tools/perfbench.mjs --cpu 1,4,6 --profile # 真实战斗的帧耗时基准(Chrome 降速 CPU 近似中低端手机),需要 Chrome + 已下载的素材
npm run build-data(tools/build-data.mjs)从官方数据表生成,不要手工修改 data/*.json。/dev/battle-perf.html 在浏览器里跑一场真实战斗(对局用的战斗运行器、模拟和渲染),实时显示帧率与逐帧耗时;在手机上打开后点击「开始测量(10 秒)」,生成的报告可以复制后附在反馈中。用到的战斗来自 node tools/capture-specs.mjs 从固定种子的机器人对局里截取的数据(public/dev/perf/)。test/golden/*.json;有意改变玩法时运行 npm run golden:update,检查差异后随改动一起提交(见 test/golden/README.md)。npm ci、npm test 和服务器冒烟测试。| 路径 | 内容 |
|---|---|
server/ | 入口 index.js;Node HTTP 静态服务 + WebSocket(/ws,代码在 http/)、大厅、对局引擎(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 测试 |
node_modules 中附带各自的许可证文件)、tools/local-extract/aklz4.py 的算法(BSD-3-Clause),以及字体等,清单与许可证全文见 THIRD-PARTY-NOTICES.md。tools/local-extract/aklz4.py 的算法来自 isHarryh/Ark-Unpacker(BSD-3-Clause,经 MooncellWiki/UnityPy);解析 Unity 资源使用 UnityPy(MIT)。感谢以上项目的作者与维护者,以及鹰角网络带来的这款游戏。
欢迎提 Issue 反馈 bug、与官方规则不一致的地方或改进建议,也欢迎提交 Pull Request:
npm test,并同步更新相关文档;文档使用简体中文,代码与注释使用英文。public/assets/ 等目录已被 .gitignore 排除)。An unofficial, non-commercial fan remake of Arknights' seasonal auto-chess tower-defense mode Stronghold Protocol: Alliance, 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.
Stronghold-Protocol-v<version>.zip (~800 MB, all the art inside, the Chinese, Japanese, English, Korean and own-language operator voices, the official battlefield scenes and the official battle effects included) from Releases — or the lite one, …-lite.zip (~25 MB), which downloads the art (~720 MB) on its first start; from 0.2.1 on, …-update.zip holds only the files changed since the earlier 0.2.x releases: stop the server, extract it over an existing 0.2.x folder and start again (the first start deletes the files the new version dropped and verifies the install) — 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 ~720 MB of art from public mirrors, the emotes and the how-to-play pages included; the official 3D board, some official HUD icons, two enemy models and 39 summon models are extracted from a local Arknights client — without one the game uses the 2D board and look-alike stand-ins (the summons show their avatars), and a server can copy public/assets/local/ and data/local-assets.json from the full bundle of the same version).?room=KEY link. On a LAN, use the address printed at start; otherwise use a virtual-LAN tool, a tunnel or a VPS — see docs/DEPLOY.md.808 followers · starred Oct 2026
507 followers · starred Oct 2026
64 followers · starred Oct 2026