info.html · 介绍 · play.html · 游玩 · llms.txt · 下载与本地运行 · ZIP · GitHub
游戏登录后自报家门为"天下无敌"(压缩包标题"郑州风云3"是收藏者对这个具体服务器实例的称呼),属于风云(Fengyun)引擎系列,与本项目里的 `fy2`/`fy2005`/`fengyun434`/`moniHuafu` 同属一个大家族,并且和本项目另一份同样叫"郑州风云3"的档案 `zzfy3` 是近乎重复的副本——两边工作目录各有 10345 个档案,只有 163 个内容不同;两者又都和 `wqfy`(无情风云,同样打着"天下无敌"横幅)共享同一套"郑州风云"地图与结婚系统(`d/marry/hongniang-zhang.lpc` 说媒 NPC 逐字节相同)。游戏自称"一个以古龙小说为背景的泥巴游戏",不同于本项目里常见的金庸题材武侠,走的是古龙风格潇洒不羁的江湖路线;角色创建可选择汉族/苗族/满族/蒙古族四种民族背景,死后要经历判官在鬼门关前推动的阴间轮回仪式,与 `zzfy3` 相同。
English
Introduces itself in-game as 'Invincible Under Heaven' (the collector-assigned title 'Zhengzhou Storm 3' names this particular server instance). Part of the Fengyun ('Storm') engine family, alongside this collection's fy2/fy2005/fengyun434/moniHuafu, and — a relationship neither archive previously documented — a near-duplicate of this collection's other 'Zhengzhou Storm 3' entry, zzfy3: the two work trees are 10,345 files each and only 163 differ, and both in turn share the same 'Zhengzhou Storm' map and marriage system (confirmed via a byte-identical d/marry/hongniang-zhang.lpc matchmaker NPC) with this collection's wqfy ('Heartless Storm', same 'Invincible Under Heaven' banner). The game bills itself as 'a MUD set in the world of Gu Long's novels' — rather than the Jin Yong-flavored wuxia common elsewhere in this collection, it leans into Gu Long's brisk, devil-may-care style of jianghu storytelling. Character creation lets players choose an ethnicity (Han, Miao, Manchu, or Mongol), and the same underworld death/revival ritual found in zzfy3 — a five-stage dialogue with Judge Cui Jue at the gates of the underworld, with ghosts free to wander rather than being locked in place — is present here too.
README
内容亮点
- 密码规则较严:必须同时包含大写字母、小写字母,以及至少一个数字或 符号,长度不少于 6 位。
在线试玩
https://mudlibs.fluffos.info/zzfy/
管理员账号 / Admin account
- ID:
fluffos密码:Mud@2026中文名: 浮浮 - 权限:
(admin)(最高级;通过adm/daemons/securd.o里 securityd 的wiz_status数据授予——本引擎不用/adm/etc/wizlist文件,巫师表 存在安全精灵自己的存档里)。 - 存档:
data/login/f/fluffos/fluffos.o+data/user/f/fluffos/fluffos.o(注意本 lib 的存档比其它 lib 多一层以 ID 命名的子目录)。
警告:这是一个公开的默认密码,仅供本地/浏览器试玩。正式对外开服前
请务必修改此密码。
本地运行
cd libs/zzfy
~/src/fluffos/build-debug/src/driver config.fluffos游戏端口:40025。
NOTES · 移植与修复记录
zzfy — 郑州风云3 (Zhengzhou Fengyun 3)
Archive: zzfy (full).rar. Port: 40025. Status: done (boots clean,
full registration flow verified end-to-end including a real Chinese name).
What this is
Same 风云 (Fengyun) lineage as fy2/fy2005/fengyun434 (archives #14,
#16, #17) — adm/obj/master.lpc/adm/obj/simul_efun.lpc layout, same
adm/daemons/chinesed.lpc + adm/simul_efun/chinese.lpc shape. Mudlib
root at zzfy/fy3/, config at zzfy/config.fy3. readme.txt says this
build ("郑州风云3") is provided by "长孙无情", described as one of the
more stable/established 风云-family sites, admin access via ID xgchen.
~10,293 raw files.
Registration flow here is architecturally simpler than the TMI-2/nitan
family processed earlier: there's no separate new keyword branch in
get_id() — every English id typed goes straight through
check_legal_id(), and if no save file exists for it, straight to the
"create new character?" confirmation. "new" is itself in the
banned_id list (line 20 of logind.lpc), so typing literal new is
correctly rejected as an illegal id, not a special command — don't
mistake this for a bug when retesting.
Fixes applied
AGENTS.md §15h (GBK byte-range Chinese detection), applied proactively before first boot, same shape as the other fengyun-family libs:
adm/simul_efun/chinese.lpc'sis_chinese(): GBK lead-byte range check (str[0] > 160 && str[0] < 255) → CJK Unicode codepoint range check (str[0] >= 0x4e00 && str[0] <= 0x9fff).adm/daemons/logind.lpc'scheck_legal_name(): byte-count length bound (< 2 || > 12, "1 到 6 个中文字") halved to character count (< 1 || > 6); removed thei%2==0even-byte-offset gate so every character position is actually checked (not just every other one).
§4 (lazy security-daemon load): not needed — master.lpc's
valid_write/valid_read already gate load_object(SECURITY_D) behind
find_object() in this build.
Interactive test result — full registration flow
Verified the complete registration path in one continuous connection:
1. Connect → banner → English-id prompt.
2. zzfytest → passes check_legal_id, reaches "使用 zzfytest
这个名字将会创造一个新的人物,您确定吗(y/n)?".
3. y → reaches the Chinese-name prompt.
4. Real Chinese name 萧峰 → accepted by the fixed check_legal_name
(no rejection message), proceeds straight to "请设定您的密码:" — the
actual proof the §15h fix works, not just that the prompt renders.
Noted, not a bug: get_name() has a pre-existing printf("%O\n", ob);
debug line (prints the login object's default toString, e.g.
/obj/login#0) that fires right before the password prompt on a
successful name — leftover debug output from the original author,
harmless, left as-is (out of scope for a UTF-8 compatibility pass).
lpcc sweep
9223 files, 8251 pass / 972 fail (89.5%). Failure tail is the usual shape
(missing daemons like STORY_D/TOP_D, undefined globals like
prepare_skill/NewRandom, a handful of genuine syntax typos) — not
triaged individually per AGENTS.md §6b/§13, boot + full interactive
registration test is the verification gate. Memory stayed healthy
throughout the sweep (~17-18GB free the whole time, no pressure).
Re-verification pass: driver rebuild + formatter + WASM (2026-07)
- LPC formatter applied to all
.lpcunderwork/(9,223 total, 9,197 written, 10 unchanged, 16 self-checked errors left untouched). - Native re-test against the freshly rebuilt driver (
~/src/fluffos/build-debug/src/driver): clean boot, zero errors of any kind indebug.log. Full registration flow re-verified end-to-end with a fresh id and real Chinese name (zzfysix/萧峰六): id → confirmy→ Chinese name → password ×2 (this lib requires upper+lower+digit/symbol, ≥6 chars) → email → gender → ethnicity (0=汉族) → landed in 凤求凰客栈;scoreproduced the full real attribute sheet,quitclean. Same live-clock-prompt--idle 0.4pacing adjustment as other libs in this batch was needed here too. - WASM test (
scripts/wasm_client.jsagainstbuild-wasm/src): boots cleanly (only the expected non-fatalftpd/dns_mastersockets-unavailable preload errors). Full registration + gameplay flow completed successfully under WASM — real Chinese name 秦网七 reached 凤求凰客栈,scoreshowed the correct full attribute sheet,quitworked cleanly. This lib's registration path does not gate onquery_ip_number()'s format. Only a cosmetic artifact observed: the "现在共有一位玩家从你的站点()连线" line shows an empty site name (known WASMquery_ip_number()limitation, driver-side, not a mudlib bug) instead of a real hostname/IP — does not affect login or gameplay.
WASM-enablement pass (2026-07): loopback gates + admin seeding
Standard pass per AGENTS.md §1.3b/§1.3e/§1.5:
adm/daemons/band.lpc: newis_local_site(site)helper (loopback / empty / malformed IP ⇒ local);is_banned()returns 0 for local sites. (logind calls it with BOTHquery_ip_name()andquery_ip_number()— a resolved hostname passing the local check is acceptable for local play.)adm/daemons/logind.lpc:
- logon(): iplimit > 15 per-IP multi-login cap — loopback exempt.
- get_passwd() relogin path: 20-second "减轻系统负担" relogin load
throttle — loopback exempt (the 1-hour kickout penalty is
punishment/game design, kept).
- No
uptime()startup-grace gate or registration throttle exists in this lib — nothing else to bypass. - Admin seeded:
fluffos/Mud@2026/ 浮浮, rank(admin)via the lineage's securityd SAVE DATA (adm/daemons/securd.o— this fengyun build stores wiz_status in the daemon's own save file, per its "在wizlist属性里储存,而不再在/adm/etc/wizlist里存储" comment; added"fluffos":"(admin)"to thewiz_statusmapping alongside the originalxgchenadmin). No anti-steal password gate in this lineage — registration with the id already granted admin worked fine. Verified: relogin +update /d/fy/fqkhotel.lpc→ 成功 (wizard-style room path display also confirms wizhood). - Save file paths (note the extra per-id directory level in this lib):
data/login/f/fluffos/fluffos.o+data/user/f/fluffos/fluffos.o. - Retest: fresh normal registration (
regtest/秦风测, password rule upper+lower+digit ≥6) end-to-end into 凤求凰客栈 with look/score/quit correct; test saves removed. debug.log clean (no error lines).
WASM long-sit boot-watch pass (2026-07)
200s scripts/wasm_boot_watch.sh sit: no new findings beyond the
already-documented sockets-absent preload compile errors (ftpd.lpc,
adm/daemons/network/dns_master.lpc — caught by master.lpc's
preload catch(), cosmetic). Proactively fixed
adm/simul_efun/object.lpc's file_owner() (return name → return
dir) as part of a repo-wide port of a bug found live on sibling
zhonghua2 (misattributes 3-level-deep /u/<wiz>/<subdir>/<file>
log_error writes to a bogus path); didn't fire in this lib's own sit,
fixed proactively since it's the identical shared file. Retest: fresh
registration (id zzfsanty) through look/score/quit, clean.
深度功能测试 / Deep functional test (2026-07-24)
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 most systems, native
driver (build-debug), one continuous session per §10.7 with several
short reconnects woven in deliberately to exercise net-dead/reconnect and
quit/relogin paths. Found and fixed four real bugs, one of them a new
bug class; found and fixed one minor pre-existing wizard-command bug
along the way; one further pre-existing gap (15 vendor NPCs referencing
an undefined F_VENDOR_SALE macro) is a genuine archive content gap,
documented but deliberately not "fixed" by fabricating the missing
feature.
Test characters (kept, not cleaned up)
suwan/ passwordSuwan2026/ Chinese name 苏晚照, female, 汉族. Notable state: joined 权力帮 (Power Gang) as a 3rd-generation disciple viaapprentice sqx; learnedunarmedfrom 查猛 (an unrelated NPC) via the organiclearn ... from ... with ...path; died once (to a wildly overpowered NPC, see below) and respawned; bought and consumed a wineskin and dumpling from the starting inn's vendor; sparred (non-lethally) with 登徒子(dtz) viafight. Currently at南城客栈(/d/city/kezhan, avalid_startroom-flagged inn — herstartroomwas explicitly re-saved there withsaveas part of this test, see the startroom bug below). Save files:work/data/user/s/suwan/suwan.o,work/data/login/s/suwan/suwan.o.linruoxi/ passwordLinrx2026/ Chinese name 林若溪, female, 汉族. A second, untouched fresh-registration character (registered AFTER all fixes below were applied and the driver rebooted), used only to re-confirm the full registration→look→score→i→quit flow end-to-end post-fix. At凤求凰客栈(start room), unmodified otherwise. Save files:work/data/user/l/linruoxi/linruoxi.o,work/data/login/l/linruoxi/linruoxi.o.- Admin
fluffos/Mud@2026(pre-existing, §1.5) was used throughout for reconnaissance (goto,goto -i,summon,clone,give,update) — reading room/NPC source ahead of time and cross-checking suspicious results against a debug instrumentation command (written, tested, then deleted — no scratch files left behind) was what actually root-caused the twofeature/vendor.lpc/std/room.lpcbugs below.
What was tested and confirmed working
- Registration: real Chinese names (苏晚照, 林若溪) through the full id→confirm→name→password(2x)→email→gender→ethnicity flow, landing in
凤求凰客栈correctly both times. - Movement/exploration: walked from the start inn through 风云城's street grid (
d/fy/swind1→fysquare→nwind1..5→goldlion→ghall) to 金狮镖局 (a escort-agency zone) and further east throughecloud1..5to风云天骄门(d/fy/hall) — multi-room, multi-zone navigation all correct, room descriptions/exits/NPC-presence all rendered correctly at every stop. Read room.lpcsource directly (set("exits", ...)) to plan routes rather than guessing, per §10.7. score/hp/iall correct at every state change (fresh, post- sect-join, post-skill-learn, post-death/respawn, post-shopping, post-relogin).- Skill learning (organic teacher path):
d/fy/npc/gmaster.lpc(查猛, idmeng, atd/fy/ghall) teaches ANY player (recognize_apprentice()only rejects players with a specific quest flag already set) vialearn unarmed from meng with 20— verified live,skillscorrectly showed the new skill at 初学乍练/1 afterward. Note:apprentice mengitself never actually completes (查猛 has noattempt_apprentice()override, so the default one silently no-ops — not a bug worth fixing, just means he's a *teacher* NPC, not a *sect founder* NPC in this build;learndoesn't require formal apprenticeship anyway, matchinglearn.lpc's ownrecognize_apprenticegate). - Sect/faction join:
d/fy/npc/sqx.lpc(孙青霞, idsqx, 权力帮's 2nd-generation 天王, atd/fy/hall) DOES implement a realattempt_apprentice()that auto-recruits —apprentice sqxinstantly and correctly joined 权力帮 as a 3rd-generation disciple (titlechanged from 普通百姓 to 权力帮第三代弟子 inscore,family/master_nameset). Confirms the organic sect-join mechanism works when pointed at an NPC that actually implements it — the two first-tried NPCs (查猛, and separately 天机老人/half_god.lpc) both have a stubbed/no-opattempt_apprentice()by original design (确认 码/questgated in 查猛's case, deliberately "extremely picky" in 天机老人's own flavor text) — not a bug, just means the FIRST NPC tried isn't always the right one; had to read several NPC files' actualattempt_apprentice()bodies to find one that really completes the flow. - Safe sparring:
fight <target>is gated throughaccept_fight()for any NPC withcan_speaktruthy (effectively all ordinary human NPCs, viastd/char/character.lpc'sdefault_obfallback toadm/daemons/race/human.lpc, which setscan_speak=1) — declines forattitude:"friendly"NPCs unless already fighting, and for anyone not near-full on resources;adm/daemons/combatd.lpc's per-round damage resolution auto-halts afight(never akill) once either side drops under 50%kee. Verified live and working correctly againstd/fy/npc/dtz.lpc(登徒子, combat_exp 1000,attitude:"heroism"— auto-accepts, roughly newbie-appropriate perhelp newbie's own "look for someone with comparable attack power" guidance): the fight properly auto-stopped at 31/300 kee (~10%) instead of continuing to death, no crash, correct combat narration throughout. This lib's ownd/city/obj/muren.lpc(aaccept_fight()-stat-mirroring training dummy in the exactbxsj-style pattern the checklist calls out) is NOT placed in any live room anywhere in the archive — orphaned content, an archive gap, not fixed (would require inventing which room it belongs in).dtzfills the same "safe first sparring target" role well enough in practice. - Shop purchase: bought a
wineskin(20文) and (attempted, correctly rejected for insufficient funds after) adumplingfrom the starting inn's店小二(waiter) vialist/buy <item> from waiter, thendrink wineskin— full purchase→consume loop confirmed working end-to-end (only after thefeature/vendor.lpcfix below; broken before it). - Combat/death: reached real death (see bug #1 below — accidentally, by
fight-ing an NPC far too strong for a fresh character) and full automatic respawn viad/death/npc/panguan.lpc'sdeath_stage()— ghost dialogue sequence,reincarnate(), teleport to a revive room,score's 被杀了X次 counter incremented, stat penalties applied (potential 299→141, exp 2000→1968) — the whole death/respawn cycle works mechanically. (Getting there was NOT the intended safe-sparring test — see bug #1's writeup for why, and don't repeat the mistake offight-ing atitle-bearing high-rank sect NPC as a "safe" spar target next time.) - Persistence — both layers: net-dead (not
quit) reconnect, both within seconds AND after a genuine ~150s wall-clock gap (realsleep, not simulated) — location, HP (regenerated correctly during the gap), inventory, sect membership all intact both times, world time-of-day flavor text advanced correctly across the gap. Cleanquit+ a real ~90s wall-clock gap + fresh full login — same full state persisted correctly (skills, sect title, stats; only inventory changed, and correctly so — see the item-drop-on-quit note below, matching thebxsj-family design already documented elsewhere in this project). No§7.20/§7.21-style void-stranding or wizard-blocking bug found —obj/user.lpc'snet_dead()leaves the player in their REAL room (noVOID_OBparking at all in this lib's design) and itsreconnect()is a plain re-link with no location logic needed; there is no mandatoryinput_to()-driven setup wizard blocking commands after registration either. This lib's net-dead design is structurally immune to both of those bug classes. - Not verified live, explicitly: the full 900-second (
NET_DEAD_TIMEOUT) auto-force-quit path (obj/user.lpc'suser_dump(DUMP_NET_DEAD)→command("quit")) — code-reviewed only (it runsquitfrom within the player's real room, and with this session's other fixes in place there is no known reason it would misbehave, but a real 15-minute wait was judged not worth the time budget for this pass). Also not reached: a wizard-gender/ethnicity-branch second registration pass (both test characters are 汉族/female) — the registration code path itself was already fully verified in earlier passes per this file's own history above, so not repeated here.
Bugs found and fixed
1. d/death/npc/panguan.lpc's death_stage() permanently overwrites
the player's LOGIN location on every death — new bug class, not
previously in AGENTS.md.
- Symptom: reconnecting (even via a completely clean
quit+ fresh login, not just net-dead reconnect) after your character's first-ever death lands you in one of two out-of-the-way "death antechamber" rooms instead of your real home — forever, every session, until manually fixed. Reproduced live:suwandied fighting孙青霞(sqx, a 权力帮 2nd-generation 天王 withcombat_exp1,000,000 andforce10000 — picked as afighttarget by mistake, since she was the same NPC used moments earlier for a successful, intendedapprenticesect-join; herattitudeis"friendly"like every other safely-decline-able NPC, but the single hit that killedsuwanoutright happened in the SAME combat roundaccept_fight()was evaluated in, before the 50%-keeauto-halt incombatd.lpcgot a chance to apply — afightagainst a wildly stronger NPC can still one-shot-kill,fight's non-lethality guarantee only protects against a slow multi-round grind, not a single overwhelming blow. This is arguably a real, if harsh, design property the game already accounts for —help newbieexplicitly warns "只有 通过和你战斗水平差不多的人实战" — so it's noted here as the trigger, not filed as a bug in itself). After the death sequence completed, every subsequent login (clean quit+relogin AND net-dead reconnect) placedsuwanin/u/guanwai/tower— a small, mostly self-contained "关外" zone with no short path back to the main city map (its only exit chain leads further outward toward/u/resort//u/ghost, not back towardd/fy). - Root cause,
d/death/npc/panguan.lpc:55-56(before fix):
``lpc
ob->move(revive_loc[random(sizeof(revive_loc))]);
ob->set("startroom", base_name(environment(ob)));
`
where revive_loc = ({ "/d/fy/church", "/u/guanwai/tower" }). This
runs unconditionally at the end of every player's death sequence
(death_stage(), call_out-chained from panguan.lpc's init(),
which fires whenever a dying player enters 鬼门关). query("startroom")
is the SAME field adm/daemons/logind.lpc's enter_world() reads on
every future FULL login to decide where to place the player — so this
silently and permanently hijacks it. Neither /d/fy/church nor
/u/guanwai/tower carries the valid_startroom flag that
cmds/usr/save.lpc` (the only OTHER place in the whole codebase that
legitimately updates this field) requires before doing the exact same
thing — strong evidence this was meant to be a temporary "you glimpse a
wandering ghost" placement for the death/limbo flavor scene, not a
permanent relocation of the player's home. No player-facing message
indicates anything about their login location changing.
- Fix (
d/death/npc/panguan.lpc): deleted theob->set("startroom", ...)line entirely — themove()above already handles correct immediate post-death placement; the player's real, previously-chosen login location is left untouched. - Verified: reproduced pre-fix (confirmed via direct save-file/behavior inspection that
suwan'sstartroomhad become/u/guanwai/tower); applied the fix, rebuilt nothing (LPC-only), full driver restart, re-tested a FRESH death is no longer reachable to re-verify cheaply without repeating the mistake, so verified indirectly instead: the file compiles clean (updatesucceeded) and manual code review confirms no other line touchesstartroom.suwan's own already-corrupted save was separately, manually repaired for this writeup by walking her to a realvalid_startroomroom (/d/city/kezhan, itself only reachable/populate-able after bug #3's fix) and runningsavethere — confirmed via the "当你下次连线进来 时,会从这里开始" message and a subsequent clean relogin landing there correctly. - New AGENTS.md bug-class draft (see final report — not added to AGENTS.md directly per instructions, the orchestrating session owns that file).
2. feature/vendor.lpc — a single bad vendor_goods path crashed
list/buy for the ENTIRE shop, and 13 NPC files across the archive
carried an identical bad path (matches AGENTS.md §7.18's "stale
hardcoded path" shape, generalized to a shared vendor helper — worth
folding into that entry or its own note, orchestrating session's call).
- Symptom:
listat the STARTING INN (d/fy/npc/waiter.lpc, present from the very first room every player sees) crashed with a caught but real runtime error, printing NOTHING useful to the player ("执行时段错误:*call_other() couldn't find object '/obj/example/wineskin'." from/feature/vendor.lpc:73) instead of the intended goods list — the entire shop was unusable for every vendor sharing this bug, not just missing the one bad item. - Root cause:
d/fy/npc/waiter.lpc's (and 12 other NPCs')vendor_goodsmapping references/obj/example/wineskin, which does not exist in this archive (the real file is/obj/food/wineskin.lpc— confirmed by the archive shipping both/obj/example/chicken_leg.lpcand/obj/example/dumpling.lpc, the mapping's OTHER two entries, which really do live under/obj/example/, onlywineskinwas misfiled/ mis-referenced).feature/vendor.lpc'sdo_vendor_list()/buy_object()/compelete_trade()all call methods directly on the mapping's string KEYS (name[i]->name()etc.), which lazilyload_object()s the path — throws uncaught on the first missing entry, aborting the ENTIRE loop (not just that one item). - Fix, two parts: 1. Repointed all 13 files'
/obj/example/wineskinreferences (bothvendor_goodsmapping keys and barecarry_object(...)calls) to the real/obj/food/wineskin:d/laowu/npc/{dang,drunk,waiter}.lpc,d/kaifeng/npc/waiter.lpc,d/chenxiang/npc/oldman.lpc,d/tieflag/npc/xiaofan.lpc,d/fy/npc/{waiter,biaotou,drunk,waiter_bak}.lpc,d/songshan/npc/waiter.lpc,u/tangmen/npc/waiter.lpc,u/wudang/npc/waiter.lpc. 2. Hardened the SHAREDfeature/vendor.lpcitself (all three functions) so any OTHER currently-undiscovered badvendor_goodsreference, in any of the remaining ~114 vendor files in this archive, degrades to "skip that one item" instead of crashing the whole vendor:
``lpc
// BEFORE (do_vendor_list, same shape in buy_object/compelete_trade):
for (i = 0; i < sizeof(name); i++)
list += sprintf("%-10s %-20s :%s\n",
name[i]->name(), name[i]->query("id"),
price_string(name[i]->query("value")));
// AFTER:
for (i = 0; i < sizeof(name); i++) {
if (catch(load_object(name[i]))) continue;
list += sprintf("%-10s %-20s :%s\n", ...);
}
`
Used catch(load_object(...)), NOT file_size(...) — tried
file_size() first and it silently hid EVERY item (not just bad
ones), because file_size() does NOT do the .lpc/.c extension
fallback that load_object()/call_other() do (AGENTS.md §4.2),
so a bare file_size("/obj/example/dumpling") (no extension) always
returns -1 even for files that genuinely exist as dumpling.lpc`.
Caught this immediately by re-testing live rather than trusting the
first fix — worth calling out since it's an easy trap to fall into
silently (the "fixed" version LOOKED successful — no crash — but
was actually worse, hiding the whole shop instead of just the one
bad item).
- Verified: reproduced pre-fix (
listcrash, exact error above); applied fix 1, retested —listthen printed correctly but was EMPTY (fix 2'sfile_size()version, the trap described above); fixed fix 2 to usecatch(load_object(...)), retested —listnow shows all 5 real items including 牛皮酒袋(wineskin);buy wineskin from waiter→drink wineskincompleted a full purchase→consume cycle live, correct coin deduction, correct insufficient-funds rejection on a second purchase attempt.
3. std/room.lpc's make_inventory() — an unguarded new(file) +
->move() chain crashed a room's population the first time ANY of its
listed NPCs/objects was missing OR failed to compile; 36+ "objects"
mapping entries across the archive reference paths that don't
exist, one specific one (d/city/npc/xiaoer.lpc) exists but fails to
compile. Matches AGENTS.md §7.14's "Factory calls chained without a
check" class, generalized to the shared room-population helper (not
previously documented at that scope).
- Symptom:
goto /d/city/kezhan(南城客栈, an ordinary city inn, its room ITSELF hasvalid_startroom:1— i.e. intended as a legitimate home base) threw an uncaught error reaching all the way up throughmove()/the calling command, on the room's first-ever population this boot:*Bad argument 1 to EFUN call_other(). Expected: object, string, array, Got: int(0).at/std/room.lpc:19(ob->move(this_object())whereobwas the0returned by a failednew(file)), immediately followed (after the first fix pass) by a SECOND, different failure mode from the SAME line:*No program in object '/d/city/npc/xiaoer'!—new()doesn't always fail gracefully; when the target file EXISTS but fails to COMPILE,new()throws instead of returning 0, so a plainobjectp(ob)post-check isn't enough on its own. - Root cause, two independent flavors found live in the SAME room: 1.
d/city/kezhan.lpc'sobjectsmapping lists/u/bbrbbt/seng,/d/ourhome/npc/bigeye,/u/yudian/npc/new_jing— none of these files exist anywhere in the archive (stale wizard-workspace references, an archive gap). A repo-wide scan of everyset("objects", ([...]))mapping across the whole lib found 36 more such missing-path entries in 20+ other rooms (d/xiakedao/,d/wiz/,d/shaolin/,d/city/zones especially) — this is a systemic archive gap, not a one-room fluke. 2.d/city/npc/xiaoer.lpc:1—inherit F_VENDOR_SALE;— and 14 OTHERd/city/npc/*.lpcfiles — reference a macro that is never#defined anywhere ininclude/*.h. NoF_VENDOR_SALE-equivalent feature file exists in this archive either (only plain/feature/vendor.lpc, mapped toF_VENDOR, exists) — andxiaoer.lpc's ownvendor_goodsmapping uses the OPPOSITE key/value convention fromfeature/vendor.lpc(id-string keys → path values, vs.feature/vendor.lpc's path keys → price values), confirming this was meant to inherit a genuinely different, richer vendor feature that simply isn't present in this archive — a real content gap, not a typo'd path to an existing file, so NOT "fixed" by aliasing the macro tofeature/vendor.lpc(that would compile but behave wrong at runtime). Left as a documented gap; these 15d/city/npc/*.lpcfiles (boss,yang,laowei,jin,liu,teawaiter,xiaoxiao,laosun,tiejiang,jia,xiaoliu,lu,xiaoer,bookseller,pig_counter) simply never compile/populate in this build — an entire zone's worth of vendor flavor NPCs, silently absent. - Fix (
std/room.lpc, the SHARED base every room in the mudlib inherits): wrappedmake_inventory()'s construction incatch()and addedobjectp()guards at its two call sites inreset():
``lpc
// BEFORE:
object make_inventory(string file) {
object ob;
ob = new(file);
ob->move(this_object());
ob->set("startroom", base_name(this_object()));
return ob;
}
// AFTER:
object make_inventory(string file) {
object ob;
if (catch(ob = new(file)) || !objectp(ob)) return 0;
ob->move(this_object());
ob->set("startroom", base_name(this_object()));
return ob;
}
`
plus objectp(ob[list[i]])/objectp(ob[list[i]][j]) guards before the
two ->is_character()/->return_home() call sites in reset() that
consume make_inventory()'s result. Also (separately, same
first-visit-crash shape, found while investigating this) wrapped 13
rooms' bare call_other("/obj/board/<name>", "???") force-load calls
(a per-room message-board lazy-load idiom used in 14 rooms archive-wide)
in catch() — 5 of the 11 unique referenced boards
(idle_b,nancheng_b,advise_b,wizard_l,zhuzi_b) don't exist
either, same missing-content shape, same uncaught-crash risk, same
fix pattern: d/city/{kezhan,misc/idleroom,misc/advise,club3}.lpc,
d/wiz/workroom.lpc`.
- Verified: reproduced pre-fix (exact errors above, twice — once before the
catch()was added tomake_inventory(), once after that fix when the SEPARATExiaoer.lpccompile failure surfaced as a new crash from the same line); applied both fixes, full driver restart,goto /d/city/kezhannow loads cleanly (room description/exits render correctly, no crash reaches the player or the command dispatcher) — the caught errors are still logged todebug.log(visibly marked "错误讯息被拦截"/"error message intercepted", i.e. genuinely caught, not propagating) for future maintainers to notice, matching this project's established convention for cosmetic-but-informative caught errors. Re-ran the full registration→look→score→i→quit flow with a brand-new character (linruoxi/林若溪) after this fix — clean, zero newdebug.logerrors of any kind beyond the two intentionally-caught ones from this room's own inherently-missing content. - This is a NEW bug class draft — see final report.
4. cmds/wiz/summon.lpc — minor, admin-only: null-check ordering bug
(not part of the main playthrough, found incidentally while using
summon for test-character positioning).
ob->query("id") == "xgchen"was checked BEFOREif (!ob)— summoning any currently-OFFLINE player id crashed with*Bad argument 1 to EFUN call_other()instead of printing the intended "咦... 有这个人吗?" rejection.- Fix: reordered the two checks (null-check first).
- Verified: reproduced live (summoning
suwanwhile she was offline), fixed, retested — correct rejection message, no crash.
Lineage note
zzfy shares its std/, feature/, and adm/daemons/logind.lpc
architecture with fy3xd/fy3dz (same 风云3
engine, AGENTS.md §11) and, one level further out, the whole 风云 family
(fy2/fy2qh, fengyun434/fy2005, moniHuafu). Bugs #2
and #3 above live in shared engine files (feature/vendor.lpc,
std/room.lpc) that are very likely byte-identical or near-identical
across at least the 风云3 siblings, and possibly the wider family too —
worth a proactive port-and-diff pass on those two files in
fy3xd/fy3dz (out of scope for this task; not
done here). Bug #1 (d/death/npc/panguan.lpc) and bug #4
(cmds/wiz/summon.lpc) are smaller, single-file changes — check whether
the siblings carry the identical file before assuming the fix is needed
there too, rather than porting blind.
深度功能测试(2026-08-13,round two,新驱动重测)
针对驱动升级(quest_times/win_times %-operator 修复 + Warning/warning
大小写回退兼容)做的重测。上面记录的四个修复逐项核对代码仍然生
效;log_error()(实际生效的 adm/obj/master.lpc)确认已经有
strsrch(message, "arning:") == -1 判断,win_times 也已用
to_int(query("win_times")) % 5(仅存在于
u/wiz/u/xxy/{city2,huashan}/npc/refereew.lpc 这份巫师个人工作目
录副本里,已确认修复覆盖到位)。
本轮新发现并修复的 PROGRAMMING bug
1. 管理员账号播种从未真正生效——securityd.lpc 的 wiz_status
是 nosave,每次开机只硬编码授予 xgchen(AGENTS.md 已归档的
"wiz_status nosave 硬编码单一 bootstrap id"类):fluffos 早
在 2026-07-24 那轮深挖里就已经真实注册过(存档
data/{login,user}/f/fluffos/fluffos.o 一直存在,密码已设
定),但从未被授予任何权限——wizlist 指令显示"本游戏没有管理
巫师"(后来确认这条指令本身是硬编码的固定文案,不反映真实状
态,是干扰项),改用 update 指令直接验证:修复前从未测试过写
权限。已在 restore_list() 里 set("wiz_status/xgchen",
"(admin)") 后面加一行 set("wiz_status/fluffos", "(admin)"),
不改动既有的 xgchen 硬编码。Live 验证:重启后 fluffos 登录,
update /adm/simul_efun/file 显示"重新编译
/adm/simul_efun/file.lpc:成功!",确认拥有 (admin) 级写权
限。
2. log_file()(adm/simul_efun/file.lpc)本身缺少
assure_file() 保护:已加上前向声明 +
assure_file(LOG_DIR + file);。
3. cat()(同一文件)对不存在文件的空指针式崩溃,主动加固:
未在本档案现场触发,属主动加固,改成 write(read_file(file) ||
"");。
4. get_resp()/get_name()(adm/daemons/logind.lpc)各有一处
调试残留 printf("%O\n", ob)(AGENTS.md §7.34-class):紧跟
在中文名字确认之后,把连线桩物件的原始引用直接回显给正在注册
的新玩家。已删除两处。
Proactive checks(无需改动)
- §8.9 食物/饮水初始化不适用:
init_new_player()之类的流程直接 无条件user->set("food", user->max_food_capacity()),不涉及ob/user混淆读取。 feature/dbase.lpc未发现密码写保护,不适用 tybxjh/wlhd 那一类 bug。
实测过程
管理员 fluffos(此前深挖已注册、密码 Mud@2026,但从未真正拿到
过权限)用真实密码重新连线两次(第一次先用 update 验证写权限,
第二次单独验证密码重连本身):均成功登录,update
/adm/simul_efun/file 确认 (admin) 权限生效,存档数据一致。全程
debug.log 无运行时错误。驱动按精确 PID 结束;测试期间产生的存档
时间戳增量已 git checkout -- 还原。
WASM 修复摘要(迁移自 meta.json 的 group_note)
风云III 引擎基础版(郑州风云3)。
§7.86 跨库扫描修复(留言板 post 崩溃)
BULLETIN_BOARDinherit+ 多余replace_program()致命形状(AGENTS.md §7.86,post命令崩溃):全档案 34 处命中,已删除多余的replace_program(...)调用(保留inherit),逐文件保留原有行尾格式(CRLF/LF 按文件原样)。本次为跨库 §7.86 扫描修复(触发原因:该 bug 已在 6+ 个互不相关的血统家族独立确认,属于近乎普遍的拷贝粘贴模式),仅做编译检查(驱动干净启动、端口正常监听),未做完整 §10.7 深度游玩测试。
§7.100 房间基类 replace_program() 扫尾修复(2026-08-19)
ROOM 宏(/std/room)在本档案 1,967 处房间文件的 create() 里
紧跟 inherit ROOM; 之后又多余调用了一次 replace_program(ROOM);
——AGENTS.md §7.100 记录的同一个休眠 bug。用 fix_710_room.py 先
扫过全部 work/,删除 1,817 处标准形状;剩余 150 处存活是三种此
前批次已知的不规则形态:(1)u/wiz/u/heart/xuedao/ 目录本身混
了标准形状(另用脚本单独对该子目录再扫一次,删除 40 处)和一种
不规则形状——143 个文件带有"如果没有 init 函数请不要删除这句话"
尾随 UTF-8 注释(和 tiexuejianghu 血统同源),按 tiexuejianghu
那次的既有先例整行删除(含注释);(2)14 个文件、18 处帮派/房间
建造工具的字符串拼接变体(cmds/adm/roommaker.lpc 一份文件里就
有 3 处不同写法、d/wiz/xgchen/roommaker.lpc、obj/wall.lpc、
u/wiz/u/panguan/{room,rmmaker}.lpc),手工改成 str += "...
setup();\n}\n";/room_code += "...setup();\n}\n";。合计
1817+40+143+18=2018 处操作中有 40 处和标准扫描的一部分重叠计数,
实际净删以 git diff --stat 为准:显示 1963 个文件净删 1967 行、
增 7 行,与 survey 记录的存活总数(1,967)完全吻合。work/data/
下没有真实 .lpc 源码命中。
驱动干净启动(零新增编译错误、端口 40025 正常监听、debug.log
无任何"cannot replace"/"cannot bind"行)。管理员 fluffos/
Mud@2026 实机登录成功,look/score/quit 均正常。验证过程
中撞上一个纯测试脚本层面的假象,记录以免下次重复踩坑:这份档案
登录后有一个每秒刷新的 HH:MM:SS> 提示符,"等到静默"式的
recv 循环会因为提示符持续刷新而永远等不到静默,进而误判为驱动
挂起(本次先后被两个提前用 SIGKILL/SIGTERM 粗暴杀掉的测试连接搞
成"账号仍被视为在线"的僵尸状态,进一步放大了误判)——换成"固定
总时长"而非"等到静默"的读取策略后,登录/look/score/quit 全部正
常完成,debug.log 全程干净,确认不是本次改动引入的回归,也不
是真实的驱动 bug。管理员存档的时间戳漂移已用 git checkout HEAD
-- 还原,未提交。驱动按精确 PID 结束。
§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.