Mire 6 (nt6)

✅ 可玩

泥潭6

nt6

🔑 fluffos / AdminPass1 更新 dd250e1 2026-09-04 源码 下载 ZIP

▶ 开始游玩 · Play Now

NT/nitan 血统 mudlib(与 nitan170911/nitan6 同源但非字节级相同),一个以创世神话(盘古开天、太极两仪,阴阳生于混沌)为背景的大型武侠 mudlib,共 23000+ 个 `.lpc` 文件,地图从长安、洛阳等中原城池一路延伸到安南(越南)、高丽(朝鲜)、哈萨克、台湾等边疆/海外场景。新角色注册完成后 `score` 会提示"还没有出生呐",须先到 `/d/register/` 区域和盘古、地藏王(地藏王菩萨)等神话人物 NPC 完成一段对话仪式才算真正"出生",把新手引导直接嵌进了世界观叙事;英文 id 输入 `pass` 可找回密码、`guest` 可直接创建游客角色,是自带的两条特殊登录捷径。数据库无关的 win_nodb 打包版本另见 `nt6nitan6win`。

English

A large NT/nitan ('Mire') lineage wuxia mudlib built on a creation myth — Pangu splitting heaven and earth, yin and yang emerging from chaos — and spanning over 23,000 source files, making it one of the largest games in this collection. Its signature touch is a 'birth ceremony': after registering, `score` reports the character as not yet 'born' until they travel to the Registration realm and complete a ritual dialogue with mythic NPCs Pangu and Ksitigarbha (地藏王/Earth Treasury Bodhisattva), weaving the tutorial gate directly into the game's own mythology rather than just an email-confirmation step. The map stretches from the Central Chinese heartland cities of Chang'an and Luoyang out to Annam (Vietnam), Korea, Kazakhstan, and Taiwan. A separate database-free 'win_nodb' packaging of this same world also exists in this collection as nt6nitan6win, sharing the same registration-room mechanic plus its own dedicated 'reborn' area.

README

本次修复前的状态

上一轮 WASM 验证已经把这个 lib 修到能干净开机(零编译错误), 但互动注册流程一直没能实际跑通——这个 lib 自己的开机横幅/分布式 预载会花相当长的真实时间(SYSTEM_D->valid_login() 靠一个 preload_list,通过 call_out() 每秒载入一个档案,约 30 个档案、 约 30 秒才能跑完),导致之前用测试脚本反复尝试都卡在计时问题上, 一直没有确认过注册到底能不能走通。

这一轮先给 scripts/wasm_client.js 加了一个新的 --reconnect-on- disconnect 选项(这个 lib 的预载跑完后会主动把还在等待的连线物 件销毁掉,提示"重新连线",这是完全正常的设计而不是 bug,只是原本 的测试工具没办法处理这种"主动断线要求重连"的情况)。用这个新选项 之后发现预载本身其实跑得比想像中快,真正卡住注册的另有其因——是 下面这几个架构性的 bug。

本次修复的关键 bug

1. §7.15 dbase 架构修复其实没修完feature/dbase.lpc 档案 自己的注释早就写着"这里现在提供真正的、每个物件各自独立的 set()/query()/delete()",但实际去看这个档案,set/query/ delete(以及 _temp 版本)的函数本体根本没有被复制过 来——只有注释,没有代码。结果就是所有继承 F_DBASE 的物件用 裸调用 set(...)/query(...) 时,仍然会命中 simul_efun 里那 个全局共享的后备 dbase,而不是自己物件的 dbase(这正是那段注 释本来想要修好的问题)。已经从血缘更近的 nitan170911feature/dbase.lpc——这次真的去读了实际代码而不是只信注 释——把完整实现(set/query/delete/set_temp/ query_temp/delete_temp)搬了过来。这是导致注册流程一开始 set("id", arg, ob) 就失败、报"Failed setting user name."的根 本原因。 2. 第二处 §8.1 GBK 字节数一类的漏网 bug: - logind.lpcget_surname()/get_name()check_legal_name(arg, 4),但提示语写的是"不要超过两个汉 字"——4 是旧式按 GBK 字节数算的上限(2 个汉字 = 4 字节), 驱动现在按码点算 strlen,所以应该是 2,否则单个汉字姓氏 + 单个汉字名字组合起来会被误判太长。 - named.lpcinvalid_new_name()strlen(name) < 2 判断"是否为空名字",同样是没有减半的旧 GBK 字节数边界(原意是"少于 1 个完整 GBK 字符 = 2 字节",即 只挡真正的空字符串),码点计数下应该是 < 1。修好之前这个 检查会把任何单字给名(比如"风")都当成"空名字"拒绝——而 中文单字名极其常见。 3. efun::set/query/addn/delete(...) 用错了 scopeuser.lpc/ baby.lpc/giftd.lpc/examined.lpc/room.lpc 这 5 个档案各 自局部覆写了 set/query/add 之类的属性存取函数,覆写内部 想要"调用没被我覆写过的原始版本"时用了 efun::set(...) 这样的 写法——但 set/query/delete 在这个驱动上从来就不是真正的 内建 efun(只是 simul_efun 或继承来的函数),efun:: 只认真 正的内建 efun,所以直接报 Unknown efun: set。改成 ::set/ ::query/::delete(调用继承链上一层的实现,修好 dbase.lpc 之后能正确解析到 F_DBASE)。其中 addn 比较特殊——它从来不是 被继承来的(只存在于 simul_efun 里),::addn 找不到有效目 标;user.lpc/giftd.lpc 里两处其实是打字打错了 addn,所在的 函数本来就叫 add(),改成 ::add(对应 F_DBASE 真正的 add())就对了;baby.lpc 里那处函数确实叫 addn(),直接改成 ob->add(prop, data),跟 simul_efun 里 addn() 自己的默认实 现一致。

