The Smiling, Proud Wanderer (Final Edition)

✅ 可玩

笑傲江湖(最终版)

xo_final

🔑 fluffos / Mud@2026 更新 bf65506 2026-09-01 源码 下载 ZIP

▶ 开始游玩 · Play Now

笑傲江湖(最终版)是以金庸小说《笑傲江湖》为背景的武侠 MUD,属于 TMI-2/ES2(Falcon 系)引擎家族,在"笑傲江湖迷你版"(xo)几乎逐文件沿用的地图和无量派设定基础上大幅扩充而成,作者自称"自玩测试站",扩出了 10 座城市、16 大门派(少林、武当、峨嵋、昆仑、丐帮,以及慕容世家等跨作品客串门派)的完整世界;新玩家从"新手培训站"开始,逐步学习基本指令、领取新手礼包,再踏入江湖闯荡,比迷你版更照顾新手的引导设计;新角色开局 10 分钟内还不能存档退出,此时执行 `quit` 并二次确认不会保存进度,而是直接销毁角色——一个刻意防止刷号的设计。

English

A wuxia MUD set in Jin Yong's "The Smiling, Proud Wanderer," greatly expanded from this collection's Mini Edition (xo) into a much larger world of 10 cities and 16 sects (Shaolin, Wudang, Emei, Kunlun, the Beggars' Sect, and more, alongside crossover sects like the Murong clan). The author describes it as their own private test server. New players start at a dedicated newbie training station that walks them through basic commands and hands out a starter kit before they head out into the jianghu, and characters can't save-and-quit during their first 10 minutes of play -- quitting early destroys the character on confirmation rather than saving it, a deliberate anti-account-farming design.

README

内容亮点

在线试玩

https://mudlibs.fluffos.info/xo_final/

管理员账号 / Admin account

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

本地运行

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

游戏端口:40024

NOTES · 移植与修复记录

xo_final — 笑傲江湖最终版1.2 (The Smiling, Proud Wanderer — "Final" Edition)

Archive: xo最终版1.2.rar. Port: 40024. Status: done (boots clean, full registration flow verified end-to-end including a real Chinese name).

What this is

Same TMI-2/ES2 (Falcon) lineage as xo (#28), but the full, un-trimmed "final" build — ~7,174 .c files vs xo's 1395 "mini edition". Same secure/daemon/{master,sefun} layout. A homebrew test-station banner ("自玩测试站... 本lib是在mini xo基础之上,全新设计开发而成") confirms this is a fork built on top of the mini edition.

Fixes applied

1. AGENTS.md §4 (lazy security-daemon load): applied proactively to secure/daemon/master.lpc's valid_write/valid_read, same shape as xo. 2. AGENTS.md §15h (GBK byte-range Chinese detection): secure/sefun/ chinese.lpc's is_chinese, system/daemon/band.lpc's IsLegalName, and system/daemon/logind.lpc's length checks all fixed to the CJK codepoint range / halved character-count bounds, applied proactively from the catalog before first boot. 3. New: "comment eats next line" typo, found twice — a Chinese-text comment line with no leading whitespace runs // right into the start of the *next* physical line's code, silently deleting a function declaration and leaving a dangling {: - system/skill/basic/kongshou.lpc: // ...int is_native_skill()\n{ - d/menpai/shaolin/npc3/hui_quest.lpc: // ...if ( random(...) < 100 ) Both fixed by moving the comment to its own line above the code. 4. Lossy GBK→UTF8 conversion corruption: convert_lib.sh's iconv -c pass silently drops genuinely-invalid byte sequences in some raw .c files, occasionally eating a string literal's closing quote (breaking syntax) and sometimes leaving behind invisible Unicode Private-Use-Area characters (, ) that defeat exact-string Edit calls. Surveyed the whole tree with iconv -f GBK -t UTF-8 against the RAW pre-conversion files to find every instance (33 total flagged, most cosmetic/non-fatal); confirmed and fixed the ~8 in system/skill that actually broke compilation, reconstructing each closing quote from context (sibling "action"/"lian"/"zhaoshi" fields' patterns): mohe-zhi.lpc, yuanyang-dao.lpc, taizu-quan.lpc (two spots), dagou-bangfa.lpc, dugu-jiujian.lpc, baye-zhui.lpc. The two with hidden PUA characters needed Python line-index read/write instead of the Edit tool's exact-substring match.

Interactive test result — full registration flow

Verified the complete registration path in one continuous connection (critical per the user's explicit instruction not to stop at "reaches a prompt"):

1. new欢迎光临笑傲江湖3 / English-name prompt. 2. English id (myxoidfull) → passes IsLegalID, reaches the "确定吗(y/n)?" confirmation. 3. y → reaches the Chinese-name prompt. 4. Real Chinese name 赵云 → accepted (no rejection message), proceeds straight to "请设定您的密码:" — this is the actual proof the §15h fix works, not just that the prompt renders.

Also confirmed (as expected, not a bug): empty input at the English-name prompt triggers a polite disconnect; BAN_D->IsTimeAllowed's anti-flood throttle (3 real minutes between new registrations from the same IP, enforced via an in-memory NewIps mapping in band.lpc, cleared by restarting the driver) rejects a second new attempt from the same source within the window with no output at all (die()'s error message is commented out at logind.lpc — this is intentional silence, not a swallowed error; don't mistake it for a bug when retesting).

lpcc sweep

Memory warning (new data point for AGENTS.md §6b): this ~7,174-file lib drove the host to ~214MB free / 18.8GB RSS on the lpcc process after ~12 minutes despite being far smaller than the previously-documented "tens of thousands of files" nitan-family threshold — file count alone does not predict memory blowup risk. Monitor free -h/process RSS on *any* sweep, not just presumed-large ones, and kill proactively if pressure gets severe. Reached a clean boot (zero compile errors in the boot log) after the fixes above.

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/e and §1.5. Gates patched (all in system/daemon/band.lpc, the live BAN_D — xoban.lpc is orphaned/unreferenced, left untouched):

Admin account seeded: id fluffos, pw Mud@2026, name 浮浮, granted (admin) via fluffos (admin) appended to secure/etc/wizlist. Verified: real registration (new/fluffos/y/浮浮/pw×2/email/m → landed in 新手培训站, auto-save fired), relogin as fluffos → update /system/daemon/band → 成功, score correct. Retest: two fresh normal registrations (秦风 m, 秦岚 f) end-to-end; test char saves removed; zero new debug.log errors. Note: this lib's email prompt actually validates format — [email protected] is rejected, use a normal-looking address. Save file: work/data/user/f/fluffos.o (NOT gitignored — normal add, no force-add needed).

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)

同一血统,完整的'final'构建版本。

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

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

第一次真正的完整游玩测试(此前几轮都只验证了注册/look/score/quit 和管理员登录,没有实战、门派、持久化)。测试角色 id xofdeep,中文名 云梦仙,拜入峨嵋派后法号"静仙"。本轮 WASM 未重新验证:emsdk 工具链下 载硬编码指向 storage.googleapis.com,本次会话的出口代理策略性拒绝该 域名(403,已用 curl $HTTPS_PROXY/__agentproxy/status 确认是策略拒 绝而非临时故障),本地无法构建 WASM 驱动。

本档案体量巨大(~7,174 个 .lpc 文件),原生 debug(ASAN/UBSAN)驱动 下几乎每条指令第一次触发某个尚未编译过的文件时都会有数秒到十几秒的 延迟(不是死锁,只是懒编译开销大),测试过程中多次原样等待而非误判 为卡死。

发现并修复:toptend.lpc 的排行榜数据文件缺失时,每一次玩家登录都会崩溃(AGENTS.md §7.54 已知模式的又一实例,触发原因是错误的 file_size() 判断值而非完全没有判断)

`` *Bad argument 1 to explode() Expected: string Got: 0. 函数调用堆栈: get_passwd() /system/daemon/logind.lpc:235 enter_world() /system/daemon/logind.lpc:607 topten_checkplayer() /system/daemon/toptend.lpc:40 topten_add() /system/daemon/toptend.lpc:354 ` logind.lpcenter_world()——每一次玩家真正进入游戏世界都会调用 ——无条件调用 toptend_checkplayer(),后者又为年龄/杀人数/内功/拳 法/轻功/剑法/刀法/短兵刃/长兵刃/经验/钱财/总纲这 12 项排行榜各调用 一次 topten_add()`。

``lpc if (file_size(f_name) == 0) { ... // 写一份全新的排行榜文件 } //主要程序! ... str = read_file(f_name); astr = explode(str, "\n"); ` 只处理了"文件存在但大小为 0"的情况,没有覆盖file_size()返回 -1 (文件根本不存在)的情况——而 libs/*/work/data/topten/ 这整个目 录在项目的 .gitignore 里被标记为"可重新生成,不纳入版本控制" (# Lib similarity/lineage analysis data -- regenerable via ... 一节)。也就是说这不是这份归档特有的缺陷,而是任何一次真正的全 新 git clone 都会必然触发file_size()==-1(不等于 0)→ 落 入下面的"主要程序"分支 → read_file() 对不存在的文件返回整数 0(不是空字符串)→ explode(0, "\n") 抛出上面的错误。同一文件 里另外两处功能类似的读取(topten_query() 第 125 行、topten_del() 第 243 行)都正确地写的是 file_size(f_name) == -1`,证明这是那一 处判断值写错了,不是设计上刻意如此。

观察但未修改:库存列表中某个物品的 ANSI 颜色码首字节(ESC,0x1B)在发送给玩家的字节流里神秘缺失,怀疑是驱动层问题,未能定位根因

测试内容与结果

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

#define ROOM STD_DIR "room/room"STD_DIR = /system/std/,宏 名本身仍是字面量 ROOM,源码里的调用不受拼接影响):删除 615 处 多余的、独立成行的 replace_program(ROOM);(保留 inherit ROOM;),全部由脚本自动删除。本库没有任何在游戏内建造房间的工具 (roommaker/rmmaker 等名称均未找到),因此没有"工厂"侧需要修 复。修复后全库仅剩 11 处历史遗留的 //-注释掉实例,均确认无害、 未改动。已用 build-debug 驱动干净启动验证(0 个新增编译错误,端 口 40024 正常监听,debug.log 无新增 "cannot replace"/"cannot bind" 行);未做完整 §10.7 深度游玩测试。

深度功能测试第二轮 / round-four §10.7 (2026-08-20):真实战斗致死与重生

补全上一轮(2026-08-07)明确标注为"未测试"的缺口——真实战斗导致死 亡、进入地府、转世重生的完整闭环。角色 id xodeath,中文名死测生。

测试方法

system/std/char/character.lpcheart_beat()(第 106 行)确认 了本库的死亡触发模型与本 session 已测过的 xyxy2/xajhxo 同宗: eff_kee/eff_sen/eff_gin(不可自然恢复的"内伤"值,只被 receive_wound() 扣减)任意一项 < 0 时直接 die()kee/sen/ gin(可恢复的"体力"值)< 0 则只是 unconcious()(安全,30+ 秒后 revive())——这正是 duilian 陪练"不会造成伤害"的设计基础 (duilian.lpc 帮助文本明确写"对练不会造成伤害",它走的是完全独 立的 duilian_ob() 逻辑,根本不调用 receive_wound())。

用管理员账号 fluffos(本库已有的 (admin) 账号)通过 call xodeath->set("eff_kee",3) 把测试角色的"内伤"值预先调到接近 归零(正常新手默认 max_kee=165),再 call xodeath->move("/d/place/newbie/lianwu_chang") 把角色传送到新手练 武场——这里除了安全的 duilian 指令外,也有可以真实 kill 的普通 NPC「陪练」(d/place/newbie/npc/pei_lian.lpc,非"陪练"专属安全对 象,未设 no_die/no_fight)。对 kill peilian 发起真实战斗(kill. lpc 会调用双方 kill_ob(),NPC 真实反击),几回合后一次「陪练」 的真实命中(receive_wound)让 eff_kee 转负,下一次 heart_beat 触发真死:「你满身血迹,再也支持不住,一头撞倒在地上,腿蹬了几 下,眼见是活不成了。」——移动到 DEATH_ROOM/d/place/death/yellow1,黄泉路)。

之后角色(无携带物品,i 显示"你身上没有任何东西")按黄泉路系列 房间一路 north 走完全程:黄泉路→黄泉路(2)→鬼门关→酆都地府(1)→ 酆都地府(2)→阎罗大殿,在阎罗大殿遇到"查察司判官"(即 d/place/death/npc/chacha.lpc)。该 NPC 的 init()check_rein() (新角色 age<=15 自动满足条件)→death_stage() 五段式对话状态 机在几次移动的间隔时间里自动跑完,最终 reincarnate() 清空 ghost 标记、把角色传送到三个随机复活城市之一(本次是魁星阁/扬州), score 确认状态从"孤魂"变回"平民",且"你经历过一次死亡"的死亡计 数正确写入存档;quit/重新登录后死亡计数、门派/属性状态在真实的 保存-加载周期后依然一致。全程 debug.log 保持完全空白,零错误。

§7.112 死亡状态机重入守卫——现场验证,确认干净

按本 session 在 xajh2/xajhxo 上两次发现并修复的模式( death_stage() 某个出口分支没清 death_stage_active 重入守卫, 把幽灵永久卡住),逐分支核对了本库仅有的两个同类状态机:

两个文件都是干净的,不是本库的实例——这次实测(含真实经过两个状 态机)也没有触发任何卡死。

标准检查清单快速过一遍(均确认已修好/本来就干净,不再重新推导)

结论

本轮唯一明确指派的缺口(真实战斗→死亡→地府→转世重生的完整闭环) 已完整走通,全程零 debug.log 错误,未发现新 bug;标准检查清单 七项全部确认干净/已修复。测试角色存档(xodeath)事后已清理,管 理员 fluffos 及背景 NPC 存档因驱动运行产生的正常增量已随本次提 交一并保存。