Jianghu Storm

✅ 可玩

江湖风云

jhfy

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

▶ 开始游玩 · Play Now

本游戏自称 江湖风云单机,是一款传统中文武侠题材 mudlib:玩家从"客店"起步闯荡江湖,可在武当、少林、丐帮、明教、桃花岛等门派间游历、拜师习武,注册后会随机落在客店、北疆小镇、铁枪庙等四个新手出生点之一,每次开局体验略有不同;地图规模中等(约八千文件),门派/任务/武功体系较为完整。经过与本项目内另外两个同源作品(夕阳再现·疯狂江湖、未明空间)的核心文件比对,确认三者同出一脉,都源自"夕阳再现之江湖风云"这一支中文武侠 MUD 血脉——本作在三者中与共同祖先最接近,可以看作这一系列的核心版本;这一支和另一轮处理过的 `xyzx`/`jhfy3`/`xajh4gkb`/`xyzxyl201412` 是同一个真正的"夕阳再现"血统,而本项目里另一批同样打着"夕阳再现"招牌、地图却是完全不同的"天涯"家族档案(`xysylmhb`/`xyzxiiylzymh`/`yzxiiizylfy`/`xyzx3` 等)与此无关,品牌名称不能作为判断血统的依据。

English

The game calls itself Jianghu Storm: Single-Player Edition. Core-file comparison against two related titles in this project (Sunset Reappears: Frenzied Jianghu, and Unknown Space) confirms all three descend from the same lineage — the “Sunset Reappears: Jianghu Storm” branch of Chinese wuxia MUDs — with this version standing closest to their common ancestor, making it the core release of the series. This is the same true “Sunset Reappears” lineage as xyzx, jhfy3, xajh4gkb, and xyzxyl201412 handled elsewhere in this project; note that a separate, unrelated “Tianya” family of archives (xysylmhb, xyzxiiylzymh, yzxiiizylfy, xyzx3, etc.) also carries “Sunset Reappears” branding despite having an entirely different map — the brand name alone isn't a reliable lineage signal.

README

内容亮点

在线试玩

https://mudlibs.fluffos.info/jhfy/

管理员账号 / Admin account

警告:Mud@2026 是本地游玩用的公开默认密码。若要正式对外开放主机,
请先修改此密码(或从 wizlist 中删除该账号)。

本地运行

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

游戏端口:40053

NOTES · 移植与修复记录

jhfy — 江湖风云