内容亮点

注册流程

英文名字(3-10 个英文字母,"pass"用于取回密码、"guest"直接创建游 客角色)→ 确认建立新角色(y/n)→ 中文姓氏(1-2 个汉字,可留空跳 过)→ 中文名字(1-2 个汉字,姓名合计至少 2 个汉字)→ 管理密码 (至少 5 位)→ 确认管理密码 → 普通密码(至少 3 位,不能和管理密 码相同)→ 确认普通密码 → 性别(m/f)→(新角色会先落在创世神话主 题的起始区域,出示公告后按任意键或等待自动继续)→ 进入游戏世界。

进入游戏后会看到提示用 register 你的邮箱 指令补登记邮箱;真正 的"score"要求角色先完成一段在 /d/register/ 区域和盘古、地藏王 等 NPC 对话的"出生仪式"才会被标记为"已出生",这是这个 lib 自己的 剧情设计,不是 bug,本次验证范围内没有走完整这段剧情。

管理员账号 / Admin account

管理员身份通过正常注册流程创建,注册完成后已确认自动落在巫师专属 的"巫师休息室"(而非普通玩家的创世起始区),验证了权限判定正确生 效。

警告:这是一个公开的默认密码,仅供本地/浏览器试玩。正式对外开服前
请务必修改此密码。

本地运行

cd libs/nt6
~/src/fluffos/build-debug/src/driver config.fluffos

游戏端口:40186。由于这个 lib 的分布式预载耗时较长,本地或浏 览器测试连线后请耐心等待约 30 秒再输入英文名字。

NOTES · 移植与修复记录

WASM 修复摘要(迁移自 meta.json 的 group_note)

