info.html · 介绍 · play.html · 游玩 · llms.txt · 下载与本地运行 · ZIP · GitHub
风云四(风云Ⅳ,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
内容亮点
- 强调角色养成与门派归属,是典型的"风云"系武侠 MUD 玩法。
- 巫师登录设有 IP 白名单机制(本地/回环地址已一律放行)。
在线试玩
https://mudlibs.fluffos.info/fengyun434/
管理员账号 / Admin account
- id:
fluffos - 密码 / password:
Mud@2026 - 中文名 / display name: 浮浮
- 权限 / level:
(admin)—— 最高级别,通过/adm/etc/wizlist中的fluffos (admin)行授权。
警告:公开架站前请务必修改此默认密码。
本地运行
cd libs/fengyun434
~/src/fluffos/build-debug/src/driver config.fluffos游戏端口:40011。
NOTES · 移植与修复记录
fengyun4-3-4.rar → fengyun434
- Archive:
archives/fengyun4-3-4.rar(6MB — "风云Ⅳ"/"Storm Riders 4", Sumxin Fengyun,www.sumxin.com). Mudlib root atFengyun/fy4/, config atFengyun/bin/config.cfg. Different lineage from the 东方故事/ simple-style libs seen so far (its ownmaster.lpcshape). - Port: 40011.
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), static→nosave (50
files, notably low ratio vs other libs of similar size — this codebase
barely uses the idiom).
Known remaining issues
- 85 lpcc-sweep failures (of 8238) — 99% pass rate, the cleanest lib so far. Not triaged given the small remaining count and time budget; none blocked booting or the login flow.
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
- Formatter:
format-corpus.mjsover all 8238.lpcfiles; 6477 reformatted, 4 unchanged, 1757 refused (self-checkerrors/token mismatches, expected on a mega-lib this size — not chased down individually). One explicitTOKEN MISMATCHreported ford/for_martea/neon_playground/migong/adm/daemons/vrm_server.lpc(left untouched by the formatter itself, per its own refuse-don't-guess policy). - Proactive fix applied before the first boot attempt of this pass: same
adm/daemons/securityd.lpcresolve()-before-wiz_statusordering bug asfy3dz/fy3xd(same 风云 engine family) — fixed proactively before booting. (A second, emptyadm/securityd.lpcfile also exists in this lib but is dead/unused —SECURITY_Dinglobals.hpoints atadm/daemons/securityd, not it — left alone.) - Native retest against rebuilt driver: clean, zero fixes needed beyond the proactive one. Full registration +
look/score/quitverified with a real Chinese name (杨过), zero debug.log errors. - WASM test: boots and plays fully. Only non-fatal errors are the expected no-sockets-package ones (
ftpd.lpcandnetwork/dns_master.lpcboth fail to compile withUndefined function socket_create/socket_bind/socket_close,*No program in objectat preload — caught, non-cascading). Full registration with a real Chinese name (郭靖),look, andquitall completed cleanly. Not affected by the documentedquery_ip_number()WASM limitation.
WASM-enablement pass (loopback / admin seeding)
- Loopback ban bypass (§1.3b): two gates patched. 1.
adm/daemons/band.lpcis_banned()(~line 46) — short-circuit for non-string / empty /127.0.0.1/localhost/127.-prefix. Called fromadm/daemons/logind.lpc:80-81. 2.adm/daemons/logind.lpcvalid_wiz_login()(~line 528) — the wizard-IP whitelist gate (/adm/etc/wizip/<id>) destructs wizard logins from unlisted IPs; loopback/empty/non-string IPs now always pass (this gate feeds onquery_ip_number(), garbage under WASM). - Uptime gate / anti-flood throttle: none found.
- Admin account (§1.5):
fluffos/Mud@2026, display 浮浮, status(admin)viafluffos (admin)appended to/adm/etc/wizlist. No/adm/etc/wizip/fluffosfile exists (= unrestricted). Verified re-login +update /adm/daemons/combatd→ 成功. - Retest: fresh normal registration (秦风) works,
look/scoreOK, test char saves removed; no new debug.log errors. - Fail-closed retrofit (2026-07-24 security correction): the loopback check(s) above originally also treated an empty/non-string IP as loopback (defensive fallback for the then-broken
query_ip_number()). Since the driver's IP-reporting bug is now fixed upstream (WASM reports a clean127.0.0.1like native), that fallback was removed — loopback is now strictlystringp(ip) && (ip=="127.0.0.1" || ip=="::1" || ip[0..3]=="127."); anything unparseable/empty is untrusted/remote and goes through the original gate logic. Retested: fluffos login +look/quitstill clean over loopback. - Save files to force-add (untracked, NOT gitignored):
libs/fengyun434/work/data/user/f/fluffos/fluffos.o,libs/fengyun434/work/data/login/f/fluffos/fluffos.o.
深度功能测试 / 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 TestPw123
— kept (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.**
- Symptom: reproduced live by simply walking out of the eastern city gate (
westfrom/d/fy/egate.lpc, matching the very first direction change any player takes when leaving the starting city) — every singlegocommand out of that room threw a caught-but-real runtime error to the player's screen (执行时段错误:*Bad argument 4 to EFUN message()plus a full backtrace), becauseegate.lpc:47-48'svalid_leave()unconditionally callstell_room("/d/fywall/eupgate", "...")with only 2 arguments on *every* leave attempt in *any* direction, not just the ones the surrounding code apparently intended to gate it for. Unlike the §7.16/§8.3-style bugs this project has mostly been finding, this one is NOT silent — it's a visible on-screen stack trace — but it is still the kind of thing only a real walk-out-of-the-first-room test catches, since every earlier smoke pass only ever didlook/score/quitfrom the login room itself. - Root cause:
adm/simul_efun/message.lpc:38,varargs void tell_room(mixed ob, string str, object *exclude) { if (ob) message("tell_room", str, ob, exclude); }— when a caller omits the optionalexcludearray (176 call sites in this lib do, includingmessage_vision()'s own internaltell_room(v_room[i], str3)viewer fan-out at line 32 of the same file), the unset varargs parameter isint 0, not({}), and this driver'smessage()efun requires its 4th argument to beobject|array, notint. Confirmed against AGENTS.md §7.12, which documents the exact same shared-wrapper shape (there attributed toyueyingqiyuanand the ES II family) — this is the same bug class recurring in the unrelated 风云 engine lineage, not a new class. Notably, two OTHER 风云3-family siblings (fy3xd,fy3dz) already carry the fix (exclude || ({})) in their copy of this same file, but three more siblings in this lib's own immediate 风云Ⅳ/风云再起Ⅱ family (fy2005,fy2,fy2qh) pluszzfy(风云3) still have the unfixed version — worth porting centrally per this task's scope note (not done here, out of scope for this session). - Fix (
adm/simul_efun/message.lpc:39):
``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 || ({ }));
}
``
- Verified: reproduced live pre-fix (
westfrom the east gate threw the exact backtrace above, rooted ategate.lpc:48→tell_room()→message.lpc:39); killed and rebooted the native driver (simul_efun changes need a restart, not justupdate, to take effect reliably); re-walked the identical route (west×5,north,east×5 from the start room to the east gate, thenwestagain) — clean, no error, normal room transition. Also grepped the rest of the lib for any OTHER "int 0 passed as message() exclude" shape beyond this one shared wrapper — none found; this single fix point covers all 176 call sites since they all route through it.
What was tested and confirmed working
- Registration: real Chinese name (沈青梧), full flow (encoding choice → id → confirm → Chinese name → password → confirm → email → gender → ethnicity), landing correctly in the Han-ethnicity start room (凤求凰客栈) per
doc/help/newbie.txt's own documented room list. - Movement/exploration: walked a wide loop of the 风云城 starting zone (
d/fy/) — the central square (风云天下), east/west/north market streets, the jewelry shop, the 私塾学堂 (private school, its "24-point" math minigame sign/NPC), the beggar-clan street NPC area, and a hidden alley (阴暗石巷 → 石巷尽头, gated by a closed 木门 door opened withopen door) leading to a 峨嵋派 (Emei sect) safehouse. Room descriptions, exits, and NPC lists all rendered correctly throughout;help newbie.txtaccurately describes both the registration flow and the starting zone. score/hp/i: all three correct at every stage (fresh, post-sect-join, post-skill-learn) and matchdoc/help/newbie.txt's documented format exactly.- Sect-join mechanism:
apprentice master leion 雷一鸣 (a genuine 峨嵋派 recruiting master atd/fy/sroom.lpc, defining a properattempt_apprentice()/do_recruit()auto-accept flow) completed correctly two calls later (apprentice, then acall_out-delayedrecruit) —scoreafterward correctly showed "峨嵋派 弟子" title and "你的师父是雷一鸣". Important negative finding along the way, NOT a bug: the roadside "老乞丐" (Old Beggar,d/fy/npc/beggar.lpc) hascreate_family("丐帮", ...)set (giving it a sect-member title for flavor) but never definesattempt_apprentice(), soapprentice old beggarpermanently sits at "pending" and never completes — this looks like a bug on first glance but isn't: cross-checking the other 4 genuine 丐帮 NPCs in the lib (d/jinan,d/songshan,d/qianfo) confirms the *real* Beggar Clan recruiter lives elsewhere and this street NPC is intentionally decorative crowd-filler, not a broken recruitment path. Documented here so a future pass doesn't waste time re-diagnosing the same NPC. - Organic skill-learning:
skills master leicorrectly listed the master's 15 skills (gated —skills <other-player>correctly refuses for non-family: "只有管理或有师徒/夫妻/结拜关系的人能察看他人的技能");learn unarmed from master lei with 50correctly consumed 精力(gin) and 潜能(potential) and raised 扑击格斗之技(unarmed) from unlearned to level 1, with the expected "你的「扑击格斗之技」进步了!" narration. - Combat: no dedicated stat-mirroring training dummy found in the reachable starting zone (grepped
accept_fightbroadly — thed/shaolin/npc/muren.lpc"木人" pattern seen in sibling libs exists here too but is a strong, sect-gated NPC, not a newbie-safe sparring partner). Followed the checklist's documented fallback instead: found and fought the weakest roadside combat-capable NPC in the starting zone (无聊少年/d/fy/npc/dtz1.lpc, unarmed 20/dodge 20).kill shaoniancorrectly engaged combat (aggressive "heroism" attitude NPC accepted immediately), exchanged one round, and the built-in danger-avoidance logic auto-fled the character to an adjacent room before any real damage was taken (气血/HP unaffected: 300/300 throughout) — confirms both the attack path and the auto-flee safety net work correctly. - Shop purchase:
listat 凤求凰客栈's 店小二 (Waiter) correctly rendered the price table (wineskin/dumpling/fried chicken leg);buy dumpling from waitercorrectly refused with "你的钱不够" (insufficient funds) since a brand-new character starts with 0 money. Not completed live — the purchase command path is confirmed working up to the funds check, but an actual successful purchase was not exercised since reaching real starting capital would have required a separate income grind (the 私塾学堂 24-point game, the 长乐坊 conman, or quest rewards) outside this pass's time budget. quit+ debug.log grep:quitfrom 凤求凰客栈 produced the expected on-screen "欢迎下次再来!" and correctly dropped the low-value 布衣 with a narrated reason; greppeddebug.logfor everything written during the quit — zeroerror:/Too deep recursion/Too long evaluation/Bad argument/couldn't find objectlines, only routine compiler warnings from files touched during the session. Clean.- Net-dead / reconnect (prompt): opened a raw socket, logged in, disconnected uncleanly (socket close, no
quit) mid-session, then reconnected within ~15 seconds — landed back in the exact same room with no void-parking or stranding, "重新连线完毕。" printed as expected. This lib'sobj/user.lpcnet_dead()/reconnect()design is structurally immune to the AGENTS.md §7.20 bug class by construction: it nevermove()s the disconnected player into a temporary void room at all (unlike the FF/ES2-style pattern §7.20 describes) — the player object simply stays in its real room the whole time it's link-dead,net_dead()only doesset_heart_beat(0)/schedules auser_dumpcall_out, andreconnect()only resets the heartbeat and cancels that call_out. Confirmed by readingobj/user.lpc:121-149in full, not just inferred from behavior. - State persistence across a real driver restart (stronger than a same-boot reconnect — full disk round-trip): killed and rebooted the native driver, then logged back in as
shenqin— location (凤求凰客栈), sect membership (峨嵋派弟子, 师父雷一鸣), and skill progress (unarmed level 1) all correctly restored from disk. Inventory showed the 布衣 again despite the earlier quit narration claiming it was dropped — harmless flavor-text quirk (the "丢下" message appears to be generic quit narration, not an actual inventory removal), not investigated further given it has no functional impact.
Not verified live, and why
- Long-wait (900s) net-dead timeout → forced quit → reconnect: the code path was read in full (
obj/user.lpc'suser_dump(),NET_DEAD_TIMEOUT= 900s ininclude/user.h) and, since this lib never void-parks a disconnected player (see above),user_dump()'scatch(command("quit"))runs from the player's real, undisturbed room — the same code path already verified clean via the manualquittest above. The live 900-second wait was started (real wall-clock blocking sleep, not a background watch) but was deliberately aborted before completion when the driver's own RSS climbed from ~40MB at boot to ~4.5GB after about 15 minutes of connected-idle wall-clock time (sustained ~4-5MB/s growth, worth flagging — see below) — killed per this project's process-hygiene policy rather than let it grow further, and a fresh driver was rebooted for the remaining checklist items. Given the code-review finding (no void room in this lib's design) and the already-verified prompt-reconnect + real-restart persistence tests, the residual risk from skipping the literal 900s live wait is assessed as low, but stated explicitly rather than silently presented as fully verified. - WASM re-verification of the
tell_room()fix: not re-run this pass (native-only). The fix is a one-line change to a shared, platform-agnostic simul_efun with no WASM-specific code path, so risk is assessed as low, but it hasn't been literally re-tested underbuild-wasm. - Death/respawn: not reached — the one real combat attempt auto-fled before any damage, by design (see above), and deliberately seeking out a fight strong enough to kill a fresh, single-skill character felt like the wrong way to spend the remaining time budget once the
tell_room()bug and the RSS finding had already emerged. - 私塾学堂's 24-point math minigame: read and understood (
d/fy/washroom.lpc's "sign" item text plusnpc/taipo.lpc), and observed live once (given "3,3,3,4", the correct answer(3*3-3)*4=24was computed but not submitted in time before the character had already moved on to other test steps in the same session) — not confirmed to actually pay out; low-stakes flavor content, not chased further.
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 崩溃)
BULLETIN_BOARDinherit+ 多余replace_program()致命形状(AGENTS.md §7.86,post命令崩溃):全档案 15 处命中,已删除多余的replace_program(...)调用(保留inherit),逐文件保留原有行尾格式(CRLF/LF 按文件原样)。本次为跨库 §7.86 扫描修复(触发原因:该 bug 已在 6+ 个互不相关的血统家族独立确认,属于近乎普遍的拷贝粘贴模式),仅做编译检查(驱动干净启动、端口正常监听),未做完整 §10.7 深度游玩测试。
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
work/adm/simul_efun/file.lpc—log_file()assure_file()guard (with forward declaration),cat()null-guard.work/adm/daemons/logind.lpc— removed twoprintf("%O\n", ob)debug leaks (both name-confirmation branches).
§7.100 跨库扫描修复(ROOM 基类同款 replace_program() 致命形状)
- 同款
inherit ROOM; ... replace_program(ROOM);冗余自替换(AGENTS.md §7.100):与xsfyssjb(同为风云系血统)完全同构,work/下 1,188 处 存活匹配,全部标准独立行形式,脚本一次性删除,无不规则残留。没有房间 生成类工具,不涉及工厂模板修复。data/下额外核查过,无命中。验证: 真实 debug 驱动干净编译启动、端口正常监听,debug.log无新增 "cannot replace"/错误行。
§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
waiter。clone /obj/money/gold 一次成功(这份档案的 clone.lpc
没有 is_admin() 门槛)。list 牛皮酒袋二十文 / 包子十五文 /
烤鸡腿三十文。buy dumpling from waiter 成功:「你向店小二买下一
个包子。」i 剩九十九两银子 + 八十五文钱(10000−15=9985)+ 包子。
save「档案储存完毕。」找零数学正确,不是钱被吞。
live debug.log 是 libs/fengyun434/log/debug.log(Boot Time Fri
Sep 4 03:43:50 2026),无 error: / Too deep recursion。管理员
存档未提交。