feedback5: version 0.2.0 — package.json / package-lock.json / APP_VERSION (DEV_BUILD turns false, so the title-screen dev tag and the boot warning go too), README (the dev-branch warning removed, the badge, the version line), CHANGELOG 0.2.0 dated 2026-10-07, the zip and download sizes re-measured; golden unchanged

- CHANGELOG 0.2.0: the integrator's draft brought up to date with what merged after it (30d9a41..2e83a6b and
  DESIGN §25.13–§25.21): the language packs and the ja / ko / zh-TW game texts (§25.20), the rebindable shortcuts
  (§25.15), the community reports of W5AA (§25.14) and CB1–CB5 (§25.16–§25.19, §25.21) under the draft's sections
  (rules, UI, lobby; the official behaviours and the reports not reproduced under 核实后不是问题), the owner's
  乌尔比安 revive-tile decision of 2026-10-07 under the deviations section (renamed 有意与官方不同的调整, the intro
  points at it); PRs #189 / #191 credited to @2321Robin as reused ideas; the draft's notes block left out.
- Sizes (tools/package.mjs, a real build of both zips, deleted after measuring): full zip 448 525 731 bytes
  (~430 MB, 16 031 files, 625 MB unpacked; was ~400 / 590), lite zip 22 927 271 bytes (~22 MB; was ~21), the setup
  download 463 MB (~460 MB; was ~440: the 自选 voices) — README 方式一 / 方式二 / 系统要求 / English summary,
  DEPLOY §0 / §1.1 / §3, the CHANGELOG's lite size.
- DESIGN §25 intro, §25.19 and §25.19.7: the custom-hotkey request (item 48) was built in §25.15, the battle-history
  request (item 22) stays postponed by the owner; §25.20: with five languages the menu is a list (buttons up to four).
- Tests: version 6 / 6, docs-consistency 24 / 24, docs-paths 7 / 7, package 10 / 10, client-static 313 / 313,
  i18n 10 / 10, i18n-data 8 / 8, i18n-packs 12 / 12, i18n-server 5 / 5; npm run golden ok (roster 49, bonds 46,
  fields 22, matches 18, standins 10, diy 138); lint 0 errors.
This commit is contained in:
sganggs committed 2026-10-07 06:41:06 +08:00
1 parent 13b52450d6
commit 6aeee5ff70
7 files changed
+159 -38

No files matched your search