NT/nitan 血统,但和 nitan170911/nitan6 不是逐字节相同。之前一轮 WASM 修复从 nitan170911 移植了 §7.15 dbase 架构修复的注释/wizard.lpc 片段,并修好了几个其它 bug(GBK is_chinese()、origin() 检查、band.lpc 回环放行、NTOS 心跳移除、mudlistd.lpc 的 socket/数组类型 bug),让这份档案启动干净,但由于这份档案缓慢的分布式预载(SYSTEM_D->valid_login() 靠一个 preload_list,通过 call_out 每秒载入一个档案,约 30 秒)反复撞上测试工具的计时问题,交互式注册流程一直没有验证过。这一轮终于完成了注册验证,并发现真正剩下的阻碍是架构性的,不是计时问题:(1)§7.15 的移植其实没做完——feature/dbase.lpc 自己的注释早就声称 set()/query()/delete() "现在已经定义"成真正的、各物件独立的函式,但函式本体其实从未从 nitan170911 真正复制过来,导致所有继承 F_DBASE 的物件用裸调用 set()/query() 时,仍然会静默命中 simul_efun 里那个全局共享的后备 dbase,而不是自己的——已经从 nitan170911 的 feature/dbase.lpc 移植了完整实现(set/query/delete/set_temp/query_temp/delete_temp),这次是真的核对过实际档案,而不是只信注释。(2)logind.lpc 的 get_surname()/get_name()(check_legal_name(arg, 4) 应为 2,对应"不超过两个汉字"的提示)和 named.lpc 的 invalid_new_name()(strlen(name) < 2 应为 < 1——会把任何合法的单字给名比如"风"当成"空名字"拒绝)里还残留着第二处 §8.1 类的 GBK 字节数没减半的 bug。(3)5 个档案(user.lpc、baby.lpc、giftd.lpc、examined.lpc、room.lpc)在各自局部覆写的属性存取函式里用 efun::set/query/addn/delete(...) 想呼叫"原始"实现——但 set/query 等在这个驱动上从来就不是真正的内建 efun(只是 simul_efun 或继承函式),efun:: 完全无法解析("Unknown efun")。已改成 ::(父层作用域,现在 F_DBASE 完整了就能正确解析)来处理 set/query/delete,addn 的情形则直接改成 ob->add(prop,data) 呼叫(addn 只存在于 simul_efun 里,从未被继承过,所以 ::addn 找不到有效目标——两处呼叫点其实是把本该呼叫 ::add 的函式(本身就叫 add())打错成了 addn,对应 F_DBASE 真正的 add())。已通过一次真实的 WASM 注册确认:完整的 id→确认→姓氏→名字→管理密码→确认→登录密码→确认→性别→电子邮件注册流程零编译错误完成,look/quit 也已验证(包括 quit 的新账号 30 分钟内可撤销删除流程)。一个 wizlist 里列出的管理员 id("fluffos")重新注册后被正确带到巫师专属的起始房间(巫师休息室),确认管理员身份生效。"score"对刚注册的角色会拒绝显示"还没有出生呐"——不是 bug:这份档案有一套独立的、游戏内的"出生仪式"(在 /d/register/ 里和盘古、地藏王等创世神话 NPC 对话),真实玩家需要先完成它才会被标记为"已出生",和其它内容/游戏设计限制一样不在本轮修复范围内。既有的格式化通过记录(之前的提交)已经覆盖了整个档案;这一轮改动的约 8 个档案单独重跑过格式化工具,不需要任何改动(已经符合它的风格)。

§7.86 跨库扫描修复(留言板 post 崩溃)

深度功能测试(2026-08-12,round two,新驱动重测)

