Heroes of Jin Yong (formerly Xia Ke Xing III)

✅ 可玩

金庸群侠传 (原名"侠客行三")

xiakexing3

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

▶ 开始游玩 · Play Now

压缩包与内部配置文件都叫"侠客行三",但实际连接进游戏后,登录横幅显示的名字是"金庸群侠传";经逐档比对,这份存档不仅与本项目 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

内容亮点

深度功能测试(§10.7)修复的 bug

在线试玩

https://mudlibs.fluffos.info/xiakexing3/

管理员账号 / Admin account

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

本地运行

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 yreal 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)

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").

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):

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,此外还确认并修好了两个在本轮次开头就已发现的问题。

`` 执行时段错误:*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.cpost 以外的场景之前一直"变身"成的那个类)改成了 #/clone/board/kedian_b.lpc (物件自己的真实文件)——纯粹是移除多余 replace_program() 的 自然结果,存档数据本身不受影响,restore()` 也不严格校验这行类 头字符串。已在 AGENTS.md §7.86 追加这份档案作为第四个确认命中的 独立血统。

深度功能测试(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(无需改动)

实测过程

管理员 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/zuixianloulist 烤鸡腿八十文铜板 / 包子五十文 / 牛皮酒袋一两白银。clone /clone/money/goldbuy jitui 成功 (「你从店小二那里买下了一根烤鸡腿」)。当场 i 还挂着「一两黄 金」,那是 MONEY_D->player_pay() 把金锭 set_amount(0) 后物件还 没析构的显示;quit 后再连只剩九十九两白银 + 二十文铜板(10000−80 = 9920),找零数学正确,不是复制金钱。

goto /d/gaibang/inholeapprentice zuo 一次成功:左全收徒, score 「丐帮第二十代弟子」、师父左全。cmds/usr/save.lpc 真正调 用两个 save()user.o 立刻带上 family_name":"丐帮" / master_name":"左全"。断线后再连,score 仍是丐帮 / 左全,银子还 在。烤鸡腿未进 autoload,quit 后不在身上。

本轮没有新的 programming bug。左全只收男性(gender != "男性" 就 静默 return),本账号是男的所以没撞上。live debug.loglibs/xiakexing3/log/debug.log(Boot Time Fri Sep 4 00:43:12 2026),无 error: / Too deep recursionerror_handler 把轨迹 交回驱动 debug.log;work/log/log 只有编译期 Unused local variable 警告。