Skip to content

About

A helper which use JEV to play ra2web(WannaFire Version)[王二火大]

Resources

Stars

5 stars

Watchers

0 watching

Forks

Repository files navigation

jev-helper · 王二火大 WannaFire

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)基础上新增的能力。

安装与使用

  1. 将发布 ZIP 解压到固定目录(ZIP 可在本仓库 Releases 页下载)。在 Chrome 的 chrome://extensions(Edge 为 edge://extensions)打开「开发者模式」,点击「加载已解压的扩展程序」,选择含 manifest.json 的目录。本地开发可直接选择本项目的 dist/。

  2. 打开扩展弹窗,进入「设置」,先在顶部选择「模型来源」:

    • Jev 云端:填写密钥,也可选择「从本地 .env 配置导入」读取已有的 JEV_API_KEY、JEV_BASE_URL、JEV_MODEL。其他字段不会保存或发送。API 默认 https://api.typesafe.ai/v1,也接受完整 /systemone 地址;自定义服务必须实现 Jev 的候选 Choice 协议,不是普通 Chat Completions 接口。
    • 本地 Laya:先按 本地模型使用说明 启动本机服务,再填地址(和局域网令牌)。

    保存时只申请所填 API 域名的访问权限。

  3. 点快捷键输入框,按下组合键并保存。默认 Alt+Shift+J,作用于游戏页面;浏览器地址栏或聊天输入框中不触发。「测试模型连接」只发送一次无游戏动作的候选选择请求(Jev 云端可能产生少量模型费用),结果直接显示在按钮上;成功后再开局。

  4. (可选)打战役关卡时,在「本局目标」里写上任务目标,例如「摧毁地图东北角的五角大楼」,详见 出击策略与战役目标。

  5. 在 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 次请求上限,达到后停止,不等于游戏结算或费用上限。不会自动接管下一场比赛。

本地部署 Laya 模型

除了 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 辆矿车才出战斗单位」等门槛也改为不超过当前目标。

对局历史与数据面板(0.5.0)

  • 历史保存在浏览器里:每场托管结束自动记一条战绩,并把这一场的全部决策日志单独存下来(最多 100 场,最旧的连同日志一起淘汰)。扩展已申请 unlimitedStorage,不受 10 MB 限制。
  • 独立数据面板:弹窗右上角「数据面板 ↗」打开一个完整网页(dashboard.html):总览(场次、胜负、总决策、总时长)、战绩表(时间、标签 / 页面、来源、结果、时长、回答、结束资金、部队峰值、损失 / 击毁)、单场详情(元信息、标签与备注、结果标记、四张曲线、各组等待率、关键事件、逐条决策记录)、导出这场(含日志)、删除这场、导出全部、清空全部,以及全局决策日志的汇总 / 导出 / 清空。
  • 弹窗只管配置与实时控制:战绩与日志面板从弹窗移除,弹窗保留战场、趋势、设置三个标签。
  • 对局元信息:开局时从页面和公开 API 采集:页面标题与地址(游戏接口不提供地图 / 任务名,页面标题是最接近的标识)、玩家列表(名字、国家、AI / 人类、盟友 / 敌方、是否已战败)、参战人数与对手数、地图尺寸、开始拍与开始秒。写进战绩与该场日志,面板里可见,并可手动加标签和备注用于后续分组分析。

工程师占领、自动兜底与历史参考(0.5.2)

  • 工程师占领:工程组新增「占领」候选:先是中立的科技建筑 / 前哨,其次是九格内没有武装敌人的敌方经济与生产建筑(精炼厂、车厂、基地车、电厂、高科技);围墙、防御、修桥小屋和可驻守的民房不作为占领目标。下达后扩展持续跟进:工程师空闲就重新派出,建筑易手即完成,工程师阵亡或超时则放弃。没有工程师时,步兵组会以「OBJECTIVE:训练工程师去占领 xxx」的名义提供训练。
  • 自动兜底:标记为关键的候选(视野无敌时的探索、占领中立建筑、资金充裕时训练工程师)在模型连续拒绝 2–3 次后由扩展直接执行,日志记为 auto_explore / auto_engineering / auto_infantry。自动执行的动作在「最近答案」里带 *。
  • 历史参考与老选项降级:每个决策组记住最近 8 次答案及当时的损失 / 击毁。打不动时(升级等级 ≥ 1,或同一选项连选 4 次没有击毁)把「最近答案 + 期间损失 / 击毁」写进题面,提示换一种;连选无进展的选项在描述前加 STALE ×N,升级到 2 级时直接从候选中撤掉一轮(保卫基地除外)。决策日志的状态摘要记录这些提示。