用新编译的 ~/src/fluffos/build-debug/src/driver(origin/master 最新拉 取,含本项目自己提交并合入的 #1343/#1344 两个 PR,以及同一会话里另外提 交的驱动 PR:把编译诊断的严重度标记从 clang 风格的小写 warning:/ error: 改回大写 Warning:/Error:,专门为了兼容本语料库里大量按老式 MudOS 惯例检查大写"Warning"的 mudlib 代码)重新验证。

to_int() 任务计数器修复

adm/daemons/combatd.lpc/cmds/std/whisper.lpc 里全部 quest_count = ... % 500 已经是 to_int(query(...)) % 500 的修复后形状,无需改动。

新发现并修复:与 hhsj 逐字节相同的 log_error() 严重度门控缺失

adm/kernel/master/error.lpc——和 hhsj(同一会话本轮更早修复过)的对 应文件逐字节相同,同一个 bug:error_type 的大小写判断本身是对的 (strsrch(message, "Warning") == -1),但从来没有真正拿这个判断结果去 门控是否要 tell_object() 转发给玩家——不管是不是纯 warning,一律无条 件转发。修复:只在真正的 error 时才转发(debug 频道广播给巫师和 write_file() 落盘均保持不变)。现场验证:驱动升级后(大写 "Warning:" 恢复)配合这个修复,干净注册流程的欢迎序列不再夹带任何 "编译时段警告:...Warning:"文本。

新发现并修复:message() 包装函式非 varargs(与 ntii/nte 同类)

adm/kernel/simul_efun/message.lpcmessage(mixed arg, string message, mixed target, mixed exclude) 没有声明 varargs,但驱动仍然接 受少于 4 个实参的呼叫(缺失的 exclude 静默补成整数 0),再原样转发 给 efun::message()——这个驱动的原生 message() efun 拒绝接受字面 0 作为 exclude。adm/daemons/actiond.lpccheck_action_startend()(每 次新角色 enter_world() 时通过 festival.lpcactiond.lpc创建触发) 用 3 个参数呼叫 message("system", ..., users()),每次新注册都会命中。 修复(加 varargsexclude || ({}))与 ntii/nte 的修法完全一致。现 场验证:修复前"执行时段错误:Bad argument 4 to EFUN message()"反复出 现在 debug.log;修复+重启后,同样触发活动播报的注册流程干净完成,"多倍 BOSS奖励"等活动公告正确显示在欢迎序列里,没有任何报错。

冷启动级联编译撑爆 maximum evaluation cost(AGENTS.md §7.90/§10.8 已有先例,本档尤其严重)

这份档案的分布式预载设计(SYSTEM_D->valid_login()preload_list 每秒载入一个档案,约 30 秒才允许登录,见既有 WASM 修复摘要记录)意味着 驱动刚起服后的头几次全新注册撞上的冷启动级联比 hhsj/ntii/nte 更 频繁:master.lpcvalid_read()/valid_object()logind.lpcget_gender()user.lpccalc_sec_id()simul_efun.lpcassure_file() 等多处各自独立触发过"Too long evaluation. Execution aborted.",符合已知类别,不是新回归(同一会话里 hhsj/ntii/nte 用 同一份升级后驱动测试时记录了同样的现象)。验证自愈:驱动"热身"几 次注册尝试、账号存档确认幸存(qinfengjiu/qinfenger/qinfengshi 均 成功落盘)后,后续全新账号(qinfengba)一次性干净走完注册→"泥潭注 册室"→欢迎序列(含活动播报),全程零报错。一次由冷启动级联间接触发的 下游症状(adm/daemons/analectad.lpcprompt_user()analecta_list 疑似因 create() 被级联打断而未初始化的情况下命中 "Value being indexed is zero")同样在驱动热身后的干净重跑里没有再复 现,判定为同一根因的下游表现,不是独立 bug,未单独修复。

完整游玩测试范围

沿用 hhsj/round one 已经验证过的"注册成功进入泥潭注册室,欢迎/活动播报 序列正确显示"作为及格线(score 对未完成"出生仪式"的角色返回"还没有出 生呐",是这份档案自己的设计,不是 bug,和 hhsj 的记录一致)。战斗/死亡 循环仍未触达,留给下一次专门测试。

本轮结论

驱动升级(含把诊断严重度标记改回大写"Warning"的驱动侧修复)后 nt6 整体 状态良好:任务计数器 to_int() 修复确认已生效;新发现并修复两个真实 bug(与 hhsj 逐字节相同的 log_error() 严重度门控缺失、与 ntii/nte 同 类的 message() 非 varargs 崩溃),均现场验证;冷启动 eval-cost 级联比 其他档案更频繁但同样验证自愈,一个下游症状(analectad.lpc 索引崩溃) 同样自愈、判定为同一根因。测试账号 (qinfengjiu/qinfenger/qinfengshi/qinfengba)存档留在 data/ 下作为佐证,未清理(未跟踪文件,不纳入本次提交)。

深度功能测试(2026-08-17,round three)——上一轮"自愈"结论被推翻

上一轮把冷启动 eval-cost 级联归类为"验证自愈"(靠存档幸存作为证据)。 这一轮真正把新角色一路测到能正常下达指令,发现"自愈"结论低估了严重 性,找到并修复了两个真实 bug:

1. AGENTS.md §7.109(跨库扫描)logind.lpcget_gender() 未加 catch() 呼叫 init_new_player(user),其后紧接的 waiting_enter_world(ob, user)(真正设置出生点/开启指令派发的那一 步)。init_new_player() 内部的 CHANNEL_D->query_default_channel(...) 在冷启动时会强制首次编译 channeld.lpc,若撞上 eval-cost 上限就会 未捕获地抛出,导致角色永久卡在"已登录但没有环境、没有指令派发"的 状态——look 等任何指令都只返回"什么?",且永远不会有存档(比 上一轮记录的"自愈"更严重,account 甚至没能落盘过)。修复: catch(init_new_player(user))。此形状在另外 112 个档案里逐字节相 同,已跨库批量修复(AGENTS.md §7.109)。 2. maximum evaluation cost 700000 不足以撑过本档案的冷启动级联: 即使套用 §7.109 的 catch() 修复后,同一驱动进程里第一个注册的 角色仍然在 /feature/command.lpc 自身的编译过程中(即 add_action() 指令注册所在的那份档案)撞上 Eval interrupted: ... cost limit reached——这条路径完全在 §7.109 的 catch() 范围之外(发生在 logind.lpc 调用链之外,是驱动装载 char.lpc 继承链时的编译期开 销),角色一样卡死在无指令派发状态,look 依旧"什么?"。修复:把 config.fluffosmaximum evaluation cost700000 提到 5000000(AGENTS.md §7.90 的标准补救值,本项目 30+ 档案已使用)。 现场验证:重开一个全新驱动进程,第一次注册(qinteste)在拉高 eval-cost 前必现同样的"什么?"卡死;拉高后重开驱动,同一批第一次 注册干净走完(look 正确显示"泥潭注册室",debug.log 全程零 cost limit reached)。上一轮"自愈"的判断标准(存档能幸存)不够 充分——本轮才发现最坏情况是"连存档都没有",必须真正拉高上限。 3. cmds/std/say.lpc 对 NPC 触发的 say 未加保护:出生仪式的 pangu(盘古)NPC 通过 command("say ...") 以自己的身份触发 say 命令,但 say.lpc 的广播行无条件 capitalize(query("id", me))—— NPC 从不设置 "id"(这是玩家专属属性),导致 capitalize(0) 崩溃 (被驱动的 mudlib 错误处理器捕获、降级为玩家可见的"发现了臭虫"提 示,不阻断后续流程,但确实是一个真实、可复现的类型错误)。修复: stringp(query("id", me)) ? capitalize(...) : "?",与本项目对同类 capitalize(query("id")) 问题的一贯处理方式一致(AGENTS.md §7.7)。只在本档案修复,未跨库扫描(触发条件依赖"NPC 用 command() 主动触发 say"这个具体交互,未确认是否在其它档案里也 存在,留给未来遇到时再核实,不盲目套用)。

完整验证了注册 → 出生仪式(盘古对话、choose 性格、washto 天赋)→ score 显示完整角色面板(不再是"还没有出生呐")全程零报错。战斗/死 亡循环/留言板仍未触达——本轮时间预算内先把发现的两个严重 bug 落地, 留给下一轮专门测试。测试账号 qinteste 存档留在 data/ 下作为佐证, 未清理(未跟踪文件,不纳入本次提交)。

深度功能测试(2026-08-17,round four)——战斗测试起步,一个待核实的疑点

出村流程(ask hua about 出村,需先"拜师")比预期更长,本轮改用 wizlist 里的管理员 id(fluffos,重新注册,正确获得巫师身份并被带 到巫师休息室)走 goto 直达 /d/wudang/tufeiwo1(土匪常出没的林中小 路)快速触发战斗,跳过完整的新手村教学/拜师流程。

发现但未确认的疑点kill tufei 攻击 土匪(银子) 后,【系统】 战斗精灵:银子(): bad action = 0 在系统频道上无限重复(每个心跳一 条,flee 离开房间后仍在继续),双方均未见明显掉血,战斗从未真正推 进。追踪到 adm/daemons/combatd.lpcquery_action()——当 query("actions", me) 不是 mapping 时会调用 me->reset_action() 重试一次,仍失败则广播这条系统消息并 return 0(放弃这次攻击,不崩 溃)。feature/attack.lpcreset_action() 理论上总会把 actions 设成某个值(技能对应的 closure,或 query("default_actions") 兜底), 所以持续失败意味着这两条路径对 土匪 这个 NPC 都没能产出一个合法 mapping——但未确认根因,也未确认这是真实玩家会遇到的路径: 本轮测试用的 fluffos 账号是全新注册的巫师,没有走任何拜师/学技能 流程,本身就没有任何战斗技能;不清楚这个"僵局"是 NPC 自身设置 (tufei2.lpc 只用 set_skill("unarmed", ...) 直接赋值,没有走正常 拜师获得技能映射的路径)的问题,还是我方(攻击者)没有技能导致的连 带问题,或两者都是。不计入 AGENTS.md 编号目录——直到用一个走完 正常拜师/学技能流程的角色重现,才能确定这是否是真实玩家可达的 bug, 还是纯粹因为用了一个跳过教学的巫师账号测试而产生的假象。下一轮如果 继续测试战斗,应该用完成拜师的角色(或至少 setskill 给自己一个合 法技能)重新触发同样的战斗,看警告是否消失。

工具方法记录:scripts/tmux_mud.shread/sendread 因为 tmux 面板固定开了 -y 500(220x500),capture-pane -S -N 的 N 起不到预 期的"只看最后 N 行"效果(面板本身够大,永远整页回卷),改用 tmux capture-pane -p | tail -N 更可靠。另外,直接在 tmux send-keys -l 里发送含中文的长指令(如 ask hua about 出村)会偶发触发本地 telnet 客户端自己的 ^] escape 模式(telnet> 提示符),经原始 socket 验证过服务端应答本身完全干净(不含裸露的 \xff),确认是本 地 telnet 客户端的问题,不是这份档案的 bug;用 telnet -E(禁用 escape 字符)启动连接后问题消失。

