New Immortal Companions' Bond: Age of Mist

✅ 可玩

新仙侣情缘之飘渺纪元

xlqy_new2007

🔑 fluffos / Mud@2026 更新 9235b8d 2026-09-01 源码 下载 ZIP

▶ 开始游玩 · Play Now

新仙侣情缘之飘渺纪元是"仙侣情缘(早期测试版)"(xlqy_early)这套以《西游记》取经旅程为背景的仙侣题材 MUD 更完整、更成熟的一个开发版本,故事围绕西天路上的人物羁绊、仙魔恩怨展开,游戏内建有完整的门派、天赋、新闻系统,新角色创建时能自行分配体格、根骨、悟性、灵性四项天赋点数,并比 xlqy_early 多了一步正式的天赋点数确认环节;经逐字节比对确认,本档案与 xlqy_early、"浙大版"(xlqyzdb)其实是同一位作者笔下同一个世界观的三个开发快照,公共路径下 84%-86% 的文件完全相同,而本站另收录的 2001 年"知秋"存档(xianlvqiyuan)虽是更远的同源近亲,文件层面的重合度却只有约 10%。

English

A more complete and mature build of the Journey-to-the-West-themed immortal/mortal romance world found in this collection's "Immortal Companions' Bond (Early Test Build)" (xlqy_early), subtitled "Age of Mist." It fleshes out full sect, talent, and news systems, and new characters allocate four talent points (physique, bone-root, comprehension, and spiritual affinity) through a dedicated confirmation step during registration that the early build lacks. A byte-level file comparison confirms this is genuinely the same authored game world as xlqy_early and the "Zhejiang University edition" (xlqyzdb) rather than just a shared engine — 84-86% of common-path files are identical across all three. A more distant relative, the 2001 "Zhiqiu" snapshot (xianlvqiyuan), shares the setting and overall lineage but only about 10% file-level overlap.

README

内容亮点

在线试玩

https://mudlibs.fluffos.info/xlqy_new2007/

管理员账号 / Admin account

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

本地运行

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

游戏端口:40022

NOTES · 移植与修复记录

