info.html · 介绍 · play.html · 游玩 · llms.txt · 下载与本地运行 · ZIP · GitHub
压缩包与内部配置文件都叫"侠客行三",但实际连接进游戏后,登录横幅显示的名字是"金庸群侠传";经逐档比对,这份存档不仅与本项目 jqxz2008/jqxz2008dlx/jqxz2008std/jqxz2015 系列共享同一套 master 核心代码(共有路径下约 91% 的文件逐字节相同),与同样叫"侠客行"的 xiakexing2017 更是关系密切(约 80%-84% 相同)——是同一套服务端程序与基础游戏世界(茶馆/客栈起步、武学训练、门派招募)在不同站点换皮后产生的多个内容快照,而非各自独立开发的游戏;新角色可加入江湖各大门派习武,并能完整走一遍死亡复活流程:从客栈经鬼门关(白无常引路)、酆都城门(黑无常把守),到复活点武庙自动复活,全程由 NPC 根据"阳寿是否已尽"判断放行。
English
Both the archive and its internal config call this game "Xia Ke Xing III" (the literal text of its connect-time /adm/etc/welcome banner), but its in-game MOTD and doc/help files consistently self-identify as "Heroes of Jin Yong" (Jin Yong Qun Xia Zhuan). A direct file comparison confirms it shares its core master codebase not just with this collection's jqxz2008/jqxz2008dlx/jqxz2008std/jqxz2015 series (91% of shared-path files byte-identical) but, more closely than either side previously realized, with this collection's own xiakexing2017 (80-84% identical) — one server program and base game world (tea-house/inn start, martial-arts training, sect recruitment) produced across several separately-branded content snapshots. New characters can join the jianghu's sects and make their way through a full death-and-revival cycle: dying takes them from the inn through the Gate of Ghosts (escorted by White Guard), then the Fengdu city gates (Black Guard), before automatic revival at the Wu Temple, entirely NPC-driven once a character's "earthly span" hasn't run out.
README
内容亮点
- 以金庸小说人物与门派体系为背景的江湖题材 MUD,新人物从"客店"起步, 可以习武、结交江湖人物、闯荡各大门派。
- 死亡/复活流程完整走通:客店→鬼门关(白无常)→酆都城门(黑无 常)→复活点武庙,全程 NPC 自动判断"阳寿未尽"后放行,无需任何 人工干预。
深度功能测试(§10.7)修复的 bug
- §8.9 食物/饮水初始化判断错了对象:
enter_world()判断的是 登录用完即弃的连线桩物件的age,而不是真正的玩家角色本体user的age,条件恒为假,导致每一个新角色食物/饮水永远初始 化成 0。改判断user->query("age")后 live 验证:新注册角色的 食物/饮水从空格(□□□)变成满格(■■■),驱动重启后依然保 持。 get_name()遗留调试printf泄漏物件引用:紧跟在新玩家输 入中文姓名之后,会把连线桩物件的原始引用直接回显给玩家,已删 除。- §7.86(第四个确认命中的独立血统家族)留言板
post崩溃:全 档案 18 个留言板实例(clone/board/*_b.lpc/*_r.lpc加一份d/taohua/taohua_b.lpc重复放置)都撞上"既inherit BULLETIN_BOARD又多余地对自己replace_program(BULLETIN_BOARD)" 的致命形状,post指令瞬间崩溃。全部删除多余的replace_program()调用(保留 CRLF 行尾),修复并重启驱动后用 测试角色在客店留言板 live 验证发帖(post board→ "留言完 毕。")、look board未读数正确、read能读出内容。 - 补建了缺失的
log/nosave/目录(战斗/拜师日志写入点,§7.11 已 确认的预防性修复)。 - 战斗与死亡/复活测试:对普通"流氓"发起
kill,多回合拳脚攻 防判定正常;角色力竭死亡后自动经"鬼门关"(白无常)→"酆都城门" (黑无常)→复活点"武庙",全程 NPC 自动判断"阳寿未尽"后放行, 无需人工干预,未观察到 §7.68 那种鬼魂卡死的形状。debug.log全程零执行时段错误。
在线试玩
https://mudlibs.fluffos.info/xiakexing3/
管理员账号 / Admin account
- ID:
fluffos - 密码 / Password:
Mud@2026 - 中文名 / Display name: 浮浮
- 权限 / Level: 天神
(admin)—— 本 lib 的最高等级,通过adm/etc/wizlist授予。
警告:这是一个公开的默认密码,仅供本地/浏览器试玩。正式对外开服前
请务必修改此密码。
本地运行
cd libs/xiakexing3
~/src/fluffos/build-debug/src/driver config.fluffos游戏端口:40038。
NOTES · 移植与修复记录
xiakexing3 — 侠客行三 / 金庸群侠传
Archive: 侠客行III .rar (note: trailing space before .rar; TODO.md's
table originally listed this as 侠客行III 可用.zip, which was wrong —
corrected once the real filename was discovered during extraction).
Port: 40038. Status: done (boots clean and quick, full registration
flow verified end-to-end including a real Chinese name).
What this is
Config's MUD_NAME is "侠客行三", but the live connection banner
actually reads "金庸群侠传" ("Jin Yong's Gathering of Heroes") — yet
another instance of a lib's internal game name differing from its
config/archive name. adm/obj/{master,simul_efun} layout — confirmed
genuinely unrelated to xiakexing100 (archive #43, adm/single/
layout) despite the shared "侠客行" title prefix, reinforcing the
established lesson that similar titles aren't a reliable lineage
signal. Small lib, ~3,651 raw files.
Extraction quirk (new, see AGENTS.md's "Archive tooling" section)
Despite the .rar extension, this archive is actually a plain POSIX
tar (unrar correctly refused it: "not RAR archive"). Its members are
stored with relative ../xkx3/... paths, which GNU tar -xf
unconditionally refuses to extract ("Member name contains '..'") even
with --transform (the safety check runs before transforms apply).
Worked around by extracting with Python's tarfile module directly,
stripping each member's leading ../ before calling extract() — see
AGENTS.md for the reusable snippet.
Fixes applied
1. AGENTS.md §15h, standard shape: is_chinese()'s GBK lead-byte
check → CJK codepoint check; check_legal_name()'s byte-count bound
< 2 || > 12 → character-count bound < 1 || > 6, removed the
i%2==0 even-byte-offset gate.
2. Confirmed NOT needed: no §4 fix (master.c's valid_write gates
via find_object only, valid_read is a bare return 1;); no
named.lpc (doesn't exist in this lib).
3. AGENTS.md §15p: /adm/daemons/network/dns_master was in
adm/etc/preload — removed proactively before the first boot
attempt. Booted clean in under 10 seconds, zero compile errors, no
hang.
Interactive test result — full registration flow
No hidden pre-id prompts. Verified the complete registration path in
one continuous connection: id xkxctest → confirm y → real Chinese
name 秦风 → accepted, proceeds straight to "请设定您的密码:". This
lib's registration prompt text warns against using Jin Yong novel
character names, but the actual banned_name array only contains
pronouns + "时空" (no specific character names), so no specific name
needed to be avoided this time.
lpcc sweep
2,981 files, 2,887 pass / 94 fail (96.8%). Failure tail is the usual shape (missing globals, a handful of syntax typos) — not triaged individually per AGENTS.md §6b/§13. Memory stayed healthy throughout (~13GB free).
Retroactive fix (found via archive #91, jqxz2008): this lib was completely command-dead after registration (AGENTS.md §15ae)
Archive #91 (金庸群侠传2008加强版.rar) turned out to have a master.c
byte-identical (in both adm/single/ and adm/obj/ locations) to this
lib's raw archive -- confirmed via md5sum, not assumed -- explaining
this lib's previously-unexplained "config says 侠客行三 but live banner
says 金庸群侠传" oddity: this is a rebrand of the same underlying
codebase. That later processing pass (after §15ae, the private
nomask command-hook bug, had been discovered) flagged this lib for a
check, since its own original testing above never verified a
post-login command -- exactly the blind spot §15ae warns about.
Checked and confirmed: feature/command.lpc's command_hook() was
private nomask (the home/command.lpc copy was already correct,
nomask without private). commandd.lpc's sscanf pattern was
ALREADY "%s.lpc" (not the ".c" variant found on bxsj/bxsj1/
jinyongwenzi — so §15ar's second bug does not apply here, only
§15ae's). Fixed by dropping private; re-verified with a fresh full
registration (id → confirm → real Chinese name "秦岳"/"秦淮" → password
→ stat-gift accept → email → gender) reaching an actual starting room
(客店), with look/score/quit all now producing correct real
output, debug.log clean (0 error: lines — the "编译时段错误"
warning-spam visible to the player during testing is the separate,
still-unfixed §15w bug, cosmetic and unrelated to command dispatch).
Re-verification pass (driver rebuild + LPC formatter + WASM build)
- Reformatted all 2981
.lpcfiles underwork/withtools/lpc-syntax/format-corpus.mjs: 2948 written, 13 already idempotent-clean, 20 refused by the tool's own token/byte-identity guard (expected on messy legacy code, not chased). Verified the §15ae fix above (feature/command.lpc'scommand_hookstayingnomaskwithprivatedropped) survived the reformat unchanged. - Native retest against the freshly-rebuilt driver (
~/src/fluffos/build-debug/src/driver, rebuilt from latest upstream master): clean boot, zero fatal errors inlog/debug.log. Full registration flow re-verified with a fresh real Chinese name (秦墨/idxkxcnex), reaching the actual starting room (客店),look/score/quitall producing correct output — confirms the §15ae fix continues to hold under both the rebuilt driver and the reformatted source. No regressions. - WASM build test (
scripts/wasm_client.jsagainst~/src/fluffos/build-wasm/src): boots cleanly (only benign compile- warning spam, no fatal errors). Full registration completed end-to-end under WASM too — idxkxcwas→ real Chinese name秦岭→ password/ stat-roll-accept/email/gender → landed in the same客店starting room,look/score/quitall produced correct output (post-login command dispatch, i.e. the §15ae fix, also confirmed working under WASM). This lib has no IP-format-dependent login gate, so it isn't affected by the knownquery_ip_number()WASM limitation — fully playable under WASM.
WASM-enablement pass (loopback-allow / admin seeding)
This lib is byte-identical (per §2.1 lineage check) to the
jqxz2008 engine/daemon files, whose WASM pass was
already done and verified with the correct fail-closed convention —
ported that fix here and re-verified independently rather than
assuming it (§2.1's "ported fixes still need per-lib verification").
adm/daemons/band.lpcis_banned(): added a loopback short-circuitif (stringp(site) && (site == "127.0.0.1" || site == "::1" || (strlen(site) >= 4 && site[0..3] == "127."))) return 0;before the regexp ban-list scan. Written fail-closed from the start: only a real loopback-shaped string counts as local; a malformed/empty/non-string site is NOT treated as local and still goes through the regexp ban check.logind.lpc'sBAN_D->is_banned(query_ip_name(ob))gate inlogon()is thereby loopback-proof.- No
uptime()startup-grace gate and no per-IP anti-flood/registration throttle exist in this lineage (checked the fulllogind.lpcinput_to chain; the only other connection-adjacent gate is the in-memorymad_lockadmin lockdown flag, default off — game/admin design, left alone).
Admin account: fluffos / Mud@2026 / 浮浮, registered through the
real flow (id → y → 浮浮 → password ×2 → talent accept y → email →
m). Granted (admin) by appending fluffos (admin) to
adm/etc/wizlist (shipped with sbaa (admin) already present;
securityd.lpc reads this file at create(), so a driver restart was
needed to pick up the new line). Verified after restart: 目前权限:
(admin), title 【天神】, update /adm/daemons/band →
重新编译 /adm/daemons/band.lpc:成功!.
Save files for the orchestrator to force-add (untracked, not gitignored):
libs/xiakexing3/work/data/user/f/fluffos.olibs/xiakexing3/work/data/login/f/fluffos.o
Retest: fresh boot, fresh registration (id qretest, real Chinese name
秦风十) through look/score/quit — landed in 客店, correct output,
clean quit. fluffos/Mud@2026 admin login verified twice (once via
update, once via score to confirm (admin)/天神 status directly).
Zero 执行时段错误 lines in debug.log across the whole session. Test
character qretest removed afterward; fluffos kept.
WASM 修复摘要(迁移自 meta.json 的 group_note)
同一代码库换牌重发(master.c 逐字节相同)。
深度功能测试(§10.7,2026-08-05)
WASM 阶段的"完整验证过注册流程,没有发现 bug"结论需要更正——这次 §10.7 深挖在注册后的日常操作(留言板发帖)里找到一个此前从未触发 过的致命 bug,此外还确认并修好了两个在本轮次开头就已发现的问题。
- §8.9 食物/饮水初始化判断的对象错了:
adm/daemons/logind.lpcenter_world()里if (!user->query("food") && !user->query("water") && ob->query("age") == 14)判断的ob->query("age")拿的是登录阶段 用完即弃的连线桩物件,而不是真正的玩家角色本体user——桩物件永 远没有age这个属性,条件恒为假,导致每一个新角色的食物/饮水 永远初始化成 0。改成user->query("age") == 14后,live 验证: 修复前新注册角色score食物/饮水两栏都是空的(□□□),修复并 重启驱动后同一注册流程走到底食物/饮水都是满格(■■■),第二次 重启后(新角色testfive)依然保持满格,确认修复稳定。 get_name()里一行遗留调试printf("%O\n", ob):紧跟在玩家 输入中文姓名之后,会把连线桩物件的原始引用(形如/clone/user/login#0)直接回显给正在注册的新玩家,是内部调试信 息泄漏。已删除该行;删除前后的注册流程 transcript 对比确认泄漏 行消失、其余流程不受影响。- 缺失的
log/nosave/目录:adm/daemons/combatd.lpc、cmds/std/kill.lpc、cmds/skill/apprentice.lpc、cmds/skill/bai.lpc都会往这个目录写文件(主要是 PK 击杀记录和 拜师技能的 FENG 记录,多数写入点还带userp()判断,NPC 战斗未 必会触发),但 AGENTS.md §7.11 已经在这个jqxz2008系列的其它 版本上确认过"目录缺失导致复活流程卡死"这个确切形状,属于零风险 的预防性修复,提前建了这个目录(.gitignore 规则本身就会忽略work/**/log,不需要额外 git 操作)。 - §7.86(第四个确认命中的独立血统家族)留言板
post崩溃:在 起始房间"客店"的留言板(clone/board/kedian_b.lpc)测试post board时,瞬间抛出运行时错误:
``
执行时段错误:*cannot bind an lfun fp to an object with a pending replace_program()
程式:/inherit/misc/bboard.lpc 第 102 行
物件: /clone/board/kedian_b
呼叫来自:/inherit/misc/bboard.lpc 的 do_post() 第 102 行,物件: /clone/board/kedian_b ("客店留言板")
`
这行错误文字和 AGENTS.md §7.86(首次在 xhcii 上发现)记录的完
全逐字一致(仅行号不同,102 行对应这份档案自己的
/inherit/misc/bboard.lpc 里同一处
this_player()->edit((: done_post, this_player(), note :)) 闭包
创建语句)。检查 kedian_b.lpc 确认是标准的致命形状:既
inherit BULLETIN_BOARD;,create() 结尾又多余地对自己
replace_program(BULLETIN_BOARD);。grep 全档案后确认这份档案
一共 18 个留言板实例全部命中同一形状(clone/board/ 下 17 个
*_b.lpc/*_r.lpc 加上 d/taohua/taohua_b.lpc 一个重复放置的
桃花岛留言板),没有发现 sje 那种运行时生成留言板源码的工厂变
体。修复:18 个文件全部只删除多余的 replace_program(BULLETIN_BOARD);
一行,保留 inherit BULLETIN_BOARD;,CRLF 行尾格式原样保留。
Live 验证:重启驱动后用测试角色 testfive(李四)在客店留言板
post board 顺利进入编辑器,输入正文、. 结束后提示"留言完
毕。";look board 显示未读数正确从 1 涨到 2,新增一条署名"李
四"、时间戳为当天的记录;read 2 能完整读出刚才写的内容。测试
完成后已把该留言板存档 work/data/board/kedian_b.o 还原到修复
前的原始内容(只保留档案自带的那条测试留言),不留会话痕迹。此
修复顺带把该存档文件的类头从 #/inherit/misc/bboard.c(post
以外的场景之前一直"变身"成的那个类)改成了 #/clone/board/kedian_b.lpc
(物件自己的真实文件)——纯粹是移除多余 replace_program() 的
自然结果,存档数据本身不受影响,restore()` 也不严格校验这行类
头字符串。已在 AGENTS.md §7.86 追加这份档案作为第四个确认命中的
独立血统。
- §7.88 message() 参数缺失检查:走查了
adm/simul_efun/message.lpc(通过adm/obj/simul_efun.lpc的#include),message_vision/tell_room/shout/say/write全部只是转呼叫内建message(), 没有本档案自己重新定义/包装一个签名不一致的message(),不适用 §7.88 这个特定形状。 - §8.3a/§8.3b 指令表:本轮登录、
look、score、post board、kill、移动指令全部正常响应,WASM 阶段笔记里"已检查过没问题"的 结论继续成立。 - 战斗与移动测试:从"客店"往西走到"北大街"(遇到"白驼山少庄 主「玉面蛇心」欧阳克"这个调戏 NPC,纯对话骚扰不主动攻击),再往 南到"中央广场",对普通"流氓"(Liu mang)发起
kill,多回合拳脚 攻防(出拳/踢腿的命中、闪避、擦伤判定文字均正常),最终测试角色 体力耗尽昏死,debug.log全程零执行时段错误。 - 死亡→复活流程完整走通,无需人工干预:角色死亡后自动送入 "鬼门关",NPC"白无常"翻账册确认"阳寿未尽"后放行
north到 "酆都城门",NPC"黑无常"重复同一套账册判断后主动"哼"一声送出, 一股"阴冷的浓雾"把角色直接传送到复活点"武庙"(岳王庙正殿)。全 程无需任何指令输入之外的干预,也没有出现 AGENTS.md §7.68 记录 的那种"present() 判断游戏对象已经不在场导致流程卡死"的鬼魂卡死 形状——按 §7.68 的既有结论,这里明确不施加那条已经在其它 lib 撤回的重试修复,只如实记录观察到的行为。复活后score确认 精/气恢复到约四成、食物/饮水依旧满格(§8.9 修复在多次死亡后依 然生效)、实战经验从 0 涨到 3。 - 本轮测试方法论:中文角色名(李四)通过
mudclient.py原始 socket 发送,注册流程与两次驱动重启后的复测均未再撞上此前记录 过的本地telnet/CJK 字节转义问题;post/kill/移动等纯 ASCII 指令改用scripts/tmux_mud.sh的 tmux 会话完成,全程无异 常。 - 会话结束前清理:删除测试角色
testfive/testfour的存档 (work/data/{login,user}/t/*.o,均无 git 历史、确认是本轮测试 产物);kedian_b留言板存档已还原;停止 tmux 会话、终止驱动进 程;未触碰其它 lib 的任何未追踪文件。
深度功能测试(2026-08-13,round two,新驱动重测)
针对驱动升级(quest_times/win_times %-operator 修复 + Warning/warning
大小写回退兼容)做的重测。
发现并修复的 PROGRAMMING bug
1. log_file()(adm/simul_efun/file.lpc)完全没有
assure_file() 保护(AGENTS.md §7.11-class):已加上前向声明
+ assure_file(LOG_DIR + file);。
Proactive checks(无需改动)
log_error()(adm/obj/master.lpc,即实际生效的 master file) 已经在 WASM 阶段修复过(strsrch(message, "arning:") == -1判 断),确认仍然生效。win_times的%-operator 修复确认存在且正确:d/city2/npc/refereew.lpc:176、u/wind/refereew.lpc:176、u/wind/refereew2.lpc:184均已用to_int(query("win_times")) % N。feature/dbase.lpc未发现 tybxjh/wlhd 那种密码写保护,不适用。
实测过程
管理员 fluffos/Mud@2026 用真实密码重新连线,落地在此前保存的
地点(客店),score 显示"【天神】"头衔和正确的属性数值,留言板
未读数正常显示。全程 debug.log 无运行时错误。驱动按精确 PID 结
束;测试期间产生的存档时间戳增量已 git checkout -- 还原。
§7.100 扫描修复(ROOM 基类多余 replace_program())
#define ROOM "/inherit/room/room":删除 795 处多余的、独立成行的
replace_program(ROOM);(保留 inherit ROOM;),与 jqxz2008/
jyqxc 系列同一血统同一形状。clone/misc/roommaker.lpc 同样有两
套模板——"造一间空房间"的 heredoc 本来干净,"克隆我所在的房间"命
令的字符串拼接模板把同一枚多余的 replace_program(ROOM); 烤进了
每一个新克隆的房间,已同步修正。已用 build-debug 驱动干净启动
验证(0 个新增编译错误,端口正常监听);未做完整 §10.7 深度游玩
测试。
§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): 4 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.
深度功能测试(2026-09-04,round three,shop + 拜师)
新角度:醉仙楼购物 + 丐帮左全拜师。2026-08-05 / 2026-08-13 两轮都没
测这两步。F_DEALER 对丐帮拒绝购买(穷叫化),必须先买再拜。
实测过程
管理员 fluffos / Mud@2026。第一输入是 您的英文名字:,落地客
店。goto /d/city/zuixianlou,list 烤鸡腿八十文铜板 / 包子五十文
/ 牛皮酒袋一两白银。clone /clone/money/gold 后 buy jitui 成功
(「你从店小二那里买下了一根烤鸡腿」)。当场 i 还挂着「一两黄
金」,那是 MONEY_D->player_pay() 把金锭 set_amount(0) 后物件还
没析构的显示;quit 后再连只剩九十九两白银 + 二十文铜板(10000−80
= 9920),找零数学正确,不是复制金钱。
goto /d/gaibang/inhole,apprentice zuo 一次成功:左全收徒,
score 「丐帮第二十代弟子」、师父左全。cmds/usr/save.lpc 真正调
用两个 save()。user.o 立刻带上 family_name":"丐帮" /
master_name":"左全"。断线后再连,score 仍是丐帮 / 左全,银子还
在。烤鸡腿未进 autoload,quit 后不在身上。
本轮没有新的 programming bug。左全只收男性(gender != "男性" 就
静默 return),本账号是男的所以没撞上。live debug.log 是
libs/xiakexing3/log/debug.log(Boot Time Fri Sep 4 00:43:12
2026),无 error: / Too deep recursion。error_handler 把轨迹
交回驱动 debug.log;work/log/log 只有编译期 Unused local
variable 警告。