Xiao Ao Jiang Hu XO (The Smiling, Proud Wanderer)

✅ 可玩

笑傲江湖 XO

xajhxo

🔑 fluffos / Mud@2026 更新 186fa10 2026-09-03 源码 下载 ZIP

▶ 开始游玩 · Play Now

游戏取材自金庸小说《笑傲江湖》,"XO"是这个版本自己的代号(登录横幅上写着"THE SMILING PROUD WANDERER"),源自 TMI-2/ES2 引擎、由"Falcon"改写,本项目还收录了同一血脉的另外两个快照 `xo`(笑傲江湖迷你版)与 `xo_final`(XO最终版1.2),以及共享同一套"XO mudlib"世界模板的第四位近亲 `xajh2`——不过逐文件比对发现两者在共有路径中只有18%的字节完全相同,说明各自都是独立重写而非直接复制。门派体系是共享模板的一个精简子集:少林、崆峒、昆仑、青城、无量剑派、《天龙八部》里的大理段氏皇宫,以及丐帮麾下的"一品堂",此外还有专属于本档案的南阳地区及一处山寨匪窝。新角色会被随机分配到几个不同的起始场景之一(比如"龙门客栈"),剑术、刀法、拳脚、轻功、短兵刃、鞭法、长兵刃等各类武学修为各自独立养成。新创建的人物如果在上线30分钟内就 `quit`,存档会被作废——这是游戏本身的防灌水设计,不是缺陷。

English

