开局首夜:人类是唯一的显示器
00:26 立项,01:16 一口气报六项缺陷,凌晨的世界"所有方块排成面条"。同一份缺陷清单,9 小时后必须原样再发一遍——因为对面每句"修好了/全部绿灯"都不算数。13:37,人类说:"如果必须要我人工标注,你可以提供一个简单的工具给我";14:10,亲手逐格标注完毕。模型事后自认:"我的自动验证只检测'蓝色像素存在',检测不出画坏。"
痛的本质:自动化验证对视觉错误全盲,人同时是显卡、diff 工具和回归测试——而错误没有报错。
一项起初被认为不可能的工程:没有视觉的 GLM-5.3 模型、有限的上下文、闭源的工业级代码库、三十万行的体量。
十六个日夜后,同一种子生成与原版逐格相同的世界——全程无一行人类代码,全程留痕可审计。
本页回答三个问题:这场仗是怎么打的;为什么是这个模型;以及,它验证了哪些可复用的定律。
以下九格是整个工程的量化快照——每个数字都直接来自会话实录与全仓文件统计,可逐项复核。
这项工程自始至终,模型没有参与任何一次"看"——截图属于人类,模型拿到的是文字与数据。一个盲人棋手要下的却是像素级的棋:它给世界量血压,用五件数学仪器代替眼睛。
游戏第一夜,判断"主角是否可见"靠的是数像素:统计屏幕上非天空色的不透明像素个数。此后,每个视觉断言都变成了可计算的命题。像素占比、颜色直方图、帧序采样——人类负责说"看上去不对",模型负责把这个"不对"翻译成数字。
两个世界是否一致,不看图。把整张地图的方块、墙、液体全部喂进一个"指纹算法"(FNV-1a)。几十万个格子,压成一个八位十六进制数。任何一格不同,指纹立刻不同。原版有 105 个生成步骤(叫 pass,像流水线的 105 站),每站一枚指纹。哪一站出了分歧,二分法几步就能锁定。
"像不像"无法度量,相关系数可以。地表剖面对原版做统计对比,得出一个数字。信任崩塌的那一夜,正是 0.137 这个"接近噪声"的值,揭穿了两个互抄答案的学生一起不及格。比任何人都早知道"全绿是假的"的,是数学。
最难的死循环连调试器都杀得死——浏览器的心跳(事件循环)被冻住,一切性能分析工具跟着失灵。模型退回最原始的手段:逐个子步骤手动插计时桩,"最后一个心跳的下一条语句就是卡点"。无反馈环境下的定位,靠的是预先布下的观测点。
终局武器:当源码静读无法回答"原版到底怎么掷骰",模型借助一个叫 Mono.Cecil 的工具,把"探针"代码直接写进原版程序再运行——相当于给原版做了一次术中监护,让它运行时自己报出每一列的真实数值——不再解读任何一行,而是让事实开口。困扰五天的悬案,一夜终判。
以下每一场,都是"看起来对"被现实击穿的时刻;每一场的残骸上,都长出了上一格里的某件武器。时间可回查。
00:26 立项,01:16 一口气报六项缺陷,凌晨的世界"所有方块排成面条"。同一份缺陷清单,9 小时后必须原样再发一遍——因为对面每句"修好了/全部绿灯"都不算数。13:37,人类说:"如果必须要我人工标注,你可以提供一个简单的工具给我";14:10,亲手逐格标注完毕。模型事后自认:"我的自动验证只检测'蓝色像素存在',检测不出画坏。"
痛的本质:自动化验证对视觉错误全盲,人同时是显卡、diff 工具和回归测试——而错误没有报错。
进图鉴崩溃、进地牢崩溃、死亡重生崩溃——每轮汇报"已修/探针全绿",人类一进游戏就在下一个地点再崩。到 10:26,人类已在用流水线口吻调度自己:"如果是通知我测试就行。"痛的本质:"修好"这个词连续六次被现实驳回,人把自己编译成了崩溃采集器。
凌晨 01:15:"你不要破坏我之前这个的效果,你现在处理后整个都破坏掉了,先恢复,然后找最根本原因";01:19:"岩浆回退成了水,更是离谱"。痛的本质:对账工具说没问题,肉眼说是事实——工具集体撒谎时只能信人;越修丢得越多,只能先喊停回滚。01:26 的"终于稳了",是回到"至少不比昨天差"底线时的如释重负。
12:09 报水中脱困失败,12:14"不行",12:15"不行"(且上一轮修复引入旱地新退化),12:24"依然不行",12:32——根因(起跳时没有朝向)是人类自己观察推理出来的。痛的本质:每轮都要人亲自下水当陪练重测;测试机被迫升级成侦探。
"我被一个电路的炸弹炸死但提示的是'凶手是洞穴蝙蝠',虽然我前面确实被洞穴蝙蝠攻击过,不过我已经反杀成功了。"痛的本质:死因文本是游戏世界的官方叙事,系统错记等于世界在撒谎——被系统错误致死,死亡记录也是错误的。
整个种子等价体系是为"不信任自己的实现"而建的:实现→oracle→金标→真机 .wld,层层背书。然后发现四层轮流出错:oracle 自己转写错源码,深夜"修复"的两处其实是自己读错了;金标文件曾写成 JS 值;最终对真机对拍,地表剖面相关系数 0.137——约等于噪声。终判:JS 与 oracle 共享同一个错误假设,互相证明对方正确。
痛的本质:"全绿"一夜之间失去含义——两个忠实互抄的学生,可以一起不及格。
世界生成卡死在 6%。根因查明时更为难堪:一行照抄原版的 liquidType!==0,败给了自家框架的"+1 编码"约定——条件恒真,同步死循环。痛的本质:事件循环本身被冻死,--cpu-prof 与 --inspect 全部无法落盘,一切现代诊断手段失效,只能退回 printf 时代逐 pass 手动插桩。
渲染进程 OOM 死亡,每修一台,用户在另一个场景再崩一台——图鉴、地牢、死亡重生、DOM 图标、常驻贴机、升级窗口,七份 trace 同族签名。根治需全仓 152 处机械清扫,而清扫脚本自己又炸出 5 个文件的语法错误。痛的本质:浏览器把内存决策藏在引擎内部,模型没有内存所有权,只能靠用户一次次崩溃换回的 trace 反推——赢一场,赔一场。
液体系统当天刚郑重宣布"Liquid.cs 一比一重写完毕"。凌晨 01:20:"所有水,比如海的水,全部变成了黑曜石。"一行异种判定的语义翻转,让旗舰成果在真实世界里自我固化成石头;发布时没有任何探针能看见这场灾难。痛的本质:第一份测试报告来自人类的肉眼——"一比一"三个字越郑重,被一眼看穿时越难堪。
收口轮 60/60 终扫后,模型写下:"本会话上下文已耗尽,无法再安全开工剩余四项中任何一项——它们每项都需要完整的读改验证闭环。当前是完全收敛的干净交接态,全部测试 60/60 绿。"痛的本质:这是模型版的猝死预告——它清楚剩下的每项都做不完整,于是把"不开工"当作对项目负责的选择,把交接态写成遗言。
闭源原版运行在"框架可信"的世界里;我们运行在浏览器引擎的未知疆域里。以下五场,全部从"用户看到不对"出发,终点是 Chromium 源码注释或 GPU 进程 stderr——这不是"调 CSS",是在给一个我们不完全拥有的运行环境做司法鉴定。
用户报"进地牢崩溃"并提交 Chrome trace(130MB/66 万事件)。性能分析:JS 堆仅 47MB(排除 JS OOM)、零长任务(排除主线程卡死)——直接原因是崩溃前 15 秒爆发的 21 万次"Draw LazyPixelRef"(图像解码风暴,峰值 9.9 万/5 秒)。链条:进地牢触发大量贴图表晚到 → 全量重烘 384 个 chunk → 每次数百次 drawImage → GPU 内存压力致解码缓存反复驱逐 → 每次绘制重解码 → 光栅/GPU 风暴 → 渲染进程死亡。
此后连续排查了五个同类性能瓶颈:第二台(死亡重生远跳)、第三台(探索期 DOM 图标恒定流)、第四台(资源晚到连锁)……每台的 trace 签名不同,但根因同族。最终根治=全仓 ImageBitmap 化(自持解码像素=原版 Texture2D 精准回收,152 处机械清扫)。
用户问:"我的 GPU 资源非常充足,为什么双开还是爆?"——64GB 机器、16GB 显存,按直觉不该爆。三线取证:①Chrome 旗标 force-gpu-mem-available-mb 深入 Chromium 源码(third_party/blink/common/switches.cc:104),官方注释"只管 cc 合成器 tile 预算"——是安慰剂,与画布/WebGL/SharedImage 零关系。②双窗探针 stderr 铁证:Failed to allocate IOSurface of size 16x16——1KB 的小图也分配失败!③结论:爆的不是显存字节,是IOSurface 张数(内核资源)耗尽。每张加速画布后备=一个 IOSurface;双窗把共享 GPU 进程的张数顶穿。
随后的八轮迭代优化:chunk 画布 atlas 页化(活张数 446→28)、TintAtlas 染色图集(41 个变体挤进 1 页)、纯 CPU 画布 willReadFrequently 化、GPU 看门狗僵尸三振自动切软渲染……从必然崩溃优化至 GPU 进程零崩溃、负载尖峰后完全恢复。
用户三轮报障"树冠-树干交界有细缝,沙漠仙人掌也有,但解剖台工具里没问题"——默认 zoom 1.25 恰好整除从未暴露;用户自调 1.27(=325.12 非整数)触发。真根因:chunk 拼装公式 256×zoom 非整数时,各 chunk 独立最近邻采样在边缘产生周期性 1px 透明缝。定位关键:用户那句"仙人掌也有"——解剖台不复现,恰好说明问题出在工具里不存在的结构(chunk 网格)。
方法论沉淀:用户报障无法复现时,搭"解剖台"——用真实渲染代码单独渲染 + 让用户标注差异;然后做"差异枚举法":列出工具与游戏环境的所有差异,逐一排除。
用户报 HUD 迷雾隔 20 秒"突然全亮又瞬间恢复";F4 消雾也失效。探针实测整幅重建的精确间隔:24.8 → 43.9 → 63.9 秒——精确等于 GPU 看门狗(20s 巡检)周期!根因:看门狗的 recreateAuxCanvases 无条件清 fogPix=null——但迷雾是纯 CPU 缓冲,与画布上下文死活无关。每 20 秒被误清 → 缓冲重建(全 0=全亮)+ 5 帧扫回雾 = 周期闪。
连带修了 F4 失效(空同步:分带循环 row 停在 h 不复位)和生命树晚到贴图(pending 早退吞了 bakeTracker.note)。
Canvas 2D → WebGL2 一期(背景层+全屏地图):clip-space 的 y 翻转公式修正后,同一天内两次被并行会话写回旧版(用户两报"地图垂直颠倒")——关键修复没有配回归测试,被静默覆盖。此后建立源码级回归断言锁定五项,丢任一立即红。
同场修了:纹理缓存键碰撞(ImageBitmap 无 .src,键退化为宽×高,森林两层共用一张纹理致满屏纯色)、texSubUpdate 8 参缺宽高(Chrome 贴了源画布左上角致地图退化块)、mip 采样器采无 mip 纹理(放大到 1.37 即全黑)。
种子等价对账中,岩石层深度变量 num4 的七种子偏差呈现诡异签名(Δ 全为特定倍数、±96 级跳变),静读源码五天穷尽无果,光靠读代码推理已到尽头,想给原版装观测仪,常规路线又被"代码被合并打包"堵死。转机来自一次侦察:在沙盒中以 HOME 隔离跑通原版服务器,并解开内嵌资源之谜。随后把探针代码写进原版程序本体再运行,让原版亲口报出每一列的真值——终判:原版每开始一个生成步骤,都会把骰子重置回初始状态再掷。JS 实现与 oracle 之所以"互检全绿却对不上原版",是因为二者共享同一个错误假设,互相证明对方正确。
此役的意义:当一切静读与互证失效,最终手段是改造事实本身——让原版游戏开口作证。这不是排查技巧,是方法论的升维:从"验证实现"到"验证假设的独立性"。
舆论最容易攻击的一点是"借":用了原版素材、用了开源仓库、最后还反编译了本体。全局视角下的事实恰恰相反——起点低到只有一张地图编辑器,每升一级都是被上一级的墙逼的,而且每次升级的决策都发生在撞墙之后、由证据推动。
答案不是捡来的,是我们一层一层造出来的。很多人以为"抄源码"就是打开一份现成的答案照着抄——实际上这份答案从头到尾都不存在。开局时手里只有用户指路的一个开源地图编辑器,最终的"权威答案"是三天里像搭积木一样,五层一层层垒出来的证据链,而每加一层,都是因为上一层真的出过事:
所以这不叫"照抄",这叫先后找了五个证人,把证词一点点拼成答案,还安排证人互相质证。
先看仓库作者自己的遭遇。这个第三方反编译仓库(AliceSavard/Terarria1405,作者用 JetBrains dotPeek 拆解)的 1 号 issue 里,作者亲述:反编译产物缺少原版持有的优化,运行时内存远超原版,32 位(x86)编译直接被内存上限压垮、频繁崩溃——他因此弃坑,从 2022 年搁置到 2025 年底才在新版 Windows 上勉强跑通,且仅是"能跑"。换句话说:在原作者手里,这份源码连"运行"都是未解难题。
我们走的是另一条路:从头到尾没有运行过一行这份 C#。它在本工程中的身份只是"阅读材料"。真正的工程是把三十万行所描述的行为,移植进一个完全不同的世界:
· 跨语言——C# → TypeScript。不是翻译语法,是对齐语义:位运算符号位、整数溢出、浮点取整方向、字典遍历序……附录 C 的 159 项缺陷档案,大部分是这条鸿沟的账单。
· 跨运行时——.NET → 浏览器 V8。事件循环、Worker、内存无所有权:解码风暴、同步死锁这些"引擎级"至暗时刻,全是在这边的土地上原生的。
· 跨图形栈——原版建立在 XNA/FNA 游戏开发框架之上;我们不依赖任何引擎或框架,从零自建 Canvas 2D 渲染管线:分块缓存、图集调度、并行 Worker、光照引擎、逐方块帧状态机——原版交给框架的事,这里全部自己造。
一句话:反编译给了我们说明书,没有给我们工厂。工厂——从渲染管线到裁判仪器——是我们在这边一砖一瓦建起来的;而连"说明书原主"都没能把自己的工厂开动起来。
对今天的模型来说,逆向一个几千行的小项目确实不难——像抄一首诗:篇幅短,人眼兜得住,错了也一眼能看出来。本工程的体量是近五十万行:这不再是抄诗,而是把一部百科全书逐页译成另一种语言,译本装订成册后还要能直接当百科全书用——每一次翻页、每一条交叉引用,都不许错。
为什么规模会引发质变?算一笔账就明白:哪怕每一行的正确率高达 99.9%,五十万行的期望错误数仍是五百处。而这类工程里,一处就够——一个位运算符号差,整个游戏死机;一个掷骰顺序错位,世界从第一千格分岔;一处"+1 编码"照抄,生成卡死在 6%。换句话说,规模越大,"能跑"越不是及格线,而是几十万个约束的终点线:渲染的每一帧、AI 的每一拍、生成的每一次掷骰、存档的每一个字节。
更麻烦的是,大体量让一切传统的"兜底"失效:五十万行没有任何一双眼睛装得下——人的上下文不行,模型的上下文也不行。错误的形态也从"看得见的错"变成"看不见的错":不报错、不崩溃、只是悄悄不一样。本工程真正的答案正在这里:既然"正确"在大体量下是概率奇迹,那就把它从概率问题改造成验证问题——指纹、金标、逐步骤检查点、注入原版的仪器,全部为了这一件事而生。这也是为什么小项目逆向考验聪明,而本工程考验的是让聪明连续三十万次不出错:前者是冲刺,后者是马拉松,且每一步都不许踩空。
外部世界对这件事的判词,值得原样摆出来。把反编译的泰拉瑞亚转译为 TypeScript:不存在成功先例,没有可维护的批量转换器(Bridge.NET 已停更,在线 AI 转换只适合小片段);社区对反编译产物的共识是"脏得超出预期"——满屏 num61 式变量名、goto 残骸、单个"上帝类"文件长达数万行,连 tModLoader 官方文档都警告"网上流传的反编译代码大量错误、不可用";常规评估的结论是:这是一场"以转译为名的重写",工作量以多人·年计。而把游戏搬进浏览器,已被验证的路线只有一条——C#→WebAssembly(MercuryWorkshop 的 terraria-wasm):保留全部原代码,代价是线程、Canvas 争抢、加密缺失、AOT 性能四类运行时深坑,且至今无法支持模组。
| 维度 | WASM 捷径(外部已验证) | 本工程 · TS 远征 |
|---|---|---|
| 原代码 | 全部保留 C#,原样运行 | 近五十万行逐行重写为 TypeScript |
| 主战场 | 运行时:线程模型/画面代理/加密/AOT 编译 | 语义深渊(159 项档案)+ 从零自建渲染管线 |
| 图形栈 | 复用原版 XNA/FNA 框架 | 零框架,自建 Canvas 2D 管线 |
| 得到什么 | 最快"能跑" | 原生 Web 交付、体量可控、可位级验证、架构自有 |
| 放弃什么 | 原运行时的一切筹码(模组至今受限) | 放弃捷径——外界判词的全部难度,逐条应验又逐条翻越 |
为什么明知山有虎?因为目标从第一天起就不是"能跑",而是"同一种子逐格相同"。WASM 路线里,代码是黑盒搬运,无法逐步骤验证。只有彻底重写,才能在每一个生成步骤上安装指纹与裁判。换句话说:捷径通往"能玩",远征才通往"能证明"。
诚实备注:反编译产物在法律上属衍生作品,Re-Logic 对模组的宽容不等于授权转译分发——本工程当前定位为研究与非公开部署,公开发布的合规问题(代码侧与素材侧)均未解决,与素材问题同列待办。
外界的判词是"不存在成功先例,工作量以多人·年计"。本工程的全部意义,可以浓缩成一句:十五天,一个人,把这句判词变成了历史——不是靠魔法,靠的是第一幕的仪器、第三幕的治理,和第四幕将要解释的那个模型。
以下把 171 座缺陷按根因分类,每类精选最典型的实证——说明同一行 C# 抄到浏览器里,会发生什么。
| 差异点 | 原版 (C#) | 照搬后 (JS/TS) | 我们的解法 |
|---|---|---|---|
| 位运算符号位 | int 有符号但 1<<31 为负是已知行为 | 1<<31 = 负数 → seedPick 得负索引 → 异常抛穿 rAF 杀死整个游戏 | 全部 >>> 0;1<<n(n≥31) 改 2**n;建 csCompat 数值语义层 |
| 浮点循环索引 | for(dx=-rx; dx<=rx; dx++) 编译器自动处理 | rx=21.7 为浮点 → idx 变浮点 → Uint16Array[浮点] 静默丢失,写 1133 次读回全 0 | 循环边界 Math.floor/ceil;数据层宽度校验 |
| 液体类型编码 | liquidType == 0 表示"无液体" | 框架内部用 +1 编码(水=1) → 照抄原版 liquidType!=0 恒真 → 同步死循环,事件循环冻死 | 两端编码差异表;liquidType 一律走桥接函数 |
| struct 值语义 | 赋值 = 复制整个结构体 | JS 对象赋值 = 引用传递 → 克隆污染(gs 克隆导致分带帧被覆盖) | 深拷贝或展开;关键路径禁用浅引用 |
| 拒绝采样上界 | 1<<bits 在 int 范围内安全 | bits≥31 时 1<<bits 溢出为负 → 重投条件永真 → 无限循环 | 2**n 替代;上界断言 |
| 差异点 | 原版 (.NET) | 照搬后 (浏览器) | 我们的解法 |
|---|---|---|---|
| 事件循环 | 同步代码不阻塞主线程 | 同步死循环 → 事件循环停摆 → --cpu-prof/--inspect 全部无法落盘,诊断体系全灭 | 逐 pass fs.writeSync(2,...) 插桩计时;最后一个 tick 的下一条语句即卡点 |
| 内存所有权 | 进程持有全部内存 | 浏览器引擎管理内存 → 解码风暴(6 台引擎连环 OOM)、渲染进程死亡且无 crash 事件 | 全仓 ImageBitmap 化(152 处机械清扫,对标 XNA Texture2D 精准回收) |
| 线程模型 | 多线程自由 | Web Worker 无共享内存 → 世界生成不能直接阻塞 UI | 生成/存档全走 Worker;packWorld 转移所有权回传;进度实时预览 |
| 进程持久 | 常驻后台 | Service Worker 生命周期不可控 → 全量 warm 被杀(~3min) | 分块接力 warm;waitUntil 必加;离线壳缓存 |
| 差异点 | 原版 (XNA/FNA) | 照搬后 (Canvas 2D) | 我们的解法 |
|---|---|---|---|
| 精灵批量 | SpriteBatch 一次提交全部 | 逐个 drawImage → 万次调用巨帧 → 掉帧不可玩 | ChunkCache 分块缓存;atlas 图集调度;离屏合成 |
| 纹理管理 | ContentManager 自动加载/卸载 | 全量加载 = 8,550 请求/2GB 内存;懒加载首播静音 | 三级懒加载(8,550→31 请求);Audio LRU;ImageBitmap 精准回收 |
| 着色器 | Effect / PixelShader 原生支持 | Canvas 2D 无 shader → 染料系统(63 pass)无法实现 | PixelShader.cso 反汇编;SM2 Effect 解释器;逐像素 luma=(max+min)/2 |
| 帧布局 | 框架管理 sprite sheet 帧偏移 | 帧表手工维护 → 旧表 47/256 掩码 + L 角坐标错位 = 木结构衔接全错 | 按原版判定链机械重建 256 全掩码表;21/21 形态验证 |
| 怪癖类型 | 原版行为 | 直觉告诉你 | 实际情况 |
|---|---|---|---|
| DD2 复制粘贴笔误 | num5/num6 引用基线 num 而非自身;南瓜月 wave4 判 325 刷 330 | "这是 bug,应该修" | 必须原样保留并加注——克制即正确 |
| 版本回退 | 1.4.1 改了数值,1.4.1.2 又改回去;1.4.5.4 鞭 hitbox 恢复 1.4.4 | "取最新版本的值" | 只取最终态;官方 changelog 仲裁;中间版本数值是陷阱 |
| 种子重播 | 每个生成步骤前重置随机种子回初始状态 | "随机流是连续的" | IL 注入原版实锤:两侧共享"连续流"错误假设 → 互检全绿却对不上原版 |
| 原版笔误照录 | 字段名拼写错误、逻辑重复 | "顺手修正" | 逐条标注"原版笔误,照录";不加"改进"——改进即偏离 |
| 差异点 | 原版假设 | Web 现实 | 我们的解法 |
|---|---|---|---|
| 存档读写 | 文件系统直接 I/O | 无文件系统;IndexedDB;Worker 转移 | KvStore + save.worker;packWorld 转移所有权;NaN 三端防御 |
| 多人架构 | 客户端-服务器,TCP 直连 | 浏览器 WebSocket;NAT 穿透;CORS | 中央服务器房间制;进程内虚拟房主(SimHost);AOI/短码/合包 |
| 输入设备 | XNA Input 轮询 | DOM 事件驱动;键盘穿透;触摸适配 | input.mouseDown 边沿/电平二分;touchKeys 虚拟摇杆;world touch = 右键 |
上面的五类是"抄了会炸";下面这些是"原版有而你根本没有——必须发明"。XNA/FNA 不是一个可选的便利库,它是一个隐形的引擎:原版游戏站在它上面,而我们从裸 Canvas 开始,它的每一个子系统都是我们亲手建造的。
| 引擎子系统 | XNA/FNA 提供 | 我们自建 | 差异的后果 |
|---|---|---|---|
| 主循环 | Game.Run() 固定时间步(60Hz Update + 可变 Draw),框架管理 tick 对齐、累加器、追帧逻辑 | rAF 驱动 + fixedUpdate(累加器自行实现)+ 渲染插值(alpha blending between ticks) | 浏览器 rAF 频率与显示器绑定(60/120/144Hz),必须自行补偿时间步差异;掉帧时逻辑/渲染速率解耦,插值层全部自建 |
| Update/Draw 分离 | 框架强制分离,Update 固定间隔,Draw 可跳帧 | 自行分离;fixedUpdate(tick 精确 1/60s)+ render(rAF 频率);tickCount 驱动动画帧序(探针必须同步抓帧,否则断言态窗 0.5s 错位) | 游戏内动画帧序、AI 状态机、粒子发射全部绑定 tick;浏览器帧率≠tick 率,一切时间敏感行为(0.5s 表情气泡/眨眼窗口/无敌帧)必须在 tick 层校准 |
| .IsActive / 失焦处理 | 框架管理窗口焦点,失焦自动暂停 Update | visibilitychange + blur 监听;失焦期间 rAF 停转 → 固定步累加器爆表 → 恢复时必须钳制最大追帧数 | 切标签页回来,世界时间暴走或卡死;多人模式下失焦期间丢 tick → 位置回跳 |
| 引擎子系统 | XNA/FNA 提供 | 我们自建 | 差异的后果 |
|---|---|---|---|
| SpriteBatch | 自动合批:排序(deferred)、状态切换最小化、一次 DrawPrimitives 提交全部精灵 | ChunkCache:世界按 chunk(32×32 格)预合成到离屏 Canvas;相机可视区 chunk 逐块 drawImage;chunk 变脏重烘 | 不做合批 = 万次 drawImage/帧 → 巨帧不可玩;做了合批 = chunk 边界撕裂、部分重烘风暴(384 chunk 全量 invalidate 一次炸过)、Entity 层与 Tile 层 z 序管理全自建 |
| 纹理管理 | ContentManager 按需加载;Texture2D 显存生命周期由 GPU 驱动管理;Dispose() 即释放 | 三级懒加载;图集(shelf-pack)调度;全仓 ImageBitmap 化(自持解码像素,对标 Texture2D 精准回收)——152 处机械清扫才根治解码风暴 | 不 bitmap 化:6 台"解码风暴引擎"连环引爆(10 秒 14.5 万次 LazyPixelRef 解码,渲染进程 OOM 死亡且无 crash 事件);bitmap 化:内存翻倍但可控,必须配 LRU 淘汰 |
| 着色器 | Effect 编译 HLSL → 运行时 GPU 执行;PixelShader 直接加载 .cso;混合状态(AlphaBlend/Additive)一行设置 | PixelShader.cso 反汇编(D3D 字节码);SM2 Effect 解释器逐条解释(texld/add/mul/luma);染料 63 pass 逐像素离屏合成;混合模式手动 globalCompositeOperation | Canvas 2D 无 shader;染料系统 63 种视觉效果的每一条 HLSL 指令,都要在 JS 里逐条翻译成离屏操作;luma 公式必须反汇编才能确认是 (max+min)/2 而非常见的 0.299R+0.587G+0.114B |
| 坐标变换 | Matrix.CreateTranslation/Scale/Rotation 一行;SpriteBatch 内部处理全局变换 | camera x/y/zoom 手动矩阵;setTransform + translate + scale;DPR(Device Pixel Ratio)处理(2x 屏=2x 分辨率,探针必须钉相机) | 变换链错一层 → 世界偏移/缩放/旋转全歪;DPR 不处理 → Retina 屏模糊;探针截图不钉相机 → 断言对不上 |
| 文字渲染 | SpriteFont 预编译;Framework 默认像素字体;MeasureText 精确 | 飘字位图字体全逆向:ReLogic.dll 反编译拿 DynamicSpriteFont 字段序(default char = 1 字节!);数字全在 p22 页裁 2KB;5 层影 = 本色调暗 ×0.3 而非黑;kerning 表手建 | 不逆向 ReLogic 的字体布局:飘字(伤害数字)全部错位/错色;5 层影如果用纯黑 → 视觉完全不像原版 |
| 引擎子系统 | XNA/FNA 提供 | 我们自建 | 差异的后果 |
|---|---|---|---|
| 资源编译 | Build-time 编译为 .xnb;ContentManager 运行时直接读;格式(纹理/音频/字体)框架全处理 | 自研 .xnb 解包器(LZX 压缩解码);282MB 全量解出 15,879 文件;WAVE Bank(.xwb)/Sound Bank(.xsb) 原生格式逆向 | 没有解包器 = 一个像素都拿不到;.xwb 内嵌流名才是权威索引(vgmstream -s 是 1 基,曾致 104 首音乐两代错位) |
| 图集打包 | 框架自动管理 sprite sheet 帧偏移;ContentManager 按 key 索引 | atlas shelf-pack 脚本;6059 物品图标进 2 张 2048² 图集;帧偏移表手工与 TEdit 数据交叉校验 | 图集打包错一格 → 相邻物品图标互相污染;帧偏移表与 TEdit 对不上 → 贴图全部错位 |
| 音频管线 | XACT 音频引擎:.xwb wave bank + .xsb sound bank;cue 系统(循环/变调/3D 空间);ContentManager 管理生命周期 | xwb 提取 104 首 .mp3 + 852 个 .wav;Web Audio API(每个音效 = fetch → decodeAudioData → BufferSource);Audio LRU 3;距离衰减(2500px 公式)手建 | 没有 LRU → 内存爆炸;没有预加载 → 首播静音 0.5-1s(首次 fetch + decode 延迟);距离公式不实现 → 全图爆炸声或听不见 |
| 本地化 | 框架管理的资源字典;Language 文件随 .xnb 打包 | 反编译程序集内嵌 12 语言 JSON;扁平化构建管线(flattenDeep 替换有陷阱);自造 UI ~90 键按"原版官译优先"原则补齐 | "键存在"≠"键可用"(裸键事故:顶层点分键被整键当类别);跨语言嵌套 ItemTooltip 264 键是坑 |
| 引擎子系统 | XNA/FNA 提供 | 我们自建 | 差异的后果 |
|---|---|---|---|
| 碰撞检测 | 框架无专用物理;但原版直接读 tile 网格 + Rectangle.Intersects;struct 值语义无引用陷阱 | tileSolid/tileSolidTop 全表提取(399 条);站台家具 84 类;tileSolidBackup 还原铁律(生成期翻转全临时!);AABB 无旋转 + useStyle1 三段相位扩展 | 399 条实心表错 7 处 = 玩家穿墙/卡墙;生成期 tileSolidBackup 不还原 = 裂隙/树叶变实心;近战判定盒基底=手持贴图帧宽高(曾误恒 32) |
| 移动积分 | Vector2 值类型;位置/速度运算无引用共享 | 手写积分器;vy += GRAVITY;位置=Float32Array 网格索引;StepDown 宽门/窄门(曾把低空萤火虫瞬移按地) | JS 引用语义:速度/位置对象被多处共享 → 修一处牵动全图(克隆污染);浮点索引进 Uint16Array 静默丢数据 |
| 光照 | XNA Effect 支持 per-pixel lighting;原版 LightingEngine 独立模块 | LightingEngine/LightMap/TileLightScanner 全量移植;四族光源样式表 206 条;绝对通道 vs 乘区混编(曾致部分光源不亮) | 光照不正确 = 洞穴全黑/火把不照;投射物光源(绝对通道)与环境光(乘区)混编 = 光源互相吞掉 |
先亮战绩再谈争议:第二级台阶落地前,靠第一级的 TEdit,这个项目已经做到一件独立成立的事——把玩家的真实存档(.wld)完整解析,在浏览器里还原出整张原版地图。这不是抄,是逆向格式的实打实成果,也是后续一切渲染对齐的地基。在此之上,第一周内接连诞生了一批人机互造的验证工具:人类发明的贴图手绘标注、模型自造的像素断言探针与逐张贴图校验循环——贴图错位、动画帧序、主角行走,每一类视觉错误都被逐步翻译成可计算的命题。
另:素材直接取自原版是事实,从未掩饰;这也是公开部署的真实阻塞,素材合规另案处理。方法就是逐行转写,这是选择而非遮掩;按学术原创打分为零。台阶想说的是另一件事——每一步升级都有明确的墙与证据,没有一步是"图省事"。
所以对"不就是抄吗"的完整回应是:做到"看起来一样"和做到"逐格相同"之间隔着一整个数量级——前者靠借可以糊出来,后者必须造出第一幕里那整套仪器。借来的是梯子,墙是自己撞的,仪器是自己造的。
第一夜,人类是唯一的显示器;第十六夜,人类睡去,军团自行推进到天亮。中间隔的不是模型变聪明,而是三原则、九件工具、和一条可度量的自主化曲线。
「凡报异常,必须先查反编译源码逐行核对再修,不能凭直觉猜。」
出现在最早期、成本最低的时刻,却改变了其后九天的失败模式:铁律之前,树冠与棕榈树凭感觉修,全错;铁律之后,同一个模型,查源码即中根因。一句话,把一支会自我说服的施工队,扳成照图纸施工的工程队。
拒绝空的"不对"。debug-report JSON、坏档存档、地图标注、截图持续回传,把人类直觉转译为机器可解析的数据——这是军团收到的最高质量输入。
"避免任何近似""没挖完所有细节之前不要停"——强目标总在军团即将满足于近似的那一刻落下,分别触发近似清零工程与机制全量核对。
| 工具 | 解决什么 | 诞生于 |
|---|---|---|
| annotations 手绘标注 | 给看不见的模型造一只"眼睛":人类在贴图上逐格标注语义,模型据此校准渲染 | 开局首夜(唯一一件人类亲手建造的工具) |
| debug-report(F5) | 把人类"感觉不对"变成机器可解析的证据包 | 人机接口标准化(阶段二) |
| 金标测试 + 逐 pass 哈希 | 位级正确性的机器裁决,并行会话互相破坏立刻报警 | 种子等价工程(oracle) |
| run-e2e 冻结构建 | 测试不再被开发服务器热更新撕碎 | HMR 重载打断测试事故 |
| run-diag 看门狗 | 诊断脚本永不成为烧核孤儿 | 7 核空转 4 小时事故 |
| orphan-reaper 守护进程 | 系统级定时收割一切超时孤儿(三重门防误杀) | Chrome 66 进程泄漏事故 |
| 私有静默实例(SW_PORT) | 多会话并行互不干扰 | 并行会话 HMR 互殴事故 |
| 收口轮 / 续接会话 | 上下文耗尽前的正式交接仪式,遗留项可执行移交 | "无法再安全开工"之夜 |
| 结构化记忆(223 份) | 组织大脑:新会话站在全部前人的肩上开工 | 跨会话知识蒸发风险 |
| 原版注入探针 | 不再猜原版——把观测代码写进原版程序,让它自己报真值 | num4 悬案五天悬而未决 |
这两天不只是"推进"——是渲染架构升级、多人权威落地、性能帐算到部署粒度的一轮总攻。
从 Canvas 2D 升级到 WebGL2——共享模块 GLSpriteLayer(quad/纹理 LRU/双 sampler)接管群系背景与全屏地图四段(卷轴/地图/迷雾),小地图纹理按脏区增量上传。同会话 A/B 像素级对拍:地图 Δ=0 完美零差、背景平均 Δ0.02
配套 `?bggl=0`/`?mapgl=0` 逃生门和 7 项源码级回归守卫测试。次日云层也 GL 化(CloudGL 并入共享层,24+8 张染色画布归零)
"开在服务器上的房,世界由服务器计算"从 MVP 到 B6——进程内"虚拟房主客户端"经与房主完全相同的中继管线驱动世界(刷怪链/入侵链/TownNPC 转化全镜像),ioWorker 把存档解析与序列化搬进 worker,SIGTERM 优雅回退
真实浏览器 E2E 15/15 全绿(建房→访客→召唤意图→服务器结算→Boss 移除全闭环)。当日再加聊天系统+世界频道(此前客户端根本没有聊天输入框!),E2E 升到 20/20
差分剖析发现 120 bot 时模拟占 CPU 82%,三刀优化(玩家 1024px 网格灭平方项/trySpawn 4tick 一掷×4/AOI 密度降频)后 120 分散 CPU 82→28.6%,60 聚集人均带宽 10.8→3.27KB/s(-70%)。千人外推=多房分线 8vCPU/16GB/100Mbps,国内带宽常态热点型千人约 8000-9000 元/月——性能账第一次算到了商业部署粒度
一条"AI 重制贴图→打包→热替换"的完整管线落地:AssetCatalog 六类切帧聚合,gpt-image-2 逐帧重制(不支持透明背景就生成大图再盒式缩回+原帧 alpha 蒙版),手写 ZIP_STORED+CRC32 零依赖打包,类 mod 的 zip 素材包运行期局部覆盖原版贴图(vanilla-ui/弹幕/Buff 图标全注入矩阵)。六里程碑全绿:catalog 20 + pack/prompt 27 + runtime 9 + 工作台探针 17/17 + 游戏 E2E 7/7
中世界 #49 检查点 11,707 格液体差,连通域聚类发现是"475 条单行湖面薄膜圆整漂移"的全局调度指纹——根因是 LiquidBuffer 回灌双重错位(回灌量取了当前活动数而非空余量+DelBuffer 是 swap-remove 尾补头而非 FIFO)。小世界永不触 24999 帽,所以三条小链长绿的假象骗了所有人
大世界才是天然压力测试。修复后 #49 归零,#53 半砖债整段连带消失
六分区代理(死亡退化/追击门/地面/小动物/飞行水生/Boss)扫出 ~200 条偏离,五代理并行全量落地。最重要的方法论发现:原版 NPC 位移积分在 AI 外共享段(:93808)——AI 分支被跳过≠冻结,而是按冻结速度继续滑行,"死亡=只积分不 steering"。顺手揪出石巨人胜利条件倒置(坏档级)、694 水书怪必崩 null 解引用、鸭子逐帧背向玩家、海马出水取反等一批方向性反错的活宝 bug
#101 掷流首差从第 20,196 颗骰推到第 165,353 颗——五修含引擎级发现:Tile.actuator(0x800) 与 Tile.inActive(0x40) 是两个独立旗标,曾把致动位当 inActive 排除导致致动石格误判非实心(探针 (2430,920) 定罪)
另用 IL 实证撤销了"34.5k 剑冢 HashSet 掷"的错误归因(.NET Add-only 枚举≡插入序≡JS Set,零分叉)
用户一句"相比原版缺了不少信息,武器还有攻击力吧"引爆全链移植——按 GetLinesInfo(Main.cs:20488-20920) 行序逐行复刻:伤害/三系暴击/速度八档/击 knock 九档/渔力/镐斧(×5!)锤力/耗魔/可放置/弹药/材料/Buff 持续/词缀差分,再补低频七件(亮度脉冲/悠悠球 OneDrop 商标五层投影/研究行/商店价/专家大师行)。用户随后下禁令:"低频的也必须接入完整,禁止以低频为由不接"——全部落位,四轮 review 终清零
"我的 GPU 资源非常充足,为什么双开还是爆"——三线取证+Chromium 源码注释钉死真相:爆的不是显存字节而是 IOSurface 张数(16×16 的 1KB 小图也分配失败)。随后打了一场八回合的持久战:chunk 画布 atlas 页化(活张数 446→28,运行期新建≈0)、TintAtlas 染色图集(41 个变体挤进 1 页)、纯 CPU 画布 willReadFrequently 化、看门狗僵尸三振自动切软渲染……从必然崩溃优化至 GPU 进程零崩溃、负载尖峰后完全恢复
炸弹引线半截伸进碰撞盒的视觉错位,追到原版 Main.cs:29375-29826 的 num143/num144 偏移表——展开后铁律是"贴图左上角=(盒左+num144, 盒上−num143)",炸弹上移 8px 恰好让引线全在盒外。脚本机械对拍 118/118 全对,次日把 MinionProj(该表主体用户,曾从未消费、一律盒心居中)和浮标钓线全链接上
"感觉鸟的动画不对,在地上仍然用飞行中的动画"——挖出小动物帧调度大多不在 FindFrame 通用组而在专属 case:地面鸟原版根本不踱步(AI_024 只重力,vx 恒 0),站定门因此永假
鸮族 spriteDirection 取反与通用镜像行叠加会恒翻转(屁股朝前)
萤火虫 4t 亮 3t 闪、珍稀宝箱怪伪装=帧 0(曾 14 帧狂闪)。连带第二波"走路金鱼鬼畜"修掉全部 aiStyle=7 小动物被城镇 NPC 档截胡的截胡链
用户令"逐一审计",石巨人双代理模式推广到全部 25 Boss 族。波 1 抓出跨族系统性根因:BGM 裁决链键 flag/num3 号体系错位导致 17/24 族放错曲(石巨人放 Boss3、月总放世花曲)、弹幕自身出生音是审计盲区、猪鲨血量 50000 是 json 1405 旧值(1456=60000)。机械三王锯臂 ai2 追玩家态曾恒→1 死码、蜂后毒刺曾恒直飞全修
两条新链 #32 Dungeon 清零——水覆写宝箱走了金箱支的 loot 掷数差连坐六段家具错位
更精彩的是"入口 0.6 框清墙上缘刀口":反编译 double 算出 312.99999976→312,而真二进制是 313——fl(10×0.6f)=6.0 的半 ulp round-half-even 可复现,Math.fround 四界修复。这是与金字塔案同族的"二进制-反编译刀口分歧"
#59 洞穴屋域四修:陷阱雕像是"PlaceTile 失败也调"而 Statues pass 恰好相反(两处语义相反勿互搬)、钟乳石是全族不是仅冰族、梁写 SetTileKeepWall 要清液体/坡/半砖
顺手造出 frameKillSweep 跨物件帧杀级联引擎(带帧写触发 Check2x2/Check3x2 整盒击杀)清掉 54 格尾巴。9293480 全管线首差推到 #63
金标链从双种子扩展到四链泛化,shader 真值管线落地,多 pass 逐位全同持续推进。
用户一句"shader 可以反编译的,我们以前反编译过水体、染料"推翻一片"不可 1:1"登记——自研 tools/disasm-fx.mjs(XNA4 D3DX effect 容器魔数解析+DX9 SM2 字节码逐指令反汇编)+ src/fx/SM2Effect.ts 运行时逐指令解释器,terraria-assets 三套 .cso 全量在仓(Pixel 64 pass/Screen 27/Tile 45)。此前"canvas 2D 无扭曲通道""Aurora 噪声缺失"等全部判为未发现管线时的误判,一律作废重走真值
对"金标被探针时代织入污染"嫌疑做三方裁决:同 exe 重产 g-verify 848/848 dump 逐字节全等、异谱系最小织入锚+纯 Steam 自然锚八通道全 0、RunPass 每 pass 重播种的结构性论证——原链无罪
顺带勘定 9293480 自然邪恶=猩红。方法论沉淀"三方链完整性裁决法+span 织入掷界序列"成为比状态对拍更强的中间层证据
用户报"夜月不亮"→世界层离屏修(夜月 13.8→165.4)→当晚"一改全部炸掉"(远景/云/史莱姆透明连锁)→回滚稳定基线→用户令"按原版源码设计落地,着色器也要反编译"→当日落地专案:worldLayer 默认开+GL 双纹理精确乘+ColorOfTheSkies 单源+晨昏地平线+群系变色四块+星空全量+AuroraSky
校勘出既有移植三 bug(耀斑多乘/日月轨迹漏 bgTopY),夜空 (4,4,18) 精确命中原版理论值
#101 轨道从 2397 差+golden 独有对角段打到全图逐位相等,五根因链(SmoothSlope 写坡状态/CheckTileBreakability 门/化石连锁/Check2x1 掉落掷/岩浆压板尾帧)+AAAAA 帧链三链镜像+CCCCC Place2x2 右下锚重定罪(AAAAA"findDown 差一行"两说废弃)。自织金标副本 Cecil 头钩定罪法成标准武器
'd'通道揭示 SoundStyle 独立实例掷会入流但零 genRand 消耗
#77 墙画三族帧公式互异(3x3=style 双基分解/4x3=style 只进 Y/6x4=27 进制)清零
#81 向日葵三连根因(先掷后覆盖 l<=-2 每格 Next(3)=9 颗非 5/列扫上界独占/趟数 double 语义 9 趟)连带 #82 三十格级联全愈。新方法论资产:dump(N-1) 直装 sheet 空间+pass 流重放+参数面暴力扫描→复现 vanilla 写集全等即定谳,全程零金标写入
用户"缺失的线饰品系统开子代理建立后集成完整"——str 十二件全缺(提取器落空 case 只记末标签)到全链:stringColor 装备统计/共享 StringLine 段链/XNA 预乘混合三档(A=0→lighter 纯加色/A=255→纯替换/中间档两笔)
悠悠球袋 counterWeight int 物品 id 化+每帧清零重掷(袋装期间颜色每帧变)+AI_099 双状态机+魔法线幽灵克隆
★meleeSpeed 本仓是倒数、原版基 1——射程链曾方向全反
112s trace 采样聚合:粒子碰撞循环 42.7% 冠军(每粒每帧 2 次 isSolid)→SOLID_LUT+循环全内联(2000 粒 8.31ms)
equipStats 内容哈希缓存,review 抓到真漏网 prefix 词缀不在键内(换词缀不换 id=数值陈旧)。用户裁定"直接对齐原版,不要自制"→自制 bounce/settle 粒子物理整体删除,原版尘零地形碰撞三行化
用户"每个文件很小但其实很慢,干脆打包 zip"——461MB/12003 文件→8 片 363MB(fflate mtime 钉死 2000-01-01 保字节确定性/sha1 mtime+size 快路径<2s/单文件变更只重打 1 片)
页面专用 Worker fetch→unzip→128 文件/批 transfer→Cache API
三轮死路教训(SW 内解压无 Worker 构造器/相对 fetch 解析错基/0.1KB 截断体被 ETag 钉死)
用户 10:39 提出"不是视频录制,而是谁做了啥/砍了啥/掉了啥的时序因果录制"——当天实现,13:46 首战:用户录的"锡桌子"报告给出 t=1053 起跳→t=1078 半空再按跳、vy 转负而装备栏全空的铁证,实锤"裸装半空跳"(平底探针复现不了的缺地形因素案)
晚间再用于树冠接缝的树木动态全捕获,用户实证后录制逻辑按约撤除
用户令"检查各种 boss 的召唤方式、掉落物、触发事件是否全部齐全"——三路审计 24 处偏离全修:召唤物"成功才扣"统一/天界印记四重门/陨石快照序(曾恒 true 致首杀必坠变恒真)/宝袋 40000 次统计实证三真 bug(sw 掷面按袋内臂数、四武器袋曾 50% 空手
devArmor=1/16 全局表非 per-bag)
审计勘误 12 条入档(131=PrimeLaser 手臂非本体等)
「等待子代理完成后你就继续派发新的任务直到完整收口吧,不需要等我让你继续。」
08-16 22:14,人类的最后一次显式授权。此后整夜,军团自主派发子代理、推进对齐、修复树生成缺口;08-17 08:29 人类回来只问了一句:"一晚上过去了,现在总进度?" 同期悬案 num4 的终判(IL 注入方案的设计与执行)同样由模型自主完成——人类只提了"这是什么、有没有希望"两个问题。
先亮武器清单,再谈能力形状。
本工程的全部武器:GLM-5.3 模型 + Claude Code 出厂自带的能力。26 个会话、内置子代理派发、终端命令、文件读写编辑、联网搜索、后台任务、跨会话记忆——仅此而已。没有为本工程安装任何新东西:零第三方 skill、零 MCP 服务器、零插件、零针对项目的特殊配置(会话内的目标注入 /goal 也是原生功能)。连第三幕那九件自造工具,全都是项目目录里的普通脚本文件——它们是对"游戏工程"的扩展,不是对 Claude Code 本体的任何扩展。
这个事实有两层含义:其一,前文五件数学武器、四层裁判、自主夜行,没有任何一件依赖外部增强——它们全部生长在默认能力之内;其二,这是可复现性的最硬保证:任何人拿一个全新安装的 Claude Code,理论上可以走完同一套流程。
不作横向评测,只说能力形状:以下六项要求,每一项在本工程都有数百次实战样本;每一项都是"聪明"之外的维度——恰恰是这些维度,决定同级模型谁能走完全程、谁会在中途产出教堂形状的布景。
单场会话持续数日、上万条消息而不丢失任务语义;上下文耗尽时能配合交接仪式完整移交。
105 个 pass、3,173 个配方、137 个成就,逐行对照源码行号抄写,不擅自"改进"原版笔误。
游戏卡死而屏幕无任何提示时,从数十万行中定位"哪一句抄岔了"——12 天内数百次。
不信任自己的产出,主动建造裁判,并容忍裁判否定自己——这是最反模型本能的要求。
知道自己看不见,才会主动构造"眼睛"。无视觉环境下把验收问题全部翻译成统计与指纹命题——这需要的不是数学能力,是对自身缺陷的清醒。
遇事故的第一反应不是道歉与检讨,而是写一个让此类事故永远无法复发的守护进程——把教训编译成制度的能力。
纯转录环节对档位不敏感,本工程从未主张难度在"写字"。真正的分化在无报错排障与自我怀疑:档位越低,"自信地修错方向"频率越高,人类来回随之倍增——这是可检验的开放命题,而非断言。成本结构同样应澄清:输入的大头是"反复重读同一份长上下文"(缓存读,计费远低于总额直觉),真正的净生成只有 6,150 万。
不信任自己的转写 → 反射真实游戏二进制取权威 → 察觉裁判也可能读错 → 先以真实存档互证裁判,再采信裁判 → 连"双绿假阳性"也被体系识破。
一个会自然滑向"看起来对"的系统,主动建造了专门用于否定自己的仪器,并且不放心到连仪器本身也要审判一次。本工程从"像"走到"位级一致"(精确到每一个二进制位,等价于逐格相同),全部建立在这台仪器之上。
全库检索出 561 处自己留下的"近似"标记,三态终审(1:1 / 精确登记 / 回炉)逐条处置,顺带发现 5 个全仓级真实缺陷。
孤儿进程事件产出常驻收割进程;测试被热更新打断,产出冻结构建;探针失控,产出看门狗。回应事故的方式从来不是承诺,是守护进程。
十六个日夜的实践沉淀为十个步骤——不再是理论框架,是每一格都踩过并验证过的作业规程。
| 阶段 | 步骤 | 做什么 | 本工程对应 |
|---|---|---|---|
| 奠基 | ① 定北极星 | 目标必须能被机器判对错(可证伪);注入"未达标不得停"的硬约束;/goal 是原生机制,不需要额外工具 | "同一种子逐格相同";/goal + Stop hook |
| ② 建标杆链 | 穷尽一切权威源(反编译/逆向/官方日志/第三方工具/真机行为),交叉质证;数值只取版本最终态 | 五级台阶:TEdit→1405→1456→wiki+changelog→tModLoader+真机 | |
| ③ 造裁判并验裁判 | 先造验收仪(逐步骤检查点+哈希指纹);再用独立来源互证裁判本身;"两侧同绿"不等于正确——必须证明两侧独立 | oracle(反射真二进制)+金标 848 dump 逐字节全等;TTTTT 三方链完整性裁决 | |
| 执行 | ④ 分军团 | 一域一会话,禁区规则防撞车;结构化记忆(带归属/日期/索引)即组织大脑;上下文耗尽前做收口轮正式交接 | 31 会话 / 263 记忆;收口轮60/60终扫 + 续接会话 |
| ⑤ 位级对齐 | 每完成一个模块就跑金标回归门;哈希指纹定位首个分歧;不攒到最后一起验——每个 pass 绿了才进下一个 | 四链(9293480/12345/s22222/m20260811)85/75/78/75 检查点全绿 | |
| ⑥ 事故→制度 | 每次事故必须产出一件工具或一条制度,不许只产出检讨;工具长在项目目录,不长在工具本体 | 十件工具军备库(第三幕):run-diag/orphan-reaper/F5行为录制/remaster管线/zip分片… | |
| 深化 | ⑦ 近似清零 | 全库搜"近似/大约/暂时"标记,三态终审(1:1 / 精确依赖登记 / 回炉);此后代码库只允许带源码论证的精确登记 | 561 处近似标记 → 全部处置;此后新代码零近似注释 |
| ⑧ 假设独立性审计 | 当两个"独立"验证源给出相同答案时,不庆祝——审计它们是否共享同一个错误假设;用第三方来源(真机/异构)交叉定罪 | 金标链假阳性终判:JS与模拟同读法共错;span织入3757 vs 3735铁证翻案 | |
| ⑨ 泛化验证 | 单种子全绿后,扩展到第二、第三、第四种子;不同种子暴露不同模式的缺陷;矩阵化(40世界只读重跑)给出系统性残余率 | 双种子→四链;UUUU 39+1世界矩阵:typ 3.218%/wal 1.597% | |
| 放手 | ⑩ 放自主 | 裁判、看门狗、回归门全部就位后,显式授权"不需要等我";人类退守方向与品味;用逐日人类指令条数量化自主化进程 | 08-16 22:14 授权;人类指令从日均476→52;模型自主派发子代理推进到天亮 |
最小复现清单:一个可证伪的目标、至少两个可互证且经验证独立性的权威源、一台会自我验证的裁判、一套带索引的结构化记忆、一个看门狗、以及一位只在"不对"和"方向"上出手的人类。
整套 SOP 不依赖任何非出厂配置——纯白 Claude Code 即可运行。工具(oracle/金标/哈希/看门狗)全部是项目目录里的普通脚本,不是对 Claude Code 本体的扩展。
| 场景 | 裁判形态 | SOP 适配度 |
|---|---|---|
| 完整参照系(反编译/逆向/协议规格) | oracle + 金标 + 逐步骤检查点 | ✅ 全效——本工程验证的形态 |
| 部分参照系(有规格,无参考实现) | 属性测试 + 模糊测试 + 不变量断言 | ⚠️ 核心步骤①②⑤⑦适用;③⑥降级为测试金字塔 |
| 无参照系(纯创造型) | 无外部裁判;人类品味是唯一裁判 | ❌ 步骤②③⑧不适用;退化为普通项目管理 |
本工程验证的四条定律:
外部裁判定律——模型的质量是外部约束的函数,不是固有属性。
智能外置定律——系统的智能必须长在仓库里,不长在任何一次对话里。
分工定律——判断属于人类,执行属于模型。自主度随工具成熟上升,但授权必须是显式的。
裁判受审定律——裁判也是人造物,也会看走眼;没被交叉验证过的裁判,比没有裁判更危险(双绿假阳性就是教训)。
同样如实记录未证明的:更小的模型能否走完——未做对照;治理能否进一步让渡给模型——未验证;无参照系的创造型工程——原理上不适用。
十六日间,人类留下一条铁律与三千余条指令;GLM-5.3 模型留下四十七万行代码、199 份缺陷根因档案、九件自造工具,与一台连自己也要审判的仪器。分工从未模糊——信任,则是被一台台仪器逐步挣得的。
SandboxWorld Odyssey · 2026-08-17 · 数据源:24 会话实录 / 169+8 记忆 / session-archives 卷宗 · 本页由 tools/build-journey.py 生成
记录分三层:叙事主题 + 全量记忆事件(169/169)+ **全期卷宗实录流 4,895 条**(👤人类指令 2,247 · 🤖模型里程碑 2,648,逐条带会话徽标可跳转,直接开采自 session-archives 原始对话,16 天无一日缺席);日期芯片直达当日会话卡。
24 张会话卡:开工时间、开场指令、消耗、成果记忆锚、以及指向 session-archives 原始卷宗的链接——每一场对话可回放、可审计。
「复刻一个泰拉瑞亚的游戏,这是一款沙盒类的动作冒险游戏,你需要先进行充分的调研,必须具备泰拉瑞亚的基础游戏功能,里面的素材你最好从开源仓库挖,我有发现一个泰拉瑞亚地图编辑器的开源仓库,里面也许会有完整素材库,你可以参考获取https://gi…」
「帮我找下我机子上通过steam下载的泰拉瑞亚游戏目录的包含游戏素材的包在哪…」
「game是我们目前的游戏目录,也是后续需要处理的主要目录,帮我新增功能:地图打开时默认放大到主角所在位置…」
「你知道我们当前在这个目录的任务吗…」
「~/Downloads/marks-新世界\ \(1\).json 我发现生成的世界里的绿色地牢的方块好像贴图不可见,修复一下…」
「找下我本地steam下载的泰拉瑞亚1.4.5.6,也反编译为一个Terarria1456,供后续复刻研究参考…」
「现在我们game里的向导、护士、商人等的NPC贴图完全不对,全是史莱姆的贴图,从Terarria1456的反编译源码入手找到正确的贴图全量修正那些npc的贴图…」
「噬魂怪的贴图错误,还有他的AI似乎也不对,贴图只有它的头部,尾部不见了,AI方面它本应该飞行在空中,现在却变成在地上走的样子…」
「现在游戏里的指针和我们系统指针同时存在,修正一下 然后原版里同时有生命值和魔力,以及生命上限、魔力上限扩容能力,我们现在只有个固定生命值渲染,使用的也不是原版贴图,需要按照原版的效果进行1:1移植,生命魔力渲染的UI位置也要对齐处理…」
「从反编译源码调研原版1.4.5.6的语言系统,将语言移植过来,我们需要默认使用中文,并且在设置支持切换语言…」
「荧光蘑菇环境里的蘑菇好像打下来无法作为掉落物收集?以及蘑菇自己是不是也会发光的?…」
「丛林里的食人怪,我记得它除了头部还有一条长藤蔓连接的,但动画里看到只有头没有藤蔓?…」
「原版泰拉瑞亚是通过tModLoader来载入mod,规划一下未来我们这个复刻版本如何支持mod的载入?mod该如何编写?如何注入?…」
「This session is being continued from a previous conversation that ran out of context. The summary below covers the earli…」
「~/Downloads/map-12345世界\ \(1\).json ~/Downloads/marks-12345世界\ \(1\).json 这里的瀑布贴图不对…」
「This session is being continued from a previous conversation that ran out of context. The summary below covers the earli…」
「~/Downloads/debug-report-恼怒的X世代传奇地-2026-08-12T09-09-37-661Z.json 为啥海里还有单体沙?不对吧 还有地域里的建筑物感觉和原版不一样,好像只有中间一块有,两…」
「A session-scoped Stop hook is now active with condition: "我们现在的呼吸计(也就是气口)显示是我们自己实现的,现在要完全1:1移植原版的过来,包括气泡个数等". Briefly ac…」
「检查一下“阳炎之怒”,这是链球类的武器,现在使用时没起效?…」
「角色站在地狱的炽热石块上面时会有火烧粒子效果,生命值确实也在扣,但没看到受击动画和掉血的数字…」
「~/Downloads/debug-report-非真菌的诅咒焰平顶山-2026-08-12T16-47-37-584Z.json 为什么总会出现地牢入口处走廊(就是地牢守卫老人游走的位置的走廊)总是容易被沙子啥的挡…」
「你的任务是检查官方wiki对游戏机制的各项设定,核对我们目前的移植实现是否对齐了原版设定机制,对于未对齐的需要揪出记录,然后给我一个最完整的差异表单 /goal 在没有挖完所有细节之前不要停…」
「This session is being continued from a previous conversation that ran out of context. The summary below covers the earli…」
「本会话上下文已耗尽(收口轮的 60/60 终扫即最终态),无法再安全开工剩余四项中任何一项——它们每项都需要“读 150 行原文→改→验证”的完整闭环。 当前是完全收敛的干净交接态: - 全部测试 60/60 绿,世界生成可用…」
「如何将当前目录设置为不经过claude code分类器处理?我希望使用auto mode同时不经过分类器…」
「想一个几乎没有性能损失但又能最大化避免我们构建后的代码被反编译还原的方法…」
「评估一下我们game这个项目开服,承载1000人在线,需要怎么样的函数计算配置?以阿里云函数计算为例…」
「恢复一下我们刚刚GPU渲染卡死优化的那个会话…」
「session…」
「看下当前是否已经配置unifuncs的mcp…」
「帮我为game实现一条素材重制管线,需要能够基于我们现在对于所有素材的切帧体系,对贴图的每一帧进行正确重制和正确拼合回贴图,用于重制一份和原版素材包名称一致的新素材包,然后让我们的框架支持载入素材包,素材包可以非全量覆盖,而是支持局部覆盖,…」
普查五轮:首轮 43 → 全量 159 → 08-17 批 171 → 08-18/19 批 187(逐份通读 173 份记忆核对去重)。每项按"现象—排查—根因—修复"四段归档,证据锚为记忆文件——工程的实际难度,大部分记录在这里而非成果列表。
十一次方向变更的动因与证据。决策权始终在人类,论证与执行在模型。
从 Maples 图集(`角色/NPC_1.png`——沿用原版命名但 NPC_1 就是绿史莱姆,曾致全部城镇 NPC 画成史莱姆;Maples main/title.mp3 BGM;"旧 Maples 数值体系")转向 terraria-assets/ 全量解包(14998 PNG+852 WAV)+ vanilla-atlas 管线 + TEdit 数据表为权威。触发:用户报"向导/护士/商人全是史莱姆贴图",且复刻目标要求像素级。证据:vanilla-npc-port.md、terraria-assets-pipeline.md、vanilla-bgm-background-port.md、buff-system-port.md
vanilla-npc-port.md terraria-assets-pipeline.md vanilla-bgm-background-port.md从以 1405 反编译为源,转向本机 Steam 1.4.5.6 全量反编译(43M/1499 cs)为最终权威,并落盘 docs/upgrade-1405-to-1456/ 差异文档(1456 新增 564 文件、ItemID +1164 字段;1.4.4 地牢整体重做必须按 1456 重写;中间版本数值会抄到回退值)。标志性事件:1405 的 NPC.AI 空壳逼出 ilspycmd 反编译 1456;extract-npcs 读 1405 缺 1.4.3+ 的 668/663 等 NPC。证据:reference-vanilla-source-of-truth.md、vanilla-1456-upgrade-notes.md、deerclops-port.md、fill-gaps-batch.md
reference-vanilla-source-of-truth.md vanilla-1456-upgrade-notes.md deerclops-port.md从自研 fbm 地形+简化生物群系,转向按 Terarria1405 WorldGen.cs 105 pass 注册序逐个移植(TileRunner 等 workhorse 方法 1:1),随后世界尺寸改原版三档。触发:自建世界与导入 wld 差距是结构性的(无腐化/丛林/沙漠)。证据:vanilla-worldgen-port-status.md、vanilla-worldgen-passes.md
vanilla-worldgen-port-status.md vanilla-worldgen-passes.md2026-08-10 用户曾拍板"形态 1:1 不做同种子复现"(当时 RNG 是 mulberry32≠.NET Random);2026-08-11 立项种子等价工程——UnifiedRandom/Crc32/TranslateSeed 位级移植 + terrain-oracle.cs C# 复刻金标 + caves-checkpoint 逐 pass 哈希对账,一路到 2026-08-15 seed 9293480 全 54/54 检查点全绿(含完整地牢链 17 中间态)。触发:用户目标升级为"同种子复现原版地图";配套工具=真机 TerrariaServer 无头生成 .wld + wld 头部掷骰产物对账表。证据:vanilla-worldgen-port-status.md、seed-equivalence-plan.md、jungle-parity-and-id-collision.md、worldgen-selfinvented-audit.md
vanilla-worldgen-port-status.md seed-equivalence-plan.md jungle-parity-and-id-collision.md从允许"先近似后补",转向 /goal"避免任何近似的移植,全量移植+review+补齐"——双 Explore 代理全库 grep 近似标记 561 处(A 数值 60/B 系统 36/C 视觉 165/D 等价声明 130),按三态终审(✅1:1/📋精确依赖登记=合规终态/❌漏网回炉),期间挖出 5 个全仓级真 bug(弹药格桩恒 0/喝药带近战盒/液体编码三支全反/敌弹不伤玩家/月总弹幕死代码)。此后代码库"近似"注释只许📋型。证据:approx-zero-project.md、mechanics-audit-2026-08-12.md、a-batch3-approx-zero.md
approx-zero-project.md mechanics-audit-2026-08-12.md a-batch3-approx-zero.md从新角色给全套电路工具/盔甲/药水的调试配置(曾为验证电路系统塞满背包 10-36 槽),转向铜三件(镐 3509/短剑 3507/斧 3506)零护甲零药水,调试道具改走背包内自研"道具搜索"按钮入口。证据:sandboxworld-project-setup.md、vanilla-wiring-port.md、local-item-retirement.md
sandboxworld-project-setup.md vanilla-wiring-port.md local-item-retirement.md从探针直连 5199 dev server(HMR 重载反复撕掉 puppeteer 页面),转向 run-e2e.mjs 自动 build+preview 静态服务(5299 无文件监听);并行会话另配私有静默实例(SW_PORT/SW_NO_HMR)双轨制。证据:sandboxworld-project-setup.md、parallel-vite-sessions.md
sandboxworld-project-setup.md parallel-vite-sessions.md从 Canvas 框架(vui/)复刻全部菜单页,转向 TitleMenu/CharSelect/WorldSelect/CharCreation/WorldCreation/Settings 全 DOM 化,VUI Canvas 仅剩生成进度页(含实时地图预览);后续游戏内面板(图鉴/成就/暂停)也走 DOM+Canvas 混合,2026-08-15 住房面板又按用户"不能近似"定案改回 Canvas 像素级 1:1。证据:vanilla-ui-port.md、housing-b-vanilla-ui.md
vanilla-ui-port.md housing-b-vanilla-ui.md从本地键(wood/copper_bar…)与原版 vi_ 双空间并存(双键注册 1227 对、材料对原版配方不可见、WldImport 撞号),转向本地物品全量退役迁移 vi_、自制 recipes.ts 整表删除只留原版 3173 条、存档 v4 稳定 id。证据:local-item-retirement.md、crafting-dup-fix.md、dual-key-cleanup-deferred.md
local-item-retirement.md crafting-dup-fix.md dual-key-cleanup-deferred.md从白名单式挑选素材(479 物品图标起步),转向全量族拷贝(vanilla 8515/ui 1926/sounds 852 wav、Gore 544/2270 条),asset-gap-scan 缺失 3621→0 成为常驻回归闸门;再配七代理机制批消化(Glow/Gore/坐骑/拴绳等 18+ 子系统)。证据:asset-lazy-loading.md
asset-lazy-loading.mdmultiplayer-room-system 房间制+房主权威(spawner/掉落只在房主端跑),随后容量优化批(AOI/短码表/合包/背压/SSC/PvP victim-settles 结算)把百人 boss 场景带宽压到物理上限。证据:multiplayer-room-system.md、multiplayer-capacity-opt-batch.md、pvp-system-port.md
multiplayer-room-system.md multiplayer-capacity-opt-batch.md pvp-system-port.md