深度功能测试(2026-08-17,round five)——第二个待核实疑点,本轮未能推进战斗测试

尝试按 round four 的建议,用一个真正学过技能的角色重现"bad action"警 告,但被两条独立的权限/寻址问题挡住,未能在本轮内完成:

1. clone/setskillcmds/arch/ 指令需要真正的 (arch) 授权SECURITY_D->valid_grant(me, "(arch)")),fluffos 这个 wizlist 里标注"(admin)"的账号并不自动具备——和 is_admin() 的情况一样 (clone.lpc/admin_flag 那条,见 round four 记录),wizlist 的 "(admin)" 标注看起来只是展示用途,不直接对应驱动侧真正的高权限判 定。绕过尝试:改走正常玩家路径——去新手村练武场 bai wubo拜 师请使用指令 bai 师傅ID(bai wu bo))取得真实技能。 2. cmds/skill/apprentice.lpcbai/apprentice 指令的真正实现) 的目标寻址疑似有 bug,或者是我方操作有误,尚未查清:在武伯所在 的练武场对 bai wu bo(含空格,武伯 set_name 声明的 id 之一) / apprentice wu bo 均得到 "你恭恭敬敬地向新手入门必读磕头请安, 叫道:「师父!」"——即代码里 me->is_apprentice_of(ob) 为真时的 提前返回分支,但 score 确认"师承"仍是"你还没有拜师",说明 present(arg, environment(me)) 解析出的 ob 实际上是新手指南 书(新手入门必读,id 只有 book/newbie book),不是武伯。把 书从背包丢在地上后重试,结果完全相同,排除了"present() 误查了我 方背包"这个最直接的猜测。真正根因(present() 的房间物件搜索顺序、 多字词 id 的匹配规则,还是别的原因)未查清——同样不计入 AGENTS.md 编号目录,因为可能是我方指令用法本身有误(比如武伯的真实注册 id 或者拜师指令的正确调用方式和源码字面猜测的不一样),而不一定是这 份档案的 bug。

