Storm Clouds Rising II

✅ 可玩

风起云涌2

fqyy2

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

▶ 开始游玩 · Play Now

风起云涌2 地图规模较大,除了华山、武当、少林、丐帮、峨嵋、明教等常见门派场景,还有独立的"杀手楼"势力和结婚玩法,社交与黑道路线并存。属于"海洋/hy"代码线家族(`SECURITY_D` 同样指向 `adm/daemons/securd.lpc`),与 `hy2000`/`hy2002`/`hy3`/`hy5` 等档案共享这套硬编码后门管理员机制,且管理员名单不存在常见的 `wizlist` 文本文件里,而是记录在安全 daemon 自身的存档数据中。

English

Part of the same "Ocean" codebase lineage as several sibling archives in this project, sharing their distinctive hardcoded backdoor admin mechanism. Features a larger-than-usual map including the classic sects alongside an independent Assassins' Tower faction and a marriage system, blending social and underworld gameplay. Its admin roster is stored not in a plain text file but inside the security daemon's own save data.

README

内容亮点

注册流程

new 触发注册 → 字符集选择(gb/gbig5/b)→ 英文 id → 确认 创建(y/n)→ 中文名字(1-5 个中文字)→ 密码 → 确认密码 → 天赋数值选 择(0-4,0 为随机)→ 天赋确认(y/n)→ 电子邮件地址 → 性别(m/f)。

本次修复的关键 bug

管理员账号 / Admin account

修正(round-two 深度测试发现旧记录有误):wiz_status 实际声明为 nosave mappingadm/daemons/securd.lpc 第 6 行),永远不会被存档 持久化——每次开机都会被 restore_list() 里的硬编码赋值重置。原来这 一行只授权了 titny 这个 id,而 titny 已经是原始存档里一个真实的 玩家(data/user/t/titny.o,密码未知,fluffos 无法冒领),所以此 前任何"写进 securd.o"的播种尝试实际上从未生效(此仓库里从未真正提 交过 fluffos 的存档,直到这次修复)。已在 titny 那行旁边并列加 了一行 set("wiz_status/fluffos", "(admin)");fluffos 走正常注册 流程创建,update 指令验证可正常编译,管理权限真正生效。

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

在线试玩

https://mudlibs.fluffos.info/fqyy2/

本地运行

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

游戏端口:40197

NOTES · 移植与修复记录

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

从一个"rar 套 rar"的嵌套压缩包中提取(外层压缩包里有一个"风起云涌.rar",里面才是真正的 mudlib 根目录,文件夹名叫 xkx2);和本项目里任何其它档案都没有 master-hash 匹配;启动干净,零修复。完整 WASM 修复:和"海洋/hy"血统同一套 bug 组合(这份档案的 SECURITY_D 也指向 adm/daemons/securd.lpc)——给 band.lpc 加了本地回环放行;修复了 logind.lpc(create()/make_body()/howmany_user())里 seteuid(getuid()) 把 euid 重置掉的 bug;给 howmany_visitor()/howmany_card() 加上了缺失计数档案的防御;修复了 check_legal_name() 过时的 GBK 字节长度界限,去掉了 i%2==0 门槛;给 securd.lpc 的 get_status() 加上了防重入编译崩溃的保护。新发现的 bug(和 hy5 同一类):adm/daemons/network/dns_master.lpc 在 3 个函式里无条件呼叫 socket_create/socket_bind/socket_close/socket_write,导致整个档案编译失败——而由于等同于 gb_big5() 的开机流程会间接碰到这个精灵,编译失败会静默破坏每一次连线的 input_to(get_id) 注册流程。已按 AGENTS.md §7.52 把涉及 socket 的函式体掏空成 no-op。管理员账号播种进了 adm/daemons/securd.o 存档文件自身的 wiz_status 属性(逐键用 CR 编码,需二进制模式读写)。注册流程到进入游戏世界、管理员权限识别都已验证。

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

深度功能测试(2026-08-12,round two,本档案第一次真正的 §10.7 深度测试)

此前只做过 WASM 修复摘要 + §7.86 扫描修复,从未跑过真正的注册/游玩 全流程。这是第一次。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 同一形状)if (wizardp(...)) 显示原始诊断; else efun::write("什么?");—— 巫师之外的每一位玩家,遇到任何编译诊断(哪怕只是最普通的警告)都 会看到一句没头没脑的"什么?"。真实复现:一次全新驱动进程下的全新 注册,冷编译级联触发的纯警告,让新角色进游戏前连续看到五次 "什么?什么?什么?什么?什么?"刷屏。修复:加上 strsrch(message, "arning:") == -1 判断,只有真正的错误才对非巫师 显示这句提示,警告保持沉默。已用同一新驱动进程下的第二次全新注册 复测:零次"什么?"。 2. new_password()adm/daemons/logind.lpc)密码校验失败后缺少 returncheck_legal_password() 返回 0(密码太短/缺大写/缺 小写/全字母没有数字或标点/和英文 id 太像)时已经自己 write() 了 拒绝理由,但函数没有 return,直接继续往下走——如果密码长度恰好 ≥5(跳过后面那道独立的 strlen(pass) < 5 兜底检查),就会在玩家 刚被告知"密码不合格"之后,原样把这个不合格密码 set() 保存下去。 静态审查直接确认这条代码路径存在(abcdefgh 这类纯字母无数字密 码就会触发);修复后用真实注册复现:同一个纯字母密码被正确地重新 要求输入,直到给出一个真正合格的密码才继续到确认密码步骤。修复: 补上 input_to("new_password", 1, ob); return;。 3. log_file()adm/simul_efun/file.lpc)完全没有 assure_file() 保护(AGENTS.md §7.11-class 的又一确认实例)LOG_DIR 下的 nosave/ 子目录在全新检出里不存在,suicide/崩溃日志/purge/ 巫师晋升等一批只在管理指令路径才会触发的 log_file("nosave/...", ...) 调用会在首次使用时未捕获抛出。注册/登录本身只写 log_file("USAGE", ...)(无子目录,本来就存在),不受影响,但这 是一个明确存在、迟早会炸的 bug,按标准模式补上 assure_file(LOG_DIR + file);(含前向声明)。 4. 管理员账号播种从未真正生效(AGENTS.md §1.5 的两种已知 bug 形状 同时命中)adm/daemons/securd.lpcwiz_status 声明为 nosave mapping——永远不会被存档持久化,每次开机都被 restore_list() 里的硬编码赋值重置成只有一个 titny。而 titny 本身已经是原始存档里一个真实玩家(data/user/t/titny.o,密码未 知),fluffos 无法冒领这个 id。这意味着此前 WASM 修复摘要里"管 理员账号播种进了 securd.o 的 wiz_status 属性"这句记录本身就是错 的——wiz_status 从来就没有、也不可能被真正持久化进 securd.o; 仓库里此前也确实从未提交过 fluffos 的存档文件。修复:在 titny 那行旁边并列加一行 set("wiz_status/fluffos", "(admin)");。已用 真实流程验证:注册 fluffos/Mud@2026 成功(称号显示"天帝"), update /adm/daemons/securd 成功重新编译,确认写权限真正生效 (不只是"看起来是 admin")。README 已同步更正这段此前错误的机制 描述。

