Repository navigation
Releases: zh667/SurvivalCraftGenius
Release list
v0.13.0 — 会用弓,会自己看田
装完确认 Game.log 第一行是 [Genius] Mod initialized (v0.13.0).
打猎:终于有解了
你从 playtest 11 开始就在说"打不到鸟"。近战只是原因的一半 —— 鸟一飞起来就变成 45 秒的干等,通常还等不到。
现在它会射。 attack 的用法一个字没变 —— 你还是只说打谁,由身体自己决定怎么打:够不着就用弓,够得着就近战,太近了先退开保持射击距离,没弓/打不中就照旧贴上去。
瞄准用的是弹道解算:打飞鸟不能瞄它现在的位置 —— 等箭到了它早飞走了,而且箭还会下坠。这段是纯数学,所以能在开发机上真测:把箭按解算结果射出去,模拟抛物线,看是不是真打中。横飞的鸟、爬升的鸟、头顶正上方、以及"射程外要老实返回打不中而不是白费箭"。
想打鸟就给它带弓和箭。没有弓它会告诉你去做一把。
看田:一句话交代,之后不花钱
以前维护一块田要走 扫描 → 收割 → 捡拾 → 补种,四步以上、每步约 1.3 万 token,而且你每次回来都要重走一遍。
现在说一句「以后这块地你帮我看着」,它就永远自己捡掉落、收熟的、补种空地,不再需要任何指令。
- 你随时可以给它别的活,那永远优先,干完自动回来看田
- 田里没事干时它会说清楚为什么 —— 比如「有空耕地但我没种子了」,你一眼知道该干嘛
- 打起来了就先打,不会一边挨咬一边种地
数字
- 基准 95.6% / pass@3 98.1% / args_valid 100%(53 个冻结场景)—— 历次最好
- 286 个单元测试通过
致谢
弓与看田循环移植自 工具人 1.1(基岩),弹道解算与图纸格式移植自 铁器风云(Abrams、Bradley),均已获授权。改动逐条记在 docs/ATTRIBUTION.md。
v0.12.1 — 修掉把上一局卡死的那个锁
装完确认 Game.log 第一行是 [Genius] Mod initialized (v0.12.1).
上一局为什么卡死
22:48 之后它只会说「请重新召唤我」。它自己的诊断一字不差:
工具仍被编号74的残留任务锁住:状态显示没有运行,但任何新动作都会被拒绝。
是我的两个 bug 叠在一起:
task_status永远看不到守护灵 —— 我把它标成"没召唤也能用",而路由器把这个标记理解成了"不许给它 brain",于是它永远回答"没召唤"。- 派发守卫锁死整个回合 ——
descend_to在对话侧超时了,但订单还在身体里跑;于是这一回合之后所有动作工具都被拒,哪怕换了一件完全不同的事。
现在:守卫只拦同一回合里重发同一件活(那才是会从头重来的情况),换一件事一律放行;而且对话侧一放弃,身体也跟着停,不再留幽灵任务。
传送不再跟你顶嘴
你连打三次「传送到我这里」,还补了句「我说的是传送」,它三次都拒绝了 —— 先嫌太近,再说冷却。那两条限制是防模型拿传送当通勤、把寻路毛病藏起来的,不是用来否决你的。现在你开口就传。
图纸盖得起了
上一局整局都在为一间 5×5 小屋凑料(68 木板 + 25 鹅卵石 + 3 玻璃),被拒了七次,每次才发现一遍价钱。
- 新增 窝棚(4×4,54 格,无玻璃)—— 开局当晚就盖得起
- 小屋去掉玻璃 —— 三块玻璃要熔炉加一趟沙子,开局不划算
list_prefabs现在直接报材料清单,还标出你差多少,一眼挑得起的那个
它不再突然哑掉
上一局有 6 次模型什么都没返回,你那边就是一片安静。现在会补一次提醒,再不行就在 HUD 上说明白。
上一局验证成功的部分
- 计划真的在用:
0/3 → 1/3 → 推进到下一步,正是设计的样子 - 图纸房最后盖成了:
小屋 @ (-41,118,192): 放置 71 格 —— 盖好了 - 传送冷却按设计触发
267 个测试通过。
v0.12.0 — 会记计划的守护灵
装之前先看这个
进游戏后 Game.log 第一行必须是:
[Genius] Mod initialized (v0.12.0).
对不上就是旧包还在,后面测什么都没意义 —— playtest 13 和 15 两次都是拿 N-1 版的日志分析的。
这版最想让你验的一件事:它不再"转圈"了
以前守护灵没有地方存"我干到哪一步了",每一步都要从聊天记录里重新猜。被打断、被抢占、超时回来猜错了,就从头再来 —— 在游戏里看起来就是在房子里转圈。
现在它有一张计划表:
- 多阶段的活会先写计划,每做完一步回来划掉一项
- 计划随存档保存,你死了、退出重进、改设置,它都还在
- 已完成的步骤退不回去 —— 这正是"继续"时把全表重置、无限重做的那个死循环
其它变化
任务协议 — 它能问"我在干嘛"(task_status)、能停(task_stop)。重复指令的规则也改对了:只拒绝同一句话里连发两次,你五分钟后改主意一律照办(上一版连这个也拒绝,那是错的)。
图纸盖房 — 内置 5×5 小屋和 7×6 木屋。材料在放第一格之前就全查完,不够就一格不放 —— 你院子里那堆半截房子是这么来的。图纸在 SurvivalcraftGenius/prefabs/,是纯文本,你可以自己改或者自己画,改过的文件永不会被覆盖。
传送要付代价了 — 60 秒冷却,20 格以内直接拒绝。以前它免费无限,所以模型拿它当交通工具,寻路的毛病全被挡住了。
便宜了 15% — 每步固定开销 12,978 → 11,876 tok。提示词改用英文重写(实测中文 1.90 tok/字 vs 英文 0.44),规则一条没删。
合成会记路了 — 要用工作台/熔炉时直接走回记住的那台,不再原地扫一圈。
数字
- 工具选择基准:93.3% / pass@3 98.0%(50 个冻结场景),高于改动前的 90.4% / 95.6%
- 261 个单元测试通过
致谢
图纸格式移植自 铁器风云(Abrams、Bradley),已获授权;设计思路另参考 工具人(基岩)。详见 docs/ATTRIBUTION.md。
v0.11.7 — 搬运不再凭空销毁物品 / 不再自己顶掉自己
先说最要紧的:这局日志是 v0.11.5 的
最后一次 Mod initialized 是 21:29 的 v0.11.5。v0.11.6 没装上,所以那批修复一条都没进这局:
- 从屋外砌墙(转圈)
- 保护耕地不被自己挖穿
- 四面有壁才准倒水
- 火把补光
- 优先打落地的鸟
你这次抱怨的"又在转圈",正是 v0.11.6 修的那个。
但日志里有两个新根因,跟版本无关
一、take_from_chest 说拿到了,东西没进背包
22:01:46 took from chest: 小麦种子 x3
22:01:56 plant_seed -> I have no seeds at all
中间十秒没有任何别的动作碰过背包。守护灵自己也说了:「箱里那3颗种子取出后却没进背包」。
搬运代码信了引擎 AcquireItems 的返回值,据此从箱子里扣掉。返回值一旦和现实不符,物品就被凭空销毁 —— 箱子里少了,哪儿也没多。
现在不信返回值:搬运前后各数一遍目标背包里该物品的数量,差值才是真正搬过去的,源头只扣这个差值。搬不过去时箱子原封不动。 背包满时给明确报错,不再含糊地说"箱子空了"。
二、它把自己的建房任务顶掉了三次
21:39:35 build_shelter 9x9 开工
21:42:23 同参数再来一次 → 上一单 error[superseded]
21:45:08 又一次 error[superseded]
长活儿没返回结果时,模型会"补发一次同样的指令",而这会取消正在跑的那一单。每补发一次就从零开始,于是永远盖不完 —— 表现出来就是你看到的转圈。
守护灵的诊断一字不差:「旧的后台建房任务和我补发的新指令互相顶掉了,寻路就表现成转圈」。
现在同一栋房子的重复指令直接返回「已经在盖同一栋了,别再下同样的指令」,不碰正在跑的任务。
打猎:还是那句实话
四次 error[no_path]: cannot reach 鸭子 —— 鸭子在飞。v0.11.6 的"优先打落地的"只在附近有落地目标时管用。
真正的解法是远程武器(弓/弩/火枪/投矛)。没做。在那之前猎鸟就是碰运气。
v0.11.6 — 不再把自己砌进墙里 / 不再挖穿自己的田
playtest 14 的六件事,大部分是我的代码在跟自己打架。
一、「一直在你盖的房子里转圈圈」—— 传送没问题,是建造把它走回去的
它这一局用了 98 次 teleport,每次都成功出去了。然后下一个 build_shelter 调用又把它走回屋里。
图纸顺序是 地基 → 掏空 → 四墙 → 屋顶,而每一格都走到格子跟前去放 —— 于是它站在里面把墙砌起来,再把屋顶盖在自己头上。
现在:地基和掏空仍在里面做(那时还没有墙),墙和屋顶一律从 footprint 外面放,按格子所在的那一边算站位,reach 4.5 够得到整面墙。测试覆盖 5×5 / 7×6 / 9×9,任何一格的站位落在里面就红。
二、汇报又反了一次
续建时已经立着的方块被跳过、不计数,所以补完的房子报「一块都没放上去」。现在报「立起 X/Y 块(这次新放 Z 块)」。
三、去挖硝石,回来九格田只剩一格
日志对得上:20:40 翻出 9 格田,20:43 它人在 (-56,70,178) —— 正是田正下方 33 格。它从田里往下打竖井找硝矿,顺手把耕地挖穿了。
GeniusProtectedBlocks 一直只管「玩家的建筑」——耕地是我们自己的活,从来没保护过。现在所有隧道/竖井/挖矿共用的那个入口会直接拒绝挖耕地和作物。
四、你说的开渠做法,被我自己的守卫拦掉了
正确做法是在田旁边或者中间挖一个能放水的沟渠,用桶接水放在这里
对。而我 v0.11.2 的守卫是「3×3×3 内有耕地就拒绝倒水」—— 田中间的沟必然紧挨着田,等于把唯一正确的解法也禁了。
真正的判据是水会不会流过去:一格四面都是实心的坑,倒进去的水就待在原地。现在按这个判,敞口才拒绝,并在错误里直接教你/它怎么挖。
所以你担心的「他会把水浇田上」不会发生 —— 敞口浇水一直是拒绝的,这次只是把正确做法放行了。
五、光照 <9 不是「这块地不能种」,是插一根火把
find_build_site(farm) 不再因为光照直接否掉;till_soil 收尾时光照不够又带着火把,就插在田边(压在耕地上会让它退回泥土)。没火把会明说要先 craft 一根。
六、飞着的鸭子还是打不到
鸟确实不怕守护灵了(Category=Bird 生效)。但日志里那两只鸭子本来就在飞 —— 不是被吓飞的。我们只有近战,对空中目标毫无办法,只能等落地、45 秒超时,而同一时刻旁边站着一只鸽子。
attack 目标选择改成先地面后距离,不再为一只飞鸭空等。
真正的解法是远程武器(弓/弩/火枪/投矛)—— 在 ROADMAP M5 反射层里,还没做。在那之前猎鸟只能挑落地的打。
215 测试。ToolBench 45 用例 80.7%/95.6%。
v0.11.5 — 续建烂尾房 + 鸟不再怕守护灵
playtest 13 的两个问题。
一、「第一次盖得挺好,怎么就判定不合适了」
19:13:46 build_shelter -> 房子只盖了一部分:(-60,103,188) 放了 71/96 块
19:13:50 build_shelter (同坐标) -> error[invalid_target]: will not hold a 5x5 building
工具自己说「用同样坐标叫我续建」,然后拒绝了同样的坐标。
因为每次都重跑勘察,而地上已经站着自己盖了一半的房子:每列的「地面高度」变成了墙顶,墙是木板 —— IsPlayerBuilt 判成「别人的财产」,直接否掉。于是它换个地方从头再来,你家门口就堆了一片烂尾。
这是同一个概念混用的第三次现身(前两次:拿它当「能不能花」筛建材、当「能不能削」整地)。这次把这个特性反过来用:给了坐标就先数一数图纸里应该是实心、而现在已经是人造方块的格子(天然地面永远不会是木板砖头),≥8 格就判定为续建 —— 跳过勘察直接补齐,也不整地(那些「凸起」就是自己的墙)。
阈值取得很低是故意的:弃掉一栋半成品,比误续建你的棚子糟糕得多 —— 续建只加方块,不拆任何东西。
二、猎鸟:你的提议是唯一的解法
查完代码才知道,潜行从一开始就不可能成功:
// ComponentFlyAwayBehavior.ScanForDanger
if (ScoreSafePlace(pos, pos, forward) < 7f) return true; // 起飞ScoreSafePlace 只统计 IsPredator 的身体,取正面半球最近那个的距离 ×0.5 —— 判据就是 「正面 14 格内有捕食者」就起飞,跟噪音、潜行、蹲下全都无关。而 IsPredator 判的是 Category ∈ {LandPredator, WaterPredator, LandOther},守护灵正是 LandOther。
我们那套「绕到背后、被正面看到就冻住等它转身」只能拖延 —— 鸟一边啄食一边转身,总有一刻正对着你。这不是难,是不可能。
所以改的是身份不是走法:Category → Bird。副作用逐条查过:
| 结果 | |
|---|---|
熊/狼/狮虎/鲨鱼的 AutoChaseMask |
都含 Bird → 照样会来打它,战斗手感不变 |
| 陆生食草动物的逃跑行为 | 根本不看 Category → 不受影响 |
| 生物刷新 | 不按 Category 限量 → 不受影响 |
| 击杀统计 | 归到「飞禽」一栏(纯显示) |
噪音门槛还在(≥0.25、脚步 8 格),所以 sneak 仍然要用 —— 但它现在只负责「别出声」,不用再演绕背了,那段冻结/绕后逻辑已删。
210 测试。ToolBench 43 用例 83.7%/95.3%。
v0.11.4 — 会自己整地了
playtest 12 里你一句话点破了根子:
你:没有合适的地形你可以自改造嘛
对。find_build_site / build_shelter / till_soil 全都只会验收,不会施工 —— 高差超过 3 格就返回「这地不行」,然后就没有然后了。而任何玩家看到坡地都会先挖两下填两下。
「放不开手脚」的真正来源不是提示词管太严,是工具里根本没有「整地」这个动作。
现在会自己整地了
- 目标高度取中位数,不是平均值 —— 平均值往往不是任何一列的真实高度,等于每一列都要动。测试验证中位数在所有候选高度里总工作量最小。
- 先削后垫;削从高往低、垫从低往高 —— 沙砾会掉,自底向上挖会把上面的料抖进坑里(和下潜楼梯同一条规矩)。
- 农田只用泥土/草皮垫。石头填进去就永远耕不了,所以缺土时明确说「先 mine_resource 泥土」,而不是笼统报缺材料。
- 绝不削掉你自己的建筑。
- 容忍高差 3 → 4;超过 4 就真是悬崖了,整地成本大于换地方。
措辞也改了
旧: 高差2格(可垫平)
新: 高差2格,我先整地(削平3格、垫高2格)
前者读起来像缺陷,后者读起来像一份工作。
till_soil 现在先整地再翻,出来的是一块平田,不是上次那种「8格梯田式耕地」。
210 测试。变异测试两处都咬得动:中位数改成平均值 → 1 红;削平改成自底向上 → 2 红。
下次实测建议:找块明显有坡的地,说「就在这盖个房,旁边开块田」。以前它会说「找不到合格地形」,现在应该先削平再动工,并且告诉你削了几格、垫了几格。
v0.11.3 — 建房三连修(木板/谎报/走不到)
playtest 12。三个 bug 全是我写的,叠在一起看起来就像模型很笨。
1. 背包 82 块木板,它说「我没有建材了,请给我鹅卵石或木板」
建材筛选复用了「别拆玩家建筑」那份名单。那份名单回答的是**「这个世界格子能不能挖」** —— 木板在里面,因为木板墙通常是玩家的房子。拿它去回答**「这个背包格能不能花」**,结果就是游戏里最理所当然的建材不能用,还反过来管你要。
两个问题,一份名单。现在分开:只挡矿、种子和功能方块(箱子/熔炉/工作台/火把/门/梯子),木板、鹅卵石、砖头、台阶、玻璃、栅栏全部可用。
2. 放了 0 块,也报「built a 5x5 shelter: floor filled in, four walls, a doorway and a roof」
汇报是照着图纸念的,把计划当结果,只在后面追加真实计数。模型于是善意地转述「房子已成型」。是工具先撒的谎。
现在先说事实:0 块 = 「房子没有盖起来」;不全 = 「只盖了一部分,不能算房子」;齐了才说盖好。
3. 一次卡住 = 整张图纸报废
ComponentPathfinding.IsStuck 是锁存标志,引擎只在 Stop() 或重新开始移动时清。order 见到它就记一格「走不到」跳下一格,却没重新下目标 —— 于是剩下每一格瞬间同样判定。日志里 5×5×5 的图纸 18 秒内「125 spots gave trouble: 走不到」,它根本没走过。
新增 ApproachCell:卡住先清锁存再重下目标,同一格重试 2 次才判死。build_shelter / till_soil / harvest_crops / use_bucket 四个 order 全部改用。
201 测试。变异测试:把木板加回排除名单(回到 bug 状态)→ 3 个测试变红。
v0.11.2 — 修「传送后压死」+ 补装水接口
playtest 11 的三个真问题。先说好消息:v0.11.0 那三项实测全部生效 —— armor Head absorbed 1.11 of 1.11(铁盔全额吸伤)、6 次 crouching on farmland、缓存命中占输入 58.5%。
1. 传送后被压死(会死人的 bug)
GetChunkAtCell 一旦区块被分配就返回对象,而生成器还没填内容 —— 那时每格读出来都是空气、GetTopHeight 返回 0。
17:30:16 teleport (-41,110,313) -> 区域还在加载,我先安全悬停
17:30:23 ⚰ Genius 阵亡于 (-41,1,313),压死
引擎自己的判据是 State >= TerrainChunkState.InvalidLight。仓库里全部 8 处区块判断统一改用 GeniusTerrainReady —— 不只传送,扫描的「世界到 Nm 就没了」、导航起点检查、远征守护吃的是同一个错,这大概率也解释了此前几次「扫描空空如也」。
另加兜底:悬停超 25 秒仍未生成就回到出发点并报 area_not_loaded,不再永远挂在天上。
2. use_bucket —— 补上它自己指出来的动词
我确认了正确方法:空桶要握着「轻击水源块」,但我现有工具接口只有挖掘和放置,无法执行轻击交互。
完全正确。空桶点水源装水、水桶点空格倒出。倒水会拒绝紧邻耕地的格子(水会流,冲毁作物且耕地退回泥土;田从 3 格内吸水,渠不用挨着)。
3. 「收农作物」不等于「把附近的草割了」
半径 8 割了 7 株只得 2 颗野生小麦种子。对账:野生黑麦 33% 掉 1 颗种子且永远不出麦,7×33%≈2.3 吻合 —— 割的全是野生株,你种的那批还没熟。现在默认跳过野生,并把「另有 N 株野生的没动」写进返回值。
顺带纠正:「野生小麦种子」和「小麦种子」种下去都是普通黑麦,区别只在掉落。
195 测试。变异测试:阈值降回旧行为 → 3 个测试变红。ToolBench 41 用例 85.4%/95.1%。
v0.11.1 — 可观测性 + 真实 token 计量
护甲/蹲田/缓存三样都是静默生效,实测里不可证伪。本版把它们变成可观测:
scan_surroundings的my_status新增armor(背着哪几件)和crouching- 护甲吸伤记日志:
[Genius] armor Torso absorbed 3.2 of 8 - 走上农田记日志:
[Genius] crouching on farmland - 每次 LLM 请求记真实用量:
[Genius] llm usage: in 12367, out 17, cached 4608
接上真数之后发现 v0.11.0 的成本估算错得离谱,三条结论更正(详见 docs/TOKEN-COST.md):
- 每次请求先白付 ~4,395 token,三个模型一致,是网关注入的,我们改不掉——只有少走一步才省得下
- 大头是中文系统提示词(~5,983)不是工具 schema(~1,990),我先前搞反了,据此瘦身工具就是错方向
- 中文比英文贵约 4 倍,所以「描述改成中文能省 token」是错的
新增 --budget --dump <path> 导出真实 payload 对表;估算器重新拟合后与实测差 2.4%。