鉴于两轮排查战斗/技能获取路径都没有干净的结论,且已经在 nt6 一份档案 上投入了五轮测试,本轮到此为止,不再继续深挖——战斗、死亡/复活循环、 留言板仍未验证。如果未来还要继续测试 nt6 的这部分,建议换一个思路: 不要试图用巫师账号走捷径,直接完整跑一遍新手村教学流程(ask lao about 各编号选项,一步步做完老村长的任务),用系统本身引导的路径推 进到真正学会技能,这样才能排除"用了非常规账号/指令导致的假象"这个反 复出现的干扰因素。

AGENTS.md §7.100 修复(2026-08-19)

同族(hhsj/xfbhh/nitan170911)共享的 ROOM 基类冗余 replace_program(ROOM); 自崩溃地雷(详见 AGENTS.md §7.100):本 lib 4925 个房间文件的 create() 末尾都有这一行多余调用,同款地雷也烤进 了自带建房工具 clone/misc/roommaker.lpc 的字符串拼接代码生成模 板。

修复:脚本化删除所有房间文件里独立成行的 replace_program(ROOM);d/huangshan/banshan.lpc 有两处独立调用,均删除),加上 roommaker.lpc 里手动摘除字符串拼接片段。git diff --stat:4926 files changed, 1 insertion(+), 4928 deletions(-),与预期精确吻合。

验证:build-debug 驱动真实冷启动,端口 40186 正常监听, debug.log 全程干净。既有的 fluffos 管理员存档密码与 README 记录 的默认值(loginpw1/AdminPass1)都对不上(大概率是更早一轮测试 时被改过),且删除玩家存档不在本次修复授权范围内——改用另一个 wizlist 里列出、此前从未创建过存档的 id wuji,走完整注册流程 (含双密码机制)后正确落地"巫师休息室",确认基于 wizlist 的管理员 判定在修复后依旧生效。goto 走访 14 个刚修复的房间(d/wuxi/ d/city/d/changan/d/wuyi/d/beijing/d/northft/d/kaifeng/ d/huashan/d/ruzhou),均正常返回,无 "cannot replace"/"cannot bind" 新增日志行。按精确 PID 结束驱动;测试期间产生的 mrtg(第三方流量统计)相关四个已跟踪存档文件漂移已 git checkout -- 还原,新建的 wuji/qinteste 存档本就是未跟踪状 态,未纳入提交。

