Tales of Wulin Heroes: Soul of Yan-Huang II

✅ 可玩

「武林群侠传」之炎黄武魂Ⅱ

yanhuangwuhun

🔑 fluffos / Mud@2026 更新 3188080 2026-09-04 源码 下载 ZIP

▶ 开始游玩 · Play Now

融合武侠与仙侠元素的 MUD,属于 ES II 引擎家族(2003 年"炎黄"分支),与同批的「炎黄英雄史」系出同门,都源自同一套 2003 年由"lxtx"改写的引擎版本:新角色从"世外桃源"启程踏上江湖路,可在"猛士型""智慧型""耐力型""敏捷型""均衡型"五种角色定位里择一发展;天赋分配是这批档案里少见的"自选数值"玩法——`washto <膂力> <悟性> <根骨> <身法>` 一次性直接指定四项数值(每项 13-30,总和须为 80),不必先随机再决定接受或重掷;死亡有完整的鬼门关体验,"黑无常"/"白无常"接引,复活固定落脚扬州武庙,这套死亡系统与「炎黄英雄史」逐字节共享;战斗中够强的对手还能主动封死玩家的逃跑路线,不是每次都能全身而退。逐字节比对显示这份档案其实是本项目 `yhwhpublicfi` 的近乎复制版本——两者约 96% 的公共文件完全相同,共享同一张 73 区地图和同一套鬼门关仪式,`yhwhpublicfi` 用的正是这款游戏不带编号的原始名字"炎黄武魂",这份档案名字里的"Ⅱ"就是专为区分两者而加的;另外还带着一整套从未接线的旧版死亡系统备份(`d/death22/`),确认在当前玩法里完全无法触达。

English

A wuxia MUD blended with immortal-cultivation (xianxia) flavor: new characters begin their jianghu journey from a "Land of Peach Blossoms" starting zone and pick one of five role archetypes (Brute, Wise, Enduring, Agile, Balanced) to shape their growth. Character creation is unusually direct for this collection — the `washto <str> <wis> <con> <agi>` command lets players assign all four core stats by hand in one shot (13-30 each, must total 80) instead of rolling and re-rolling. Death sends players through a full underworld sequence escorted by the Black- and White-Guard psychopomps (黑无常/白无常), with revival always landing at the Yangzhou Martial Temple — a system shared byte-for-byte with this collection's sibling "Chronicle of Yan-Huang Heroes" (yhyxs; both trace to the same 2003 ES II engine rewrite by developer "lxtx"). Strong enemies in this game can actively block a losing player's escape route rather than always allowing a clean retreat. A file-level comparison found this build is in fact a near-duplicate of this collection's yhwhpublicfi — 96% of common files byte-identical, same 73-zone map, same underworld ritual — which carries the plain, unnumbered version of this game's own "Soul of Yan-Huang" title; the "II" in this build's own name exists specifically to tell the two apart. Also carries a full unwired backup death-and-revival subsystem (d/death22/) left over from an earlier build, confirmed unreachable in current play.

README

内容亮点

深度功能测试新发现的 bug(详见 NOTES.md)

死亡/复活系统的 d/death/npc/{hei,bai}.lpc(黑无常/白无常,游戏 里实际生效的一套)有 AGENTS.md §7.68 归档的复活软锁死 bug,已修 复,并现场完整验证了一次真实死亡→鬼门关→复活的全流程。这份档案 还额外带着一整套从未接线的死代码死亡系统(d/death22/,配一个同 样未接线的 logind2.lpc),里面 hei.lpc/bai.lpc 有同样的软 锁死 bug(已一并修复,虽然当前不可达,成本很低);同一批死代码 里还有一对更早版本的"gargoyle"命名文件,其中 bgargoyle.lpc 的 守卫条件被反着写了(!wizardp 而不是 wizardp),如果这份死代 码曾经被接线过,会导致所有普通玩家(非巫师)的复活序列永远不会 被排上日程——因为确认这段代码当前完全不可达,未做修改,只作为 历史存档记录。另外发现并修复了一类和手足档案"炎黄英雄史"完全相 同的 bug:help/rulesclone/game/{8,21}_hlp 三个无扩展名纯文 本帮助文件从未被转成 UTF-8(和"炎黄英雄史"对应文件逐字节相同, 证实是两份档案共享的同一批未转码内容),已用 iconv 转换。

