Fengyun IV

✅ 可玩

风云Ⅳ — fengyun434

fengyun434

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

▶ 开始游玩 · Play Now

风云四(风云Ⅳ,Sumxin 风云工作室出品),属于"风云"(Fengyun)武侠引擎家族的一支,与 `fy2`、`fy2005`、`fy2qh`、`fy3xd`、`fy3dz` 同源,各自是不同站点/年代基于同一引擎开发的独立内容分支。故事以古龙武侠小说为背景,玩家从刚踏入江湖的普通百姓做起,选择民族(汉族/苗族/满族/蒙古族,对应不同的初始属性倾向和出生地点),在古龙笔下的门派恩怨与江湖人物间闯荡历练。

English

Produced by Sumxin's Fengyun studio, part of this project's "Fengyun" wuxia engine family shared with fy2, fy2005, fy2qh, fy3xd, and fy3dz — each a separate content branch from a different site or era built on the same core engine. Set in a jianghu drawn from Gu Long's wuxia novels, players begin as an ordinary commoner just entering the martial world, choosing an ethnicity (Han, Miao, Manchu, or Mongol) that shapes starting attributes and birthplace.

README

内容亮点

在线试玩

https://mudlibs.fluffos.info/fengyun434/

管理员账号 / Admin account

警告:公开架站前请务必修改此默认密码。

本地运行

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

游戏端口:40011

NOTES · 移植与修复记录

fengyun4-3-4.rar → fengyun434

Status: DONE — boots clean, playable over telnet

Zero fixes needed to boot — clean on the first attempt (checked proactively for the known load_object/domain_file/angle-bracket- include patterns beforehand; none present in this lineage). GB/BIG5 encoding-selection prompt (same legacy pattern as other libs), then full login flow.

What was fixed

Nothing needed for boot. Routine conversion only: encoding (8801 converted, 255 already UTF-8/ASCII, 151 skipped binary, 30 lossy), .c.lpc (8238 files, 465 refs auto-fixed), staticnosave (50 files, notably low ratio vs other libs of similar size — this codebase barely uses the idiom).

Known remaining issues

How to run

cd libs/fengyun434
~/src/fluffos/build-debug/src/driver config.fluffos
python3 ../../scripts/mudclient.py 127.0.0.1 40011 --timeout 10 --send "0" --send "" --send "quit"

(the "0" selects GB encoding at the legacy GB/BIG5 prompt)

Post-hoc fix: UTF8-native is_chinese/registration (AGENTS.md §15h)