OpenAI 兼容模型与对局模型信息(0.5.4)

  • 第三种模型来源「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 的对局同样记录这些。

修桥与装饰物(0.5.6)

三局实测(Jev / 本地 Laya / DeepSeek)都卡在断桥前:部队反复进攻对岸一面敌方国旗,工程师被派去「占领」路灯和管道堆(这些根本不能占领,工程师原地反复重发),修桥选项从没被选中。用这三局的真实回合重放发现,问题在我们出的题,不在模型:

  • 装饰物不再是目标:旗帜、路灯、管道、围栏、路牌等没有功能的建筑,不会出现在进攻选项和「已知敌方建筑」里;中立建筑只有真正的科技建筑(油井、医院、机械厂、机场、前哨、科技电厂、实验室等)或有发电 / 精炼 / 生产功能的才给工程师占领。
  • 占领失败会放弃:工程师到了目标旁边反复被拒(重发 3 次)或超时,就放弃并记住这个目标,不再提供。
  • 修桥说清楚为什么:同一个进攻目标持续 2700 拍没打下来(重复下令不重置计时),或地图上看得到受损的桥段,修桥选项会写明「进攻卡住了,很可能是桥断了」,排在占领前面,模型连续两次不选就由扩展自动派工程师;没有工程师时,训练工程师的选项同样写明修桥并可自动执行。
  • 生存性重建自动兜底:「重建精炼厂 / 基地车」这类恢复收入或建造能力的选项,模型连续两次选等待后由扩展自动建造(本地 Laya 那局连续 480 次选等待,从没重建精炼厂)。

据楼攻坚、不再添油、历史参考真正生效(0.5.7)

依据四份实测战报:一条路两边各有碉堡,部队只打一边、另一边没人进民房去打,最后变成一两个兵往上送;「参考过往选择」几乎没触发;DeepSeek 偶尔不调用函数,连续 5 次看不懂的回答让托管自动停止。

  • 据楼攻坚:每个看得见的敌方防御(碉堡、塔)单独找一栋离它 8 格以内的空民房,给出「派 N 个步兵进这栋楼打它」的选项,两边的碉堡各自一个选项;进攻失利(打法升级或进攻卡住)时写明优先,模型连续两次不选就自动派兵进楼。
  • 不把兵留在家里:基地附近的守楼选项只在基地受威胁或闲置步兵至少 8 个时才给(之前一局里同一栋自家民房被进了 6 次)。
  • 两边都打:进攻选项除了原来的两个主目标,还单独列出离部队最近的最多 3 个敌方防御。
  • 不再添油:还能生产时,可调动的兵少于 4 个就不进攻,改为集结;部队停止增长后的「现有兵力进攻」也要求至少 4 个。
  • 历史参考真正生效:同一选项连续选 4 次、期间「一个没打掉」或「损失多于击杀」都算没有进展,会在题面写出最近的选择与战损并标记 STALE(之前只认「一个没打掉」,添油时总能打掉几个,所以几乎不触发);连续 6 次没有进展就把它撤下一轮(本地 Laya 读不懂提示,只能靠撤选项)。保卫基地永不撤。
  • 函数调用回答看不懂时重发:模型没有调用函数、直接回一段文字时,改用 JSON 输出自动重发一次,再失败才算一次失败。

任务完成后自动撤出建筑(0.5.8)

