info.html · 介绍 · play.html · 游玩 · llms.txt · 下载与本地运行 · ZIP · GitHub
档案本身标注为"风云三",但游戏内登入横幅实际写的是"铁血江湖"——一个独立于本项目改动的原始命名不一致。地图以中原江湖的华山、武当、明教等经典门派重镇为核心,另外还设有两处跨海历练场景:一片"神户"(日本)区域和一处台湾区域。新角色从中央城最大的酒楼"英豪酒楼"起步;退出游戏设有真实的 30 秒登入后冷却(提示"档案正在存取中,三十秒后方能下线!"),是本合集里少数把防刷退机制直接写进游戏设计的一个。
English
A wuxia MUD whose archive is filed as “Storm III” (风云三) but whose actual in-game banner reads “Blood-and-Iron Jianghu” (铁血江湖) -- an unrelated title mismatch, not an error this project introduced. The map centers on the classic Huashan/Wudang/Mingjiao sect towns of central-plains jianghu, plus two overseas zones for cross-strait adventuring -- a Kobe/Japan area and a Taiwan area. New characters land at Yingxiao Restaurant (英豪酒楼), the largest tavern in the central city, and quitting is gated by a genuine 30-second post-login cooldown (“the file is still being saved”) -- one of the few libs in this collection to write anti-farming logic directly into the game design.
README
内容亮点
- 档案名叫"风云三",登入横幅却是"铁血江湖",内容和档案名对不上, 是这批档案里命名最混乱的一个。
- 地图除了华山、武当、明教等门派场景,也有一片"神户"(
d/japan/) 海外场景,和xajh4gkb的日本区域一样是跨海历练的设定,另外还 有"台湾"(d/taiwan/)场景。 - 登入后有真实的 30 秒退出冷却(提示"档案正在存取中,三十秒后方能 下线!"),是这批档案里为数不多明确写在游戏设计里的反刷退机制。
- "扬州"(
d/yangzhou/)分区旁边留着一个完全没被引用的旧版备份目 录d/yz_bak/yangzhou/,两者部分房间内容相同但路径/文件名不 同,是当年重新整理分区时留下的历史痕迹(见下方 bug 修复说明)。
- 更正(2026-08-05):上面提到的"7.68 复活软锁"修复已经撤销——经重新评估,鬼魂"不在场"时放弃复活流程更可能是有意的游戏设计(多数这类档案里鬼魂本身就无法自行移动,离开是一种游荡机制,回来时 init() 会重新触发流程),不是需要强制重试的 bug;详见 NOTES.md。
注册流程
英文名字(3-8 个英文字母)→ 确认建立(y/n)→ 中文名字(2-6 个中文 字)→ 密码(≥3 字元)→ 确认密码 → 电子邮件地址 → 性别(m/f)。
退出游戏(quit)有一个真实的 30 秒冷却:登入后 30 秒内无法
quit(会提示"档案正在存取中,三十秒后方能下线!"),这是游戏本身
的设计(防止频繁登出刷数据之类),不是 bug。
本次修复的关键 bug
is_chinese()本身已经是正确的 Unicode 码点判断,但check_legal_name()的长度界限(strlen<4||>8)和逐字符判断循 环(i%2==0门槛 +name[i..<0]尾部切片)仍然是旧版 GBK 双字节 假设,导致包括标准测试名字在内的所有真实中文名字都被拒绝——已改 为匹配错误提示文字本身声明的字符数界限(2-6)和逐字符判断 (AGENTS.md §8.1)。
深度功能测试新发现的 bug(§10.7,2026-08-04)
- §7.34 printf 调试泄漏:
adm/daemons/logind.lpc的get_name()里有一行遗留的printf("%O\n", ob);,已删除。 - §7.68 复活软锁死(第 13 例):
d/death/npc/{wgargoyle, bgargoyle}.lpc(鬼门关的白无常/黑无常)已按标准修法拆分!ob/!present(ob)两种情况。 - 全新发现:
REVIVE_ROOM宏指向不存在的文件,导致复活流程走完 后玩家永久卡死(比 §7.68 更严重——即使全程不打断也一样卡 死):include/login.h的REVIVE_ROOM指向/d/yangzhou/temple,这个文件早已不存在,只残留在一个完全没被 引用的旧版备份目录d/yz_bak/yangzhou/里。现场复现确认boot.log(不是debug.log)记录了*call_other() couldn't find object '/d/yangzhou/temple',白无 常的对话和reincarnate()都能正常完成,但最后一步移动角色失 败,永久卡在鬼门关。凭d/yz_bak/yangzhou/daxiongbaodian.lpc↔ 现役d/yangzhou/damingshi1.lpc(同为"大雄宝殿")这组内容相同、 路径不同的房间对照,确认现役区语义上对应的"寺庙"房间是d/yangzhou/damingshi.lpc("大名寺")——已把REVIVE_ROOM改指 向这里,现场复现验证角色能成功落地。 - 顺手修复一处确认为原始压缩包本身损坏的乱码字(白无常/黑无常对 话"□上册子"→"合上册子",凭本项目另外 10+ 个不同血统档案的同款 对话逐字印证)。
- 留意但未修复:巫师自建赌场
u/lxh/dufang.lpc的east出口同 样指向一个不存在的文件(chunxilu3),项目里确实有同名文件d/chengdu/chunxilu3.lpc,但缺乏像REVIVE_ROOM那样的结构性 证据能确认这就是原意,按不确信不瞎猜的原则先如实记录、未改动。
管理员账号 / Admin account
- id:
fluffos - 密码 / password:
Mud@2026 - 权限 / level:
(admin)
管理员名单存储在纯文本文件 adm/etc/wizlist 里。修正(round-two 深
度测试发现):wizlist 里虽然早就有 fluffos (admin) 这一行,但从
未有匹配的角色存档被真正提交过——wizlist 只决定权限等级,不会凭空
创建这个 id 本身的角色。已用真实注册流程走完全程创建角色,update
指令验证可正常编译,管理权限真正生效。
警告:这是一个公开的默认密码,仅供本地/浏览器试玩。正式对外开服前
请务必修改此密码。
本地运行
cd libs/fys
~/src/fluffos/build-debug/src/driver config.fluffos游戏端口:40164。
NOTES · 移植与修复记录
WASM 修复摘要(迁移自 meta.json 的 group_note)
档案名叫"风云三",但实际游戏内横幅是"铁血江湖"(内容无关,只是文件名对不上)。is_chinese() 在这份档案里本来就已经修成了正确的 CJK 码点判断,但 check_legal_name() 的长度界限(strlen<4||>8)和它的字节步进循环(i%2==0 门槛,name[i..<0] 尾部切片)底层仍然是旧的 GBK 字节配对假设,会静默拒绝所有真实中文名字,包括标准的两字测试名——已把界限改成匹配错误提示本身声明的字符数(2-6),循环改成逐字符切片(§8.1)。quit.lpc 强制了一个真实存在的 30 秒登录后冷却(游戏设计如此,不是 bug)——测试时需要更长的 idle/填充指令预算才能观察到冷却结束,而不只是立即的 notify_fail 拒绝。排版格式化工具的第三类盲点检查(CJK 重新加空格)在约 20 个总命中里抓到了 6 处真正的损坏(5 个 ASCII 地图档案加一个分词器失去同步的帮助文字档案)——全部 6 处都直接还原,没有手工修补。管理员账号(fluffos/Mud@2026)通过真实注册流程 + adm/etc/wizlist 播种。
深度功能测试(§10.7,2026-08-04)
此前只验证到注册流程本身,本轮原生 driver(端口 40164)走完了移 动、留言板、商店 NPC 观察、战斗、以及两轮死亡→复活验证(第 一轮暴露出一个全新的、真正会把玩家永久卡死的 bug;第二轮在修复 后确认问题彻底解决)。
主动检查(对照 AGENTS.md 已归档的 bug 类),发现并修复三个真实 bug:
1. §7.34 printf 调试泄漏(新实例):adm/daemons/logind.lpc
get_name() 里,紧跟在中文名字校验通过之后有一行
printf("%O\n", ob);——每个新玩家都会在自己屏幕上看到连线对象
的原始调试信息。已删除。
2. 第 13 例 §7.68 复活软锁死:d/death/npc/{wgargoyle,
bgargoyle}.lpc(鬼门关的白无常/黑无常,DEATH_ROOM 宏
/d/death/gate 直接摆着白无常,其 north 出口
/d/death/gateway 摆着黑无常,两者均可达)的 death_stage()
把"玩家暂时不在场"和"对象已销毁"合并成同一个提前 return。已
拆分为标准修法:!ob 永久放弃,!present(ob) 改为 5 秒后重
试。
3. 全新发现:REVIVE_ROOM 宏指向一个不存在的文件,导致复活序
列走完对话后玩家永久卡在鬼门关(比 §7.68 更彻底——不是"暂时中
断才卡死",而是即使全程不被打扰也一定卡死)。include/
login.h 里 #define REVIVE_ROOM "/d/yangzhou/temple"
指向的文件根本不存在;现场复现(杀死测试角色、完全不打断地等
待超过 30 秒)后,虽然 debug.log 全程干净,但 driver 自己的
stdout 捕获(boot.log,沿用 §10.8 的排查经验——debug.log
会漏掉这类错误)明确记录了 执行时段错误:*call_other()
couldn't find object '/d/yangzhou/temple'.——白无常的五段对话
和 reincarnate() 都正常完成,但最后一步 ob->move
(REVIVE_ROOM) 静默失败,角色永远留在鬼门关,只能看到白无常反
复的闲聊消息。追查发现"temple.lpc"这个文件名如今只存在于一个
完全没有被任何活跃房间引用的备份目录
d/yz_bak/yangzhou/(内容是"隋炀帝陵",和"temple"这个文件名本
身的语义已经不匹配了——这份备份目录很可能是扬州分区某次重新整
理之前的旧版快照)。比对 d/yz_bak/yangzhou/daxiongbaodian.lpc
("大雄宝殿")与现役区 d/yangzhou/damingshi1.lpc(同样是"大雄
宝殿")这一对内容相同、路径不同的房间,可以确认现役的"扬州"分
区是这个旧备份重新整理/改名后的产物;现役区里语义上真正对应
"temple"(寺庙)的房间是 d/yangzhou/damingshi.lpc("大名
寺",紧邻着"大雄宝殿",房间里有一位"知客僧")。已把
REVIVE_ROOM 改指向 /d/yangzhou/damingshi,并在宏定义旁写
了完整的排查注释。现场复现验证:修复后角色死亡→鬼门关→完整对
话→reincarnate()→成功落地"大名寺",不再卡死。
顺手发现但未修复、留待观察的一处类似问题:u/lxh/dufang.lpc
("逍遥赌坊",一位巫师自建的骰子赌场,从"英豪酒楼"往南可达)的
east 出口写的是 __DIR__ "chunxilu3"(相对路径,指向
u/lxh/chunxilu3.lpc,不存在),现场触发出的是同一类"目标文件不
存在"报错。项目里确实有一个同名文件 d/chengdu/chunxilu3.lpc
("春熙路口",成都分区),文件名重合但没有找到任何更直接的证据
(没有注释、没有其它文件引用)能确认这就是原作者的本意——不像
REVIVE_ROOM 那样有"隋炀帝陵/大雄宝殿"这种结构性配对证据支撑,
所以按本项目一贯的原则(不确信就不要瞎猜)先如实记录,不改动。
主动检查确认不是 bug 的项:command_hook
(feature/command.lpc)已经是 nomask;全文搜索未发现
MESSAGE_D-> 未加防护的调用;食物/饮水在 logind.lpc 里两处都
是无条件 user->set("food", 100); user->set("water", 100);,没有
任何 age 判断,不是 §8.9 的错误对象变体。
顺手修复一处确认为原始压缩包本身损坏的乱码字(用 Python 直接
读取 raw 归档字节核实过,不是转码流程引入的):白无常/黑无常两份
文件里"□上册子"应为"合上册子"(GBK 字节 \xa1\xf5 本来就是符号
表里的"□",原作者当年大概率是手误/复制粘贴丢字)——本项目另外至
少 10 个不同血统档案的同款判官/无常对话都逐字写着"合上册子",凭
这么多独立来源的印证还原。
完整游玩记录:
1. 用真实中文名"沈牧"(id shenmu)注册成功,落地"英豪酒楼"(中
州城最大的酒楼,no_fight 房间),场景里有真正可读的留言板
(当时无留言)和 NPC"武大郎"。
2. 移动:英豪酒楼→逍遥赌坊(巫师自建赌场,规则牌子文字完整)→
文定北街→市中心→延陵东路等多个房间,沿途场景描述、出口、
NPC 列表均正常渲染(除上文记录的 chunxilu3 死路外)。
3. 战斗测试:wimpy 0 后依次尝试攻击"小孩""流氓"等新手区 NPC
(战斗力都很低,几个回合分不出胜负),最终用"侠士"(明显高出
一个数量级的战斗力)一击致命触发死亡流程。
4. 死亡→复活验证(两轮,如上文详述):第一轮暴露 REVIVE_ROOM
bug(角色永久卡在鬼门关,即使完全不打断也一样),第二轮在修
复+重启 driver 后验证角色成功落地"大名寺"。
结果:整个测试会话(含两轮死亡复活循环、一次修复后重启)
debug.log 全程为空,没有任何真实的 error:/Bad argument/
No program/Too deep recursion 记录——REVIVE_ROOM 那个 bug 的
报错只出现在 boot.log(driver 自己的 stdout),再次印证了
§10.8 强调的"只看 debug.log 会漏掉一类真实错误"的教训。测试角
色存档(data/{login,user}/s/shenmu.o)保持未跟踪;三处 .lpc
改动(logind.lpc/wgargoyle.lpc/bgargoyle.lpc)已用 formatter
校验({"errors":0});include/login.h 的宏定义改动不在
formatter 覆盖范围内,改动很小,人工核对无误。
更正(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 崩溃)
BULLETIN_BOARDinherit+ 多余replace_program()致命形状(AGENTS.md §7.86,post命令崩溃):全档案 47 处命中,已删除多余的replace_program(...)调用(保留inherit),逐文件保留原有行尾格式(CRLF/LF 按文件原样)。本次为跨库 §7.86 扫描修复(触发原因:该 bug 已在 6+ 个互不相关的血统家族独立确认,属于近乎普遍的拷贝粘贴模式),仅做编译检查(驱动干净启动、端口正常监听),未做完整 §10.7 深度游玩测试。
深度功能测试(2026-08-13,round two,新驱动重测)
Re-tested against the freshly-rebuilt build-debug/src/driver(post
全库 quest_times/win_times %-operator 修复 + Warning/warning
驱动文本回退)。
发现并修复的 PROGRAMMING bug
1. log_error()(adm/obj/master.lpc)完全没有严重度检查(AGENTS.md
§7.34-class,与本轮 wdxtym/ffxymud/fy2mg 同一原始形状):
if (this_player(1)) efun::write("编译时段错误:" + message +
"\n");——不区分巫师/玩家,也不区分警告/错误。真实复现:全新驱动
进程下首次完整注册流程(fluffos 管理员账号)触发的冷编译级
联,屏幕上连续刷出 124 行原始诊断(本轮迄今为止最严重的一
次,这份档案的场景/NPC 数量明显更大)。修复:加上
strsrch(message, "arning:") == -1 判断。已用同一新驱动进程下的
完整重新注册复测:零次诊断刷屏(唯一命中的"什么"是正常游戏文本
"发生什么了?")。
2. log_file()(adm/simul_efun/file.lpc)完全没有 assure_file()
保护(AGENTS.md §7.11-class 的又一确认实例,与 fqyy2/fy2mg
同一形状):LOG_DIR 下的 nosave/ 子目录在全新检出里不存
在,suicide/崩溃日志/巫师 clone 日志等管理指令路径的
log_file() 调用会在首次使用时未捕获抛出。注册/登录本身只写
log_file("USAGE", ...)(无子目录,本来就存在),不受影响,但
这是一个明确存在的 bug,按标准模式补上
assure_file(LOG_DIR + file);(含前向声明)。
3. 管理员账号从未真正创建(AGENTS.md §1.5 的"wizlist 有记录但角色
从未真正建立"形状,与 fy2mg 同一模式):adm/etc/wizlist
里早就有 fluffos (admin) 这一行,但 README 此前的记录"账号本身
通过正常注册流程创建"经核实是错的——git log 确认仓库里从未提交
过 data/{login,user}/f/fluffos.o。已用真实注册流程完整创建
fluffos 角色,score 确认显示"目前权限:(admin)",
update /adm/daemons/securityd 确认可正常重新编译。README 已同
步更正这段记录。
Proactive checks(无需改动)
win_times修复确认存在且正确:d/city2/npc/refereew.lpc:177和u/xxy/city2/npc/refereew.lpc:176均已用(string)(to_int(query("win_times")) % 5)。- 未发现
message()simul_efun 包装函数——不适用 message()-missing-varargs 这一类 bug。 assure_file()本身末尾不做seteuid(getuid())重置,不属于nitan_san/nt6nitan6win那种"assure_file 自己把 euid 重置掉"的 形状。
实测过程
fluffos 管理员账号完整注册(英文 id → 确认建立 → 中文名,直接设定
不需要二次确认 → 密码(此代码线只要求 ≥3 字元,比 fqyy2/fy2mg
宽松很多)→ 确认密码 → 邮箱 → 性别)进入起始区域。修复前后各做一次
全新驱动进程下的完整注册;修复前复现了 124 行诊断刷屏,修复后干
净。log/debug.log 全程时间戳未变化,确认无新增未捕获运行期错误。
驱动最终按精确 PID kill,ps -p 确认已退出。
已清理
- 管理员
fluffos的存档已提交(data/{login,user}/f/fluffos.o)。
AGENTS.md §7.100 修复(2026-08-19,批次五)
ROOM 基类冗余 replace_program(ROOM); 自崩溃地雷(详见 AGENTS.md
§7.100):2868 个房间文件的 create() 里紧跟 inherit ROOM; 之后
都有这一行多余调用,永久设下"待替换"标记,第一次对该房间对象绑
定闭包就会崩溃。这份档案有 5 处代码生成模板烤了同一个地雷:
obj/roommaker.lpc、d/obj/clone/misc/roommaker.lpc(简单字符串
拼接写法)以及 obj/rmmaker.lpc、u/panguan/rmmaker.lpc、
u/panguan/room.lpc(room_code += 缩进写法略有不同的另一套模板,
前两处修完后仍剩 3 处才发现)。
修复:脚本化删除所有房间文件里独立成行的 replace_program(ROOM);,
加上 5 处模板手动摘除字符串拼接片段。git diff --stat:2868 files
changed。备注:survey 记录的"live"数字(3013)和实际盘面对不上,
真实 live 数量是 2870(总匹配 3157 减去 287 处确认为既有注释的行,
逐条抽样核实过),修复后 0 处遗留 live 匹配,287 处注释原样保留未
动。
验证:build-debug 驱动真实冷启动,端口 40164 正常监听,
debug.log 全程干净。既有管理员账号 fluffos/Mud@2026 登录正常
(落地英豪酒楼,look/quit——quit 触发"三十秒后才能下线"的存档中提
示,属正常游戏机制不是崩溃),全程无新增
"cannot replace"/"cannot bind" 日志行。
§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): 3 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.
AGENTS.md §7.19: enable_player() reentrancy guard (2026-09-01)
Same corpus-wide bug class as mhxy/wuhanzhan: feature/command.lpc's
enable_player() wraps enable_commands() and is unconditionally
reachable from an NPC's init() via setup()/reset_me() (confirmed
on this lib's own d/*/npc/zhangmen*.lpc-family NPCs, matching
mhxy's originally-documented d/xueshan/npc/zhangmen.lpc pattern).
Calling enable_commands() on an object that's already living()
makes the driver re-invoke that object's init() as a side effect;
since init() calls back into enable_player(), that is genuine
same-call-stack reentrancy that repeats until "Too deep recursion"
aborts a room's first-ever visit.
Fixed with a true reentrancy flag (nosave private int
in_enable_player_now;), NOT a bare if (living(this_object()))
return; guard — this lib's feature/damage.lpc revive() and
cmds/std/sleep.lpc wakeup()/wakeup2() all legitimately
re-invoke enable_player() while the object is still living()
(that's how a fainted/asleep character gets commands back), so a
living()-gated guard would silently break every one of those real
re-enables. enable_player()'s single body has no early return
statements, so the flag is set at entry and cleared once, before the
function's fall-through end. Verified with a single-file lpcc
compile check (exit 0, no errors) against feature/command.lpc.
深度功能测试(2026-09-04,round three,shop + 拜师)
新角度:英豪酒楼真实购买 + 泰山派天乙道人拜师。round one(2026-08-04)
只「商店 NPC 观察」,没有 buy。round two(2026-08-13)补了
log_error 闸门和 log_file assure_file,没有拜师。wakeup 说
「has buy, need 拜师」——NOTES 正文里其实没有成功购买记录,本轮两
项都做。
本轮没有新的 programming bug。log_file() 已有 assure_file()。
log_error() 已有 arning: 闸门(玩家可见 0 条编译警告)。第一
输入是「您的英文名字」。quit 仍有 30 秒冷却(设计,不测 quit)。
实测过程
管理员 fluffos / Mud@2026。端口 40164。落地英豪酒楼
/d/zhongzhou/yinghao,武大郎 id wu dalang,F_VENDOR。clone
/obj/money/gold 一次成功(cmds/app/clone.lpc 无 is_admin()
门槛)。list 烤鸡腿三十文 / 烧饼四十文 / 包子五十文等。buy
jitui from wu dalang 成功:「你向武大郎买下一根烤鸡腿。」i 剩
九十九两银子 + 七十文钱(10000−30=9970)+ 烤鸡腿。
goto /d/taishan/yitian(一天门),天乙道人 id tianyi。
apprentice tianyi 一次成功:「恭喜您成为泰山派的第十四代弟子。」
score「泰山派第十四代弟子」「你的师父是天乙道人」。save「档案
储存完毕。」峨嵋 qingxin.lpc 没有房间引用,未走那条。陈玉林
(丐帮成都)int>=25 拒收,没测。
live debug.log 是 libs/fys/log/debug.log(Boot Time Fri Sep 4
03:55:18 2026),无 error: / Too deep recursion。管理员存档未
提交。