Proactive checks(无需改动)

实测过程

新号走完整注册流程(GB/Big5 选择 → 英文 id → 确认建立 → 中文名,直 接设定不需要二次确认 → 密码 → 确认密码 → 天赋 0 随机 → 接受 → 邮箱 → 性别),完整进入"混沌之初"起始区域。中途一度怀疑存档没有真正写 入(用同一个 id 在同一驱动进程下二次连线时被当成全新账号处理),但 换一个全新 id 复测后确认注册→存盘→重新登录→存档正确恢复全部正常, 判定是一次性偶发状况(可能是紧接着上一次尝试触发的临时状态),非可 复现 bug——记录下这次排查过程本身,供未来遇到类似"看起来存档失败" 的现象时先排除偶发因素再下结论。log/debug.log 全程时间戳未变化, 确认无新增未捕获运行期错误。驱动最终按精确 PID kill,ps -p 确认已 退出。

已清理

AGENTS.md §7.100 修复(2026-08-19,批次三)

ROOM 基类冗余 replace_program(ROOM); 自崩溃地雷(详见 AGENTS.md §7.100):3257 处命中。自带建房工具 clone/misc/roommaker.lpc 的 字符串拼接模板同样修复。修复过程中因本地一次 git stash 误操作, d/gumu/tree.lpc 一度残留了字面 <<<<<<</=======/>>>>>>> 冲 突标记——提交前被 git diff 检查发现,改用从原始 HEAD blob 重新 按脚本逻辑派生该文件(二进制安全,保留原始 CRLF/尾随空格)修复, 未手动编辑穿过冲突。

git diff --stat:3256 files changed, 1 insertion(+), 3257 deletions(-), 与预期精确吻合。

验证:build-debug 驱动真实冷启动(既有的"Too deep recursion"启动 期警告在改动前的原始代码上同样存在,与本次修复无关),端口 40197 正常监听。既有管理员账号 fluffos/Mud@2026(GB/Big5 编码选择 后)登录,头衔【天帝】,经 oldplayer 路径走访至〖圣殿〗,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): 5 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.

深度功能测试第三轮 / §10.7 round three (2026-09-03)

新角度:2026-08-12 那一轮只覆盖了注册 + 落在「混沌之初」。本轮走 移动、平安城当铺/武馆、扬州实战、白驼山拜师传送、quit 后重连。管 理员仍是播种账号 fluffos / Mud@2026(中文名阿福,称号天帝,年 龄 14)。登录第一提示是 GB/Big5,先回 g

实测过程(无崩溃)

发现并修复的 PROGRAMMING bug

log_file()SECURITY_D 重入「Too deep recursion」 (AGENTS.md §7.11 的后续形状,不是缺目录本身)。2026-08-12 在 adm/simul_efun/file.lpclog_file() 加了 assure_file(LOG_DIR + file)assure_file() 里的 file_size() / mkdir()SECURITY_D->valid_read / valid_write。拒绝路径会 再调 log_file("read_fail.log") / log_file("write_fail.log"), 于是又进 assure_file(),直到:

Too deep recursion.
program: /adm/obj/simul_efun.lpc, ... file: /adm/simul_efun/file.lpc:25
Too deep recursion.
program: /adm/obj/master.lpc, ... file: /adm/obj/master.lpc:315

触发点是开机 backupd create()log_file("backup")。驱动仍 会听到 40197,但这是真编程 bug,不是无害警告。

修复:nosave int in_log_file;。嵌套的 log_file() 跳过 assure_file(),直接 write_file()valid_write 本来就放行 LOG_DIR 下的 write_file,循环出在 file_size/mkdir,不是 写文件)。CRLF 按二进制保留。复测冷启动(/tmp/fqyy2-boot2.out) 零条 “Too deep recursion”,登录 / skills / quit 仍正常。

兄弟档:同一套 Ocean/hy securd.lpc 拒绝日志 + §7.11 assure_file-in-log_file 至少在 hy2000 上也在。本轮不扫全库。

本轮未现场走完

本轮修改的文件