+124
View File
@@ -1,5 +1,129 @@
# 更新记录 # 更新记录
## 0.2.0 — 2026-10-07
0.2.0 是一个大版本:加入了补位、自选编队、英文界面、日文 / 韩文 / 繁体中文的游戏文本和自定义快捷键,按官方数据和 PRTS 修正了一批规则,并修复了社区和 GitHub 上反馈的问题;同时为了便于维护和接受贡献,把代码里最大的几个文件拆开了(拆分不改变玩法,有一套固定种子的「黄金结果」逐项核对)。0.1.4 的全部修复都已移植到新的代码结构。规则对照官方数据和 PRTS 核对;查不到出处的标了推断,详见 DESIGN §25([docs/history/0.2.0.md](docs/history/0.2.0.md))。有意和官方不同的几条单独写在「有意与官方不同的调整」里。
### 新功能
- **补位**:在「干员调配」新增的「干员持有」页标出自己没有的干员(特许干员以外的普通干员都可以标,默认全部持有),开局后这些干员由官方的补位干员上场:8 名预备干员,以及郁金香、Sharp、Mechanist、Stormeye、Pith、Touch、Raidian、Misery、领主·Sharp。盟约、特质、阶级、价格和合成仍按原干员;补位干员的技能、天赋和模组按官方数据实现。商店、手牌、临时整备区、棋盘、详情卡和结算里显示的都是补位干员本人,带一个小的「替补」标记;作战中补位干员用自己的语音(预备干员不说话)。人机持有全部干员。
- **自选编队**:在「干员调配」新增的「自选编队」页,为 5 阶、6 阶各选 2 名自己拥有的 6★ 干员(也可以选技能和模组固定的预备干员),三个技能任选,精锐时可选模组。调度中心升到 5 级 / 6 级后,这些干员只出现在你自己的商店里(每人单独的库存,不进公共卡池),随机获得干员的效果也会抽到它们;没有特质,盟约按干员自己的阵营计入。带召唤物的干员(麦哲伦、令、电弧、白铁、望、多萝西等)放下后,召唤物按官方数量进入手牌。自选干员作战时也用自己的语音。联动干员不在可选范围内。
- 目前可选的 71 名 6★ 干员,技能、天赋和模组都按官方数据完整实现:推进之王、陈、艾丽妮、赫拉格、闪灵、夜莺、嵯峨、艾雅法拉、刻俄柏、霍尔海雅、早露、提丰、娜仁图亚、逻各斯、真言、维伊、左乐、重岳、煌、黑、鸿雪、伊芙利特、谬因、林、年、斩业星熊、珊比、森蚺、斥罪、黍、帕拉斯、止颂、贝洛内、W、菲亚梅塔、维什戴尔、棘刺、赤刃明霄陈、司霆惊蛰、薇薇安娜、怒潮凛冬、赫德雷、假日威龙陈、莱伊、阿斯卡纶、涤火杰西卡、机械师、凯尔希、琴柳、可露希尔、澄闪、阿、傀影、弑君者、老鲤、温蒂、望、多萝西、予愿安洁莉娜、黑键、麦哲伦、令、电弧、淬羽赫默、遥、酒神、白铁、娜斯提、死芒、凯尔希·思衡托、Mon3tr。只在集成战略、生息演算里生效的模组(ISW-A、SO-A、SO-B、RA-A)不能选。
- **英文界面**:标题页右上角和「设置」里可以切换中文 / English,默认中文,切换后当前画面立即刷新。界面文字全部有英文;干员、技能、敌人、盟约、机变卡等游戏文本使用官方英文数据;服务器的提示和播报也按每位玩家自己的语言显示。切到英文后仍显示中文的只有玩家名字(人机的名字也是)、多轮悬赏改写过的「接下来两场作战」说明、官方英文服还没有的文本(部分自选干员和较新的模组),以及「玩法说明」的官方中文教程图(标题有英文)。界面译文的基础来自 PR #70(感谢 @YuriRestia)。
- **日本語、한국어、繁體中文**:干员、技能、敌人、盟约等游戏文本使用官方日服、韩服、台服的数据,约 91%–97% 的文本有官方译文。界面文字还没有翻译:日文、韩文暂时显示英文界面,繁体中文显示简体中文界面,缺少官方译文的游戏文本也是如此;欢迎社区翻译界面(docs/I18N.md)。
- **语言包**:把一个语言文件放进语言文件夹,游戏就会提供这种语言,不用改代码,服务器运行中放入也会出现在语言菜单里;没翻译的文字依次用它声明的后备语言和中文显示。添加语言的步骤和检查工具见 docs/I18N.md。
- **自定义快捷键**:「设置 → 快捷键」里可以修改刷新、冻结、升级、撤退、出售和准备就绪(独立模拟作战中是暂停)的按键:点一下再按新键,和别的操作冲突时两者互换,可以恢复默认;默认按键和 0.1.4 相同,Esc 不能改(社区请求)。
- **精简包**:Releases 除了附带全部素材的完整包,还提供约 22 MB 的精简包,第一次启动时从公开镜像下载素材。两个包都只放运行需要的文件,不再附带测试、设计文档和研究笔记。
### 有意与官方不同的调整
- 技能开启后攻击范围会变大的技能(如野鬃二技能、银灰三技能、莫斯提马三技能、薄绿一技能、玛恩纳二技能、安洁莉娜三技能,共 39 个),敌人进入变大后的范围就释放,不再等敌人走进原本的攻击范围;深巡二技能也按这条。
- 补位的重装(预备干员-重装、Mechanist)和自选的重装干员,攻击范围内有敌人就释放技能,不用等受到攻击(与 0.1.1 起的深巡、雷蛇等相同)。
- 只作用于自己或友军的自动技能,技力满就释放,不再等有敌人:浊心斯卡蒂二技能、纯烬艾雅法拉一技能、伺夜二技能等(GitHub #124 的后续)。
- 效果作用在召唤物范围上的技能,敌人进入场上召唤物对应的范围时也会释放:麦哲伦一技能(龙腾的范围,含空中)、令三技能(每个召唤物周围的十字范围,仅地面)、电弧二技能(赛柯的范围,仅地面)和三技能(桑特拉的范围,含空中),不再只等敌人走进干员自己的攻击范围(维护者 2026-10-06 的决定)。
- 望:本模式里放在棋盘上的棋子原本不占她的持有库存,技能叠到上限 7 枚后一直阻回,整场只能放一次。现在场上的棋子占用库存,棋子退场会回到库存、原地再部署时再占一枚,库存满时退场一枚就会降到 6 枚,技能整场都能循环释放(维护者 2026-10-06 的决定,与本模式「不消耗持有数量」的说明不同)。
- 乌尔比安三技能【移动】后被击倒时,回到自己的部署位倒地,并在那里再部署,不再留在【移动】后的位置(社区反馈;维护者 2026-10-07 的决定。PRTS 的规则是在倒下的位置再部署,这里只对他的三技能例外)。
### 规则(按官方)
- 整备区 10 格都满时,不能再购买或领取干员(凑成合成的第三张也不行);一空出格子,临时整备区的干员会自动补进来(GitHub #82,感谢 @Hucxious)。
- 联防阶段改用官方的联防专用地图,不再沿用本回合的战场,水池、箱子和特殊地形都不会出现(GitHub #41,感谢 @Hucxious、@shanzhaikabi)。
- 敌人的攻击在攻击动作的伤害帧才生效:伤害帧之前被晕眩、冻结、沉睡、浮空、缴械或恐惧,这一下会被打断,例如忍冬三技能的短暂晕眩(GitHub #187、#170)。
- 秘术师(深靛等)在攻击判定时就蓄能,不再多等一个攻击间隔(GitHub #181,感谢 @Paper-Yuan)。
- 生命回复速度不再算作治疗:吟游者(魔王等)、调香师、瑕光二技能、铃兰三技能、锡人的持续回复,对禁疗和「无法被友方治疗」的干员同样有效,也不吃治疗加成(GitHub #96、#137;区分方式由 PR #135 提出,感谢 @SpiritedAwayCN)。
- 突袭:开着的被动技能(缄默德克萨斯、宴、斯卡蒂二技能等)算作「技能就绪」,成员会立即跳到地面敌人身边(GitHub #49)。
- 伺夜的狼群按官方有「战术点形态」:失去最后一只狼影后不会消失,25 秒后带 1 只狼影满血归来。一技能只在狼群在场时释放,并按狼群的状态生效(形态中立即归来、加一只狼影、满层时回满生命);二技能在战术点形态时也能释放,馈赠留给归来的狼群。
- 武者(宴等)的特性回血改为每造成一次伤害都触发,且不受自身禁疗影响。
- 同一名干员身上的多个庇护不再相乘,只取最高的一个(宴、余、缪尔赛思等)。
- 链愈师(莎草等)的治疗链在上一个目标周围 3×3 内跳跃,满血的友军也会被经过。
- 强攻手、重剑手、推击手以及写着「同时攻击阻挡的所有敌人」的技能,最多同时攻击阻挡数个目标,被阻挡的敌人优先。
- 琳琅诗怀雅二技能的香槟炸弹扔向 x-6 范围内敌人所在的格子,附近没有敌人时也会放置(GitHub #116)。
- 新硎 / 沉沙持有断刃时只有一层攻击力加成,最后一把断刃用掉后加成消失,不再越打越高(GitHub #107)。
- 策略「Touch」(外勤医疗)召来的 Touch:三技能的额外治疗单独计算并享受加成,低于一半生命才提升治疗量,攫升、超脱的触发补全;补位的 Touch 用同一套实现。
- 华法琳的模组治疗加成在目标恰好 50% 生命时也生效(按客户端数据;瑕光、古米、塞雷娅等仍是低于 50%)。
- 塑心特质每场战斗的层数上限是整体共用的,最高盟约换了也不会重新计算(PR #178 评审中发现)。
- 泥岩三技能前 10 秒的「闭锁」按 PRTS 是强制缴械 + 无敌 + 不可阻挡:这段时间里她不再阻挡敌人,原本挡住的敌人会继续前进,醒来后才重新阻挡。
- 突袭盟约的近战干员跳到地面敌人身边时,优先落在能阻挡敌人的格子(敌人路线经过、不是围墙的地面格,或目标敌人所站的格子),只有没有这样的格子时才会落到围墙上,高台仍然不会落(GitHub #148;官方只说「再部署至一名地面敌人周围」,落点按维护者 2026-10-06 的决定)。
- 华法琳赋予的特质叠层上限按客户端数据为每场 7 层(精锐 14 层):官方 3 月 27 日的调整是「从 12/24 降低至 7/14」,此前误按 12/24 实现(GitHub #175,PR #192,感谢 @FrogThai、@kukiC)。
- 拟态物质:已有精锐和两名初始、卡池里也没有这名干员的复制时,什么都不给,不再随机给一名同盟约干员(GitHub #207,感谢 @ishtar1314)。
- 拉普兰德:本回合新合成的精锐算新的一只,合成后的第一次主动刷新 +8(GitHub #169,感谢 @FrogThai)。
- 首领血量改为「数据表的血量 × 开战时存活的人数」:独立模拟按 1 人计算,是此前的 4 倍;同盟模拟按开战时存活的玩家人数(含人机和托管,最多 4 人),取代此前的固定血量。隐秘核心「胄」的无人机造成的 2% 伤害不再被单次伤害上限取消(PR #209,感谢 @qingjingshenghuo)。
- 孤岛风云的囚犯出场时是禁锢的灰色模型,第 3 次攻击前开始闪烁警告,第 4 次攻击前解放,第 4 下就按解放后的攻击力计算(社区反馈)。
- 悬赏敌人被地形等无来源伤害击倒时,联防里也照样给赏金,归它倒下的那半场的玩家(社区反馈)。
- 用升华、博士投影把场上的自选召唤类干员原地升为精锐时,召唤物会补足到精锐的数量(麦哲伦、令、望)。
- 刺玫二技能期间,只有反击触发的特性治疗给被保护的干员,其余攻击照常治疗范围内血量最低的友军(包括她自己);此前技能期间的治疗全给了被保护的干员,哪怕对方满血(社区反馈)。
- 琳琅诗怀雅一技能也会治疗她自己(社区反馈)。
- 琳琅诗怀雅的「破财消灾」每次部署都从 5 费重新算(开局、再部署、突袭再部署),再部署后不再沿用翻倍后的费用(社区反馈;PRTS 备注)。
- 赫默二技能「医疗无人机」技力满就释放,医疗探机立即上场,不用等有友军受伤;库存满时技力停止回复(社区反馈)。
- 限时召唤物(赫默的医疗探机、巫恋的诅咒娃娃、浊心斯卡蒂的海嗣,以及自选干员的工程蓄水炮、沙地兽、“打字机”、本能的召唤)不会受到伤害(包括活性源石)、不会被治疗,血条显示剩余时间(社区反馈)。
- 砾的普通攻击是两段各 50% 的伤害(总伤害不变),「频次」类敌人每次被她攻击减 2(社区反馈;PRTS 特性备注)。
- 乌尔比安三技能只会移动到自己棋盘上的格子,联防时不会再跳到红门后,也不会落到领袖战场的另一半(社区反馈)。
- 「受到攻击时」触发的反击对敌人造成的每一次伤害都生效,不只是普通攻击:菲莱二技能会反击深溟巢涌者的脉冲,星熊、泡泡、刺玫、余、玛恩纳、年、斩业星熊同理(社区反馈)。
- 复活(策略「埃芒加德」的命结之秘、M3茧甲)按 PRTS 是被击倒后立即在原地免费再部署:被击倒时和部署时的效果都会触发(如砾、瑕光的叠层),部署后限时生效的技能重新开始(带这类技能的突袭成员复活后会立刻突袭)(社区反馈)。
- 敌人身上的两次寒冷合成一次冻结后不再留下寒冷:谢拉格盟约的寒风不会再从 51 层起把敌人一直冻到战斗结束,冻结时间随层数增长(社区反馈;PRTS 术语释义)。
- 策略「佩佩」升级调度中心得到的特殊刷新要按正常刷新价格付费,不再免费(社区反馈)。
- 策略「凯瑟琳」的定向投放可以刷出任意阶级的商店装备,不再只有不高于调度中心等级的(社区反馈:原版 1 级升 2 级也可能出 6 阶装备)。
- 选了策略「Touch」时,炎盟约的炎佑不再占掉外勤医疗的医疗干员的位置,两者可以同时出场(社区反馈)。
- 突袭成员只会跳到自己棋盘范围内的格子:领袖战场上不会落到手牌和临时整备区那两排,也不会跳到联防或领袖战场的另一半(社区反馈)。
- 被沉默的萨卡兹枯朽战士倒下时不再留下污染秽蚀(社区反馈;PRTS「死亡爆炸」默认可被沉默)。
- 萨卡兹穿刺手被晕眩或束缚时停止加速、加速层数清零(减速不会清零,和官方一样);被阻挡后的第一下额外造成「当前移动速度 × 600」的物理伤害,然后停止加速(社区反馈)。
- 自制投石机「索敌不受阻挡影响」:被站在排气格栅上(隐匿)的干员阻挡、范围内又没有别的干员时不会攻击,和原版一样;其他敌人仍会攻击阻挡自己的隐匿干员(社区反馈)。
- 升级调度中心后,新增的商品栏位立即放上新卡,不用等下一次刷新(社区反馈;官方教程「升级后将出现更多的商品栏位」)。
### 界面
- 「干员调配」新增「干员持有」「自选编队」两页,都可以导出 / 导入。
- 自选干员的卡片和棋子带「自选」标记,补位干员带「替补」标记。
- 自选干员因为本局禁用了它的全部盟约而不会出现在商店时,开局简报、选择策略时的本局信息和对局中的本局信息都会写明。
- 39 个召唤物(多数是自选干员的召唤物,另有凯瑟琳的爬行号·防护单元和凛御银灰的风雪之眼)在公开素材源里没有战斗模型,以前只显示头像;现在从游戏客户端提取官方模型,整合包已带,从源码运行的服务器重新运行一次 `npm run setup -- --local` 即可(另有 5 个召唤物在游戏里本来就没有模型)。
- 飞行单位按官方离地约 1.3 格;帝国炮火先兆者纵向拉伸、木制瑞印左右镜像,和官方模型一致(PR #211,感谢 @xcdoge)。
- 联机开局简报的顶栏在手机和英文界面下不再压住「自选编队」标签。
- 模组的「特性追加」接在基础特性后面显示(干员调配、局内数值、详情卡和自选编队的模组),不再只显示追加的那一句;作战效果一直是对的(社区反馈)。
- 持续的范围特效(如炼金单元)叠在一起时不再越叠越亮(社区反馈)。
- 结算卡不再显示调和、协防干员、独行、绝技的层数:这几个盟约照常累计层数,官方也不显示(社区反馈)。
- 银灰的普通攻击使用自己的命中音效,不再借用三技能的挥砍和命中音效;雷蛇、初雪、圣约送葬人的普通攻击也不再用技能的命中音效(社区反馈)。
### 联机与大厅
- 干员持有和自选编队按座位保存,开局时固定;对局进行中修改的设置留到下一局生效。
- 被淘汰后观战(以及观战席)会一直跟着上次查看的玩家,每回合开始不再跳回自己的空棋盘;没查看过时跟随第一位仍在场的玩家,人机也算(社区反馈;思路来自 PR #189,感谢 @2321Robin)。
- 观战领袖回合的休整期时,看到的是领袖战场和站在那里的领袖,不再是没有领袖的普通棋盘(社区反馈)。
- 最终攻势和隐秘核心的休整期,像作战时一样把同组两名玩家放在同一个战场上(队友的一半只能看),从回合开始到作战结束,左侧队伍栏用官方的绿框标出同组两人(社区反馈;参考了 PR #191,感谢 @2321Robin)。
### 人机
- 人机和 AI 托管不会在整备区满时购买;为了凑第三张会先卖掉最弱的单张。
- AI 托管更倾向购买玩家自己的自选干员,并会提前一回合升级调度中心;人机自己不使用补位和自选。
### 从 0.1.4 移植
- 0.1.4 的全部修复都已移植到新的代码结构,内容见下方 0.1.4 的记录。再次感谢这些 PR 的作者:@sunstricken(#69、#66)、@SpiritedAwayCN(#176、#114)、@shanzhaikabi(#115)、@Sukvii(#109)、@salt-fishes(#119)、@LongQianChen(#103)、@2321Robin(#129、#150)、@CELLOPOI(#149、#146)、@Convey123(#185、#110、#72、#73、#134、#74、#127)、@zasx77771(#183)、@xcdoge(#160)、@Cloudnyco(#186)、@NekoTC(#24),以及 @Hucxious 对沉睡阻挡的实测(GitHub #140)。
- 移植时顺带修好:结算语音从来不播放的问题(补位、自选干员用自己的声音说结算台词);限时技能运行期间,突袭成员同样算「技能就绪」(PR #109 与 GitHub #49 的规则衔接);0.1.4 的沉睡规则也用在自选干员上:酒神的迷狂牢笼不会挡住沉睡的敌人,死芒二技能让敌人沉睡时,被她的仆役挡住的敌人同样脱离阻挡。
### 工具与开发
- 为了便于维护,最大的几个文件按职责拆成了多个模块:服务器入口、对局、玩家状态、战斗引擎、敌人、干员技能(每名干员一个文件)、界面逻辑和战斗特效,玩法不变。
- 新增「黄金结果」:一套固定种子的场景(每名干员的每个技能和模组、每个盟约、每个领袖和联防、完整的人机对局、每名补位和自选干员),改动玩法时必须同时更新,并说明哪些场景变了。
- 新增 ESLint(只检查正确性)、类型检查和导入边界检查(战斗模拟不能引用服务器专用代码),GitHub Actions 会运行。
- 新增 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)(代码地图)和 [CONTRIBUTING.md](CONTRIBUTING.md)(怎样参与贡献、怎样添加自选干员)。
- 新增打包工具:`npm run package` 生成完整包,`npm run package:lite` 生成精简包(docs/DEPLOY.md 第 7 节);只打包运行需要的文件,打包前检查拒绝名单、导入、清单里的素材是否齐全、只差大小写的路径,以及文件里有没有个人目录路径。
- 素材清单 `data/assets.json`:去掉了已移出自选的焰狐龙梓兰的素材;模组类型图标统一用小写文件名(dec-X 和 dec-x、WAH-Y 在 Windows / macOS 不区分大小写的磁盘上会冲突);加入了 71 名自选干员的作战语音(994 条,约 25 MB)。
- 界面文字的检查进了测试:没有经过 `t()` 的中文、没有英文翻译的界面文字都会让测试失败(docs/I18N.md)。
- 设计文档拆分:docs/DESIGN.md 变成索引,现行规则按领域放在 docs/design/,各次试玩和各版本的规则修订放在 docs/history/,章节号不变,代码和文档里的「DESIGN §N」照常可查。
- 每局要加载约 340 个脚本模块,远程联机时建议在反向代理上开启 HTTP/2(见 docs/DEPLOY.md)。
### 核实后不是问题
- 单人标准模拟商店的价格(1 / 1 / 5 / 8 / 10,之后每回合减 1)与官方一致(GitHub #116 第 1 点)。
- 险境及以上,开局展示的三种敌人类型合计出现 7–9 波、每种 1–3 波,其余是特异敌人:这就是官方的排布(社区反馈;文档补充了说明)。
- 策略「鸭爵」每波把 0–2 名敌人换成鸭爵等,一波出现两只鸭子是官方规则(社区反馈)。
- 会移动的领袖(铳、卢西恩)在每个领袖战场上都按官方路线移动,各领袖按数据里的攻击间隔攻击(社区反馈)。
- 烛煌携带坚固维式重锤时两种锁血都会生效:先触发她的天赋,倒地后再受到致命伤害才轮到重锤的锁血(社区反馈;维护者 2026-10-07 决定保持这个顺序)。
- 寻呼模块、简易通讯机给的干员不高于当前调度中心等级,所以用在缪尔赛思身上要到 6 级才会给(调和盟约只有她,Ⅵ阶),按官方保留(社区反馈;维护者 2026-10-07 的决定)。
- 本局禁用的盟约在每个难度都一样,只移除全部盟约都被禁用的干员;炎佑也会受到源石溶剂「每秒受到 60 真实伤害」的效果(PRTS 备注);两名变形同构体变成的阿戈尔照常吞噬(社区反馈)。
- 伺夜的狼群最多 3 只狼影,吟游者的特性可以回复战术家召唤物和不屈者的生命,荒芜拉普兰德三技能期间由无人机攻击、本人不普攻,叙拉古的恐惧概率,都和官方一致;突袭的玛恩纳攻击范围内有敌人时不突袭,是盟约原文的规则(社区反馈)。
- 以下没有复现,需要具体的对局(干员、地图、回合或录像):野鬃把敌人顶出地图、锏拉动领袖、昆图斯占地变小、炼金单元没有伤害、归溟幽灵鲨被吞噬时进入再部署、炎佑被空中单位阻挡、选 Pith 策略时联防里阿戈尔的加成被清空、满血时源石溶剂不生效(社区反馈)。
## 0.1.4 — 2026-10-06 ## 0.1.4 — 2026-10-06
0.1.3 之后的小版本:合并了多位贡献者的 PR,修正了高台和阿戈尔的规则,并修正了文档和测试。下一个版本(0.2.0)会做一次便于维护的重构、多语言支持,以及补位和自选编队。 0.1.3 之后的小版本:合并了多位贡献者的 PR,修正了高台和阿戈尔的规则,并修正了文档和测试。下一个版本(0.2.0)会做一次便于维护的重构、多语言支持,以及补位和自选编队。
+7 -12
View File
@@ -1,13 +1,8 @@
# 卫戍协议:盟约 · Stronghold Protocol: Alliance # 卫戍协议:盟约 · Stronghold Protocol: Alliance
> [!WARNING]
> **开发版(dev 分支):不稳定,请勿用于公开服务器。** 这里是 0.2.0 的开发中代码,规则、数据和存档格式随时会变,可能有未发现的问题。想玩或开服请使用 [Releases](../../releases/latest) 页面的正式版整合包,或 `master` 分支。反馈问题时请注明「dev」和版本号(标题页底部、启动横幅和 `/healthz` 都会显示 `0.2.0-dev`)。开发版与正式版在同一地址下共用浏览器里保存的设置和登录信息,来回切换后如果界面异常,清除这个网站的数据即可。开发版不提供整合包。
>
> *Development branch: unstable — do not run it as a public server. Rules, data and saved settings may change at any time. Play or host the latest release (or the `master` branch) instead; when you report a bug from this branch, say "dev" and the version shown on the title screen. It shares the browser's saved settings with a release served at the same address — clear the site's data if the interface misbehaves after switching. No release zips are built from this branch.*
《明日方舟》季节性自走棋塔防玩法「卫戍协议:盟约」的**非官方同人复刻**:浏览器即开即玩,单人或 1–4 人联机合作。 《明日方舟》季节性自走棋塔防玩法「卫戍协议:盟约」的**非官方同人复刻**:浏览器即开即玩,单人或 1–4 人联机合作。
![version](https://img.shields.io/badge/version-0.2.0--dev-orange) ![version](https://img.shields.io/badge/version-0.2.0-2ea44f)
![license](https://img.shields.io/badge/code%20license-GPL--3.0--or--later-blue) ![license](https://img.shields.io/badge/code%20license-GPL--3.0--or--later-blue)
![node](https://img.shields.io/badge/node-22%20%7C%2024-339933) ![node](https://img.shields.io/badge/node-22%20%7C%2024-339933)
@@ -42,7 +37,7 @@ English summary: [below](#english).
- **独立模拟**(单人)与**同盟模拟**(1–4 人**合作**,没有 PvP;空位可以加 AI 队友)。 - **独立模拟**(单人)与**同盟模拟**(1–4 人**合作**,没有 PvP;空位可以加 AI 队友)。
- 服务器是一个 Node.js 程序,**战斗在各玩家的浏览器里模拟**(和官方一样),服务器只管经济与回合,一台低功耗小主机就能开服。 - 服务器是一个 Node.js 程序,**战斗在各玩家的浏览器里模拟**(和官方一样),服务器只管经济与回合,一台低功耗小主机就能开服。
- 本分支是 0.2.0 开发版(未发布);最新正式版是 0.1.4,见 [CHANGELOG.md](CHANGELOG.md)。仍有少数规则按推断实现,与官方不一致的地方欢迎在 Issue 里反馈。 - 当前版本 0.2.0:加入了补位、自选编队、英文界面(另有日文、韩文、繁体中文的游戏文本)和自定义快捷键,并修复了 0.1.4 发布后玩家和 GitHub 上反馈的问题,详见 [CHANGELOG.md](CHANGELOG.md)。仍有少数规则按推断实现,与官方不一致的地方欢迎在 Issue 里反馈。
## 功能一览 ## 功能一览
@@ -69,8 +64,8 @@ English summary: [below](#english).
[Releases](../../releases/latest) 里有两种整合包,代码和运行依赖完全相同,二选一: [Releases](../../releases/latest) 里有两种整合包,代码和运行依赖完全相同,二选一:
- **完整包** `Stronghold-Protocol-v<版本>.zip`(约 400 MB,解压后约 590 MB):附带全部美术 / 音频(含官方 3D 棋盘贴图),解压就能玩,不需要再下载任何东西。**推荐。** - **完整包** `Stronghold-Protocol-v<版本>.zip`(约 430 MB,解压后约 625 MB):附带全部美术 / 音频(含官方 3D 棋盘贴图),解压就能玩,不需要再下载任何东西。**推荐。**
- **精简包** `Stronghold-Protocol-v<版本>-lite.zip`(约 21 MB):不带素材,第一次启动时自动从公开镜像下载美术、Spine 模型、音频、字体、表情和「玩法说明」教程图(约 440 MB,可中断,再次启动会续传);官方 3D 棋盘等本地客户端素材不在其中(见下面的「本地客户端素材」)。适合下载大文件不方便的情况。 - **精简包** `Stronghold-Protocol-v<版本>-lite.zip`(约 22 MB):不带素材,第一次启动时自动从公开镜像下载美术、Spine 模型、音频、字体、表情和「玩法说明」教程图(约 460 MB,可中断,再次启动会续传);官方 3D 棋盘等本地客户端素材不在其中(见下面的「本地客户端素材」)。适合下载大文件不方便的情况。
两种包都只含运行和部署需要的文件(服务器、客户端、数据、启动脚本、setup / doctor / 素材下载工具、许可证与说明、[docs/PLAYING.md](docs/PLAYING.md) 和 [docs/DEPLOY.md](docs/DEPLOY.md));测试、开发工具和设计文档只在源码仓库里。 两种包都只含运行和部署需要的文件(服务器、客户端、数据、启动脚本、setup / doctor / 素材下载工具、许可证与说明、[docs/PLAYING.md](docs/PLAYING.md) 和 [docs/DEPLOY.md](docs/DEPLOY.md));测试、开发工具和设计文档只在源码仓库里。
@@ -90,7 +85,7 @@ English summary: [below](#english).
git clone https://github.com/sganggs/Stronghold-Protocol.git git clone https://github.com/sganggs/Stronghold-Protocol.git
cd Stronghold-Protocol cd Stronghold-Protocol
npm install # 安装依赖(postinstall 会把 pixi / preact / three 复制到 public/vendor) npm install # 安装依赖(postinstall 会把 pixi / preact / three 复制到 public/vendor)
npm run setup # 检查环境,并从公开镜像下载约 440 MB 美术 / 音频(可中断,再次运行会续传) npm run setup # 检查环境,并从公开镜像下载约 460 MB 美术 / 音频(可中断,再次运行会续传)
npm start # 启动服务器:http://localhost:3000 npm start # 启动服务器:http://localhost:3000
``` ```
@@ -104,7 +99,7 @@ npm start # 启动服务器:http://localhost:3000
| 项目 | 要求 | | 项目 | 要求 |
|---|---| |---|---|
| 开服的电脑 | Windows / macOS / Linux,Node.js 22 或 24(LTS);磁盘约 600–750 MB(素材、依赖与本地提取贴图:完整包解压后约 590 MB);内存空闲约 100 MB,每局再加几 MB | | 开服的电脑 | Windows / macOS / Linux,Node.js 22 或 24(LTS);磁盘约 600–750 MB(素材、依赖与本地提取贴图:完整包解压后约 625 MB);内存空闲约 100 MB,每局再加几 MB |
| 玩家 | 支持 WebGL 的现代浏览器(Chrome / Edge / Firefox / Safari 最新版),电脑、手机或平板(横屏) | | 玩家 | 支持 WebGL 的现代浏览器(Chrome / Edge / Firefox / Safari 最新版),电脑、手机或平板(横屏) |
| 网络 | 首次进入游戏时,每位玩家要从开服的电脑下载几十 MB 素材(之后走浏览器缓存);对局中流量很小 | | 网络 | 首次进入游戏时,每位玩家要从开服的电脑下载几十 MB 素材(之后走浏览器缓存);对局中流量很小 |
@@ -250,7 +245,7 @@ GOLDEN_FULL=1 node --test test/golden.test.js # 黄金结果:固定
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. 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.
- **Run:** download the full bundle `Stronghold-Protocol-v<version>.zip` (~400 MB, all the art inside) from [Releases](../../releases/latest) — or the lite one, `…-lite.zip` (~21 MB), which downloads the art (~440 MB) on its first start — 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 ~440 MB of art from public mirrors, the emotes and the how-to-play pages included; the official 3D board, some official HUD icons and two enemy models are extracted from a local Arknights client — without one the game uses the 2D board and look-alike stand-ins, and a server can copy `public/assets/local/` and `data/local-assets.json` from the full bundle of the same version). - **Run:** download the full bundle `Stronghold-Protocol-v<version>.zip` (~430 MB, all the art inside) from [Releases](../../releases/latest) — or the lite one, `…-lite.zip` (~22 MB), which downloads the art (~460 MB) on its first start — 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 ~460 MB of art from public mirrors, the emotes and the how-to-play pages included; the official 3D board, some official HUD icons and two enemy models are extracted from a local Arknights client — without one the game uses the 2D board and look-alike stand-ins, and a server can copy `public/assets/local/` and `data/local-assets.json` from the full bundle of the same version).
- **Play with friends:** create a co-op room and share the 4-letter key or the `?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](docs/DEPLOY.md). - **Play with friends:** create a co-op room and share the 4-letter key or the `?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](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. - **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](LICENSE)); game assets excluded. - **License:** code GPL-3.0-or-later ([LICENSE](LICENSE)); game assets excluded.
+5 -5
View File
@@ -10,7 +10,7 @@
| 服务器 CPU | 战斗在各玩家浏览器里模拟(DESIGN §14),服务器只负责回合、经济和校验:**每个房间每个作战回合约 1 ms CPU**。AI 队友 / 掉线玩家的战场由服务器模拟:作战开始时 3 个 AI 战场在开发机上约 0.2–0.5 s CPU,小主机上可能要几秒(分成 8 ms 小片执行,不会卡住其他房间)。`SP_VERIFY=all` 会复算每个真人战场,CPU 明显增加,小主机建议保持 `off` 或 `sample`。 | | 服务器 CPU | 战斗在各玩家浏览器里模拟(DESIGN §14),服务器只负责回合、经济和校验:**每个房间每个作战回合约 1 ms CPU**。AI 队友 / 掉线玩家的战场由服务器模拟:作战开始时 3 个 AI 战场在开发机上约 0.2–0.5 s CPU,小主机上可能要几秒(分成 8 ms 小片执行,不会卡住其他房间)。`SP_VERIFY=all` 会复算每个真人战场,CPU 明显增加,小主机建议保持 `off` 或 `sample`。 |
| 服务器内存 | 空闲约 100 MB,每个进行中的对局再增加几 MB。 | | 服务器内存 | 空闲约 100 MB,每个进行中的对局再增加几 MB。 |
| 网络 | 4 人对局中服务器每回合下行约 0.25 MB(DESIGN §14 实测)。首次进入游戏时浏览器要从主机下载所需的图片 / Spine 模型 / 音频(按需加载,之后走浏览器缓存),公网隧道带宽小时第一次会慢一些。 | | 网络 | 4 人对局中服务器每回合下行约 0.25 MB(DESIGN §14 实测)。首次进入游戏时浏览器要从主机下载所需的图片 / Spine 模型 / 音频(按需加载,之后走浏览器缓存),公网隧道带宽小时第一次会慢一些。 |
| 磁盘 | 素材约 440 MB(`public/assets`)+ 依赖约 125 MB(`node_modules`;整合包只带运行依赖,约 65 MB);可选的本地提取约 40 MB(`.venv-extract`)+ 70 MB 贴图(见第 6 节)。完整包解压后约 590 MB。 | | 磁盘 | 素材约 460 MB(`public/assets`)+ 依赖约 125 MB(`node_modules`;整合包只带运行依赖,约 65 MB);可选的本地提取约 40 MB(`.venv-extract`)+ 70 MB 贴图(见第 6 节)。完整包解压后约 625 MB。 |
| 玩家设备 | 支持 WebGL 的现代浏览器(Chrome / Edge / Firefox / Safari 最新版),电脑或手机平板(横屏)。老旧设备可在设置里调低画质或访问 `/?board=2d`。 | | 玩家设备 | 支持 WebGL 的现代浏览器(Chrome / Edge / Firefox / Safari 最新版),电脑或手机平板(横屏)。老旧设备可在设置里调低画质或访问 `/?board=2d`。 |
服务器**无状态**:房间和对局只存在内存里,没有数据库和存档,**不需要备份**。重启服务器会结束正在进行的对局(包括断线后本可在 24 小时内回来继续的独立模拟)。 服务器**无状态**:房间和对局只存在内存里,没有数据库和存档,**不需要备份**。重启服务器会结束正在进行的对局(包括断线后本可在 24 小时内回来继续的独立模拟)。
@@ -26,13 +26,13 @@
``` ```
装完**关闭并重新打开**终端,`node -v` 应显示 v22 或更高(winget 的 LTS 目前是 v24.x,同样可用)。没有 winget 时从 <https://nodejs.org/zh-cn/download> 和 <https://git-scm.com/download/win> 下载安装。 装完**关闭并重新打开**终端,`node -v` 应显示 v22 或更高(winget 的 LTS 目前是 v24.x,同样可用)。没有 winget 时从 <https://nodejs.org/zh-cn/download> 和 <https://git-scm.com/download/win> 下载安装。
2. 下载,三选一。建议放在一个固定、短、**不在 OneDrive 同步范围内**的目录,例如 `C:\Stronghold-Protocol`: 2. 下载,三选一。建议放在一个固定、短、**不在 OneDrive 同步范围内**的目录,例如 `C:\Stronghold-Protocol`:
- **完整包(推荐)**:在仓库的 [Releases](https://github.com/sganggs/Stronghold-Protocol/releases) 页面下载最新版本的 `Stronghold-Protocol-v<版本>.zip`(约 400 MB,解压后约 590 MB;已含运行依赖、前端库和全部素材,包括官方 3D 棋盘等本地客户端素材),解压后把里面的 `Stronghold-Protocol` 文件夹放到上述位置。不需要 Git,首次启动也不用再下载素材。素材版权归上海鹰角网络 / Yostar,仅限非商业使用,见 [NOTICE.md](../NOTICE.md)。 - **完整包(推荐)**:在仓库的 [Releases](https://github.com/sganggs/Stronghold-Protocol/releases) 页面下载最新版本的 `Stronghold-Protocol-v<版本>.zip`(约 430 MB,解压后约 625 MB;已含运行依赖、前端库和全部素材,包括官方 3D 棋盘等本地客户端素材),解压后把里面的 `Stronghold-Protocol` 文件夹放到上述位置。不需要 Git,首次启动也不用再下载素材。素材版权归上海鹰角网络 / Yostar,仅限非商业使用,见 [NOTICE.md](../NOTICE.md)。
- **精简包**:同一页面的 `Stronghold-Protocol-v<版本>-lite.zip`(约 21 MB)。代码、运行依赖和前端库与完整包相同,但不带素材:美术、Spine 模型、音频、字体、表情和「玩法说明」教程图在首次启动时由 setup 从公开镜像下载(约 440 MB,显示进度,可中断续传;镜像设置见下面的「国内镜像下载」)。官方 3D 棋盘等本地客户端素材需要用本机客户端提取,或从同一版本的完整包复制(第 6 节)。适合下载大文件不方便、或想先下一个小包的情况;放置方式同完整包。 - **精简包**:同一页面的 `Stronghold-Protocol-v<版本>-lite.zip`(约 22 MB)。代码、运行依赖和前端库与完整包相同,但不带素材:美术、Spine 模型、音频、字体、表情和「玩法说明」教程图在首次启动时由 setup 从公开镜像下载(约 460 MB,显示进度,可中断续传;镜像设置见下面的「国内镜像下载」)。官方 3D 棋盘等本地客户端素材需要用本机客户端提取,或从同一版本的完整包复制(第 6 节)。适合下载大文件不方便、或想先下一个小包的情况;放置方式同完整包。
- **源码**: - **源码**:
```powershell ```powershell
git clone https://github.com/sganggs/Stronghold-Protocol.git C:\Stronghold-Protocol git clone https://github.com/sganggs/Stronghold-Protocol.git C:\Stronghold-Protocol
``` ```
3. 双击 `C:\Stronghold-Protocol\scripts\start-windows.bat`。首次会:安装依赖(`npm ci`;整合包已含,跳过)→ 复制前端库(整合包已含,跳过)→ 下载约 440 MB 素材(完整包已含,跳过;精简包和源码在这一步下载,显示进度,中断后再次启动会续传)→ 若检测到本机的明日方舟客户端,询问是否提取官方贴图(可跳过)→ 启动服务器并打开浏览器。 3. 双击 `C:\Stronghold-Protocol\scripts\start-windows.bat`。首次会:安装依赖(`npm ci`;整合包已含,跳过)→ 复制前端库(整合包已含,跳过)→ 下载约 460 MB 素材(完整包已含,跳过;精简包和源码在这一步下载,显示进度,中断后再次启动会续传)→ 若检测到本机的明日方舟客户端,询问是否提取官方贴图(可跳过)→ 启动服务器并打开浏览器。
4. 窗口里会打印朋友可用的地址,例如 `http://192.168.1.23:3000`。用另一台设备打开它确认能进入。关闭窗口即停止服务器。 4. 窗口里会打印朋友可用的地址,例如 `http://192.168.1.23:3000`。用另一台设备打开它确认能进入。关闭窗口即停止服务器。
等价的手动命令:`npm ci`、`node tools/setup.mjs`、`npm start`。 等价的手动命令:`npm ci`、`node tools/setup.mjs`、`npm start`。
@@ -204,7 +204,7 @@ https / wss 说明:页面通过 https 打开时客户端自动连接 `wss://
## 3. Docker ## 3. Docker
```bash ```bash
# A) 构建时下载素材(需要联网,约 440 MB) # A) 构建时下载素材(需要联网,约 460 MB)
docker build -t stronghold-protocol --build-arg FETCH_ASSETS=1 . docker build -t stronghold-protocol --build-arg FETCH_ASSETS=1 .
docker run -d --name stronghold -p 3000:3000 --restart unless-stopped stronghold-protocol docker run -d --name stronghold -p 3000:3000 --restart unless-stopped stronghold-protocol
+19 -17
View File
@@ -41,7 +41,8 @@ swaps in one wave already answered; the moving leaders' routes checked; 野鬃,
reproduced) → §25.18; CB5, match flow and UI (a module's 特性追加 line after the class trait, the new shop slot filled at reproduced) → §25.18; CB5, match flow and UI (a module's 特性追加 line after the class trait, the new shop slot filled at
the upgrade, an eliminated player following a player through every round, the boss field and its leader in a watcher's the upgrade, an eliminated player following a player through every round, the boss field and its leader in a watcher's
boss prep, the pair together in the boss prep with the official green frames; PRs #189 / #191 reused, not merged; the boss prep, the pair together in the boss prep with the official green frames; PRs #189 / #191 reused, not merged; the
battle-history and hotkey requests left to the owner) → §25.19; language packs, the first type of content packs (a battle-history request postponed by the owner, the hotkey request built in §25.15) → §25.19; language packs, the first
type of content packs (a
language is a file in the language folder) → §25.20; the last stream of that batch, CB1, bonds, strategies and items (the language is a file in the language folder) → §25.20; the last stream of that batch, CB1, bonds, strategies and items (the
谢拉格 wind's endless freeze, 埃芒加德's and M3茧甲's 复活 as a knock-out and a free redeploy, 佩佩's paid refresh, the 炎佑 on 谢拉格 wind's endless freeze, 埃芒加德's and M3茧甲's 复活 as a knock-out and a free redeploy, 佩佩's paid refresh, the 炎佑 on
the medic's slot, 凯瑟琳's offer, the hidden layers on the result card; the official behaviours pinned) → §25.21. the medic's slot, 凯瑟琳's offer, the hidden layers on the result card; the official behaviours pinned) → §25.21.
@@ -1554,8 +1555,8 @@ briefing types' share of the waves).
### 25.19 Community reports of 2026-10-06, stream CB5: match flow and UI — `ui/loadoutModel.js traitLines`, `player/economy.js _openLevelSlots`, `match/watch.js _followScout`, `match/views.js prepFieldMeta / bossMateView`, `render/app.js syncMates`, `ui/gameLogic/camera.js teamFrameIds` ### 25.19 Community reports of 2026-10-06, stream CB5: match flow and UI — `ui/loadoutModel.js traitLines`, `player/economy.js _openLevelSlots`, `match/watch.js _followScout`, `match/views.js prepFieldMeta / bossMateView`, `render/app.js syncMates`, `ui/gameLogic/camera.js teamFrameIds`
CB5 took the items about the match flow and the screens (16.2, 19, 51, 55, 56 of the list; 22 and 48 are features the CB5 took the items about the match flow and the screens (16.2, 19, 51, 55, 56 of the list; 22 and 48 are feature
owner has not decided — what each would take is at the end). Each was reproduced first (a script, or the real server in requests — 22 postponed by the owner, 48 built in §25.15 —, both at the end). Each was reproduced first (a script, or the real server in
headless Chrome for the screens), checked against the official data, PRTS and the official tutorial pages, then fixed in headless Chrome for the screens), checked against the official data, PRTS and the official tutorial pages, then fixed in
one commit with its tests; two open community PRs were reused without merging them (§25.19.6). one commit with its tests; two open community PRs were reused without merging them (§25.19.6).
@@ -1653,19 +1654,20 @@ one commit with its tests; two open community PRs were reused without merging th
`bossPairing` field; #191's 联防 frames and the phase banner naming the partner are not built. If the owner still wants `bossPairing` field; #191's 联防 frames and the phase banner naming the partner are not built. If the owner still wants
them, they can go on top of this. them, they can go on top of this.
#### 25.19.7 Not built — what the two feature requests would take (the owner has not decided) #### 25.19.7 The two feature requests: battle history postponed by the owner, custom hotkeys built (§25.15)
- **22 战绩 / 分队胜率**: the result is already complete (`m.result`: per-player stats, lineup, band, bonds, titles, rounds - **22 战绩 / 分队胜率** — postponed by the owner; what it would take: the result is already complete (`m.result`:
passed, victory — `server/match/results.js`). With no accounts the simplest is per browser: append a compact record at per-player stats, lineup, band, bonds, titles, rounds passed, victory — `server/match/results.js`). With no accounts the
`m.result` to localStorage (capped, e.g. the last 200; only matches of ≥ 2 rounds, as asked), a 战绩 screen in the lobby simplest is per browser: append a compact record at `m.result` to localStorage (capped, e.g. the last 200; only matches
(list, win rate per strategy / core bond / mode and difficulty, 导出 / 导入 like the loadout), tests and i18n — no of ≥ 2 rounds, as asked), a 战绩 screen in the lobby (list, win rate per strategy / core bond / mode and difficulty,
server change. Server-side history needs persistence and an identity the remake does not have. Decisions: browser-only 导出 / 导入 like the loadout), tests and i18n — no server change. Server-side history needs persistence and an identity
or not; what 「分队」 groups by (strategy, core bond, lineup); the sample cap. the remake does not have. Decisions left for then: browser-only or not; what 「分队」 groups by (strategy, core bond,
- **48 自定义快捷键**: the keys are fixed in `ui/gameLogic/shortcuts.js shortcutFor` (R 刷新, F 冻结, D 升级, Q 撤退, X 出售, lineup); the sample cap.
Space 准备 / 暂停, Esc). It would take a 快捷键 section in 设置 (capture a key per action, conflicts refused, 恢复默认), - **48 自定义快捷键** — built in 0.2.0: §25.15 (W5AC; the community request 「快捷键可不可以自己设置」, the owner's decision of
a sanitised map in the settings (`sanitizeSettings`), `shortcutFor` reading it, every `<kbd>` hint and tooltip reading it 2026-10-07). 设置 → 快捷键 rebinds 刷新, 冻结, 升级, 撤退, 出售 and 准备就绪 / 暂停 (Esc stays fixed); the key map lives in
too, i18n and tests. Decision: whether to allow it at all (the official PC client's keys are fixed as far as the data the settings (`sanitizeSettings`) and `shortcutFor`, the facing wheel and every key hint read it. One difference from
shows: `pc_key_holder` hints). the estimate that stood here: a key another action has is swapped, not refused. The official PC client's keys are
fixed as far as the data shows (`pc_key_holder` hints), so the shortcuts are the remake's own.
### 25.20 Language packs: a language is a file in the language folder, the first type of content packs (W5AD; the owner's decisions of 2026-10-07) — `shared/packs.js`, `shared/i18nPacks.js`, `shared/i18n.js`, `shared/i18nData.js`, `server/packs.js`, `server/http/static.js`, `public/js/ui/lang.js`, `public/js/data.js`, `tools/i18n.mjs`, `tools/packs.mjs`, `tools/build-i18n.mjs`, `tools/package.mjs`, docs/I18N.md §5, docs/PACKS.md ### 25.20 Language packs: a language is a file in the language folder, the first type of content packs (W5AD; the owner's decisions of 2026-10-07) — `shared/packs.js`, `shared/i18nPacks.js`, `shared/i18n.js`, `shared/i18nData.js`, `server/packs.js`, `server/http/static.js`, `public/js/ui/lang.js`, `public/js/data.js`, `tools/i18n.mjs`, `tools/packs.mjs`, `tools/build-i18n.mjs`, `tools/package.mjs`, docs/I18N.md §5, docs/PACKS.md
@@ -1715,8 +1717,8 @@ one commit with its tests; two open community PRs were reused without merging th
`ko.json`, `zh-TW.json` built with `build-i18n --lang` (ja 96.5 %, ko 97.4 %, zh-TW 91.1 %) and minimal UI packs `ko.json`, `zh-TW.json` built with `build-i18n --lang` (ja 96.5 %, ko 97.4 %, zh-TW 91.1 %) and minimal UI packs
`public/i18n/ja.json`, `ko.json`, `zh-TW.json` — a `_meta` manifest (its own and English name, credits: the official `public/i18n/ja.json`, `ko.json`, `zh-TW.json` — a `_meta` manifest (its own and English name, credits: the official
client data via ArknightsAssets) and no UI strings yet: `ja` / `ko` fall back to English, `zh-TW` to the Simplified client data via ArknightsAssets) and no UI strings yet: `ja` / `ko` fall back to English, `zh-TW` to the Simplified
Chinese UI (no fallback — the owner's choice; [ASSUMED] numbers in 萬 / 億). The menu shows the five languages as Chinese UI (no fallback — the owner's choice; [ASSUMED] numbers in 萬 / 億). With five languages the menu is
buttons. UI translations are welcome from the community (docs/I18N.md §5 "Shipped packs"). a list (buttons up to four). UI translations are welcome from the community (docs/I18N.md §5 "Shipped packs").
- **The output in Chinese and English did not change**: `test/i18n-packs.test.js` renders every msgid of - **The output in Chinese and English did not change**: `test/i18n-packs.test.js` renders every msgid of
`public/i18n/en.json` in both languages with sample params and compares it with the renderer of 0.2.0 before packs; `public/i18n/en.json` in both languages with sample params and compares it with the renderer of 0.2.0 before packs;
`node tools/build-i18n.mjs --check` still finds `data/i18n/en.json` up to date. One English entry was added, the tab `node tools/build-i18n.mjs --check` still finds `data/i18n/en.json` up to date. One English entry was added, the tab
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "stronghold-protocol-alliance", "name": "stronghold-protocol-alliance",
"version": "0.2.0-dev", "version": "0.2.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "stronghold-protocol-alliance", "name": "stronghold-protocol-alliance",
"version": "0.2.0-dev", "version": "0.2.0",
"hasInstallScript": true, "hasInstallScript": true,
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
"dependencies": { "dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "stronghold-protocol-alliance", "name": "stronghold-protocol-alliance",
"version": "0.2.0-dev", "version": "0.2.0",
"private": true, "private": true,
"description": "明日方舟「卫戍协议:盟约」非官方同人联机网页复刻(1–4 人合作,Node.js 服务器 + 浏览器客户端)", "description": "明日方舟「卫戍协议:盟约」非官方同人联机网页复刻(1–4 人合作,Node.js 服务器 + 浏览器客户端)",
"license": "GPL-3.0-or-later", "license": "GPL-3.0-or-later",
+1 -1
View File
@@ -5,7 +5,7 @@ import { N_ } from './i18n.js';
export const PROTOCOL_VERSION = 1; export const PROTOCOL_VERSION = 1;
/** Release version shown to players (title screen, server banner, /healthz). Kept equal to package.json "version" /** Release version shown to players (title screen, server banner, /healthz). Kept equal to package.json "version"
* (test/version.test.js); PROTOCOL_VERSION above is the separate wire-format number. */ * (test/version.test.js); PROTOCOL_VERSION above is the separate wire-format number. */
export const APP_VERSION = '0.2.0-dev'; export const APP_VERSION = '0.2.0';
/** A development build (the public `dev` branch): the title screen, the boot banner and the README say so, and /** A development build (the public `dev` branch): the title screen, the boot banner and the README say so, and
* tools/package.mjs refuses to build a release zip from it without --allow-dev. */ * tools/package.mjs refuses to build a release zip from it without --allow-dev. */
export const DEV_BUILD = /-dev$/.test(APP_VERSION); export const DEV_BUILD = /-dev$/.test(APP_VERSION);