Chrome / Edge Manifest V3 扩展。配置模型密钥(或本地模型地址)、API 地址和游戏页快捷键,即可一键接管正在运行的对局。无需 Node 代理、控制台代码或重新构建游戏。
官网:《王二火大》 · WannaFire official website。扩展弹窗底部和使用说明的官网入口随语言切换:中文显示「王二火大」并打开 wangerhuoda.com,英文显示「wannafire」并打开 wannafire.com,均使用新标签页。
当前版本:0.7.5。各版本改了什么见 更新记录。
| 能力 | 说明 | 引入版本 |
|---|---|---|
| 一键托管 | 在游戏页开启 / 停止 AI 托管,支持自定义快捷键 | 0.2 |
| 双语观察台 | 弹窗内「战场」「趋势」两页实时战况,中 / EN 即时切换 | 0.2 |
| 游戏内悬浮状态窗 | 托管时在游戏画面上显示状态、资金、响应耗时 | 0.3 |
| 两种模型来源 | Jev 云端(需密钥、按次计费)或 本地部署的 Laya 模型(免费、可局域网共享) | 0.4.0 |
| 设置页体验改进 | 密钥可显示 / 隐藏、已保存密钥直接回填、输入错误就地提示、测试按钮直接显示结果 | 0.4.0 |
| 决策日志 | 本机记录每次模型问答与执行结果,可导出 JSON 离线分析 | 0.4.1 |
| 按实际兵力出击 + 战役目标 | 出击门槛随生产能力变化,探图不再中断,可填写本局目标 | 0.4.2 |
| 后台不停摆 + 舰船自卫 | 切到别的标签页时托管照常运转;军舰遇敌自动还击 | 0.4.3 |
| 对局战绩 | 每次托管结束自动记一场,含时长、资金曲线、决策统计,可逐场导出 | 0.4.3 |
| OpenAI 兼容模型 | 任意 OpenAI 格式的服务都能当模型来源,模型从服务的列表里选;对局记录云端 / 本地、具体模型、请求地址和 Token 消耗 | 0.5.4 |
| 指挥模式 | OpenAI 兼容来源可切到「指挥官」:模型读战况简报,自己给每支小队定打法、决定造什么,扩展负责执行和本能反应 | 0.7.0 |
| 自动发版 | 推送 main 自动测试、打包并发布 GitHub Release |
0.4.x |
加粗项为在原项目(ra2web/jev-helper 0.3.0)基础上新增的能力。
-
将发布 ZIP 解压到固定目录(ZIP 可在本仓库 Releases 页下载)。在 Chrome 的
chrome://extensions(Edge 为edge://extensions)打开「开发者模式」,点击「加载已解压的扩展程序」,选择含manifest.json的目录。本地开发可直接选择本项目的dist/。 -
打开扩展弹窗,进入「设置」,先在顶部选择「模型来源」:
- Jev 云端:填写密钥,也可选择「从本地 .env 配置导入」读取已有的
JEV_API_KEY、JEV_BASE_URL、JEV_MODEL。其他字段不会保存或发送。API 默认https://api.typesafe.ai/v1,也接受完整/systemone地址;自定义服务必须实现 Jev 的候选 Choice 协议,不是普通 Chat Completions 接口。 - 本地 Laya:先按 本地模型使用说明 启动本机服务,再填地址(和局域网令牌)。
保存时只申请所填 API 域名的访问权限。
- Jev 云端:填写密钥,也可选择「从本地 .env 配置导入」读取已有的
-
点快捷键输入框,按下组合键并保存。默认
Alt+Shift+J,作用于游戏页面;浏览器地址栏或聊天输入框中不触发。「测试模型连接」只发送一次无游戏动作的候选选择请求(Jev 云端可能产生少量模型费用),结果直接显示在按钮上;成功后再开局。 -
(可选)打战役关卡时,在「本局目标」里写上任务目标,例如「摧毁地图东北角的五角大楼」,详见 出击策略与战役目标。
-
在
https://ra2web.github.io/正常进入对局,点击「开启托管」。再次点击「停止」或按快捷键即可接手。关闭弹窗仍继续运行。已打开的游戏页建议在安装扩展后刷新一次,确保快捷键监听器加载;工具栏按钮可直接注入当前页面。
也预先支持 wangerhuoda.com、www.wangerhuoda.com 和 staging.wangerhuoda.com。localhost / 127.0.0.1 调试页可通过点击扩展注入;首次点击前不注册这些调试页的快捷键。页面必须暴露兼容的 window.werhd 玩家 API。
密钥保存在本机浏览器扩展存储,不同步、不注入游戏页面、不记录到日志。它不是系统钥匙串加密存储。可在弹窗清除。更换服务域名需重新输入相应密钥。模型请求由扩展后台发出,拒绝重定向,网页不能指定请求 URL 或读取密钥。
HTTP 401/402/403 会显示具体状态并立即停止托管;服务恢复或修改配置后手动开启。每局默认 2000 次请求上限,达到后停止,不等于游戏结算或费用上限。不会自动接管下一场比赛。
除了 Jev 云端,扩展还能使用在本机 Apple 芯片上运行的 Laya 决策模型:不需要密钥、不产生费用,可局域网共享,但决策质量明显弱于 Jev,属实验用途。模型来源、服务端启动、扩展里要填的地址与令牌、请求 / 响应格式和常见问题,见 本地模型使用说明(docs/local-laya.md)。
原策略按遭遇战写死:进攻选项只在「至少 8 辆地面作战车辆(有敌机时另加 2 辆机动防空)」时出现,探图只在「从未见过敌方建筑」时提供。战役关卡常常造不出车、只能出步兵或根本不能生产,于是永远卡在集结和生产。现在:
- 出击门槛跟着生产能力走(
state.forceReadiness,每次决策都附带原因):能造车按原规则;造不出车时步兵等一切武装单位一起计数;什么都不能造时有多少打多少;部队长时间(2700 tick)没有增长也直接用现有兵力进攻。造不出防空车时不再因为敌机而死等。 - 探图不再因为见过一栋敌方建筑就停止:只要还不能进攻,就持续派一个可消耗单位向未探索区域推进;侦察兵的训练也随之继续。
- 本局目标:设置页新增「本局目标(可选)」,例如「摧毁地图东北角的五角大楼」,下次开启托管起随每次决策发给模型,替换默认的遭遇战目标;留空按遭遇战处理。游戏接口不提供任务文本,需要手动填写。
此前决策和微操只靠页面定时器驱动,Chrome 对后台标签页会把定时器压到每分钟一次,而游戏模拟照常推进,于是切走一会儿就会出现「每分钟只问一次、部队原地不动、钱越攒越多」。现在玩家 API 的 onTick 每拍检查一次,定时器迟到就立即补跑,标签页在后台也保持正常节奏;停止托管时注销回调。页面不提供 onTick 时退回定时器。
海军单位射程内出现敌人时自动开火,即使正在执行模型下达的打击或侦察命令;不参与陆战任务和工厂通道清理。
弹窗新增「战绩」标签。每次托管结束(手动、胜负、对局结束、页面刷新)自动记录一场:时长、游戏内时长、模型来源与模型名、请求 / 回答 / 失败次数、平均响应、受理 / 等待动作数、部队峰值、资金起止与峰值、资金与决策曲线、已受理生产、各决策组等待率、本局目标与结束原因。重复停止不重复记录,只监视不托管不记录。最多保留 30 场,可逐场「导出这场 JSON」或「清空战绩」。
设置页底部新增「决策日志」:扩展在本机记录每次模型问答(各决策组的说明、候选、选择、置信度、概率)、执行结果(受理 / 等待 / 未执行及原因)、请求失败、托管开始结束和对局结果,附带当时的资金、部队、电力等数字摘要;不记录密钥、会话令牌和原始单位列表。最多约 2000 条或 4 MB,超出时丢弃最旧的。
面板直接显示汇总:决策次数、平均响应、受理 / 等待 / 未执行、已受理的生产、各决策组的等待率与常选项。「导出 JSON」把汇总和全部记录下载为 jev-log-<时间>.json,「清空日志」删除本机记录。状态摘要里还带有当时的出击就绪状态与原因。
离线分析:
node tools/analyze-log.mjs <导出的 json 或 laya --log 文件>打印同样的汇总并列出全部选择等待的比例。本地 Laya 服务加 --log <文件> 会把每次请求另存为 JSON Lines(候选、选择、概率、耗时、状态长度),同一脚本也能分析。
- 模型来源开关:顶部切换 Jev 云端 / 本地 Laya,两套地址、密钥 / 令牌、模型名各自保存。
- 密钥显示与回填:JEV 密钥、本地访问令牌右侧有小眼睛按钮切换明文 / 密文;打开设置时已保存的密钥直接回填并默认遮住。输入框里是什么就保存什么,清空并保存即清除;更换 Jev 服务地址时必须重新输入密钥。密钥只返回给扩展自己的弹窗,内容脚本、状态接口、悬浮窗都拿不到。
- 行内错误提示:哪个输入框有问题,就在它下面标红并写明原因(缺密钥、地址非法或非 HTTPS、模型名 / 快捷键非法、上限超范围等),焦点自动落到第一个出错处。地址、密钥、令牌、模型名保存时自动去掉首尾空格。
- 测试按钮带状态:「测试模型连接」按钮自身显示测试中 / 成功(含来源、耗时、模型名)/ 失败(含原因),修改设置后自动复位。
- 默认允许展示,仅在托管已开启且展示设置开启时出现。快捷键、停止按钮、自动结束托管都会同步隐藏;不会在大厅或未托管时出现。
- 半透明窗口显示托管状态、有效模型回答数、资金、响应耗时、游戏 tick、停止快捷键和当前模型来源。拖动标题可移动,也可聚焦标题后用方向键移动;右侧按钮收起 / 展开。在当前页面内保留位置,刷新后重置。
- 在扩展「设置」中关闭「托管时显示悬浮状态窗」即可隐藏,立即保存、下次仍生效,不影响托管运行。语言跟随扩展设置。
- 开始 / 停止采用状态通知;可见且正在托管时约每 1.5 秒读取扩展会话及控制器状态,不额外请求模型或提交游戏命令。窗口不接收密钥、会话令牌或原始模型输出。
- 顶部「中 / EN」即时切换并保存语言。英文游戏名为 WannaFire。界面、提示、快捷键通知与帮助页均提供两种语言;游戏自身的语言不受影响。英文下单位使用稳定的规则代号(例如
MTNK),不伪造游戏未提供的英文译名。 - 「战场」:基地威胁、基地火力覆盖之外的攻击者、己方作战单位、视野内敌军、基地附近敌军、矿车、平均血量、防空、电力、生产队列和己方单位清单。位置图仅显示当前可见的最多 24 个单位/方和基地,自动缩放,不是全图雷达。
- 「趋势」:累计有效模型回答折线;现有资金与扣除生产队列剩余投入后的资金估算双线。支持鼠标查看采样点和左右方向键。模型一次回答可能包含多组选择,回答数、等待选择数和已受理动作数分开显示。
- 打开弹窗时每约 1.5 秒按需读取现有玩家 API,未开启托管也能观察;不调用模型、不提交命令。运行托管时关闭弹窗仍由玩家观测事件记录,停止托管且关闭弹窗后不再采样。
- 图表保留最近 300 个点,采样间隔至少 2 秒,横轴为本机时间;实际间隔也取决于游戏速度。超过 10 秒的采样空缺不连接曲线。数据存于本地扩展 session storage,后台休眠不丢失;每次开启托管、切换新局、刷新页面会重新开始,不保留长期战报。结束对局保留最后快照并标记为非实时。
- 态势来自当前玩家视野,威胁判断沿用本地策略的公开规则分析;不读取迷雾中敌军,不保证估算完整。
- 自动探索兜底:视野里没有敌人、也没有已知敌方建筑时,模型连续三次对探图选「等待」,扩展直接派出第一条前沿探索任务(日志中记为
auto_explore),任务未完成时部队不再原地空等。 - 海陆协同:基地受到舰船威胁时,能打到它的己方舰船一并编入「保卫基地」任务;闲置舰船会主动接近 12 格内能打的敌人。
- 桥梁修理:桥梁修理小屋不再只看基地 40 格以内,行进路线上任何己方单位 25 格内的小屋都会触发「派工程师检修」候选,没有工程师时提示训练一名。
- 双方兵力与战损:每次观测统计我方单位 / 建筑数、可见敌方单位 / 建筑数,以及累计新建、我方损失、击毁敌方(只算在我方视野内消失的目标,迷雾中的不计)。「趋势」和每场战绩各有「兵力趋势」「战损累计」两张曲线。
- 结果标记:对局结束时未战败的场次显示「对局结束 · 未战败」,战绩详情可手动标记胜利 / 战败或清除。游戏接口在任务完成后立即离开对局,扩展来不及读到胜负,战役胜利需要手动标记。
- 悬浮窗:托管时的游戏内状态窗新增一行四个数字:我方人员损失、击毁敌方人员、我方建筑损失、击毁敌方建筑(与「战损累计」口径一致,只算视野内消失的敌方目标)。
- 自动战报:设置里「对局结束后自动保存战报」默认开启。每次托管结束,扩展把这场的战绩记录、资金 / 兵力 / 战损曲线和该场全部决策日志打包成一个 JSON,静默保存到「下载 / jev-reports / jev-report-<时间>.json」,不弹保存框,不含密钥。战绩详情里会显示文件名。
tools/analyze-log.mjs可直接分析该文件。 - 按态势升级打法:每次决策先评估最近 1800 拍的交换比和当前进攻是否停滞。损失 ≥ 4 且击毁不到损失一半,或对同一目标进攻超过 2700 拍毫无进展,就提升「升级等级」(最高 3):放弃当前添油式进攻、出击门槛按等级提高(8 → 12 → 16 → 20),生产目标同步上调,并把能用的一切列给模型:有弹药的飞机、军舰、目标附近可驻守的空民房(作为前沿火力点,驻守候选会扩展到目标 14 格内)、工程师、可建的前沿防御。空军、海军、驻守、工程、运输各组的说明都会附上「地面进攻失利,把这一支力量用到同一目标上」。交换比转好或安静一段时间后等级回落。决策日志的状态摘要记录升级等级与近期损失 / 击毁。
原策略写死「3 辆矿车、2 座精炼厂」,还要求先有 2 辆矿车才生产战斗单位、资金超过 6000 就建第二座车厂。现在每次决策先看最近 1800 拍的实际收入(资金变化加上已花掉的钱)、资金是在累积还是在下降、矿车有没有因为找不到矿而闲置,再定目标:
- 资金 ≥ 4000 且没有下降:钱不是瓶颈,矿车和精炼厂都维持现状,不再追加。
- 有矿车找不到矿而闲置:目标停在现有数量,不再买矿车。
- 资金 < 1500 且在下降:向「每座精炼厂 2 辆、最多 3 辆」扩张;矿车已有 2 辆时优先补第二座精炼厂。
- 其他情况:按每座精炼厂 2 辆维持,上限 3。
- 没有精炼厂时先建精炼厂,任何矿车都不买。第二座车厂只在资金富余且车厂队列排满时考虑。
目标和理由写进 state.economy,建筑组与车辆组的说明随之变化;「先有 2 辆矿车才出战斗单位」等门槛也改为不超过当前目标。
- 历史保存在浏览器里:每场托管结束自动记一条战绩,并把这一场的全部决策日志单独存下来(最多 100 场,最旧的连同日志一起淘汰)。扩展已申请
unlimitedStorage,不受 10 MB 限制。 - 独立数据面板:弹窗右上角「数据面板 ↗」打开一个完整网页(
dashboard.html):总览(场次、胜负、总决策、总时长)、战绩表(时间、标签 / 页面、来源、结果、时长、回答、结束资金、部队峰值、损失 / 击毁)、单场详情(元信息、标签与备注、结果标记、四张曲线、各组等待率、关键事件、逐条决策记录)、导出这场(含日志)、删除这场、导出全部、清空全部,以及全局决策日志的汇总 / 导出 / 清空。 - 弹窗只管配置与实时控制:战绩与日志面板从弹窗移除,弹窗保留战场、趋势、设置三个标签。
- 对局元信息:开局时从页面和公开 API 采集:页面标题与地址(游戏接口不提供地图 / 任务名,页面标题是最接近的标识)、玩家列表(名字、国家、AI / 人类、盟友 / 敌方、是否已战败)、参战人数与对手数、地图尺寸、开始拍与开始秒。写进战绩与该场日志,面板里可见,并可手动加标签和备注用于后续分组分析。
- 工程师占领:工程组新增「占领」候选:先是中立的科技建筑 / 前哨,其次是九格内没有武装敌人的敌方经济与生产建筑(精炼厂、车厂、基地车、电厂、高科技);围墙、防御、修桥小屋和可驻守的民房不作为占领目标。下达后扩展持续跟进:工程师空闲就重新派出,建筑易手即完成,工程师阵亡或超时则放弃。没有工程师时,步兵组会以「OBJECTIVE:训练工程师去占领 xxx」的名义提供训练。
- 自动兜底:标记为关键的候选(视野无敌时的探索、占领中立建筑、资金充裕时训练工程师)在模型连续拒绝 2–3 次后由扩展直接执行,日志记为
auto_explore/auto_engineering/auto_infantry。自动执行的动作在「最近答案」里带*。 - 历史参考与老选项降级:每个决策组记住最近 8 次答案及当时的损失 / 击毁。打不动时(升级等级 ≥ 1,或同一选项连选 4 次没有击毁)把「最近答案 + 期间损失 / 击毁」写进题面,提示换一种;连选无进展的选项在描述前加
STALE ×N,升级到 2 级时直接从候选中撤掉一轮(保卫基地除外)。决策日志的状态摘要记录这些提示。
- 第三种模型来源「OpenAI 兼容」:OpenAI、各类中转、DeepSeek、通义、Ollama、LM Studio 等 OpenAI 格式的服务都能用。扩展把战况和同一组候选发给模型,模型通过函数调用(默认)或 JSON 输出选择;只能从给出的候选里选,选错或缺项的组按「等待」处理并在日志里标
*。模型还会给每个选择附一句理由,数据面板的逐条决策里可见。 - 模型从列表里选:填好 API 地址和密钥后点「获取模型列表」,扩展调用服务的
/models接口,下拉选择,不用手输模型名。列表跟着地址记住;换了地址要重新获取,且必须重新输入密钥(已保存的密钥不会发往另一个服务)。本机 / 局域网地址可不填密钥。 - 兼容不支持强制函数调用的服务(0.5.5):DeepSeek 的思考模型等会拒绝「指定必须调用某个函数」,扩展遇到这种拒绝会自动改成让模型自行调用再发一次,并记住这个服务和模型,之后不再先试。
- 等得更久:真实模型一次回答通常 5–25 秒,这个来源单次最多等 30 秒,回答过期的容忍度也放宽。游戏倍速越高,越容易因过期被丢弃,建议用正常速度。
- 对局记录新增模型信息:每场战绩记下来源类型(云端 / 本地;OpenAI 兼容按地址判断)、来源名称、配置的模型和服务实际返回的模型、调用方式、请求地址,以及输入 / 输出 / 合计 Token。数据面板的战绩表多了 Token 列,总览多了总 Token,单场详情显示以上全部并算出每次决策平均 Token;决策日志的每条记录也带输出 Token。Jev 和本地 Laya 的对局同样记录这些。
三局实测(Jev / 本地 Laya / DeepSeek)都卡在断桥前:部队反复进攻对岸一面敌方国旗,工程师被派去「占领」路灯和管道堆(这些根本不能占领,工程师原地反复重发),修桥选项从没被选中。用这三局的真实回合重放发现,问题在我们出的题,不在模型:
- 装饰物不再是目标:旗帜、路灯、管道、围栏、路牌等没有功能的建筑,不会出现在进攻选项和「已知敌方建筑」里;中立建筑只有真正的科技建筑(油井、医院、机械厂、机场、前哨、科技电厂、实验室等)或有发电 / 精炼 / 生产功能的才给工程师占领。
- 占领失败会放弃:工程师到了目标旁边反复被拒(重发 3 次)或超时,就放弃并记住这个目标,不再提供。
- 修桥说清楚为什么:同一个进攻目标持续 2700 拍没打下来(重复下令不重置计时),或地图上看得到受损的桥段,修桥选项会写明「进攻卡住了,很可能是桥断了」,排在占领前面,模型连续两次不选就由扩展自动派工程师;没有工程师时,训练工程师的选项同样写明修桥并可自动执行。
- 生存性重建自动兜底:「重建精炼厂 / 基地车」这类恢复收入或建造能力的选项,模型连续两次选等待后由扩展自动建造(本地 Laya 那局连续 480 次选等待,从没重建精炼厂)。
依据四份实测战报:一条路两边各有碉堡,部队只打一边、另一边没人进民房去打,最后变成一两个兵往上送;「参考过往选择」几乎没触发;DeepSeek 偶尔不调用函数,连续 5 次看不懂的回答让托管自动停止。
- 据楼攻坚:每个看得见的敌方防御(碉堡、塔)单独找一栋离它 8 格以内的空民房,给出「派 N 个步兵进这栋楼打它」的选项,两边的碉堡各自一个选项;进攻失利(打法升级或进攻卡住)时写明优先,模型连续两次不选就自动派兵进楼。
- 不把兵留在家里:基地附近的守楼选项只在基地受威胁或闲置步兵至少 8 个时才给(之前一局里同一栋自家民房被进了 6 次)。
- 两边都打:进攻选项除了原来的两个主目标,还单独列出离部队最近的最多 3 个敌方防御。
- 不再添油:还能生产时,可调动的兵少于 4 个就不进攻,改为集结;部队停止增长后的「现有兵力进攻」也要求至少 4 个。
- 历史参考真正生效:同一选项连续选 4 次、期间「一个没打掉」或「损失多于击杀」都算没有进展,会在题面写出最近的选择与战损并标记 STALE(之前只认「一个没打掉」,添油时总能打掉几个,所以几乎不触发);连续 6 次没有进展就把它撤下一轮(本地 Laya 读不懂提示,只能靠撤选项)。保卫基地永不撤。
- 函数调用回答看不懂时重发:模型没有调用函数、直接回一段文字时,改用 JSON 输出自动重发一次,再失败才算一次失败。
进楼能打,但一直待在里面等于少了这些兵。现在扩展记住每栋楼是为什么进的,任务完成就自动撤出,步兵回到部队:
| 进楼原因 | 什么时候撤 |
|---|---|
| 据楼攻坚(打某个碉堡) | 那个碉堡没了,且楼 10 格内没有武装敌人,稳定约 10 秒 |
| 前沿据点 | 楼 10 格内连续约 1 分钟没有武装敌人 |
| 守自家门口 | 楼 10 格内连续约 3 分钟没有武装敌人 |
- 附近还有武装敌人时绝不撤,避免出楼就挨打;楼被打到快塌时的紧急撤出仍由原来的选项负责。
- 刚撤出的楼 2 分钟内不再出现在进楼选项里,避免进进出出。
- 撤出由扩展自己判断执行,不额外问模型;进楼的题面里也告诉模型「完成后会自动撤出」。
一局 Jev 实测从游戏第 13 分钟到第 78 分钟一动不动:只有 4 个动员兵,兵营在、钱涨到 7.2 万,却一个兵没造,每轮都说「能调动的兵不足 4 个,先集结」,共用了 1400 多万 Token。原因是这张图造不了战车工厂,而步兵规则仍按「坦克是主力、步兵只是辅助」:最多 6 个步兵、每种角色最多 3 个,于是永远凑不够 8 人的出击门槛。
- 步兵就是主力时取消辅助上限:可生产的列表里没有能打仗的战车时,步兵上限按出击需要放宽(最多 16 个),不再按角色限 3 个;钱至少 3000 且兵不够出击时,模型连续两次不选造兵,扩展就自己造。
- 死锁时自动据楼攻坚:部队长时间凑不够出击人数(2700 拍没增长),据楼攻坚也写明原因并自动执行,让现有步兵有进展。
- 防空塔不是攻坚目标:只对空的防御(如爱国者导弹)不挡路,不再派步兵进楼去打(本地 Laya 那局两次攻坚都打的是爱国者导弹)。
- 没事时少问几次:连续 5 轮全部选等待、也没有执行任何动作,且基地没被攻击,就改为约 3 秒问一次;有动作或基地被打立即恢复原来的节奏。
两局本地 Laya 实测:一局已经打到对方家门口,五角大楼却一直没被摧毁,部队挨打不还手,损失 162;接着一局设了本局目标「摧毁五角大楼」,部队反复进军又掉头,最后 53 次回家集结。原因是本局目标只作为一句话写在题面开头,没有任何选项对应它;进攻名单里防御位常被只能打飞机的爱国者导弹占满;模型每隔几秒换一次目标,整队就掉头一次。
- 本局目标直接给选项:本局目标里写的建筑名(中文如「五角大楼」「白宫」「发电厂」「兵营」「铁幕」等,或直接写英文,英文按整词匹配)会对上画面里的建筑,作战题的第一个选项就是「摧毁它」,写明编号和坐标。不管兵够不够都列出来,但只有部队已就绪(或兵力长期不再增长)时,模型连续两次选等待,扩展才自己派兵去打;兵不够时只列不派,模型选「集结」也照办,避免把小股部队一波波送上去。已经在打这个目标时不会重复派。目标走进迷雾后按最后看到的位置推进,确认被摧毁后选项消失;被我方工程师占领则记为「已占领」、不再进攻。还没找到目标时,探图会继续并写明在找它。目标按逗号、句号、「和」「并」「但」、and、but 等分句理解:「摧毁五角大楼,保护白宫」「摧毁五角大楼但不要打白宫」都只打五角大楼,写「保护 / 占领 / 不要打」的建筑绝不进攻。基地被打时先守家,目标选项排第二、不自动执行。
- 进攻名单更实用:防御目标只列能打地面部队的(爱国者这类防空塔不再占防御名额,但排在普通建筑最后,敌人只剩防空塔时照样能打,能收尾);其余建筑按建造厂、工厂 / 兵营、矿场、电厂排序;总共不超过 6 个进攻选项,有本局目标时不超过 4 个(目标附近的碉堡优先,越贴近目标越靠前),保证本地小模型读得到就绪信息和目标选项。
- 挨打会还手:单位被射程更远的敌人打(比如动员兵被碉堡打)时,能伤到对方就和附近同伴一起抵近还击,伤不到(比如步兵被坦克打)就退出对方射程,之后约 30 秒内任务不会再把它派回去;同一单位约 4 秒内只处理一次。大规模混战时每轮只检查一批单位、先按距离粗筛,不拖慢游戏;战报里这类记录每 10 秒最多一条、同一轮合并。
- 不再来回掉头:接受一个进攻任务后约 30 秒内,除非目标已毁、基地要守、是本局目标或是本局目标附近挡路的碉堡,不接受换去打别的目标或回家集结(记为「任务锁定」,模型能在历史里看到);同一目标反复下令既不重置「进攻停滞」计时,也不延长锁定;进攻失利被放弃时锁定一并解除,马上可以集结。「已在进攻」只在兵力仍有门槛 75% 以上时成立,残兵不能借此绕过门槛。
- 出击判定更稳:进入「可以出击」后,兵力跌破门槛的 75% 才转回集结;集结点固定约 2 分钟,不再每轮漂移、反复下集结令。只能打附近 15 格内的可见敌军,选项写明目标和坐标。
- 修正造兵死锁:防御建造队列里的哨戒炮不再被当成「能造战车」;进攻失败后门槛升到 12 / 16 时,自动补兵按新门槛算;失败后「兵力停止增长就出击」的等待从 2 个观察窗口缩短为 1 个。
- 题面更省:作战题把本局目标和是否就绪放在最前面,进攻失利说明压缩成一句放最后;基地没受威胁时不再问防御建造(原先每轮都答「等待」,约占四分之一 Token);修桥只在进攻卡住或看到桥受损时才给。
0.6.0 实测(本地 Laya,目标「摧毁五角大楼」,最后敌方建筑清零)里,游戏第 756–948 秒约 3 分钟损失 92 个单位:
- 还手的兵被拉走:判断「同一个任务」要求目标相同且单位名单完全一样,而部队一直有新兵加入、有人阵亡,名单几乎每轮都变,于是每 2–3 秒整支部队重新接到「进攻兵营」,刚转身去打身边敌人的兵又被拉回去。现在同一目标再次下令时只发给新来的和空闲的单位,正在交火的兵保持当前目标。
- 拿步兵冲碉堡:0.6.0 的射程外受击回应让附近的动员兵「抵近还击」碉堡——碉堡正是克步兵的。现在打我们的是固定防御时,附近不足 8 人就后撤出它的射程,并把这座碉堡标记为「据楼攻坚优先」:据楼攻坚选项排第一,模型一轮不选就自动派兵进楼;8 人以上才一起强攻。射程更远的敌方步兵、载具仍照常抵近还击或后撤。
- 本局目标没匹配上时留下线索:这局设了「摧毁五角大楼」,但全场题面都是「Target not found yet」,没有任何建筑被识别为五角大楼。现在目标没匹配上时,每条决策日志会带上视野里所有敌方 / 中立建筑的名称和代号,下次战报里就能查到它在游戏里的真实名字。
- 家门口民房反复进出:自家门口的一栋民房被下令进驻 65 次,「空闲乘员重新进入」497 次。现在家门口守楼只在基地受攻击时给(自动补兵后闲置步兵几乎总是超过 8 个,旧条件等于一直成立);进不去的楼重发 3 次仍进不去就放弃。
到 0.6.1 为止,扩展先用规则把局面想一遍,每组只给模型 2–6 个候选,模型做选择题。实战里反复出问题的几乎都是规则这一层:规则没想到的(另一侧的碉堡、五角大楼)模型选不到,规则想错的(拿步兵冲碉堡)模型也纠正不了。0.7.0 给「OpenAI 兼容」来源加了第二种决策方式,设计见 docs/commander-design.md。
- 怎么打开:设置 → 模型来源选「OpenAI 兼容」→「决策方式」选「指挥官(大模型自行决定打法)」。Jev 云端和本地 Laya 仍然只做选择题(本地 Laya 每组只读约 256 Token,读不了简报)。改这一项和改模型一样,会停止正在进行的托管。
- 模型看到什么:一份战况简报——每种单位能做什么(射程、对空射程、对步兵 / 装甲 / 建筑 / 飞机的每秒伤害、能不能进楼、是不是只能打飞机)、我方各小队(兵种、位置、血量、当前意图、谁在打它、对方射程是否更远)、敌方部队和建筑(血量、射程、旁边的空民房)、断桥和修桥小屋、能造什么、本局目标,以及上一轮命令的结果(执行了没有、小队还剩几人、目标还剩多少血、这段时间损失 / 击杀多少、哪些命令因编号不存在被拒)。
- 模型能下什么:每支小队一个意图——进攻某个目标、边走边打、移动、到点坚守、进某栋民房、回防基地、撤回整补、派最快的一个去探路;造什么兵 / 建筑(每次最多 5 个);派空闲工程师占领或修桥。所有编号都会核对,不存在的那一条丢弃并在下一轮告诉模型原因,其余照常执行。
- 扩展怎么执行:两轮之间扩展自己维持意图:只给新加入或空闲的成员补令,不打断正在交火的兵;进攻目标看不见时按最后看到的位置推进;进楼只派能进楼的步兵、人数不超过民房空位,其余原地待命不冲过去,碉堡被拆后自动撤出;建筑位置、采矿、修理照旧由扩展处理。本能反应保留:被射程更远的敌人打时还手或后撤、集火、舰船自卫;基地被打约 30 秒(450 拍)模型还没安排回防,就让离基地最近的小队自动回防,并在下一轮简报里写明。
- 节奏:开局立刻问一次,之后约每 12 游戏秒(180 拍)一次;基地刚被打、某支小队这一轮折损过半、进攻目标被摧毁、第一次看到敌方建筑或本局目标时立刻问。上一轮没回来不会再发。单次请求最长等 90 秒(gpt-5.6、deepseek-flash 实测约 30–50 秒)。
- 记录:每轮在日志里记一条「指挥」:简报篇幅、Token、耗时、模型的总体说明、每条命令和理由、执行结果、被拒原因。数据面板的关键事件时间线和决策记录都能看到,单场详情写明决策方式;弹窗「最近执行记录」也会显示;日志统计里有指挥轮数、平均耗时、被拒命令数。
0.7.4 实测(同一关,从第 35 分钟开始托管):部队推到作战实验室旁,守军清完后工程师进去,第 3508 秒占领成功;随即游戏给了一批援军和建筑(第二个建造厂、3 座电厂、苏军作战实验室),但占下的实验室约 6 秒后从我方建筑里消失,再过约 5 秒游戏判定我方战败。日志分不清实验室是被打掉了还是被剧情转给了别的势力。
- 占领后继续跟踪目标:每轮记下它的血量;离开我方后记下是「转手」(又出现在非友方建筑里)、「消失」(可见位置上没了)还是「看不见」,以及最后的血量。
- 战败 / 观察结局时记下各势力是否战败、目标最后的状态、我方剩余建筑数。
- 本版不改打法,只补记录;下次这关的报告就能看出占领后发生了什么。
0.7.3 实测(同一关,还是战败):实验室认出来了,扩展先后派了约 15 个工程师,但每个都是单独从 117 格外穿过敌方碉堡去的,没有一个走到;大部队一直在家「集结」(4/12)。两局实验室都在游戏约 32 分半时消失、随即判负,这关应该有时间限制。
- 占领任务不再等凑满出击人数:有 6 个作战单位就向实验室旁边(离它 4 格、我方来的方向)边走边打,模型两次不选就自动执行;这时不再给「回家集结」的选项。部队只清守军,不打实验室本身。
- 有守军时工程师不再单独出发:跟在推进部队后面约 4 格,部队到了目标 8 格以内、或者目标附近已没有守军时才进去占领。
- 「集火」不会再打要占领或要保护的建筑(模拟时发现停在实验室旁的坦克会自动打它)。
- 正在执行任务的工程师不会再被派去干别的。
0.7.2 实测(本地 Laya,新关卡,目标「使用工程师占领盟军战略实验室」,战败):
- 「占领」被当成了「保护」,目标一直显示没找到,虽然盟军作战实验室整局都在视野里;也没派工程师去占。实验室反而作为普通进攻目标出现在选项里,最后我方在它旁边打建造厂时它消失,随即战败。
- 模型对「造犀牛坦克」连续答了 251 次「等待」,钱从 4,000 涨到 14,000,部队从 19 人打到只剩 6 人。
改动:
- 「占领 / 夺取 / 攻占 / capture / seize」现在是单独一类目标:认出后标成「用工程师占领、绝不攻击」。它不会出现在任何进攻选项里(指挥模式下也不是合法攻击目标),守着它的碉堡排在进攻选项最前面。
- 工程师优先去占它:没有守卫时模型拒绝一次就自动派;有守卫时拒绝三次后自动派。没有工程师就先训练一个,钱少也照样训练;有守卫时多备一个。
- 目标被我方占下算完成;被摧毁会写明「目标被毁,占领失败」。
- 「保护」某建筑时,它也不再出现在进攻选项里。
- 钱在 5,000 以上、部队不到 40 个单位时,模型连续两次不造兵,就自动造一个作战单位(不会是矿车或工程师)。
0.7.1 实测(本地 Laya,目标「摧毁五角大厦」):四块五角大楼都被认出并依次打掉,任务完成。但第一块打了约 10 分钟:这关造不了战车,扩展给纯步兵部队设了 16 人上限,动员兵一直停在 20 人左右,钱却从 4,000 涨到 9,000 没花出去;后来任务送来一批天启坦克,剩下三块 30 秒内全倒。
- 只能造步兵时,手里有 3,000 以上就把步兵上限从 16 提到 40;到 5,000 以上且没到上限,补兵自动执行,不再等模型选。
- 钱不多(3,000 以下)时仍按原来的 16 人上限,给矿车、建筑留钱。能造战车的对局不受影响。
0.7.0 实测(本地 Laya,目标「摧毁五角大厦」)里,目标一直显示「没找到」,最后五角大楼只倒了一半。日志里视野内建筑的名字说明了原因:这张华盛顿地图上的五角大楼是四座建筑,名字是「RA2 Wash Pent A / B / C / D」,没有一座叫「Pentagon」,所以从没被认出来;倒掉的两块是打旁边敌人时顺带打掉的。
- 「五角大楼 / 五角大厦 / Pentagon」现在同时认「Wash Pent」这几块;用这局看到的 38 种建筑核对过,只有这四块被认出,普通的华盛顿民房不会被当成目标。
- 目标由几块组成时,打掉一块后接着打旁边剩下的一块,四块都倒了才算完成。
| 版本 | 主要改动 |
|---|---|
| 0.7.5 | 占领后继续跟踪目标(血量、转手 / 消失),战败时记下各势力状态和目标最后情况;不改打法 |
| 0.7.4 | 占领任务:6 个单位就向目标旁推进(不再回家集结),工程师跟在部队后面、到了再进;集火不打要占领 / 保护的建筑;执行任务中的工程师不被另派 |
| 0.7.3 | 「占领」类目标:认出后绝不攻击,守卫碉堡优先清,工程师优先派(必要时自动),没工程师就先训练;「保护」的建筑也不进进攻选项;钱在 5,000 以上且模型一直不造兵时自动造作战单位 |
| 0.7.2 | 只能造步兵的对局里,钱在 3,000 以上时步兵上限从 16 提到 40,5,000 以上自动补兵,不再让钱堆着、部队停在 20 人 |
| 0.7.1 | 本局目标认得出拆成几块的地标:华盛顿地图的五角大楼是「Wash Pent A–D」四座建筑,现在都算作目标,打完一块接着打旁边的下一块,四块都倒了才算完成 |
| 0.7.0 | 新增指挥模式(仅 OpenAI 兼容来源,设置里切换):模型读战况简报,给每支小队下意图、决定生产和工程师任务;扩展校验编号、执行并维持意图(只给新来 / 空闲的单位补令)、保留还手 / 后撤 / 集火等本能,基地被打 450 拍无回防时自动回防;约每 12 游戏秒决策一次,出事立刻决策;每轮写「指挥」日志,数据面板和弹窗可见 |
| 0.6.1 | 重复同一进攻目标时只给新来的和空闲的单位下令,正在还手的兵不被拉走;少量步兵被射程更远的碉堡打时后撤并把它标为据楼攻坚优先(下一轮不选即自动),8 人以上才一起强攻;家门口守楼只在基地受攻击时给,进不去的楼 3 次后放弃 |
| 0.6.0 | 本局目标(如「摧毁五角大楼」,按分句理解、保护的建筑不打)直接变成作战题第一个选项,部队就绪时可自动执行,目标进迷雾后按记忆坐标推进;防空塔不占防御名额但只剩它们时照样列出;被射程外敌人打时抵近还击或后撤(限量检查、合并播报);进攻任务约 30 秒内不换目标、同一目标不重置停滞计时;出击判定加 75% 缓冲、集结点固定;哨戒炮不再算能造战车、自动补兵按当前门槛;无威胁时不问防御建造、修桥只在需要时给 |
| 0.5.9 | 造不了战车时步兵就是主力:取消「最多 6 个步兵 / 每种 3 个」的上限,钱多兵少时自动补兵;部队长期凑不够出击人数时据楼攻坚自动执行;只能打飞机的防空塔不再作为攻坚目标;连续多轮全选等待且无动作时改为约 3 秒问一次 |
| 0.5.8 | 进楼的步兵在任务完成后自动撤出归队:攻坚的碉堡没了、前沿附近约 1 分钟没敌人、家门口约 3 分钟没敌人;附近有武装敌人时绝不撤;刚撤出的楼 2 分钟内不再进 |
| 0.5.7 | 新增「据楼攻坚」:每个看得见的敌方碉堡单独给出「派步兵进它射程附近的民房」选项,进攻失利时自动执行;家门口的守楼只在基地受威胁或步兵富余时给;进攻选项额外列出离部队最近的敌方防御;能生产时少于 4 个兵不进攻;「损失多于击杀」也算没有进展,同一选项连续 6 次没进展就撤下一轮;函数调用的回答看不懂时改用 JSON 重发一次 |
| 0.5.6 | 装饰物(旗帜、路灯、管道等)不再作为进攻和占领目标;占领反复被拒的目标会放弃并不再提供;进攻长时间卡住或看到损坏的桥时,修桥选项写明原因、排在占领前面并可自动执行;重建精炼厂等生存性建造连续被拒两次后自动执行 |
| 0.5.5 | DeepSeek 等拒绝强制函数调用的服务自动改用「模型自行调用」重发并记住;只填域名时请求地址不再多出斜杠;模型下拉提示选回答快的模型 |
| 0.5.4 | 新增「OpenAI 兼容」模型来源(函数调用 / JSON 输出,模型从 /models 列表选择,理由写入日志);战绩与数据面板记录云端 / 本地、模型、请求地址、Token 消耗 |
| 0.5.3 | 修复数据面板打开后提示「此操作只允许在插件窗口中执行」、看不到任何战绩:后台原先只信任弹窗,面板在标签页里打开被拒;现在信任扩展自己的所有页面,游戏页脚本依旧拒绝 |
| 0.5.2 | 工程师占领中立 / 无防守敌方建筑并持续跟进;按占领目标训练工程师;关键候选被连续拒绝后自动执行;最近答案与损失 / 击毁写进题面,连选无效的选项降级或撤下 |
| 0.5.1 | 跨机器访问:本机、局域网、Tailscale 等私有网络与所有 https 地址默认可用;其他 IP / 域名走明文 http 时在设置的「允许的外部地址」里一键允许后即可使用(按地址精确申请访问权,可随时移除);公网明文时行内提醒;修正清单里 Chrome 不认的 IP 通配授权写法;本地服务启动时列出所有网卡地址并标明 LAN / Tailscale;文档补「用哪个地址」与「分发给别人用」 |
| 0.5.0 | 对局历史保存在浏览器(100 场,含每场完整日志);独立数据面板网页:总览、战绩表、单场详情与曲线、标签 / 备注 / 结果标记、逐场或全部导出、删除;弹窗只保留配置与实时控制;开局采集对局元信息(页面标题与地址、玩家、人数、地图尺寸、开始时间) |
| 0.4.7 | 矿车 / 精炼厂 / 第二车厂目标按实际收入、资金趋势和矿车闲置情况动态决定,不再写死 3 辆矿车 2 座精炼厂 |
| 0.4.6 | 悬浮窗显示双方人员 / 建筑损失;对局结束自动保存战报到下载目录(可关闭);按交换比与进攻停滞自动升级打法:放弃添油、提高集结门槛、上调生产目标、列出空军 / 海军 / 前沿驻守 / 工程师等可用手段 |
| 0.4.5 | 保存设置改为「先保存、再授权」:授权被拒也不丢已填内容,顶部出现「授权访问」按钮一键补授权;开启托管 / 测试连接缺授权时同样提示 |
| 0.4.4 | 拒绝探图三次后自动探索;舰船编入基地防御并主动接近近处敌人;行进路线上的桥梁修理小屋触发工程师检修;双方兵力与战损曲线;对局结果手动标记 |
| 0.4.3 | 决策循环改由游戏拍子唤醒,后台标签页不再每分钟才决策一次;舰船射程内遇敌自动还击;弹窗新增「战绩」标签;决策日志记录出击就绪状态 |
| 0.4.2 | 出击门槛按实际生产能力判断(能造车 / 只能出步兵 / 不能生产 / 兵力停滞各有规则);探图不再因见过敌方建筑而停止;新增「本局目标」设置 |
| 0.4.1 | 新增决策日志:本机记录、面板汇总、导出 JSON、清空;本地服务 --log 请求日志(见 docs/local-laya.md);离线分析脚本 tools/analyze-log.mjs |
| 0.4.x(CI) | GitHub Actions:推送 main 自动测试、打包并按版本号发布 Release;PR 只做检查;Actions 升级到 Node 24 |
| 0.4.0 | 新增「模型来源」开关与本地 Laya 决策服务(npm run laya,支持局域网共享 + 访问令牌);私有网段允许 HTTP;设置页改进(密钥显示 / 隐藏与回填、行内错误提示、测试按钮带状态、自动去首尾空格) |
| 0.3.0 | 游戏内悬浮状态窗 |
| 0.2.x | 双语观察台(战场 / 趋势);同步 WERHD 玩家 API 参考 |
每个版本的测试与验证细节见 VALIDATION.md。
本仓库同步了一份线上玩家 API 参考,供编写和检查扩展策略使用:
API 仍由游戏页的 window.werhd 提供;这些参考文件不打入扩展运行包。
git clone https://github.com/ra2web/jev-helper.git
cd jev-helper
npm ci
npm test
npm run package| 命令 | 作用 |
|---|---|
npm run build |
构建到 dist/,在扩展管理页重新加载并刷新游戏页即可生效 |
npm test |
构建并运行全部测试 |
npm run package |
构建并在 artifacts/ 生成发布 ZIP |
npm run laya |
启动本地 Laya 决策服务(见 docs/local-laya.md) |
node tools/preview.mjs |
界面预览,打开 http://127.0.0.1:4318/ |
node tools/analyze-log.mjs <文件> |
离线分析决策日志 |
dist/ 可直接加载;ZIP 位于 artifacts/。唯一构建依赖是 esbuild,无远程代码、无运行时外部依赖。
界面预览使用模拟数据,只需输入任意测试字符串;不会连接模型或游戏,也不会打包进入扩展。
推送到 main(含合并 PR)时 GitHub Actions 会自动执行 npm test 和 npm run package,并按 package.json 的版本号发布 Release(标签 v<版本>,附带 ZIP 和 SHA-256)。同一版本只发布一次,发新版前先同步修改 package.json 与 public/manifest.json 的版本号(不一致时工作流直接失败);PR 只做检查不发版。工作流见 .github/workflows/release.yml。
src/player/:后续策略的维护位置。初始策略来自原工程docs/examples/jev/的 v8.8.15,射程、编队、防守、科技、部署、驻扎、运输、空军、围墙、变卖与桥梁逻辑保持;0.4.2 起出击门槛与探图规则按生产能力调整。原工程示例是历史接入方案,不会在每次构建时复制覆盖这里的策略。src/page.mjs:通过公开window.werhd控制当前玩家;决策走消息适配器,没有密钥和 HTTP 代理地址。src/content.mjs/src/overlay.mjs:隔离环境中的消息桥接、快捷键和托管时的悬浮状态窗。不自动开启托管。src/background-core.mjs:设置、会话、权限、模型来源选择、Jev / 本地协议、决策日志和错误处理。会话计数存于 session storage,后台休眠/唤醒不重置预算;以标签页、文档和会话标识拒绝过期响应。src/observer.mjs/src/telemetry.mjs:只读观测、压缩快照与有界历史采样。src/i18n.mjs/src/charts.mjs:双语文案和本地 SVG 图表,无外部图表依赖。src/popup.mjs与public/:弹窗(观察台、战绩、设置)、说明、图标。tools/laya-server.py/tools/laya-server.sh:本地 Laya 决策服务(npm run laya),不打入扩展运行包;使用说明见docs/local-laya.md。tools/analyze-log.mjs:决策日志离线分析。test/:既有策略回归及扩展消息、权限、停止、会话边界、双模型来源、决策日志、战役出击规则、拍子唤醒、舰船自卫与战绩测试。
游戏引擎和 API 不在本项目中修改。扩展先用公开战况生成候选,模型(Jev 或本地 Laya)选择候选,执行器复查后提交普通玩家命令。接受命令不等于已经产生游戏效果;策略仍属实验性质。
脚本执行上下文、扩展后台跨域请求、可选域名权限、存储访问范围。Chrome 不提供运行时修改 commands 快捷键的接口,因此弹窗中的自定义组合键由游戏页监听,而不是伪装成已修改浏览器的全局快捷键。
扩展安装和真实模型实战的验证范围见 VALIDATION.md。