AGENTS.md §7.79 修复(2026-08-19)

addn("prop", value)(无第三参数)恒为静默无效果,同族 (xfbhh/hhsj/nitan170911/nitan6/nt6nitan6win)共通问题,方 法论/脚本详见 xfbhh NOTES.md 对应小节(同一 fix_addn2.py)。本 lib clone/user/user.lpc 未发现命名笔误覆盖(正确命名为 add), 只有 clone/user/baby.lpc 一处本地覆盖(覆盖 addn 未覆盖 addn_temp),排除其 8 处 addn(...) 调用。591 处改写,git diff --stat:339 files changed, 591 insertions(+), 591 deletions(-),加 上排除的 8 处,591+8=599,与调查阶段统计精确吻合(nitan6/ nt6nitan6win 数字完全一致)。

验证:build-debug 驱动真实冷启动,端口 40186 正常监听,debug. log 全程干净,无新增编译错误。用内建 guest 快速账号验证登录直达 游戏世界("你连线进入nt6"),无报错。按精确 PID 结束驱动;测试产生 的 mrtg 存档增量已 git checkout -- 还原。

adm/npc/nanxian.lpc 字节损毁修复(2026-08-20)

兄弟库 nt6nitan6win 自己的第四轮测试发现并修复了这份档案里 adm/npc/nanxian.lpc 的字节级损毁(两处字符串字面量内嵌入了 NUL 字 节+乱码,来自同一份共享档案打包时的损毁),其中一处在真正会执行到 的 ask_reborn()message_vision() 调用里,会让这个 NPC 的 create() 崩溃中断(连带 create_family()/setup()/穿装备全部执 行不到)。确认 nt6 自己的 nanxian.lpc 携带完全同一处损毁(字节 偏移量不同但损毁形状一致),已用同样的修复内容改正(改后档案哈希 与 nt6nitan6win 修复后的档案完全一致,确认两边原本就是同一份内 容)。因为本档案既有的 fluffos 管理员账号密码已经漂移(此前记 录),无法用 update 现场触发这个懒加载 NPC 档案的重新编译,本次 验证止于全新驱动进程干净冷启动(零新增编译错误)+ 修复内容与已证实 正确的兄弟库版本逐字节比对一致,未做真正的游戏内触发验证。

``§7.112`` residual-gap closure (2026-08-20)

Corpus re-scan (grep -rl 'call_out("death_stage"' ... | filter for missing guard) found unguarded init()-scheduled death_stage() call_out chain(s) in d/death/npc/bai.lpc, d/death/npc/hei.lpc that the original two-wave sweep (see AGENTS.md §7.112) missed -- same reconnect-triggered duplicate-chain bug, different filename/lineage. Added the standard query_temp("death_stage_active")/set_temp/delete_temp re-entry guard, adapted per file's own exit points. Compile-verified via lpcc --batch.

§7.30 uninitialized-mapping accessor sweep (2026-08-20)

Corpus-wide mechanical sweep of the feature/skill.lpc shared-lineage bug (confirmed independently on xiakexing2017/jqxz2015/haiyang2 via round-four testing): 6 accessor(s) in this file returned a raw never-initialized mapping instance variable (defaults to int 0, not ([]), until first assigned), crashing any unguarded keys()/sizeof()/indexing caller for a fresh/untrained character. Fixed at the accessor level (mapp(x) ? x : ([])) per the documented remedy. Verified via lpcc --batch static compile check only (not a live boot) as part of a large mechanical sweep; not individually functionally re-tested live on this lib.

Ported §10.7 combat F_DBASE fix from sibling nitan6 (2026-08-21)

feature/attack.lpc/feature/damage.lpc/feature/attribute.lpc confirmed byte-identical (md5sum) to nitan6's pre-fix copies. nitan6's round-four §10.7 deep test found and fixed a severe bug: these files are inherited as siblings of F_DBASE by char.lpc, never inheriting F_DBASE themselves, so their bare query()/set()/query_temp()/set_temp() calls silently hit the shared simul_efun dbase instead of the fighting character's own — reset_action()'s broken set("actions", ...) meant do_attack() silently no-opped every combat round, and receive_damage()/ receive_wound()'s broken calls meant landed hits never actually reduced qi/jing. Combat never applied real damage on this lib. Ported the identical fix (same this_object()/me redirect pattern) directly from nitan6's fixed files rather than re-deriving it. Compile-verified via lpcc --batch (not live-boot-tested independently on this lib — the fix itself was already proven live on nitan6).