Based on Jin Yong's novel The Smiling, Proud Wanderer, "XO" is this version's own codename (the login banner reads "THE SMILING PROUD WANDERER"), descended from the TMI-2/ES2 engine lineage and rewritten by "Falcon." This collection also holds two other snapshots of the same bloodline, xo (Mini Edition) and xo_final (Final 1.2), plus a fourth relative, xajh2, with which it shares the same underlying "XO mudlib" world template — though a file-level check found the two only 18% byte-identical among shared paths, confirming each was independently rewritten rather than copy-pasted. It runs a trimmed subset of that shared sect roster (Shaolin, Kongdong, Kunlun, Qingcheng, Wuliang, the Duan-clan palace of Demi-Gods and Semi-Devils, plus the Beggars'-Sect-adjacent Yipin Hall) alongside its own exclusive Nanyang region, complete with a bandit mountain stronghold. New characters are dropped into one of several random starting scenes, such as the Dragon Gate Inn, and each weapon discipline (sword, blade, fist, qinggong, whip, polearm) levels independently; quitting within 30 minutes of character creation forfeits the save by design, not bug.

README

在线试玩

https://mudlibs.fluffos.info/xajhxo/

管理员账号 / Admin account

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

本地运行

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

游戏端口:40069

NOTES · 移植与修复记录

xajhxo — 笑傲江湖XO (The Smiling, Proud Wanderer — "XO" build)

Archive: 笑傲江湖XO .rar (note trailing space in the archive filename before .rar). Port: 40069. Status: done (boots clean, full registration flow verified end-to-end with a real Chinese name, ordinary post-login commands look/score/i all confirmed working per §15ae policy).

Raw root: 笑傲江湖XO .rar extracts to a single top-level xo/ directory (4922 files) — config self-names the mud simply 笑傲江湖 (matches the archive's own title, no site-branding difference to note).

Lineage confirmation (verified via diff/md5sum, per explicit instruction)

Confirmed same TMI-2/ES2 (Falcon) lineage as both prior "XO" family libs — libs/xo/ (archive #28, "笑傲江湖迷你版"/mini edition) and libs/xo_final/ (archive #29, "XO 最终版1.2"/final build) — via the identical header credit line in secure/obj/master.lpc:

// Original from TMI-2 and ES2
// Rewritten by Falcon 96-10-02

(byte-identical wording to what libs/xo/NOTES.md already documented for archive #28). This is a genuine third, independent snapshot in the same lineage — not a duplicate or simple size-variant of either sibling:

Fixes applied (with why)

1. AGENTS.md §4 (lazy security-daemon load recursion guard)secure/obj/master.lpc's valid_write/valid_read called load_object(SECURITY_D) unconditionally on every single call (catch()-wrapped but with no find_object() gate or re-entrancy flag) — identical shape to the exact bug already fixed on sibling xo. Applied the same guard: check find_object() first, and a nosave re-entrancy flag so a disallowed/failed load degrades to a safe default (1 for read, 1 for write once already loaded) instead of recursing. Applied proactively before first boot given the recognized lineage. 2. AGENTS.md §15h (GBK byte-range Chinese-detection bug) — applied in THREE places: - secure/simul_efun/chinese.lpc's is_chinese(): str[0] > 160 && str[0] < 255 (GBK lead-byte range) → CJK Unicode codepoint range (str[0] >= 0x4e00 && str[0] <= 0x9fff). Also relaxed the length gate from strlen(str) >= 2 to >= 1, since logind.lpc's sliding-window caller (is_chinese(name[i..<0])) legitimately passes single-CHARACTER substrings under UTF-8 (the original >=2 assumed "1 Chinese char = 2 GBK bytes", which no longer holds). - secure/sefun/chinese.lpc (the orphaned/unreachable duplicate, confirmed nothing loads secure/obj/sefun.lpc): same fix applied as cheap insurance, in case anything non-obvious ever does load it. - system/daemon/logind.lpc's check_legal_name(): halved the byte-calibrated length bound (strlen(name) < 4 || > 10< 2 || > 5, matching what the message text already says: "必须是 2 到 5 个中文字"), and dropped the i % 2 == 0 && byte-offset gate in the per-character sliding-window loop (every UTF-8 index is already one full character, not every-other byte). These three together are what let a REAL Chinese name (verified: 秦风, 秦岭, 秦风三 across 3 independent test runs) actually pass registration instead of being silently rejected — confirmed via live interactive test, not just code inspection. 3. AGENTS.md §15g (case-sensitive #include <Action.h>) — 3 files (system/feature/command.lpc, system/feature/lcommand.lpc, cmds/wiz/localcmds.lpc) #include <Action.h> (capital A) but the real file on disk is include/action.h (lowercase) — same root cause already documented on sibling xo (a different specific file list, but the identical bug shape), found via the lpcc sweep's dominant "Undefined class 'Action'" failure cluster. Fixed all 3 include directives to the correct case. 4. New: class Action was never actually DEFINED anywhere in this archive (only ever referenced as a return/parameter TYPE in add_action.lpc/lcommand.lpc) — confirmed by grepping the whole tree for a real class Action { ... } struct declaration and finding none, even after fix #3 corrected the file-case issue. Cross-checked sibling xo's include/action.h and found it DOES carry the real struct ({ string verb; string ob; string func; }), matching exactly the fields this archive's own add_action.lpc accesses (Action->verb/->ob/->func). Ported the struct verbatim from xo into this lib's include/action.h — this is lineage evidence, not a guess (see the "Lineage confirmation" section above: this snapshot independently lost a piece of plumbing xo still has). 5. AGENTS.md §8g variant (missing macro, not missing file) — three separate instances found via the lpcc sweep: - GROUP_TASK — referenced (inherit GROUP_TASK;) by 42 files under system/task/, never #defined anywhere, despite the real target file (/system/std/group_task.lpc) existing on disk. This ONE missing macro was the single highest-impact fix of the whole pass — it alone accounted for 42 of the initial 144 lpcc-sweep failures. Added #define GROUP_TASK STD_DIR "group_task" to globals.h. - EXERT_DIR — referenced by 6 files under system/skill/{exert, shaolin,wuliang,xkdao}/, never defined, despite the real /system/skill/exert/ directory existing. Added #define EXERT_DIR "/system/skill/exert/". - ZUOJI — referenced (inherit ZUOJI;) by 3 files (mount/steed NPCs: clone/npc/horse1.lpc, horse2.lpc, u/xli/obj/ baobei_zhu.lpc), never defined, despite the real target (/system/std/char/zuoji.lpc, a genuine "standard mount" base class per its own header comment) existing. Added #define ZUOJI STD_DIR "char/zuoji". 6. New: class task's field names never matched what actually uses the classinclude/task.h's class task defined lowercase fields (need_save/name/verb/target/event/begin_time/task_end) that NOTHING in the whole archive ever reads or writes (confirmed via grep), while the only two real consumers of class task (system/std/task.lpc's GetTask(), system/feature/task.lpc's AddTask/GetTask/etc.) exclusively access a completely different, PascalCase field set: TermType, KeyName, Verb, Target, Event, Birth, TaskEnd. This ONE mismatch cascaded into 45 of the initial 144 lpcc-sweep failures (every top-level file that transitively loads system/std/task.lpc, e.g. any NPC using the task system). Fixed the struct to the field set both real consumers already use, verified safe since nothing legitimately needed the old field names. 7. New: d/place/hami/npc/hami.npc was completely absent — 8 files under d/place/hami/npc/ (yizhang.lpc, afanti.lpc, huosan.lpc, mmaiti.lpc, laoban.lpc, nvren.lpc, woldman.lpc, kid.lpc) #include "hami.npc" (quoted, same-directory convention) for their shared inherit NPC; + ask_where() helper, but the file genuinely doesn't exist anywhere in the raw archive. Reconstructed verbatim (not fabricated) from sibling xo_final's byte-for-byte-matching d/place/hami/npc/hami.h (see lineage section above — its own header comment literally reads // hami.npc, confirming it's the same content under a renamed extension in that later snapshot). 8. New: d/city/yangzhou/npc/cloth/cloth.lpc missing #include <armor.h> — the only one of 169 files inheriting CLOTH across the whole lib that omitted the include every other one has; a one-off copy-paste omission. Added the missing include line. 9. New: d/place/wiz/inn_hall.lpc's inherit LIB_ROOM; referenced a macro/base class defined NOWHERE in the archive — the file's own SetShort()/SetLong()/SetExits() calling convention (PascalCase, argument-taking) is used by no other file in the whole lib (11 other files call a no-argument SetLong() from their own zone-specific shamo.h, an unrelated shape). The room's own author had already tried and commented out //inherit ROOM; right above the broken line — reverted to that (the base class that's actually defined and used successfully by every other room in the lib) and converted the 3 Set*() calls to the standard set("short"/"long"/"exits", ...) idiom, rather than fabricate a whole new LIB_ROOM base class. 10. AGENTS.md §3 counterexample (found again, larger this time) — the blanket \bstatic\bnosave sed collateral-damaged 16 unique log-path string literals across 14 files ("static/usage", "static/wiz_usage", "static/wiz_login_err", "static/purge", "static/command_limit", "static/promote", "static/ multi_login", "static/action_log", "static/create_room_fail", "static/CALL_PLAYER", "static/promotion", "static/QIUHUN_MSG", "static/BLOCK_CHANNELS", "static/SUICIDE", "static/ DIE_PLAYER", "static/yipin_log"), rewritten to "nosave/...". Confirmed the real log/static/ directory exists in the raw archive with genuine seed data (log/static/usage, log/static/ wiz_login_err, log/static/wiz_usage) that these path references were supposed to point at. Reverted all 16 occurrences across all 14 files back to "static/...". 11. AGENTS.md §15w (log_error warning-spam)secure/obj/ master.lpc's log_error() broadcast every message reaching it (including harmless compile WARNINGS like "Illegal to declare nosave function", a direct side-effect of this project's own static→nosave fix) to the connected player, exactly matching the documented pattern. Gated the player-facing efun::write() broadcast on the message not containing "warning:" — still logs everything to file regardless. 12. §15ab-style defensive hardening (2 spots, insurance not reactive fixes)secure/simul_efun/file.lpc's cat() (write(read_file( file)), no guard) and clone/user/login.lpc's receive_message() (no !stringp(str) guard) both match the documented "unguarded write(read_file()) can crash a fresh connection" shape from xjcq2000/haiyang2. All files these two currently reach (WELCOME/ MOTD/new_player) DO exist, so this wasn't an active crash — but it's cheap, matches established precedent, and closes the risk if any future edit ever points cat() at a missing file during the login sequence. 13. ~12 individual pre-existing content typos, found via the lpcc sweep and fixed after confirming each against raw pre-conversion bytes (not blind edits): - system/skill/shaolin/mohe-zhi.lpc, system/skill/misc/ yuanyang-dao.lpc, system/skill/misc/taizu-quan.lpc (2 spots), d/menpai/shaolin/npc/dd.lpc, d/city/nanyang/npc/guo.lpc, d/zuzhi/yipin_tang/dixia/shuangqi.lpc, d/zuzhi/yipin_tang/ dixia/suni.lpc: missing-closing-quote bugs, several confirmed via raw-byte inspection to be the exact "iconv -c's invalid-byte recovery ate an adjacent REAL byte too" gotcha already documented for xo_final (an orphan single byte sitting where the second byte of a 2-byte GBK closing-bracket/quote character should have been) — reconstructed each closing quote/bracket from the raw bytes and/or sibling entries' established pattern, not guessed. - d/city/lanzhou/chanfang.lpc: a fullwidth space (U+3000) used as function-call whitespace (set( "search_things") — illegal at that syntax position; replaced with a normal space. - d/place/xkdao/npc/obj/hare.lpc, d/zuzhi/yipin_tang/peacock/ xuanwu_tang/npc/tuzhong1.lpc: fullwidth commas () used as array-element separators inside actual code (AGENTS.md §9 pattern) — replaced with ASCII commas; hare.lpc also had one element using a mismatched '... single-quote instead of "...". - d/city/chuzhou/npc/whorehouseboss.lpc: set("negative_score', 3000) — opened with ", closed with ' (mismatched quote type), cascading into "End of file in string"; fixed to a matching pair. Same file also had a set_xiuwei_by_tyep typo (→ set_xiuwei_by_type, the real function 438 other files call correctly). - d/menpai/duanshi/npc/obj/yaopai2.lpc: a genuinely corrupted duplicate array-element fragment ("/d/map/xinan/ with no closing quote, immediately followed by the real, complete element on the next line) — confirmed present in the RAW archive too (not a conversion artifact); deleted the broken duplicate line. - d/zuzhi/yipin_tang/xuanwu_tang/diaolan.lpc and its duplicate at d/zuzhi/yipin_tang/peacock/xuanwu_tang/diaolan.lpc: both called a bare undefined("exits/out") (never a real efun/simul_efun on this driver) where the evident intent was "is exits/out NOT set" — fixed to !query("exits/out"). - system/menpai/wuliang/zuo_zimu.lpc, d/menpai/wuliang/npc/ zuo.lpc, d/menpai/wuliang/west/npc/xin_shuangqing.lpc, d/menpai/wuliang/backup/npc/xin_shuangqing.lpc: all 4 files share an identical copy-pasted "姓名" (character-name) dialogue string missing its closing quote before the field-separator comma — fixed all 4 with the same closing-quote insertion. - 4 orphaned help-text/map files renamed away from a misleading .lpc extension (AGENTS.md §12 pattern — plain text, never #included/load_object()d by anything, confirmed via grep): help/wizard/format.lpc.txt, help/wizard/chelp/ref/ lpc.lpc.txt, help/wizard/chelp/concepts/lpc.lpc.txt (these 3 were pre-named .lpc in the RAW archive itself, not created by our rename script — a pre-existing naming quirk, not conversion fallout), and d/city/dali/dalimap.lpc.txt (a pure ASCII-art city map, same shape as the shenmin map precedent already documented for a different lib). - Two files (d/nanyang/suishi.c/d/city/nanyang/suishi.c) needed a direct manual iconv -f GB18030 -t UTF-8 -c pass — convert_lib.sh's per-file conversion left them as raw un-converted GBK bytes (misdetected by file's heuristic despite the forced-text-extension fix already in the script, per the known encoding-detection caveat) — re-verified UTF-8-valid after manual conversion, and re-checked for .c"/static references (none found, nothing else to fix in either file).

Confirmed NOT needed (checked via source read, not assumed)

Interactive test result — full registration + post-login flow

Read system/daemon/logind.lpc's actual logon()/get_id()/ confirm_id()/get_name()/new_password()/confirm_password()/ get_email()/get_gender()/enter_world() callback chain before scripting the test (per instructions, not inferred from prompt text). Sequence confirmed: connect → English id → y/n new-character confirm → Chinese name → password → confirm password → email → gender (m/f) → dropped into a randomly-selected start room (select_start_room() picks among 4 real rooms).

Ran the full flow 3 times, each in one continuous mudclient.py connection (2 initial runs, 1 more after the later include/task.h and include/action.h fixes to confirm nothing broke):

1. qinfengy秦风 (real Chinese name, accepted immediately — direct proof the §15h fix works, not just that the prompt renders) → password/confirm/email → m → entered 宫城外 (Gaochang city outskirts) with correct room description → look (repeated the same correct room description — confirms add_action's command_hook dispatch is genuinely working) → quit → correctly gated behind the lib's own "must play 30 minutes before data saves" confirmation (y/n), not a bug. 2. qinlingy秦岭 (different real Chinese name, female) → ... → f → entered 太白楼 (a DIFFERENT start room — confirms select_start_room()'s randomization works) with NPCs (小三, 段无畏) rendered in the room → look (correct repeat) → score (full character sheet: gender-correct "十四岁的女性人类", all 7 skill categories at 零级, kill counts, 杀气/师门忠诚度/实战经验/ 江湖阅历/武林声望 all rendering real Chinese text correctly) → quit gate again. 3. (Re-verification after include/task.h/include/action.h/globals.h fixes) qinfengsany秦风三 → ... → m → entered 宫城外 again → lookscorei (inventory: correctly showed 青布衣衫 — the auto-equipped starting cloth from enter_world()) → quit gate.

grepping log/debug.log after each of the 3 sessions for error|denied|bad argument|undefined|crash|segfault|recursion turned up zero real hits in all 3 runs (only expected config-dump lines like error_handler : 1 and the harmless compile-time nosave warnings).

lpcc sweep

4304 total .lpc files (4308 initially, minus 4 renamed to .txt as orphaned non-code text per fix #13). 4202 pass / 102 fail (97.6%), up from an initial 4132/4308 (95.9%) before this pass's fixes.

Memory stayed healthy throughout 3 successive sweep runs (peaked ~2.9GB RSS on the lpcc process, host never dropped below ~5GB free even with 2-3 other concurrent agents' sweeps running at the same time) — this lib did NOT reproduce the unusually heavy per-file memory footprint noted for xo_final at a similar file count.

Remaining 102 failures, triaged by category (none further fixed, consistent with AGENTS.md §6b — shared/systemic root causes are fixed, the long tail is documented):

What this confirms for future agents

If another "笑傲江湖"/XO-titled archive turns up later in this project, check it against all THREE now-processed XO-lineage libs (xo, xo_final, xajhxo) via the same diff/md5sum discipline — this pass confirms the lineage has at least 3 independently-evolved snapshots, not just 2, and world-content sharing (skill files, zone NPCs) doesn't always correlate with which sibling a new snapshot's core security/master files most resemble.

Re-verification pass: driver rebuild + formatter + WASM (2026-07-23)

WASM-enablement pass (2026-07, loopback/uptime/throttle + admin seed)

Standard WASM-first pass per AGENTS.md §1.3(b)/(e) and §1.5. Loopback = 127.0.0.1, any 127. prefix, "localhost", or an empty/non-string value (covers older WASM query_ip_number()/query_ip_name() garbage). Gates patched:

Admin seed: registered fluffos / display 浮浮 / password Mud@2026 through the real flow (id → y → Chinese name → password x2 → email → gender m → random start room; enter_world() saves both the user and login objects immediately, so no quit-gate interaction). Granted (admin) by appending fluffos (admin) to /secure/etc/wizlist (the WIZLIST file, include/login.h). Verified after reboot: login as fluffos → update /system/daemon/band → "重新编译 ...成功!".

Retest: fresh normal registration (qfxoab / 秦风) re-verified end-to-end into 小秦淮客寓 with look/score/quit correct; test saves removed. No new errors in log/debug.log.

Save files for the orchestrator to add (both paths tracked, not gitignored; data/user/f/ and data/login/f/ are NEW directories):

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

同一个 XO 血统,第三份快照。状态已从过时的 limited 修正——这份档案自己的 README 里从未记录过任何缺陷说明,本轮重新测试也没有发现:管理员登录(fluffos/Mud@2026)干净正常,"目前权限:(admin)"。

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

深度功能测试 / Deep functional test (2026-08-07)

第一次真正的完整游玩测试。测试角色最终定格在 xajhthr(中文名 秦岭三, 女),另有一个更早的测试角色 xajhtwo(秦岭,男,无量剑派东宗第六代弟 子)在验证"初次30分钟内quit会清空存档"这个既定设计时被系统正确删除, 细节见下。本轮 WASM 未重新验证:emsdk 工具链下载硬编码指向 storage.googleapis.com,本次会话的出口代理策略性拒绝该域名(403,已用 curl $HTTPS_PROXY/__agentproxy/status 确认是策略拒绝而非临时故障), 本地无法构建 WASM 驱动。之前 WASM 测试记录里提到的"性别选择之后角色创 建有时卡住、有时重复循环"的问题,这一轮在原生驱动上找到了真正的根因 (见下方"发现并修复"第一条)——这不是 WASM 专属的时序抖动,是一个 一直存在、原生驱动同样会触发的真实崩溃,只是这份档案自己的错误处理 机制把崩溃现场写进了一个此前没人查看过的独立日志文件,而不是 debug.log,导致此前的排查方向被误导。

发现并修复:每一个新玩家在创建人物流程的最后一步(选择性别之后)都会静默崩溃,从未真正进入游戏世界

`` *Wrong permissions for opening file /log/static/usage for append. "No such file or directory" 'get_gender' at /system/daemon/logind at line 422 'log_login' at /system/daemon/logind at line 678 'log_file' at /secure/obj/simul_efun at /secure/simul_efun/file.lpc:17 ` logind.lpcget_gender()(设置完性别后)先调用 log_login(ob, user, ...) 记录新玩家日志,log_login() 又调用 simul_efun 的 log_file(PPL_USAGE_LOG, ...)PPL_USAGE_LOG 宏是 "static/usage"),而 log_file() 只是裸的 write_file(LOG_DIR + file, text),从不检查 /log/static/ 这个 目录是否存在——而这个目录根本不存在于这份档案里。这一步崩溃 发生在 get_gender() 函数体的最开头,init_new_player(user)enter_world(ob, user)`(真正把玩家送进游戏世界的调用)都排在这次 崩溃之后,从未有机会执行——每一个新注册的玩家都会在这里卡死, 不是偶发的时序问题。

``lpc void log_file(string file, string text) { assure_file(LOG_DIR + file); write_file(LOG_DIR + file, text); } ` 这个 secure/simul_efun/file.lpc 文件本身还有一个 orphaned 的孪生 副本 secure/sefun/file.lpc(确认没有任何代码 #include 或加载它, 与此档案自己 NOTES.md 之前记录的"重复 sefun 目录"是同一批遗留文件) ——同样的修法作为廉价保险也一并应用了。 修复过程中还发现:assure_file()在物理上定义在log_file()之 后,加上调用它需要一个"先声明后使用"的前置原型(这份档案的编译 器不支持在同一文件里调用尚未出现在源码前面的函数——logind.lpc 文件头部本身就有一长串private void xxx(...)这样的前置声明,是这 份代码库自己的既定写法):第一次只加 assure_file()调用而没加前置 声明,编译报错Undefined function assure_file——按同一惯例在文件 开头加了一行void assure_file(string file);`补上。

发现并修复:少林寺方丈(本派拜师环节的关键 NPC)因为一处技能名拼写错误,从存档诞生起就从未真正出现在他自己的房间里

`` *F_SKILL: No such skill (shalin-xinfa) 创建房间中的物体失败, 详见 room_log ``

``lpc set_wugong("shalin-xinfa", 200); ` ——技能名拼成了"shalin",少了一个"o"。system/skill/shaolin/ shaolin-xinfa.lpc(正确拼写)确实存在,证明这是纯粹的拼写笔误, 不是故意改名或缺失内容。set_wugong()对一个不存在的技能名会直接 抛出未捕获的错误,而这一行排在 create_family("少林派", 36, "掌门 方丈")之前——玄慈的整个create()`在能把自己注册为少林派掌门 之前就先崩溃了,导致这个对象连同"少林派"这个门派的掌门归属,从这 份档案诞生起就从未真正被创建过。全档案搜索确认这个拼写错误只出现 这一处。

观察但未处理(超出"仅修程序 bug"范围)

测试内容与结果

§7.100 扫描修复(ROOM 基类多余 replace_program()

#define ROOM STD_DIR "room"STD_DIR = /system/std/,宏名本 身仍是字面量 ROOM,源码里的调用不受拼接影响):删除 439 处多余 的、独立成行的 replace_program(ROOM);(保留 inherit ROOM;), 438 处脚本自动删除;另 1 处在本库房间建造工具 clone/wizard/roommaker.lpc"克隆我所在的房间"命令的字符串拼接模 板里,已同步手动修正。help/wizard/es/help/roommaker 是纯文本帮助 文档,不含该 bug 模式,无需处理。work/data 下未发现额外 .lpc 源文件。修复后全库仅剩 52 处历史遗留的 //-注释掉实例,均确认无 害、未改动。已用 build-debug 驱动干净启动验证(0 个新增编译错误 ,端口 40069 正常监听,debug.log 无新增 "cannot replace"/ "cannot bind" 行);未做完整 §10.7 深度游玩测试。

深度功能测试第四轮 / Round-four §10.7 deep test (2026-08-20):真实战斗致死/复活流程

补全上一轮(2026-08-07)从未真正测试过的一环:真实战斗导致角色死亡、 经过判官轮回流程、最终复活重新落地游戏世界的完整循环。全程同时监视 log/debug.log(驱动默认日志)和 log/runtime(这份档案自己的 error_handler() 改写落点,上一轮正是靠查看这个文件才找到注册崩溃 的真正根因,本轮同样全程盯着)。

死亡机制确认(两段式 kee/eff_kee 模型)

system/std/char.lpcheart_beat() 确认了这份档案的死亡判定 逻辑:eff_kee/eff_sen/eff_gin 任一 < 0 时直接 die()kee/ sen/gin 任一 < 0 时(存活状态下)先 unconcious(),非存活状态才 die()。这是与本项目其它一些库(如 xyxy2)相同形状的两段式生命值 模型。用管理员 call qxverify->set("eff_kee", -1) 给测试角色注入一次 性负值(临时数值授予,未绕过真实 die()/heart_beat() 代码路径), 接下来完全依赖真实的、未修改的 heart_beat() 心跳循环触发 die()—— 测试确认心跳只在角色有活跃在线连接时才会真正跳动(断线角色的心跳不 会推进死亡判定),角色保持连线在场时,等待几秒后角色真实死亡("你死 了","【谣言】秦验证莫名其妙的死了"),移动进入 DEATH_ROOM/d/place/death/yellow1,"黄泉路"),is_ghost() 变为 1。

发现并修复:查察司判官 chacha.lpc 的死亡轮回状态机有一条退出分支忘记清理重入守卫,导致携带任何物品死亡的鬼魂永久卡死、再也无法投胎——本轮任务重点排查对象,找到了真实缺陷

``lpc if (sizeof(obs)) { command("hmm"); tell_object(ob, HIW "判官说道:“不过阴间的东西是不能带到阳间的,你先要把你身上的东西放下来。”\n" NOR); ob->delete_temp("death_stage_active"); return; } ` 这是最小、行为一致的修复:清理守卫以后,玩家扔掉东西、离开房间再走 回来会重新触发init()check_rein()death_stage()整条链,这次 deep_inventory()`已经是空的,直接走向正常完成分支。

标准检查清单快速过一遍(预期多数已修,仅确认)

结论

本轮任务明确要求的"真实战斗致死+复活"缺口已补全:找到并修复了一个 真实、可复现、静默的程序缺陷chacha.lpc死亡轮回状态机的重入守 卫在物品检查分支遗漏清理,导致携带物品死亡的鬼魂永久卡死、两条投胎 路线同时失效),修复经过全新测试角色从死亡到复活的完整实测验证,两 份日志文件全程干净无新增。标准检查清单六项全部确认(一项已修实无需 再动、四项确认不适用/设计正常工作、一项就是本轮的核心发现)。

String corruption !\xee\x93\xa2n cleanup (2026-09-03)

Same convert-era byte corruption as the waiter !”\n / !\n + private-use U+E4E2 + literal n shape. Fixed in: waiter.lpc (nanyang + city/nanyang), huilun.lpc, system/feature/command.lpc.