Applied in a later batch pass across the whole project: is_chinese/is_chinese2 in the shared chinese.lpc simul_efun fragment used GBK byte-range checks that silently never match real Chinese text once strings are UTF-8 (this driver's str[i] returns a Unicode codepoint, not a GBK byte). This broke character registration specifically -- any real Chinese name was rejected. Fixed the range check to test the CJK Unicode block instead, and halved the GBK-byte-calibrated length bounds in check_legal_name to match. See AGENTS.md §15h for the full writeup; confirmed via a real interactive registration test (Chinese surname + given name reaching the next prompt).

Re-verification pass: driver rebuild + LPC formatter + WASM build

WASM-enablement pass (loopback / admin seeding)

深度功能测试 / Deep functional test (2026-07-24, round two)

First real *playthrough* pass on this lib (all prior passes verified only registration + look/score/quit + admin login, or watched boot output). Played as an ordinary new player through registration, exploration, organic sect-joining and skill-learning, a real quit with a debug.log grep, a native driver *restart* (stronger than a mere reconnect — full disk round-trip) to confirm save persistence, a prompt net-dead/reconnect cycle, and a shop-purchase attempt. Native driver (build-debug) only — WASM not re-verified this pass (out of time budget after the RSS investigation below; the fix is a one-line change to a shared simul_efun with no WASM-specific risk, so this is a low-risk gap, but stated explicitly rather than silently skipped).

Test character: id shenqin, Chinese name 沈青梧, password TestPw123kept (not cleaned up) as playthrough evidence. State at time of writing: 峨嵋派 (Emei sect) 弟子 (disciple) under master 雷一鸣 (6th generation), skill 扑击格斗之技/unarmed at level 1 (learned via the organic teacher-NPC path), located at 凤求凰客栈 (风云城, the Han-ethnicity start room), inventory: 布衣 (cloth, worn), 0 money. Save files: work/data/user/s/shenqin/shenqin.o, work/data/login/s/shenqin/shenqin.o.

Bug found and fixed

**adm/simul_efun/message.lpc:38-40 — the shared tell_room() wrapper passed a raw, unset int 0 as message()'s 4th (exclude) argument on every 2-argument call site, crashing with *Bad argument 4 to EFUN message() — this is AGENTS.md's already-cataloged §7.12 "Shared message/wrapper argument bug" class, not a new one.**

``lpc // BEFORE: varargs void tell_room(mixed ob, string str, object *exclude) { if (ob) message("tell_room", str, ob, exclude); } // AFTER: varargs void tell_room(mixed ob, string str, object *exclude) { if (ob) message("tell_room", str, ob, exclude || ({ })); } ``

What was tested and confirmed working

Not verified live, and why

RSS growth observation (not root-caused, flagged for awareness)

During the aborted long-wait test above, the native driver's RSS grew from ~40MB shortly after boot to ~4.5GB after ~15 minutes of wall clock time, at a sustained rate of roughly 4-5MB/s that showed no sign of plateauing when killed. The admin status command's own memory accounting (Total accounted: ~5MB — apply cache, objects, arrays, mappings, strings, prog blocks, all trivially small) came nowhere close to explaining the ~4.5GB VmRSS/VmData (confirmed via /proc/<pid>/status — single-threaded, so not a thread-local leak either), meaning the growth is happening entirely outside the LPC driver's own object/memory accounting — almost certainly a native-level leak in a C efun or the interpreter itself, not something an LPC-level source fix in this mudlib can address. Circumstantial suspect: this lib's adm/daemons/network/dns_master is in adm/etc/preload, and adm/daemons/whod.lpc periodically (call_out every 3-15 minutes) calls DNS_MASTER->query_muds()/RWHO_Q->send_rwho_q() against long-dead remote hosts — a class of dead-end network activity this project has flagged before (AGENTS.md §7.6) for hanging boots, though not previously for sustained memory growth. Not conclusively root-caused — the process was killed for safety before further diagnosis, and a second, unrelated concurrent agent's driver (a different lib entirely, xjcq2000) was independently observed at a similarly elevated RSS at the same wall-clock time, so this may be a broader phenomenon (driver build, host machine memory pressure, or this specific test environment) rather than something specific to this lib's own source. Left as an explicit open flag rather than guessing at a fix; not currently believed to be a new distinct AGENTS.md bug class since the root cause was not pinned down at the LPC-source level (which is what that catalog is scoped to) — recorded here so a future pass on this lib (or a sibling with the same dns_master/whod setup) that hits the same symptom doesn't have to rediscover it from scratch.

Separately (much lower severity, cosmetic only): the login banner's "目前共有%d位人士正在游戏中" headline count is inflated by stale shipped intermud/rwho snapshot data (work/data/remote/name@*, id@* — real remote-mud player-name lists from the original 2000s-era game, read by adm/daemons/whod.lpc's query_num() = sizeof(users()) + sizeof(REMOTE_NAMES)) — showed "三百零七位人士" online when the real, accurate count (confirmed via who, which correctly uses live users() only) was 1-2. Same *spirit* as the already-cataloged §7.16 "stale shipped real-timestamp" class (old archive data misread as live), but a different, non-crashing mechanic (a wrong cosmetic number, not a runaway loop) — not fixed this pass given it's purely cosmetic and lower priority than the crashing tell_room() bug, flagged here for a future pass.

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

风云Ⅳ 基础版。

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

Deep functional test round two (2026-08-14)

Independently re-verified against current code rather than trusting the round-one writeup above. Found and fixed two new gaps (both standard checklist items, no new bug classes); re-confirmed round one's real find (§7.12 tell_room()) live via the exact original crash route.

New fix: adm/simul_efun/file.lpc's log_file() missing assure_file(), plus cat() null-guard