xlqy_new2007 — 新仙侣情缘之飘渺纪元 (New Immortal Companion's Fated Love: Ethereal Era)

Archive: xlqy_new2007.rar. Port: 40022. Status: done (boots clean, connects, plays through GB/BIG5 selection and into the age-verification gate with zero fatal errors).

What this is

"ES II mudlib" lineage again (adm/obj/master.c's header comment: "for ES II mudlib... rewritten by Annihilator"), same family as rzrmud (#23) and xkx2001 (#25). Archive extracts to a 复件 xlqy_new/ ("copy of xlqy_new") folder — note the leading Chinese text + space in the directory name, handled fine by convert_lib.sh/cp -r as long as it's quoted throughout.

Found and fixed a real bug in extract.sh while processing this archive: the .rar extraction branch cds into the destination before referencing the (relative) archive path, so unrar couldn't find it and silently produced an empty raw/ while the script still reported success (no -e, exit 0 either way). Fixed in scripts/extract.shARCHIVE is now resolved to an absolute path up front, and the script now checks raw/ actually has files and fails loudly if not, for any archive type. See AGENTS.md's "Archive tooling" section for the writeup; this could in principle have silently affected other .rar archives run through the old script, though every previously-committed lib's work/ already passed its own boot test, so nothing already marked done is suspect.

Fixes applied

1. extract.sh (see above — a tooling fix, not lib-specific). 2. adm/daemons/convertd.lpc:258: the exact AGENTS.md §8h stray- trailing-backslash-before-closing-quote typo in the Greek-alphabet conversion table ("Ρ\","Ρ", — this lib's specific character was Rho, not Alpha like the previously-seen instances), recurring for the third time in this "西游记/ES"-adjacent family (xyj2000f, mhxy, now here). This file has plain LF line endings (not CRLF like mhxy's copy) — used sed -i -E 's/\\"(,)?$/"\1/' directly; caught and had to correct a mistake: initially reused the CRLF-safe pattern from AGENTS.md §8h verbatim (s/\\"(,)?\r?$/"\1\r/), which unconditionally appends \r in the replacement even when the original line had none, injecting a spurious \r into this LF-only file's one fixed line. Verified with cat -A before and after; stripped the stray \r back out. Lesson for next time this recurs: check whether the file actually has CRLF (file <path> or cat -A a sample line) BEFORE choosing which of the two sed patterns to use — don't default to the CRLF-safe one "just in case", since its replacement isn't actually conditional on the match. convertd.lpc is #included into many other daemon files, so this one fix should improve the lpcc pass rate substantially (initial sweep pre-fix: 8845/9060 = 97.6%, with hundreds of the failures being "In file included from .../convertd.lpc" cascades — re-swept after the fix, see below).

Observed but not diagnosed: one non-fatal runtime error during login

The connect-time banner sequence prints the configured default error message string ("你发现事情不大对了,但是又说不上来。") once, between the Beijing-time line (chinesed.lpc's bj_time()) and the registered- player-count line — i.e. some error is happening around logind.lpc's UPTIME_CMD->report() call, but it's evidently caught/ non-fatal (execution continues normally to the age-verification prompt and beyond) and produced no trace at all in debug.log (same silent-error shape as AGENTS.md §15d, though not chased down with the same catch()-instrumentation technique here since it isn't blocking anything). Flagging for whoever revisits this lib's cmds/usr/uptime.lpc or UPTIME_CMD->report() next.

Interactive test result

Boots clean, connects; ASCII-art banner + Chinese render correctly, GB/BIG5 selection prompt works, uptime/registration-count lines print (with the one non-fatal error noted above), reaches the age-verification ("are you a student?") gate with zero fatal errors. Did not proceed further into character creation (out of scope for this pass).

lpcc sweep

Initial sweep (before the convertd.lpc fix): 9060 files, 8845 pass / 215 fail (97.6%), with a large fraction of the failures being convertd.lpc inclusion cascades. Re-run after the fix — see the fresh numbers in this lib's lpcc_fail.log (not hand-copied here to avoid this note going stale relative to the regenerable file itself).

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

2026-07-23: driver rebuild retest + LPC formatter + WASM check

WASM-enablement pass (loopback-allow / gate bypass / admin seed)

Standard WASM-first pass per AGENTS.md §1.3b/e and §1.5. Gates patched (same shapes as sibling xlqy_early):

- logon() reconnect-flood throttle (last_ip==ip && time+10>time, ~line 96) — loopback exempt. - logon() per-IP connection cap (logon_cnt > 10, ~line 113) — loopback exempt. - encoding() !ip_name destruct + dotted-quad char-loop validator (~lines 195-207) — wrapped in if (!is_loopback_conn(ob)); this was the WASM-fatal gate. - No uptime() startup-grace destruct gate; the uptime() at ~line 155 is the 300s newid registration window (content) — left intact.

Admin account seeded: id fluffos, pw Mud@2026, name 浮浮, granted (admin) via fluffos (admin) line prepended to adm/etc/wizlist. Verified: real registration flow (gb/no/new/fluffos/浮浮/pw×2/email/m/ 9/y → entered world), then relogin as fluffos → status (admin), update /adm/daemons/logind → 成功. Retest: fresh normal registration (秦风, gender f) end-to-end with look/score/quit all correct; test char save removed; zero new debug.log errors. Save file: work/data/user/f/fluffos.o (NOT gitignored — orchestrator adds normally, no force-add needed).

Fail-closed retrofit for the loopback-allow gate (2026-07-24)

The loopback helper above was originally written matching the project-wide convention at patch time (AGENTS.md §1.3b), which also treated an empty/non-string/malformed query_ip_number() result as loopback, defensively, because the WASM driver used to return garbage there. That underlying driver bug is now fixed (fluffos commits e33bb5da "fix: query_ip_number() returned uninitialized garbage under WASM" and 007bb863 "feat: synthetic resolve() on WASM instead of raising an LPC error", both 2026-07-23; the locally-built build-debug/build-wasm binaries already postdate both commits), so treating unparseable IPs as trusted is a fail-open gap with no remaining justification. Retrofitted to fail-closed: loopback is now strictly ip == "127.0.0.1" || ip == "::1" || ip[0..3] == "127." (with a stringp() guard before the slice) — a malformed/empty IP now falls through to the NORMAL gate instead of being treated as local. Retested after tightening: fresh driver boot clean, fluffos loopback login and its wizard update command both still work; zero new debug.log errors.

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

First real *playthrough* pass on this lib (all prior passes stopped at registration + look/score/quit; see AGENTS.md §10.7). Native driver (build-debug), one continuous scripts/mudclient.py session per test step (state persists across steps via the lib's own save/relogin path).

Test character: id shenlim, Chinese name 沐阳 (Muyang), password MudPass123, email [email protected], gender male, gift allocation accepted as rolled (体格20/根骨20/悟性25/灵性25). Final state left behind: joined 东方武馆 (Dongfang Martial Hall, via 东方博玉's ask boyu about join), learned 扑击格斗之技 (unarmed, level 1) from teacher NPC 东方聪 via the organic learn unarmed from dongfang cong path, combat_exp 6 (from one real fight, see below), one 粗布衣 (linen robe) in inventory, died once and was successfully reincarnated (气/血 currently 重伤/受伤 from that), sitting at 聚见亭 (START_ROOM) after a final clean quit. Save files: work/data/user/s/shenlim.o, work/data/login/s/shenlim.o — kept intentionally as evidence of a working end-to-end playthrough.

What was tested and confirmed working

Bugs found

1. Fixed — adm/simul_efun/message.lpc's tell_room() wrapper passes a raw int 0 as message()'s exclude argument on every 2-arg call. This is AGENTS.md §7.12 ("Shared message/wrapper argument bugs"), recurring on a new lineage — not a new bug class.

``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) { if (!exclude) exclude = ({}); message("tell_room", str, ob, exclude); ` Fixing the single shared wrapper (per AGENTS.md §7.12's own prescribed remedy) covers all 717 call sites at once, rather than patching individual call sites piecemeal (an earlier draft of this fix instead null-guarded the three tell_room(environment(), ...) call sites in obj/user.lpc directly — reverted once the actual root cause was traced to the shared wrapper, since a per-call-site guard would have left every *other* 2-arg tell_room()` call in the lib equally exposed).

2. Observed, not independently fixable at the LPC level — a genuine native driver crash, matching AGENTS.md §10.8's already-cataloged "driver-fatal ref-count-0 free_svalue() abort" class (third corroborating occurrence, and — per bug 1 above — plausibly the exact mechanism §7.12's own severity-escalation paragraph already predicts, not a fresh mystery).

`` 执行时段错误:*Bad argument 4 to EFUN message() ... 呼叫来自:/obj/user.lpc 的 user_dump() 第 236 行 ... ****** FATAL ERROR: FATAL: Object 0x55c032a76368 /std/skill ref count 0, but not destructed (from free_svalue). (current object was /d/ourhome/kedian2) ... crash() in master called successfully. Aborting. ` The process exited outright — every connection dropped, ss -tlnp showed nothing on port 40022, the driver PID was simply gone. debug.log` showed zero** trace of any of this (same total silence AGENTS.md §10.8 already documents) — the only reason this was caught at all was having the driver's own stdout redirected to a file, per that section's own "actionable takeaway."

Observed, deliberately not touched (out of scope: not a crash, not wrong behavior)

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

仙侣情缘 XLQY 基础版(2007)。

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

深度功能测试第二轮 / Deep functional test round two (2026-08-15, post driver-upgrade re-test)

驱动于 2026-08-12 升级后的重测。标准检查清单发现并修复四处问题:

1. config.fluffosmaximum evaluation cost500000(已知 风险区间)提升到 5000000。 2. adm/obj/master.lpc::log_error()(AGENTS.md §7.10 大小写坑的 又一实例):判定用的是 strsrch(message, "warning: ")(小写 w,且要求紧跟一个空格),而本驱动实际吐出的是大写 Warning: Unused local variable 一类文字,逐字节对不上,等于 完全没有过滤——每次惰性编译遇到警告都会把原始编译诊断广播给连 线玩家。改成不含开头 w/W 的 "arning:" 子串匹配(§7.10 记录的 标准写法,同时兼容大小写两种历史形态)。 3. adm/simul_efun/file.lpclog_file() 没有 assure_file() 目录预建保护,补上调用及前向声明;cat() 补上 read_file() || "" 空值防护。 4. obj/user.lpc::reconnect()(AGENTS.md §7.108,第十五条独立确 认的血统)adm/daemons/logind.lpc 有同款 exec(old_link, user); 踢掉重复登录写法,reconnect() 缺少 enable_commands()。按 §7.108 记录的写法预防性修复,现场用两个 真实连线复现"保持第一个连线不断开→第二个连线登录→答 y 踢掉旧连 线"验证:score 修复后立即正常显示完整角色档案。

cmds/wiz/update.lpc(§7.106)已经是正确写法,无需改动。

现场验证摘要

驱动干净启动,管理员 fluffos/Mud@2026 登录(GB/BIG5 选择→未成 年人关卡"no"→id+密码)确认 您的系统权限目前是:(admin)update /adm/daemons/logind 成功验证真实写入权限,现场未观察到编 译警告泄漏(确认 log_error 修复生效)。踢掉重复登录重连路径现场验 证通过(见上)。debug.log 全程干净(876 行,无真实错误)。

本轮修改的文件

§7.100 sweep (2026-08-19)

Fixed the corpus-wide inherit ROOM; ... replace_program(ROOM); redundant-replace bug (AGENTS.md §7.100). 337 live occurrences deleted: 336 via scripted sweep (fix_710_room.py), plus 1 hand-fixed roommaker-tool template (obj/roommaker.lpc, simple string-builder variant). 5 already-commented-out instances left untouched. No real .lpc source found under work/data/. Verified via build-debug driver boot: clean compile, port 40022 listening, zero new "cannot replace"/"cannot bind" debug.log lines.

§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 fix: enable_player() reentrancy from init()

feature/command.lpc's enable_player() (wrapper around enable_commands()) was reachable from an NPC's init() (via the shared std/char.lpc setup() chain), and enable_commands() is only safe to call from create() -- calling it again on an object already living() makes the driver re-invoke that same object's init() as a side effect, which recursed back into enable_player() on the same call stack until "Too deep recursion" aborted the boot on a room's first-ever visit. Fixed with a true reentrancy flag (in_enable_player_now, set at entry, cleared before every return), NOT a living()-gated guard -- disable_player() in the same file legitimately re-calls enable_commands() while already living() (sleep/wakeup via cmds/std/sleep.lpc, revive via feature/damage.lpc), which a living() guard would silently break. Verified via lpcc --batch single-file compile check (PASS). Part of the corpus-wide §7.19 sweep (Batch C).