Archive: 江湖风云.rar (#59, byte-identical duplicate: 江湖风云 (1).rar, already listed in AGENTS.md's Duplicate archives table — only this one processed; confirmed via md5sum before extracting, 5607c63bab7ebe67dd44896b145ccda7 for both). Port: 40053. Status: done (boots clean, full registration flow verified end-to-end three times across two driver sessions, with three different real Chinese names, all reaching the actual game world).

What this is

The archive extracts to raw/Jhfy/, a Windows MudOS 0.9.20 bundle (mudos.exe, mudos.dll, mud.log) with the actual mudlib root at Jhfy/world/ (confirmed via Jhfy/config.jh's mudlib directory : ./world / master file : /adm/obj/master directives — the archive's own config file, not a guess). config.jh's name field decodes (GB18030→UTF-8) to "江湖风云单机" ("Jianghu Fengyun — standalone/single-player build"), matching the archive's own filename — no slug rename needed, jhfy is a direct, accurate transliteration. ~8,979 raw files, 8,071 .lpc after the rename — a mid-sized lib for this batch.

Layout: adm/{daemons,obj,simul_efun,etc,tmp} (not adm/single/).

Lineage: a genuine third fork of the 夕阳再现 ("Sunset Reappears") family

The task brief flagged that two already-done libs in this repo — xyzxfk (#46, 夕阳再现-疯狂江湖.rar) and wmkj (#55, 未明空间.rar, live banner "江湖风云之夕阳再现") — both show a "江湖风云" name somewhere. Checked via md5sum on the three core files, per AGENTS.md's standing "verify via diff, never assume from title alone" rule, before doing anything else:

| file | jhfy | xyzxfk (#46) | wmkj (#55) | |---|---|---|---| | adm/simul_efun/chinese.c | 961d77af... | 961d77af... (same) | 961d77af... (same) | | adm/obj/master.c | 8841d611... | 861c587c... (different) | 8841d611... (same) | | adm/daemons/securityd.c | d1bd5477... | d1bd5477... (same) | a33cb521... (different) | | adm/daemons/logind.c | 24ef0ce8... | dbc4a7af... (different) | efd6e03e... (different) |

This is a genuine three-way shared lineage, not a coincidence of title: this lib's chinese.c is byte-identical to BOTH #46 and #55; its master.c is byte-identical to #55's; its securityd.c is byte-identical to #46's; only logind.c (and the room/world content) is independently maintained in each fork. This lib's own logind.lpc banner literally reads "夕阳再现" / 之 / 「江湖风云」 — i.e. this archive is very plausibly close to (or is) the actual upstream "夕阳再现之江湖风云" build that both #46 and #55 forked from/around, given it shares the *most* files (2 of 3 core files matched, vs. 1 of 3 for each of the other two). Confirmed further during the lpcc sweep: d/quanzhen*/hudi{4,5,6}.lpc, d/player/fyue_room.lpc, and several u/fyue/huashan/* files are the exact same room content (same filenames, same pre-existing typos) already documented in wmkj's NOTES.md — genuine shared world-content, not independently authored.

All of #46's and #55's proven fixes were ported/re-verified directly against this lib's actual source rather than rediscovered from scratch, per the task brief's instruction — see below for exactly which applied, which didn't, and how each was confirmed.

Fixes applied

1. AGENTS.md §15h (standard shape, ported from #46/#55 — verified this lib's chinese.c is the identical file, so the identical fix applies): adm/simul_efun/chinese.lpc's is_chinese() — GBK lead-byte range check (strlen(str)>=2 && str[0]>160 && str[0]<255) rewritten to a CJK Unicode codepoint check (strlen(str)>=1 && str[0]>=0x4e00 && str[0]<=0x9fff). 2. AGENTS.md §15h, check_legal_name() in adm/daemons/logind.lpc (this lib, like #55, has no separate named.lpccheck_legal_name is defined directly in logind.lpc, and its shape is NOT byte-identical to #55's copy since logind.c is one of the files that differs across this family — read and fixed independently, not blind-ported): - Byte-count bound strlen(name) < 2 || > 10 → character-count bound < 1 || > 5 (message text "必须是 1 到 5 个中文字" already stated the correct intended character count). - Sliding check i%2==0 && !is_chinese(name[i..<0]) (alternating GBK-lead-byte offsets, variable-length tail slice) → !is_chinese(name[i..i]) on every index (one whole character per index under UTF-8). 3. AGENTS.md §15p: adm/etc/preload had /adm/daemons/network/dns_master live — commented out proactively before the first boot attempt (CRLF-terminated file, edited carefully to preserve line endings elsewhere).

Confirmed NOT needed (verified by reading source directly, not assumed)

Registration-flow verification (the critical check)

Read adm/daemons/logind.lpc's full callback chain (logon → get_id → confirm_id → get_name/get_resp → new_password → confirm_password → select_gift/set_gift/get_gift → get_email → get_gender → init_new_player/enter_world) before scripting any test. No hidden pre-id BIG5/student/client-version gate — the very first prompt ("请输入您的英文名字:") really is get_id, gated only by check_legal_id() (3-14 lowercase English letters only — no digits, confirmed the hard way, see below) and a banned_id substring check (admin, arch, wizard, apprentice, immortal, player, fuck) plus a literal "guest" ban. A valid non-empty Chinese name is accepted with no y/n confirmation step — straight into the password prompt.

Gotcha hit and documented: a first attempt used id qinfeng2 (digit in the English id) — check_legal_id() only allows a-z, so it was rejected, and every subsequent scripted --send line landed on the still-active "please re-enter your English name" prompt, cascading into a confusing multi-line rejection sequence (exactly the class of gotcha AGENTS.md warns about: re-verify with a clean id, don't assume the Chinese-name fix is broken from a cascaded transcript). Confirmed by re-running with an all-letters id.

Test 1 (first successful full run) — python3 scripts/mudclient.py 127.0.0.1 40053 --timeout 30 --idle 2 --send "qinfengsan" --send "y" --send "秦风三" --send "test1234" --send "test1234" --send "0" --send "y" --send "[email protected]" --send "m" --send "look" --send "quit":

Test 2 (independent, after all content fixes below were applied and the driver was restarted — LPC objects don't recompile from an on-disk edit alone) — same script, id linfeng / name 林风 (2 characters), gender f: accepted through the identical full chain, landed in a different start room this time (/d/xingxiu/beijiang, "北疆小镇" / Northern Frontier Town — confirming the random(4) start-room pick works), correct gender-appropriate broadcast (听说又来了一位叫做林风的小姑娘), look/ quit both worked.

Test 3 (final re-verification after ALL fixes, on a fresh driver restart) — id qinfengsi / name 秦风四 (3 characters), gender m: accepted immediately again, landed in "铁枪庙" (Iron Spear Temple) — a third distinct start room — quit worked cleanly.

All three sessions' debug.log grep clean for error/denied/ segmentation/Undefined function beyond the two expected benign boot-time echo lines (mudlib error handler : 1, a config-flag echo, not an actual error) and the intentional live log_error()-to-player mechanism surfacing harmless Unknown #pragma, ignored / Unused local variable compiler warnings to whoever triggers a lazy compile (original mudlib behavior, not a bug introduced here).

Driver process management note: the very first boot (launched via a plain nohup ... & disown from a Bash tool call) was killed by an unexplained external SIGTERM sometime between two tool-call turns, even though ps confirmed it alive and had already served one full successful test in between — strongly suggests the sandbox's per-tool-call process group cleanup can reap a background process that isn't in its own session. Fix: launch with setsid nohup ... & disown (own session id, ps -o pgid,sid confirms PGID==SID==PID) — the driver then survived cleanly across every subsequent tool call for the remainder of testing.

All driver processes were killed (kill -TERM) after each round of testing; no driver process is left running on port 40053.

lpcc_check.sh sweep

8,071 files. Host memory stayed healthy throughout (free -h: 3.7-4.2GB free / ~3.6GB used out of 23GB at every check — nowhere near AGENTS.md §6b's OOM-risk territory; other agents' concurrent conversions for archives #58/#61 were also running on the same host at points during this pass without issue).

| Pass | Result | |---|---| | 1 (pre-fix) | 7933 / 8071 = 98.3% | | 2 (+ 20 file fixes, see below) | 7953 / 8071 = 98.5% | | 3 (+ 8 more file fixes) | 7959 / 8071 = 98.6% (final) |

Content bugs found and fixed via the sweep (all pre-existing, confirmed

against raw pre-conversion bytes where relevant — not introduced by this pipeline)

Remaining 112 failures — triaged by category, not fixed further (per

AGENTS.md §6b: fix genuine shared/impactful bugs, document the rest; this matches the same triage rigor applied on wmkj)

Encoding

convert_lib.sh's automated pass: 8,649 converted cleanly, 295 already-UTF-8, 33 lossy (invalid bytes dropped via iconv -c fallback — mostly NPC/room/data files, e.g. d/quanzhen_old/obj/bookshelf.c, u/fyue/huashan/{map.c,intro}, cmds/usr/{nick.c,whotest.c}), 2 skipped as genuinely binary. One of the lossy files (d/heimuya/shenggu.c) was confirmed via xxd to have a genuine invalid-GBK-lead-byte-then-newline sequence at the exact failure point — the specific "iconv -c eats an adjacent real newline" gotcha from AGENTS.md's Encoding section, fixed as described above. No un-converted GBK stragglers found (re-ran the AGENTS.md straggler check: file -b reports text/script/empty for every .lpc/.h in work/).

Config

config.fluffos adapted from Jhfy/config.jh (labeled "MudOS 0.9.20", GBK→UTF-8 converted before any other edit, per AGENTS.md §5). Original port number : 6666 replaced with 40053 (this project's port assignment for archive #59, per the task brief — next free port after 40051-40052 reserved for archives #57-58). mudlib directory points at /home/sunyc/src/mudlib/libs/jhfy/work (absolute path). All other directives carried over, matching the tuning-knob template used for the last several libs in this batch (wmkj/xiakexing3 shape). log/ directory created as a sibling of config.fluffos (not inside work/), driver always launched via cd libs/jhfy && setsid nohup .../driver config.fluffos (see the "Driver process management note" above for why setsid specifically was needed in this session).

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

WASM-enablement pass (2026-07: loopback-allow + throttle exemptions + admin seeding)

Standard pass per AGENTS.md §1.3b/e + §1.5. Gates found and patched:

- :173ban_cnt > 16 cap on concurrent same-IP pre-login connections in logon(); - :235ip_cnt > 8 same-IP player cap in get_id() (the non-welcome/non-netclub branch).

Admin account: fluffos / Mud@2026 / 浮浮, registered through the real native flow (id → y → Chinese name → password ×2 → gift 0/y → email → gender m). Granted (boss) — NOT (admin) — via adm/etc/wizlist (added fluffos (boss) alongside the original fyue (boss)): this lineage extends the ES II wiz_levels ladder with (president)/(admin)/(boss)/(ceo) above (arch), and (boss) is the top rank the securityd ACL tables actually trust (trusted_read/ trusted_write "/"), as well as what the original admin fyue holds. Verified after restart: login shows 您目前权限:(boss), update /cmds/usr/score recompiles successfully. Save files (must be committed): work/data/user/f/fluffos.o, work/data/login/f/fluffos.o.

Retest: fresh registration (秦风/ceshizhe) end-to-end + look/score/quit clean; fluffos login + update clean; debug.log free of errors; test character saves removed.

Dual-mode verification pass (2026-07-24)

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

此前被错误标记为某个不存在于本项目任何档案的原始压缩包文件名的 duplicate_of;这里的内容其实是完全独立、可游玩的游戏(有自己的 -N 变体编号、自己的端口、自己的 README)——duplicate_of 已清除。

深度功能测试(§10.7,本轮):直接核对手足档案 jhfy2 已确认的 bug

jhfy2(本项目里的另一个"江湖风云"变体)此前的 §10.7 深度测试发现 了 3 个 bug(printf 调试残留、§8.9 食物/饮水年龄检查错对象、2 处 §7.68 死亡软锁)。这次直接核对了 jhfy 是否也带着这几个 bug,而不 是从零排查:

用真实驱动完整验证了一次全新注册(英文 id→中文名字确认→密码→天赋 点数(随机 0)→email→性别,比 jhfy2 多了"是否满意随机中文名字"这一 道确认),进入"客店"后 score 正确显示食物/饮水两条状态全满、属性 数值和分配一致;移动到"南大街"实际攻击 NPC"小贩",角色被打死,干 净地触发"你死了"→"鬼门关"死亡场景→NPC"白无常"自动完成整套复活对 白(不需要玩家任何操作)→魂魄归位→正确送达 REVIVE_ROOM("武庙", 和宏定义一致)——debug.log 全程保持空白,确认三处修复全部生效, 没有任何遗留问题。

未继续测试的部分

时间关系,没有测试拜师、购物、留言板。

更正(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 崩溃)

深度功能测试(2026-08-13,round two,新驱动重测)

Re-tested against the freshly-rebuilt build-debug/src/driver(post 全库 quest_times/win_times %-operator 修复 + Warning/warning 驱动文本回退)。log_error()adm/obj/master.lpc)已经在更早一轮 (引用注释里的"AGENTS.md #15w")正确修复过,本轮只发现并修复了 log_file() 一处。

发现并修复的 PROGRAMMING bug

1. log_file()adm/simul_efun/file.lpc)完全没有 assure_file() 保护(AGENTS.md §7.11-class 的又一确认实例,与本轮 ffxymud/ hc 完全同一形状)adm/daemons/logind.lpcget_gender()新角色注册流程的最后一步)紧跟着调用 log_file("login/newid.log", ...)——LOG_DIR 下的 login/ 子 目录若不存在,会在每一个全新角色注册完成的那一刻未捕获抛出,属 于会影响核心注册路径的高优先级实例(不只是 nosave/* 这类只在 管理指令才会触发的低优先级路径)。已补上 assure_file(LOG_DIR + file);(含前向声明)。

Proactive checks(无需改动)

data/{login,user}/c/chenba.o 是此前会话遗留的未提交测试存档 ——Aug 5 mtime,早于本次会话,未受本轮任何操作影响,未触碰。)

§7.100 房间基类 replace_program() 扫尾修复(2026-08-19)

ROOM 宏(/inherit/room/room,见 include/globals.h)在本档案 2,245 处房间文件的 create() 里紧跟 inherit ROOM; 之后又多余调 用了一次 replace_program(ROOM);——AGENTS.md §7.100 记录的同一个 休眠 bug(多余调用给对象打上永久"pending replace"标记,对象一旦绑 定任何闭包就会崩溃);本档案属于 XYZX/fyue 房间生成工具血统, clone/misc/roommaker.lpc/u/fyue/misc/roommaker.lpc 两份逐字节 相同的副本。用 fix_710_room.py 扫过 work/,删除 2,243 处标准 形状;两份房间生成工具各剩 1 处字符串拼接变体 str += "...replace_program(ROOM);..."(heredoc 模板里的独立行 已被脚本正常扫到),手工改成 str += "\n\tsetup();\n}\n";。修复 后 work/ 下 0 处存活 replace_program(ROOM) 残留,105 处转档之 前已注释掉的 // 行原样保留,work/data/ 下没有真实 .lpc 源码 命中。git diff --stat 显示 2243 个文件净删 2245 行,与脚本自报 数字 + 2 处手工编辑吻合。

驱动干净启动(零新增编译错误、端口正常监听、debug.log 无任何 "cannot replace"/"cannot bind"行),巫师账号 fluffos/Mud@2026 确认"您目前权限:(boss)"后 look/goto 走读了 2 个曾经命中过这 个 bug 的房间(u/snow/wudujiao/yaoshi.lpcu/snow/wudujiao/zhushe.lpc)均正常,quit 干净退出。登录存档 的时间戳增量已用 git checkout HEAD -- 撤销,未落入提交。

深度功能测试(round four, 2026-08-20):拜师 / 购物 / 留言板 + 清单复核

环境说明:本轮会话开始时宿主机之前已重启过(archives-side build-debug/ 符号链接不存在),实际驱动二进制路径是 /home/sunyc/src/fluffos/build-debug/src/driver (不是任务提示里写的 mudlib/build-debug/src/driver——那个路径这台机器上 从未存在过,lpcc_check.sh 自己引用的也是 ~/src/fluffos/build-debug/...), 从这个路径正常编译启动,端口 40053 正常监听。

1. 拜师(sect apprenticeship):干净通过

attempt_apprentice() 的实际调用点在 cmds/skill/apprentice.lpcapprentice/bai 指令),选了武当派开山祖师张三丰(kungfu/class/wudang/zhang.lpc),通过 d/wudang/xiaoyuan.lpc("金殿")房间的 set("objects", ...) 克隆放置定位到该 房间。管理员 fluffosgoto /d/wudang/xiaoyuan 抵达后 bai zhang

☆你想要拜张三丰为师。
张三丰说道:我武当派乃内家武功,最重视内功心法。

命中 zhang.lpctaiji-shengong 技能不足 50 的合理拒绝分支(fluffos 账号没有武当内功技能),机制走通、拒绝理由合理,无崩溃、debug.log 无新增 错误——按验收标准算干净通过(不需要真正收徒成功才算过)。

2. 购物(shopping):完整验证买入 + 当铺卖出双向交易,两级货币确认正常

`` ☆你向小贩买下一串冰糖葫芦。 ☆ 你身上带着的物品有(负重 4%): 五十个铜板(Coin) √布衣(Cloth) 糖葫芦(Bingtang hulu) 法传送帖(Trans site) `` 一两银子买五十文的东西,正确找零五十个铜板——两级/三级货币(金/银/铜)换算 正确。

`` ☆你把身上的一串冰糖葫芦卖掉四十文钱。 ☆ 你身上带着的物品有(负重 5%): 九十个铜板(Coin) ` 五十文的东西按 do_sell()` 的 80% 折算卖得四十文(50+40=90,与背包铜板 数吻合)——买入/卖出双向真实交易全部走通,无崩溃。

3. 留言板(board posting):确认 §7.114 不适用,真实多行留言完整验证

先静态核对 feature/edit.lpc(本档案 F_EDIT 的实际实现):

void input_line(string line, string text, function callback) {

没有 private 修饰符——grep -n "private.*input_line" libs/jhfy/work/feature/edit.lpc 零命中,§7.114(input_to() 递归回调被误标 private 导致多行输入第二行起 静默丢失)在本档案不成立。

再用真实驱动做端到端多行留言测试:goto /d/city/kedian("有间客栈"), post 测试留言标题,输入两行正文,. 结束,read new

留言完毕。
☆
[1] 测试留言标题                             浮浮(fluffos)(Thu Aug 20)
----------------------------------------------------------------------
这是第一行测试内容。
这是第二行,确认多行留言能完整保存。

两行正文全部保存并读出(不是只有第一行)——§7.86 之前修复的 replace_program() 崩溃 bug 也没有复发(post 指令本身没有崩溃)。测试帖 用 discard 1 清除,board 存档目录(work/data/board/kedian_b.o,测试前 不存在)测试后一并删除,不留churn。

4. 清单复核(静态检查,均确认无需改动)

本轮结论

四项深度测试(拜师、购物买入、购物卖出、留言板多行发帖)全部干净通过, 七项清单复核全部确认无需改动,本轮未发现任何新的 programming bug, 未做任何代码改动。debug.log 全程只新增两行良性 Unknown #pragma, ignored 编译期警告(inherit/char/master.lpcfeature/dealer.lpc 首次被本次会话触发懒编译时输出),没有任何 error/denied/segmentation 等级别的新增内容。驱动测试结束后按精确 PID 正常终止(kill -TERMss -ltnp 确认端口 40053 不再监听)。测试产生的存档 churn (fluffos.olast_on 时间戳、临时 data/board/kedian_b.o)已全部 撤销/删除,git status 干净(仅剩此前会话遗留、与本轮无关的 data/{login,user}/c/chenba.o,原样未动)。

§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.