Standard §7.11-class gap: log_file() wrote directly with no directory-existence guard, cat() had no null-guard on read_file(). Fixed both, with a forward declaration (this driver requires one when a function is called before its own textual definition in the same file — confirmed the hard way on dtsl earlier this session).

New fix: two active printf("%O\n", ob) debug leaks in logind.lpc

Both in the Chinese-name-confirmation flow, right before the "请设定您的 密码:" password prompt — one in the manual-name-entry branch (get_name()), one in the random-name-accept branch (get_resp()). Matches this session's established checklist item to check both branches independently. Removed both; update /adm/daemons/logind confirmed the file still compiles cleanly afterward.

Re-verified live: round one's §7.12 tell_room() fix still holds

Code-confirmed exclude || ({ }) still present in adm/simul_efun/message.lpc, then live-walked the exact original crash route as admin: 凤求凰客栈 → across 风云城 → east through the 东云 corridor to 风云东城门 (the east gate), then west — the precise valid_leave()/tell_room() call site round one's bug report cited. Landed cleanly, zero new debug.log errors (only harmless compile warnings from the newly-loaded gate-guard NPCs). Also noted: this lib's actual live debug.log is at log/debug.log (the driver's launch-cwd level), not work/log/debug.log — the latter contains only stale content from a much earlier (fluffos 20260721) boot and is not written to by the current driver; same quirk this project has documented before on other libs (config's log directory : /log resolves against launch cwd, not the mudlib root).

Not re-investigated this pass: the RSS-growth flag and cosmetic online-count inflation

Round one's flagged-but-not-root-caused native RSS leak (unrelated to any LPC-level fix, ~40MB → ~4.5GB over 15 minutes) and the cosmetic inflated "目前共有%d位人士" online-count (stale shipped rwho data) were both left exactly as documented — neither is something this pass's checklist-driven verification touches, and this pass's own driver was killed well within a couple of minutes of uptime each boot, so the RSS question wasn't (and didn't need to be) re-observed.

Verification method

Booted native build-debug driver, admin login (fluffos/Mud@2026) — note this lib's login flow (encoding choice → id → password) needs each step sent as a separate paced call, not batched via a single rapid multi — a batched attempt this pass left the session at the password prompt with subsequent input silently misrouted as game commands ("什么?"), while individual sendread calls worked correctly both times; not a mudlib bug, a test-harness pacing note for next time on this lib. update /adm/daemons/logind as the real privileged-action check. Two full rapid reconnects (each a fresh full login, not silent resume — this lib's net_dead() design never void-parks a player, so prompt reconnects go through the ordinary registration-shaped login path), both clean. Driver killed by exact PID promptly after each boot; incidental fluffos.o save-timestamp churn reverted before commit.

Files modified this pass

§7.100 跨库扫描修复(ROOM 基类同款 replace_program() 致命形状)

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

深度功能测试(2026-09-04,round three,paid shop)

新角度:补上 2026-08-14 round two 没做成的真实购买。那次 buy dumpling from waiter 停在「你的钱不够」(新角色身无分文); 雷一鸣拜师已经完成,本轮不再拜师。

本轮没有新的 programming bug。log_file() 已有 assure_file()log_error() 已有 arning: 闸门。第一输入是 GB/BIG5 内码菜单 (0 = GB,1 = BIG5),不是把 id 直接喂给 get_id

实测过程

管理员 fluffos / Mud@2026 / 浮浮。端口 40011。先发 0 选 GB, 再发 id/密码。落地已经在凤求凰客栈(/d/fy/fqkhotel),店小二 id waiterclone /obj/money/gold 一次成功(这份档案的 clone.lpc 没有 is_admin() 门槛)。list 牛皮酒袋二十文 / 包子十五文 / 烤鸡腿三十文。buy dumpling from waiter 成功:「你向店小二买下一 个包子。」i 剩九十九两银子 + 八十五文钱(10000−15=9985)+ 包子。 save「档案储存完毕。」找零数学正确,不是钱被吞。

live debug.loglibs/fengyun434/log/debug.log(Boot Time Fri Sep 4 03:43:50 2026),无 error: / Too deep recursion。管理员 存档未提交。