深度功能测试(2026-09-04,round three,shop + 拜师)

新角度:扬州醉仙楼购物 + 古村武伯拜师。2026-08-12 第二轮走完了注册, score 因未出生拒绝;2026-08-17 前后几轮留下「还没有拜师」。这是 nitan6 兄弟库,端口 40186。第一输入可以是 gb 再英文 id,也可以直接 发 id。管理员 fluffos 的 login 口令此前已漂移,本轮用原 salt 重算 cryptpasswordad_password 都重置成 Mud@2026(只提交 data/login/f/fluffos.o)。wizlist 是 fluffos (admin)。没有 wizpwd,登录会警告然后走普通密码。进世界前有约 3 秒「请输入任意键 继续」。预载期间(SYSTEM_D->valid_login() 靠 preload_list 逐秒载入) 第一次连上可能只有「已经执行了 N 秒」就挂断、看不到 id 提示——等横幅 出现「允许玩家登入」或开机约 90 秒后再连。

clone / callis_admin() 锁死在 lonely/shulele/cqpkzaz / admin_flag==21fluffos 不能 clone 也不能 call me->save()gift fluffos 可用((arch)(admin))。save 频繁会「请不要频 繁储存进度」。武伯 attempt_apprentice 自己会 ob->save(),拜师因此 能落盘。

实测过程

管理员 fluffos / Mud@2026。巫师出生在 /d/wizard/wizard_roomgoto /d/register/entry 做出生仪式:先 choose 1,再 washto 20 20 20 20和 nitan_san / nitan_ceshi 不同,这份档案的 washto 会自动 born 到古村;之后再打 born 是「什么?」。休息室里的 register 动词是 register <id> <email>,不是 register [email protected] (后者只在 /d/register/regroom)。

gift fluffosgoto /d/city/zuixianlou。F_NAME 修好以后店小二名字 正常。现场付钱买成的是 buy 1:「你从店小二那里买下了最后一件布衣」 (金子银子太重,找了 99 铜板)。buy jitui 当时仍是「你想买什么?」 ——list 只剩编号 1 的布衣,因为 feature/dealer.lpcinit_goods() 用裸 query("vendor_goods") 打到 simul_efun 共享 dbase。已改成 this_object()->query("vendor_goods")。对已加载的店小二做 update 不会重新 init 货架,烤鸡腿清单要冷启动后的新 NPC 才看得到。付钱购物 本身已现场验证。

拜师对象是 /d/newbie/lianwuchang 的武伯(d/newbie/npc/wubo.lpc, id ({ "wu bo", "wu", "bo" }))。F_NAME 修好前 bai wu bo 会拜到新手 入门必读 / 布衣上,因为 present("wu") 先命中身上的布衣。修好后要用 bai bo(或先丢掉布衣再 bai wu),不要用 bai wu / bai wu bo。 现场:「恭喜您成为古村的第二代弟子」。杀驱动冷启动再登录:门派古村、 师承武伯、古村第二代传人。身上仍有布衣和 gift 自动加载的六张一千两金 票。

发现并修复的 PROGRAMMING bug

1. F_NAME / F_COMMAND / F_APPRENTICE 裸 query()/set()(从 nitan6 已修版本原样移植 feature/name.lpcfeature/command.lpcfeature/apprentice.lpc):这三个 feature 和 F_DBASE 是 char.lpc 的兄弟 inherit,裸调用打到 simul_efun 共享 dbase。修复前每个 NPC/ 物品显示成 0(0) / 布衣,bai wu 会向布衣磕头。

2. F_DEALER vendor_goods 同样打到共享 dbasefeature/dealer.lpc): init_goods()item = query("vendor_goods") 改成 this_object()->query("vendor_goods")。不改的话醉仙楼货架对不上 xiaoer2.lpc 里写的 jitui/jiudai/baozi。

3. 华山/青城收徒计数拼写(与 jhfy2/wmkj/hy2002 同形,静态 对照修,本轮拜师走的是武伯不是华山): kungfu/class/huashan/{yue-buqun,yue-wife,feng-buping}.lpc 以及 kungfu/class/qingcheng/yu.lpcrecruit_apprentice()add("apprentice_availavble", -1),永远减不到 set("apprentice_available", 3) 那个字段。四处都改成 apprentice_available