在线试玩

https://mudlibs.fluffos.info/yanhuangwuhun/

管理员账号 / Admin account

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

本地运行

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

游戏端口:40060

NOTES · 移植与修复记录

yanhuangwuhun — 炎黄武魂 conversion notes

What this is

Archive 炎黄武魂_64bit.rar (#66). Self-identifies (config.cfg name : field, and the adm/etc/welcome banner) as 「武林群侠传」之炎黄武魂Ⅱ ("Wulin Qunxia Zhuan: Yanhuang Wuhun II" — "Chronicles of Martial Heroes: Soul of the Yellow Emperor II"). Two bundled .doc/.docx files at the archive root ("武林群侠传2(炎黄武魂)修改更新说明.doc" and "炎黄武魂终极版修改思路 及说明.docx") confirm the same real title. The slug yanhuangwuhun (from the archive filename) differs slightly from the self-identified name but was kept as-is per the task's port-assignment convention — noted here per instructions.

Lineage: master.lpc's header comment is the giveaway — "for ES II mudlib / original from Lil / rewritten by Annihilator (11/07/94) / modified by Xiang for XKX (12/15/95) / updated by Doing Lu for hell (2K) / Modify By Linux@lxtx for yh 2003.3" ("yh" = 炎黄/Yanhuang). This is the same ES II lineage already seen in es1_win/esI/xkx2001/rzrmud/xo/ bmxkx2001/kxkj/yueyingqiyuan/wuhanzhan (a 2003 fork of that common ancestor, done by an author using the handle "lxtx"). adm/single/{master,simul_efun}.c layout (not adm/obj/) matches the xkx2001/rzrmud branch of that family most closely.

"64bit" in the archive name refers to a bundled prebuilt driver, not the mudlib: the raw archive contains mudos.exe (a 2006 Win32 MudOS binary) at the top level AND a separate fluffos64/ directory holding a full Cygwin-based 64-bit FluffOS driver build (driver.exe + a dozen cygwhatever.dlls, dated Oct 2016) plus a start64.bat launcher. Both were ignored entirely, per standing project policy — only the LPC mudlib source was extracted/converted/run through this project's own FluffOS build.

Pipeline steps

1. Extracted archives/炎黄武魂_64bit.rarlibs/yanhuangwuhun/raw/ with scripts/extract.sh (plain unrar, no password/SFX issues). 2. Converted raw/work/ with scripts/convert_lib.sh: - encoding: already_utf8=475 converted=11549 lossy=8 skipped_binary=41 (the 8 lossy files: 2 .bak quest-daemon files, 2 adm/etc/ip/ banned-IP data files, 1 cmds/arch/recovermud.c admin tool — all non-critical data/dead-tooling, not on the boot/registration path) - renamed to 10,756 .lpc files (0 stray .c remaining) - fixed 395 literal ".c" references (.lpc/.h scope) + 5 #include <....c> angle-bracket refs + converted 9 local angle-bracket <x.lpc> includes to quoted form - staticnosave touched 63 files (see the counterexample fix below — this one had an unusually large false-positive collision) 3. Wrote libs/yanhuangwuhun/config.fluffos (port 40060, mudlib directory pointed at work/, config's original name field 炎黄武魂Ⅱ kept). Created log/, binaries/, adm/tmp/ dirs (didn't exist in the raw archive). 4. Read master.lpc/securityd.lpc/chinese.lpc/named.lpc/ logind.lpc/message.lpc proactively before first boot and applied every applicable catalog fix (below) before ever attempting a full driver boot. 5. Booted build-debug/src/driver on port 40060 — required two rounds of fix-then-reboot (see "Fixes found only via a real boot" below) before reaching a fully clean boot with zero errors. 6. Verified the full registration flow with mudclient.py three independent times, each in one continuous connection, each reaching an actual room in the game world. 7. Ran the full lpcc_check.sh sweep (normal-sized lib, no §6b OOM concern) — iterated twice more after the first sweep to fix newly discovered content bugs, ending at 10747/10756 = 99.92% pass. 8. Killed the driver by exact PID when done (never used a broad pkill -f — verified other agents' concurrently-running drivers for other libs, e.g. huoying, yxcs, haiyang2, were never touched).

Fixes applied proactively (before first boot), per the AGENTS.md catalog

- #define PATH(name) (name[0..1] + "/" + name) (first GBK char, 2 bytes) → name[0..0] (first character). - Every strlen(name) < 2 guard (in remove_name, map_name, who_is, invalid_new_name) → < 1. - A name[0..1] bucket-key reference in remove_namename[0..0]. - invalid_new_name()'s sliding-window similar-name check: guard strlen(name) < 4< 2; loop bound i <= l - 4i <= l - 2; 2-char-window slices name[i..i+3] (4 bytes) → name[i..i+1]; 3-char-window slices name[i..i+5] (6 bytes, guarded by i+6<=l) → name[i..i+2] (guarded by i+3<=l).

Fixes found only via a real boot / registration test (not visible from source review alone)

Content bugs found via the lpcc_check.sh sweep (fixed)

Sweep pass rate before any content fixes: 10732/10756 = 99.78% (24 failures). After fixing the shared-root and individually-diagnosed bugs below: 10747/10756 = 99.92% (9 failures remaining, all confirmed non-bugs or genuine content gaps — see next section).

Remaining sweep failures (9) — confirmed non-bugs or genuine content gaps, not fixed

Confirmed NOT needed (verified by reading source, not by hitting a crash)

Registration flow — read before testing

adm/daemons/logind.lpc's callback chain: logon() → banner → get_id (English id, check_legal_id: lowercase letters only, 3-10 chars, no digits — using an id with a digit produces a confusing rejection cascade that consumes subsequent --send lines as retries; learned this the hard way on this lib too, see transcript below) → confirm_id (y/n, new character if yes) → get_surname (Chinese, ≤2 chars, optional — blank skips) → get_name (Chinese, ≤2 chars) → combined-length check → NAME_D->invalid_new_name() (duplicate/similar-name/compound-surname check) → new_ad_password/confirm_ad_password (≥5 chars, admin/backup password) → new_password/confirm_password (≥3 chars, must differ from admin password) → get_type (1-5 character archetype, blank defaults to 5/"均衡型") → get_gender (m/f) → make_body()enter_world(). No hidden BIG5/student/client-version pre-id gate — the very first prompt IS the real id prompt (unlike xyzx3/xkxz2). "new"/"none"/ "guest"/"cancel" are explicitly banned ids (routed to a guest/deny path, not character creation), matching several other libs in this project.

Registration flow — verified transcripts (3 independent runs, one continuous connection each)

Run 1 — id qinfeng, surname , given name , type 均衡型 (default/blank), gender m:

您的英文名字...:qinfeng
使用[qinfeng]...您确定吗(y/n)?y
您的中文姓氏...:秦
您的中文名字...:风
请设定您的管理密码:admin1234
请再输入一次...:admin1234
请输入你的普通密码:pass123
请再输入一次...:pass123
请您选择...类型:(blank -> 均衡型)
您要扮演男性(m)的角色或女性(f)的角色?m
你连线进入炎黄武魂Ⅱ。
世外桃源 - ...(full room description, exits west/east/north/south, NPCs 水笙/狄云 present)
> look  -> re-displays the same room correctly
> quit  -> 欢迎下次再来!

Zero errors in debug.log for this run (this WAS the run that first exposed the message()/tell_room() bug during PRELOAD, before login — by the time registration itself ran, that had already been fixed).

Run 2 — id qinling, surname , given name , type 耐力型, gender f: identical successful flow, reached the same starting room (世外桃源), look/quit both worked. Zero errors in debug.log.

Run 3 (final, post-all-fixes) — id qinhuai, surname , given name , type 智慧型, gender f: identical successful flow, reached the same starting room, look/quit both worked. Zero errors in debug.log for the entire session (confirms the message()/tell_room() forward-declaration fix is fully effective, not just partially).

All three characters' save data confirmed written to disk: data/login/q/{qinfeng,qinling,qinhuai}.o and data/user/q/{qinfeng,qinling,qinhuai}.o.

Gotcha hit twice while testing (worth flagging for future libs): using a login id containing a digit (qinfeng2, qinfeng5) fails check_legal_id's letters-only check, and the resulting rejection loop silently consumes every subsequent --send argument as a retry attempt at the SAME prompt — by the time the script runs out of arguments, the session is stuck mid-flow with no obvious error. Not a mudlib bug (the letters-only id rule is intentional and correctly implemented) — just a reminder to keep test ids simple/pure-alphabetic.

lpcc sweep result

10747 / 10756 = 99.92% pass (9 failures, all confirmed non-bugs/ content gaps documented above — none affect boot, registration, or normal gameplay reachable from the tested paths).

Files changed (relative to libs/yanhuangwuhun/work/)

2026-07-23: driver rebuild retest + LPC formatter + WASM check

WASM-enablement pass (loopback-allow / gate bypass / admin seed)

Standard WASM-first pass per AGENTS.md §1.3b/c/e and §1.5. Gates patched:

- logon() BAN_D->is_banned() gate (~line 75) — loopback exempt. - logon() same-IP multi-login cap (iplimit > 9, ~line 106) — loopback exempt. - the WASM registration blocker: both unguarded VERSION_D->is_version_ok() call sites (banner ~line 87, get_id hard gate ~line 161) now guarded with find_object(VERSION_D) — daemon absent (as under WASM, where versiond's sockets usage keeps it from compiling) ⇒ notice/gate skipped. This was the documented "no id prompt under WASM" hard blocker. - No uptime() startup-grace gate or registration-rate throttle in this lineage's logind (MAX_USERS capacity cap left intact).

Admin account seeded: id fluffos, 普通密码(login pw) Mud@2026, 管理密码(recovery pw) Admin2026, display name 浮浮 (surname prompt skipped with bare ENTER — the lineage's surname+given-name split flow rejects 姓=名, so "浮"+"浮" does NOT work; skip the surname instead). Granted (admin) via fluffos (admin) appended to adm/etc/wizlist. Verified: real registration flow end-to-end into 世外桃源, relogin → update /adm/daemons/band → 成功 (score correctly says 还没有出生 until the newbie quality-selection is done — game design). Retest: fresh normal registration (姓 秦 名 风, f) end-to-end, look/quit correct; test char saves removed; zero new debug.log errors.

Save files for the orchestrator to add (none gitignored, normal add):

Fail-closed retrofit for the loopback-allow gate (2026-07-24)

The loopback helper above was originally written matching the project-wide convention at patch time (AGENTS.md §1.3b), which also treated an empty/non-string/malformed query_ip_number() result as loopback, defensively, because the WASM driver used to return garbage there. That underlying driver bug is now fixed (fluffos commits e33bb5da "fix: query_ip_number() returned uninitialized garbage under WASM" and 007bb863 "feat: synthetic resolve() on WASM instead of raising an LPC error", both 2026-07-23; the locally-built build-debug/build-wasm binaries already postdate both commits), so treating unparseable IPs as trusted is a fail-open gap with no remaining justification. Retrofitted to fail-closed: loopback is now strictly ip == "127.0.0.1" || ip == "::1" || ip[0..3] == "127." (with a stringp() guard before the slice) — a malformed/empty IP now falls through to the NORMAL gate instead of being treated as local. Retested after tightening: fresh driver boot clean, fluffos loopback login and its wizard update command both still work; zero new debug.log errors.

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

yh2003 代码库基础版(炎黄武魂Ⅱ)。状态已从过时的 limited 修正——本轮找到并修复了一个真正的 bug:adm/daemons/logind.lpc 的 check_ok() 在每一次成功登录时都未加保护地呼叫 MESSAGE_D->find_chatter(),而 MESSAGE_D(adm/daemons/network/messaged.lpc)在 WASM 下编译不过(原始的 socket_create()/socket_bind() 呼叫,sockets 包不可用)——由此产生的未捕获'No program in object'运行时错误会在 check_ok() 执行到一半时中止,静默地把连线留在一个损坏状态,之后每一条指令(包括 quit)都回显'什么?',从未真正进入任何房间。已用 find_object(MESSAGE_D) 保护这个呼叫来修复(手足档案 yhyxs 上也应用了同样的修复)。修复后重新验证干净:管理员登录(fluffos/Mud@2026)正常进入游戏世界,'目前权限:(admin)',quit 正常。

深度功能测试(§10.7,2026-08-04)

原生 driver(端口 40060)跑了一遍超出注册流程的完整游玩。这份档案 和它的手足档案 yhyxs(yh2003 血统)几乎共享一切——注册流程逐字 一致,help/newbie 只有示例人名/颜色码的差异,help rules / clone/game/{8,21}_hlp 三个文件是逐字节相同的内容(见下)——但注 册细节上有一处真实差异:这份档案的天赋重掷指令是 washto <膂力> <悟性> <根骨> <身法>(一次性直接指定四项数值,总和必须为 80, 每项 13-30 之间),不是 yhyxs 的那种"随机结果 + wash 重掷"交 互式流程——照抄 yhyxs 用法直接输入 wash 会被解析成一个别处也 存在的通用"洗手"动作("你洗了洗手。"),不是这份档案的属性系统, 容易误判为 bug,实际是这条血统内部的一次真实分支演化,读源码 (d/register/yanluodian.lpc)之后才搞清楚正确用法。

主动检查adm/daemons/logind.lpc 没有 §7.34 printf 残留,没 有 §8.9 食物/饮水按错误对象 age 初始化的问题(写法本来就正确), MESSAGE_D->find_chatter() 已经用 find_object(MESSAGE_D) 包住 (这份档案自己 WASM 修复阶段已经修好,本轮确认仍然正确)。

发现并修复的问题(详见下方分类)

1. §7.68 复活软锁死,命中数量创下这批测试的记录:六个死亡系统 NPC 文件。这份档案有两整套死亡系统:d/death/include/ login.hDEATH_ROOM 宏实际指向 /d/death/gate,是真正在游 戏里生效的一套)和 d/death22/(没有任何代码路径引用它,和一 个同样从未被引用的 adm/daemons/logind2.lpc 配对,是这份归档 里附带但从未接线的整套备用/旧版内容)。d/death/npc/ {hei,bai}.lpc(活的)d/death22/npc/{hei,bai}.lpc (死代码,不可达) 都有同样的 if (!ob || !present(ob)) return; 复活软锁死守卫,全部四个都按 已验证的修法拆分修复(d/death22 那两个虽然当前不可达、无法现 场验证,但如果这套内容未来被重新接线,修复已经提前到位,成本 很低)。 2. 一个更有意思的、真正只存在于死代码里的独立 bugd/death/ npc/{wgargoyle,bgargoyle}.lpc("gargoyle"命名风格,和活的 hei.lpc/bai.lpc 是同一批"黑无常/白无常"角色的另一套旧版实现, 同样没有任何房间引用它们,属于死代码)除了同样的 §7.68 守卫之 外,bgargoyle.lpcinit() 还有一处反向写反的条件: !wizardp(previous_object()) ——所有其它姊妹文件(包括同目录的 hei.lpc)都是不带 !wizardp(previous_object())(意思是 "如果来的鬼魂是巫师就放弃处理,交给巫师自己的复活流程"),唯独 bgargoyle.lpc 反过来写成"如果来的鬼魂不是巫师就放弃处 理"——也就是说,如果这个文件真的被接上房间,普通玩家死亡后走 到这个黑无常面前,init() 会直接 return,call_out("death_stage"...) 永远不会被排上日程,复活序列压根不会开始,普通玩家会永久卡成 鬼魂(只有巫师能被正常处理)。因为这个文件本身就是不可达死代 码,这个 bug 现在完全不会触发,没有做任何修改——按 AGENTS.md 已有的"confirmed unreachable"惯例记录,不当作需要修复的活跃 bug,只作为一个有趣的历史存档(大概是这条血统在从"gargoyle"命 名迁移到"hei/bai"命名的某次重构里引入的笔误,新文件修对了,旧 文件的笔误就一直原样留在归档里)。 3. yhyxs 完全相同的 extensionless GBK 文本残留 bug(AGENTS.md §4.1 已归档条目的第二个具体实例)help/rulesclone/game/ {8,21}_hlp 三个文件,用 Python 做全树 UTF-8 解码扫描后发现内容 和 yhyxs 对应文件逐字节相同diff 完全无输出),证实这 是两份姊妹档案共享的、从未被转码的同一批原始内容。用相同的 iconv -f GB18030 -t UTF-8 转换,现场用 help rules 验证显示 正常。

发现但确认不是 bug,特意未做修改d/register/yanluodian.lpc 第 57 行 paizi 提示牌文字"washto选好天赋之后"缺少分隔标点("活 的"版本和它自己的 .bak 死代码副本里写法完全一样,确认是原始存 档里的笔误,不是转码流程造成的)——因为不确定原文缺失的具体标点 是什么(逗号?空格?),按"不要凭空编造内容"的原则未做任何修改, 只在此记录。washto 本身是真实生效的指令(不是打字错误),只是 提示牌上的说明文字标点缺失。

注册与游玩:注册测试角色(秦皇 / id qinhuang),走到"花铁 干"处选性格,washto 20 20 20 20 拿到均衡天赋,born 扬州人氏 投胎,落在扬州客店,食物/饮水 233/300(§8.9 修复生效的直接证 据)。角色带有"武林外传"这本书和先天技能"玄黄聚纳/周天运转/铜皮 铁骨"(和 yhyxs 的角色不同,这条血统的具体门派/技能设计是独立 内容)。

战斗+死亡+复活测试(第三次真实死亡+undisturbed 完整现场验 证):北大街的"欧阳克"(和 jyqxc/yhyxs 里的是同一个反复出 现的固定布景反派角色)。第一次交手把测试角色打到半昏迷但侥幸逃 脱未死;重连时踩到了这条血统的"网络异常断线后短暂拒绝立即重连" 锁定窗口——第一次尝试在异常断线后几秒内立即重连卡在"请输入密 码:"没有任何后续响应,等待接近一分钟后才收到"重新连线完毕"并正 常继续,不是新的驱动级 hang/crash,是已有惯例记录过的"退出/断 线后有一段锁定窗口"现象(第一反应怀疑是又一次 §10.8 类崩溃, 用一个全新 id 的并行连线确认 driver 本身完全正常响应后排除了这个 可能)。第二次交手,角色试图 wimpy 自动逃跑时被欧阳克主动封死 退路("你见势不妙,转身想要逃走。却见欧阳克飞身一闪,已将你的退 路封死。"——比之前几次姊妹档案的战斗多了一个新细节:够强的对手 能主动拦截逃跑,不是每次都能全身而退),连续两下重击(77点+45点 创伤)后被"活活冻死了"(和 yhyxs 一样,战斗伤害叠加当时降雪环 境效果导致的死亡flavor)。死亡后送到鬼门关,"白无常"(刚修复的 活的 d/death/npc/bai.lpc)在场,没有主动打断复活序列,等待 完整走完后重连确认:角色已复活、站在"武庙",hp 显示气血满血 100/100、精气 63/100(仍在恢复中)、潜能从 99 减半到 50(符合死 亡惩罚)。这是本轮系列测试第三次(前两次是 jyqxc/yhyxs)现场 完整验证 §7.68 修复后 undisturbed 路径的正确性。

quit 正常退出("欢迎下次再来!"),driver 全程存活,没有触发 §10.8 类崩溃(和上一次 yhyxs 会话不同)。debug.log 全程没有 真实的 error:/denied/Bad argument/Too deep recursion 行。 formatter 检查(所有改动文件均已是干净格式,无需重排版)、 git status --short libs/yanhuangwuhun/ 复查均确认改动范围干 净——只有七处源码修改(三处 GBK→UTF-8 转码 + 四处 §7.68 修复)是 跟踪变更,测试角色的新存档保持未跟踪、未提交。

更正(2026-08-05):§7.68 复活软锁"修复"已撤销

上面提到的"鬼魂离开/不在场时被永久放弃复活流程"曾被当作 AGENTS.md §7.68 记录的一类 bug 修复(把单次判定改成每 5 秒重试)。经用户指出并 重新审视:这更可能是有意的游戏设计,不是 bug——大多数这类档案里 鬼魂根本无法自行移动,所以"不在场"要么从未真正发生,要么是"离开去 在阴间游荡,想回来时再走回这个房间、流程会通过 init() 重新从头开始" 这种有意为之的宽松机制,而不是需要强制追上玩家的错误。强行重试还可能 引入新问题:如果鬼魂之后又走回这个房间,旧的重试和 init() 重新触发的 新一轮流程可能同时运行,导致对话重叠错乱。已把这处改动撤销,恢复成 原始的 if (!ob || !present(ob)) return; 单次判定写法(bmxkx2001 除外——那份档案里这确实是一个真实存在、经过实际复现验证的 bug:鬼魂 本身完全无法移动,是另一个不相关的 NPC 强行把鬼魂拖走导致的)。详见 AGENTS.md §7.68 顶部的撤销说明。

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

AGENTS.md §7.100 修复(2026-08-19,批次三)

ROOM 基类冗余 replace_program(ROOM); 自崩溃地雷(详见 AGENTS.md §7.100):3370 处命中。自带建房工具 clone/misc/roommaker.lpc 的 字符串拼接模板同样修复。

git diff --stat:3369 files changed, 1 insertion(+), 3370 deletions(-), 与预期精确吻合。

验证:build-debug 驱动真实冷启动,端口 40060 正常监听。既有管理 员账号 fluffos/Mud@2026(姓氏栏留空跳过)登录,目前权限: (admin),世外桃源→桃源茅屋→世外桃源多房间走访无误(与 yhyxs 共 享同一份注册区场景内容,同样改用固定间隔裸 socket 脚本规避活动时 钟提示符),quit 干净退出,全程无新增 "cannot replace"/"cannot bind" 日志行。

§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): 5 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.

§7.125 sibling-sweep fix: premature set("registered", 1) defeats the registration gate (2026-08-28)

Flagged in AGENTS.md §7.125 as a sibling worth checking (originally found on zhyx, same yh2003/ES2 lineage). Confirmed byte-identical: adm/daemons/logind.lpc's enter_world() unconditionally ran user->set("registered", 1); //user->set("born",1); right after handing out starting clothing, on every login — permanently short-circuiting the register-room's valid_leave() gate (d/register/room{w,s,n}.lpc, "你还不快注册?") and channeld's registration check from a character's first-ever login onward, since d/register/npc/shuisheng.lpc's do_decide() (the correct, sole place this flag should be set, confirmed present and correct in this lib too) could never matter — the flag was already permanently 1 before the player ever got a chance to register. Fixed by deleting the premature line in enter_world(). Verified via a clean native driver boot only (not an independent live walk-out-of-the-room reproduction on this specific lib — the bug shape and remedy are a verbatim port of an already live-verified fix from the shared-lineage sibling zhyx).

深度功能测试(2026-09-03,第三轮)

新角度:2026-08-04 第一轮做了注册 / washto / 战斗死亡,没测商店 和拜师。手足 yhyxs 2026-09-01 的路径可直接套。