进楼能打,但一直待在里面等于少了这些兵。现在扩展记住每栋楼是为什么进的,任务完成就自动撤出,步兵回到部队:

进楼原因 什么时候撤
据楼攻坚(打某个碉堡) 那个碉堡没了,且楼 10 格内没有武装敌人,稳定约 10 秒
前沿据点 楼 10 格内连续约 1 分钟没有武装敌人
守自家门口 楼 10 格内连续约 3 分钟没有武装敌人
  • 附近还有武装敌人时绝不撤,避免出楼就挨打;楼被打到快塌时的紧急撤出仍由原来的选项负责。
  • 刚撤出的楼 2 分钟内不再出现在进楼选项里,避免进进出出。
  • 撤出由扩展自己判断执行,不额外问模型;进楼的题面里也告诉模型「完成后会自动撤出」。

打破「凑不齐兵就不进攻」的死锁(0.5.9)

一局 Jev 实测从游戏第 13 分钟到第 78 分钟一动不动:只有 4 个动员兵,兵营在、钱涨到 7.2 万,却一个兵没造,每轮都说「能调动的兵不足 4 个,先集结」,共用了 1400 多万 Token。原因是这张图造不了战车工厂,而步兵规则仍按「坦克是主力、步兵只是辅助」:最多 6 个步兵、每种角色最多 3 个,于是永远凑不够 8 人的出击门槛。

  • 步兵就是主力时取消辅助上限:可生产的列表里没有能打仗的战车时,步兵上限按出击需要放宽(最多 16 个),不再按角色限 3 个;钱至少 3000 且兵不够出击时,模型连续两次不选造兵,扩展就自己造。
  • 死锁时自动据楼攻坚:部队长时间凑不够出击人数(2700 拍没增长),据楼攻坚也写明原因并自动执行,让现有步兵有进展。
  • 防空塔不是攻坚目标:只对空的防御(如爱国者导弹)不挡路,不再派步兵进楼去打(本地 Laya 那局两次攻坚都打的是爱国者导弹)。
  • 没事时少问几次:连续 5 轮全部选等待、也没有执行任何动作,且基地没被攻击,就改为约 3 秒问一次;有动作或基地被打立即恢复原来的节奏。

本局目标真正变成进攻选项、不再来回掉头(0.6.0)

两局本地 Laya 实测:一局已经打到对方家门口,五角大楼却一直没被摧毁,部队挨打不还手,损失 162;接着一局设了本局目标「摧毁五角大楼」,部队反复进军又掉头,最后 53 次回家集结。原因是本局目标只作为一句话写在题面开头,没有任何选项对应它;进攻名单里防御位常被只能打飞机的爱国者导弹占满;模型每隔几秒换一次目标,整队就掉头一次。

  • 本局目标直接给选项:本局目标里写的建筑名(中文如「五角大楼」「白宫」「发电厂」「兵营」「铁幕」等,或直接写英文,英文按整词匹配)会对上画面里的建筑,作战题的第一个选项就是「摧毁它」,写明编号和坐标。不管兵够不够都列出来,但只有部队已就绪(或兵力长期不再增长)时,模型连续两次选等待,扩展才自己派兵去打;兵不够时只列不派,模型选「集结」也照办,避免把小股部队一波波送上去。已经在打这个目标时不会重复派。目标走进迷雾后按最后看到的位置推进,确认被摧毁后选项消失;被我方工程师占领则记为「已占领」、不再进攻。还没找到目标时,探图会继续并写明在找它。目标按逗号、句号、「和」「并」「但」、and、but 等分句理解:「摧毁五角大楼,保护白宫」「摧毁五角大楼但不要打白宫」都只打五角大楼,写「保护 / 占领 / 不要打」的建筑绝不进攻。基地被打时先守家,目标选项排第二、不自动执行。
  • 进攻名单更实用:防御目标只列能打地面部队的(爱国者这类防空塔不再占防御名额,但排在普通建筑最后,敌人只剩防空塔时照样能打,能收尾);其余建筑按建造厂、工厂 / 兵营、矿场、电厂排序;总共不超过 6 个进攻选项,有本局目标时不超过 4 个(目标附近的碉堡优先,越贴近目标越靠前),保证本地小模型读得到就绪信息和目标选项。
  • 挨打会还手:单位被射程更远的敌人打(比如动员兵被碉堡打)时,能伤到对方就和附近同伴一起抵近还击,伤不到(比如步兵被坦克打)就退出对方射程,之后约 30 秒内任务不会再把它派回去;同一单位约 4 秒内只处理一次。大规模混战时每轮只检查一批单位、先按距离粗筛,不拖慢游戏;战报里这类记录每 10 秒最多一条、同一轮合并。
  • 不再来回掉头:接受一个进攻任务后约 30 秒内,除非目标已毁、基地要守、是本局目标或是本局目标附近挡路的碉堡,不接受换去打别的目标或回家集结(记为「任务锁定」,模型能在历史里看到);同一目标反复下令既不重置「进攻停滞」计时,也不延长锁定;进攻失利被放弃时锁定一并解除,马上可以集结。「已在进攻」只在兵力仍有门槛 75% 以上时成立,残兵不能借此绕过门槛。
  • 出击判定更稳:进入「可以出击」后,兵力跌破门槛的 75% 才转回集结;集结点固定约 2 分钟,不再每轮漂移、反复下集结令。只能打附近 15 格内的可见敌军,选项写明目标和坐标。
  • 修正造兵死锁:防御建造队列里的哨戒炮不再被当成「能造战车」;进攻失败后门槛升到 12 / 16 时,自动补兵按新门槛算;失败后「兵力停止增长就出击」的等待从 2 个观察窗口缩短为 1 个。
  • 题面更省:作战题把本局目标和是否就绪放在最前面,进攻失利说明压缩成一句放最后;基地没受威胁时不再问防御建造(原先每轮都答「等待」,约占四分之一 Token);修桥只在进攻卡住或看到桥受损时才给。

自卫:别把还手的兵拉走,别拿步兵冲碉堡(0.6.1)

0.6.0 实测(本地 Laya,目标「摧毁五角大楼」,最后敌方建筑清零)里,游戏第 756–948 秒约 3 分钟损失 92 个单位:

  • 还手的兵被拉走:判断「同一个任务」要求目标相同且单位名单完全一样,而部队一直有新兵加入、有人阵亡,名单几乎每轮都变,于是每 2–3 秒整支部队重新接到「进攻兵营」,刚转身去打身边敌人的兵又被拉回去。现在同一目标再次下令时只发给新来的和空闲的单位,正在交火的兵保持当前目标。
  • 拿步兵冲碉堡:0.6.0 的射程外受击回应让附近的动员兵「抵近还击」碉堡——碉堡正是克步兵的。现在打我们的是固定防御时,附近不足 8 人就后撤出它的射程,并把这座碉堡标记为「据楼攻坚优先」:据楼攻坚选项排第一,模型一轮不选就自动派兵进楼;8 人以上才一起强攻。射程更远的敌方步兵、载具仍照常抵近还击或后撤。
  • 本局目标没匹配上时留下线索:这局设了「摧毁五角大楼」,但全场题面都是「Target not found yet」,没有任何建筑被识别为五角大楼。现在目标没匹配上时,每条决策日志会带上视野里所有敌方 / 中立建筑的名称和代号,下次战报里就能查到它在游戏里的真实名字。
  • 家门口民房反复进出:自家门口的一栋民房被下令进驻 65 次,「空闲乘员重新进入」497 次。现在家门口守楼只在基地受攻击时给(自动补兵后闲置步兵几乎总是超过 8 个,旧条件等于一直成立);进不去的楼重发 3 次仍进不去就放弃。

指挥模式:让大模型自己定打法(0.7.0)

到 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.5)

0.7.4 实测(同一关,从第 35 分钟开始托管):部队推到作战实验室旁,守军清完后工程师进去,第 3508 秒占领成功;随即游戏给了一批援军和建筑(第二个建造厂、3 座电厂、苏军作战实验室),但占下的实验室约 6 秒后从我方建筑里消失,再过约 5 秒游戏判定我方战败。日志分不清实验室是被打掉了还是被剧情转给了别的势力。

  • 占领后继续跟踪目标:每轮记下它的血量;离开我方后记下是「转手」(又出现在非友方建筑里)、「消失」(可见位置上没了)还是「看不见」,以及最后的血量。
  • 战败 / 观察结局时记下各势力是否战败、目标最后的状态、我方剩余建筑数。
  • 本版不改打法,只补记录;下次这关的报告就能看出占领后发生了什么。

占领目标:部队先推过去,工程师跟在后面(0.7.4)

0.7.3 实测(同一关,还是战败):实验室认出来了,扩展先后派了约 15 个工程师,但每个都是单独从 117 格外穿过敌方碉堡去的,没有一个走到;大部队一直在家「集结」(4/12)。两局实验室都在游戏约 32 分半时消失、随即判负,这关应该有时间限制。

  • 占领任务不再等凑满出击人数:有 6 个作战单位就向实验室旁边(离它 4 格、我方来的方向)边走边打,模型两次不选就自动执行;这时不再给「回家集结」的选项。部队只清守军,不打实验室本身。
  • 有守军时工程师不再单独出发:跟在推进部队后面约 4 格,部队到了目标 8 格以内、或者目标附近已没有守军时才进去占领。
  • 「集火」不会再打要占领或要保护的建筑(模拟时发现停在实验室旁的坦克会自动打它)。
  • 正在执行任务的工程师不会再被派去干别的。

「占领」类目标派工程师;钱堆着不花时自动造兵(0.7.3)

0.7.2 实测(本地 Laya,新关卡,目标「使用工程师占领盟军战略实验室」,战败):

  • 「占领」被当成了「保护」,目标一直显示没找到,虽然盟军作战实验室整局都在视野里;也没派工程师去占。实验室反而作为普通进攻目标出现在选项里,最后我方在它旁边打建造厂时它消失,随即战败。
  • 模型对「造犀牛坦克」连续答了 251 次「等待」,钱从 4,000 涨到 14,000,部队从 19 人打到只剩 6 人。

改动:

  • 「占领 / 夺取 / 攻占 / capture / seize」现在是单独一类目标:认出后标成「用工程师占领、绝不攻击」。它不会出现在任何进攻选项里(指挥模式下也不是合法攻击目标),守着它的碉堡排在进攻选项最前面。
  • 工程师优先去占它:没有守卫时模型拒绝一次就自动派;有守卫时拒绝三次后自动派。没有工程师就先训练一个,钱少也照样训练;有守卫时多备一个。
  • 目标被我方占下算完成;被摧毁会写明「目标被毁,占领失败」。
  • 「保护」某建筑时,它也不再出现在进攻选项里。
  • 钱在 5,000 以上、部队不到 40 个单位时,模型连续两次不造兵,就自动造一个作战单位(不会是矿车或工程师)。

只能造步兵时,钱多就继续补兵(0.7.2)

0.7.1 实测(本地 Laya,目标「摧毁五角大厦」):四块五角大楼都被认出并依次打掉,任务完成。但第一块打了约 10 分钟:这关造不了战车,扩展给纯步兵部队设了 16 人上限,动员兵一直停在 20 人左右,钱却从 4,000 涨到 9,000 没花出去;后来任务送来一批天启坦克,剩下三块 30 秒内全倒。

  • 只能造步兵时,手里有 3,000 以上就把步兵上限从 16 提到 40;到 5,000 以上且没到上限,补兵自动执行,不再等模型选。
  • 钱不多(3,000 以下)时仍按原来的 16 人上限,给矿车、建筑留钱。能造战车的对局不受影响。

本局目标认得出拆成几块的地标(0.7.1)

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。

WERHD 玩家 API

本仓库同步了一份线上玩家 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。

About

A helper which use JEV to play ra2web(WannaFire Version)[王二火大]

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages