Tianya Reborn

✅ 可玩

再现天涯

zxty

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

▶ 开始游玩 · Play Now

《再现天涯》(游戏内横幅:梦回天涯),与本项目里由 `tybxjh` 领衔的完整"天涯"八件套家族(`wlhd`/`xhcii`/`ffxymud`/`jhfy2`/`xysylmhb`/`xyzxiiylzymh`/`yxjh`/`yzxiiizylfy`)同源——"世界之巅"跳崖场景(`d/city/sj.lpc`)与 `tybxjh`/`xhcii`/`ffxymud`/`jhfy2`/`xysylmhb`/`xyzxiiylzymh` 逐字节完全相同,`wlhd` 则独立改写过同一个房间;与 Doing 血统的 `hell` 家族并无关系。角色创建采用单一 2-4 字姓名(不像 `zjdywzb` 系列那样区分姓氏与名字),带属性天赋随机菜单,新角色从"有间客栈"起步;巫师权限阶梯的最高称号是 `(boss)`,不同于多数兄弟档案惯用的 `(admin)`。本项目里的 `zxty08nxgbb` 是同一款游戏 2008 年的修改重发布版本。

English

Tianya Reborn (in-game banner: 'Dream Return to Tianya'). Unrelated to the Doing-lineage 'Hell' family covered elsewhere in this collection, but shares the same source code as this collection's wider 'Tianya' family — its 'Peak of the World' cliff-jump scene is byte-for-byte identical to tybxjh (the lineage's root), xhcii, ffxymud, jhfy2, xysylmhb, and xyzxiiylzymh, while wlhd shares the same map but independently rewrote that one room. Its wizard hierarchy tops out one rank differently from most siblings, at (boss) rather than (admin). Character creation takes a single combined 2-4 character name (unlike the separate surname/given-name split used by the zjdywzb-family titles) with a random attribute-talent menu, starting new characters at the Inn of Leisure. A 2008 revised re-release of this same game is also in this collection as zxty08nxgbb. Its bulletin-board system spans 105 boards across the sect and city zones.

README

内容亮点

本次修复的关键 bug

1. 一个预先存在(不是这次修复引入)、会挡住整个开机的编译错 误:正在生效的 adm/daemons/logind.lpc 第 28 行 string *banned_id = (...) 前面多了一个孤立的冒号 :string *banned_id,导致 error: modifier list may not be empty,logind 整个编译失败,每一个连线的玩家都会被 new_conn_handler 直接断线——去掉了这个多余的冒号。 2. check_legal_name() 的 §8.1 GBK 字节区间/奇偶判断 bug: 长度上限没有减半(<4||>8,本意是"2到4个中文字")——改成 <2||>4;还有一个 i%2==0 的奇偶门槛,配合只检查 str[0] 的单码点 is_chinese(name[i..<0]) 辅助函数,实际 上只验证了一半的字符是不是中文——去掉了这个奇偶门槛,改成每 个字符都检查。is_chinese()adm/simul_efun/chinese.lpc) 本身已经是正确的逐码点 0x4e00-0x9fff 判断,不需要修。 3. master.lpcadm/obj/master.lpc)的 valid_read()/valid_write() 都缺少标准的 user == this_object() 短路判断——都补上了。

确认了本档案不需要修的地方:is_killing()feature/attack.lpc)本来就是 object 参数,所有呼叫点也都 传的是 object,没有 §7.50 的类型不匹配问题。httpd.lpcdns_master.lpc(经由 inetd.lpc)、versiond.lpcclosed.lpc 虽然都有真正没被掏空的裸 socket_*() 呼叫,但都不 在 adm/etc/preload 里,也没有任何注册/登录路径能触发到它们 (VERSION_D/CLOSED_D 只互相呼叫,以及被少数几个同样不可达的 NPC/指令呼叫)——用 grep 确认过没有任何被预载的精灵或 logind.lpc 引用它们,因此保持休眠状态没有改动,和本项目其他档 案里 ftpd/dns_master 已确认的休眠先例一致。log/nosave/ 目录本 来缺失(被好几个不在开机路径上的功能用到,比如 shell 日志、打造 日志、吃丹日志)——为保险起见建了这个目录,虽然这里并不是致命 bug(logon() 自己的 log_file() 呼叫都不走 nosave 路径)。

深度功能测试(§10.7)修复的 bug

sibling-check 自 tybxjh/xhcii(同一"天涯"家族,已完成深挖):

(这份档案不需要 xhcii 的缺失 /log/login/ 目录修复:这个目录 本来就存在。)

管理员账号 / Admin account

警告:对外公开架设前请务必修改此密码。

本地运行

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

游戏端口:40166

NOTES · 移植与修复记录

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

再现天涯(游戏内横幅:梦回天涯 / 'Dream Return to Tianya')。和本次会话更早处理过的 Doing 血统 'hell' 家族无关——是一个独立的 ES 衍生代码库,但带有一个巫师个人目录(u/zjb/)里放着好几份核心系统档案(logind.lpc、master.lpc、securityd.lpc)过时的备份副本,没有任何真实路径引用它们(根据 include/globals.h 和 config.fluffos,LOGIN_D=/adm/daemons/logind,MASTER_OB=/adm/obj/master)——已通过 grep 确认 u/zjb/ 之外没有任何地方引用这些备份副本,所以只改动了两份真正生效的档案;备份保持原样,作为无害的死代码。WASM 修复了:(1)真正生效的 adm/daemons/logind.lpc 里一个转档之前就存在(不是本轮引入)的、阻断启动的编译错误:第 28 行 'string *banned_id = (...)' 前面多了一个孤立的 ':',产生"error: modifier list may not be empty",导致 logind 完全编译不过,通过 new_conn_handler 把每一个连线用户都断开了——已删掉这个多余的冒号。(2)check_legal_name() 的 §8.1 GBK 字节区间/奇偶 bug:strlen 界限没有减半(<4||>8,本意"2 到 4 个中文字",已改成 <2||>4)以及一个 i%2==0 的奇偶门槛,配合一个单码点的 is_chinese(name[i..<0]) 辅助函式,实际上只验证了每隔一个字符是不是中文——已删掉奇偶门槛,让每个字符都被检查。is_chinese() 本身(adm/simul_efun/chinese.lpc)本来就是正确的(对 str[0] 做逐码点的 0x4e00-0x9fff 区间检查),不需要修。(3)master.lpc(adm/obj/master.lpc)的 valid_read()/valid_write() 缺少标准的 'user == this_object()' 保护——两处都已加上。已确认这里不需要的修复:is_killing()(feature/attack.lpc)本来就接受物件参数,每一个呼叫点也本来就传的是物件——这份档案不存在 §7.50 类的类型不匹配 bug。httpd.lpc、dns_master.lpc(通过 inetd.lpc)、versiond.lpc、closed.lpc 都带有真实、未掏空的 socket_*() 呼叫,但没有一个在 adm/etc/preload 里,也没有一个能从登录/注册路径触达(VERSION_D 和 CLOSED_D 互相呼叫,还被少数几个 NPC/指令呼叫,而那些呼叫者本身在启动时也触达不到)——保持原样,完全休眠,和本项目其它地方对 ftpd/dns_master 已经确立的先例一致;已通过 grep 确认没有任何预加载精灵或 logind.lpc 引用它们。log/nosave/ 目录缺失(很多非启动路径的功能会用到它——shell 日志、制作日志、吃道具日志)——出于预防已经创建,尽管这里不是阻断启动的(logon() 自己的 log_file() 呼叫都不指向 nosave 路径)。管理员账号播种:fluffos (boss) 加入 adm/etc/wizlist(这份档案的最高巫师阶层字符串是 '(boss)',不是 '(admin)'——和压缩包原有的 tangsheyu/baizhou/bzhou/baixzhou 条目并存)。注册流程在格式化前后都完整验证过(英文 id→y 确认→单一中文全名(2-4 个字,不分姓名)→管理员密码+确认→登录密码+确认→属性赠礼菜单(0 随机)+确认→电子邮件地址→性别→进入有间客栈),管理员权限已通过'您目前权限:(boss)'确认。有一处格式化工具第 3 个盲点命中(d/city/sj.lpc,转档之前就存在的不配对引号导致 CJK 重新加空格损坏)——已通过 git checkout 还原,确认格式化前的原始内容里没有那个 '\ n' 签名。LPC 格式化工具对全部 13193 个档案运行(写入 13067 个,80 个转档之前就存在的错误,46 个未改动,包括 u/zjb/ 下很多死代码档案)。没有 :: 父类呼叫拆分命中,没有 case 标签带尾随注释的候选。

深度功能测试(§10.7,2026-08-05)

这份档案是"天涯"家族的又一分支,先检查了同家族已完成 §10.7 深挖 的 tybxjh/xhcii 的记录,逐项在 zxty 自己的源码里核实:

深度功能测试(2026-08-13,round two,新驱动重测)

针对驱动升级(quest_times/win_times %-operator 修复 + Warning/warning 大小写回退兼容)做的重测。上面记录的所有修复(printf 泄漏、§8.9、 §7.85 进度条、§7.86 留言板、exert_function 类型错误)逐项核对代 码仍然生效;win_times%-operator 也已用 to_int(query("win_times")) % 5d/city2/npc/refereew.lpc:146)。

本轮新发现并修复的 PROGRAMMING bug

1. feature/dbase.lpc(真正生效的 F_DBASE)的密码写保护是 tybxjh/wlhd 那一类已确认的 bug 形状if ((prop == "password" || prop == "ad_password") && wizhood(this_object()->query("id")) == "(boss)" && this_player() && geteuid(this_player()) != this_object()->query("id")) return;——wizhood() 纯粹读 wizlist 文件,不检查密码是否已经真正存在于 dbase 里,任何 预先播种为 (boss) 的 id 都会在自己第一次设置密码时被这条守卫 拦截。按已确立的标准修法加上 mapp(dbase) && dbase[prop],只在 密码已存在时才拦截,不影响首次创建。(u/zjb/ 目录下另外三份 dbase.lpc 死代码副本有完全相同的形状,但没有任何宏或引用指向 它们,未改动。) 2. log_error()adm/obj/master.lpc,实际生效的 master file)的严重度检查漏了第二个回显分支:这份档案的写法有两条并 行的回显路径——if (this_player(1)) efun::write(...)else if (this_player()) tell_object(...)——第一轮编辑只把严重度判 断包进了第一条分支,live 复现:注册过程中仍然收到大量原始的 编译时段错误:.../combatd.lpc:1384:1: Warning: Unused local variable ... 泄漏,因为走的是第二条 tell_object 分支。已把 两条分支一起包进 strsrch(message, "arning:") == -1 判断(和 yxjh 上确认过的同一类"多分支各自需要单独加保护"教训一致)。 3. log_file()adm/simul_efun/file.lpc)本身缺少 assure_file() 保护:函数体只有裸 write_file(),同一文件里 的 assure_file() 辅助函数从未被调用。已加上前向声明 + assure_file(LOG_DIR + file);。 4. cat()(同一文件,供玩家/巫师直接呼叫的 cat 指令)两处独立 的 write_file("/log/file/{cat,bugcat}", ...) 同样缺少 assure_file() 保护,且对不存在文件的 read_file() 结果没有类 型检查work/log/file/ 整个目录被 .gitignore 忽略,真正 全新的检出不会带有这个目录。特别检查过 enter_world() 里的 cat(MOTD) 调用——它的调用者 base_name(ob) 正好是 /adm/daemons/logind,两处 write_file() 都显式排除了这个调 用者,所以这条路径本身不会导致"每次登录必崩"(不像 yxcs 的 cat(WELCOME) 那次),但玩家/巫师直接用 cat 指令读取任意档 案时仍然会命中未防护的 write_file()。已给两处都加上 assure_file(),并把 write(str1) 改成 write(str1 || "")

Proactive checks / 观察记录

实测过程

管理员 fluffos(管理密码 AdminMud@2026,普通密码 Mud@2026adm/etc/wizlist 早已播种但从未真正注册过)用完整双 密码注册流程创建,落地"有间客栈",score 显示"【巫师总兼】"头 衔,食物/饮水满格。随后做了三次独立的断线重连+密码验证(详见上方 "间歇性触发"记录):均成功用普通密码登录,存档数据一致。全程两个 调试日志位置都干净,无运行时错误。驱动按精确 PID 结束;管理员存 档已提交。

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

ROOM 基类冗余 replace_program(ROOM); 自崩溃地雷(详见 AGENTS.md §7.100):4474 个房间文件命中。本 lib 有四份独立的建房工具拷贝 (clone/misc/roommaker.lpcu/xiyang/obj/roommaker1.lpcu/landy/obj/roommaker.lpcu/bzhou/obj/roommaker.lpc),全部 四份的字符串拼接代码生成模板里都烤了同一个地雷,一并修复。

修复:脚本化删除独立成行的 replace_program(ROOM);,四份 roommaker 模板手动摘除字符串拼接片段。git diff --stat:4474 files changed, 与预期精确吻合。

验证:build-debug 驱动真实冷启动,端口 40166 正常监听。既有管理 员账号 fluffos/Mud@2026 登录(本次连线未触发既有记录过的间歇 性 wzd_log 巫师身份验证挑战),score 显示【巫师总兼】头衔, quit 干净退出,全程无新增 "cannot replace"/"cannot bind" 日志行。 测试触发了本 lib 自身"游戏内时长不足 30 分钟不予存档"的既有逻辑, 误删了 data/login/f/fluffos.o,已用 git checkout 还原,未纳入 提交。

§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): 4 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-03,round three,shop + 拜师)

新角度:醉仙楼购物 + 丐帮左全拜师,并核对存盘后门派是否还在。 2026-08-13 那一轮明确没测这两步。

实测过程

管理员 fluffos / 普通密码 Mud@2026(本次未走管理密码)。落地 /d/city/kediangoto /d/city/zuixianloulist 价目为铜钱尺度 (烤鸡腿八十文钱)。clone /clone/money/goldbuy jitui 成功 (找零九十九两银子 + 二十个铜板)。F_DEALERfeature/dealer.lpc) 没有丐帮「穷叫化」拒绝;dealer1.lpc / vendor.lpc 有,醉仙楼小二 不用那两份。本轮仍先买再拜。

goto /d/gaibang/inholeapprentice zuo:左全收徒,score 称谓 「丐帮第二十代弟子」、师傅左全。没有 yxjh 那种 join 名门正派 门。 显式 save 成功,user.o 立刻带上 family

本轮第一次登陆 127.0.0.1 没走 wzd_log;断线重连时触发,显示码 首位是诱饵,按第 2–5 位算 (n1*n4+8)*100+n2*n3-3 通过,公式和 2026-08-13 / zxty08 记录一致。重连 score 仍是丐帮第二十代弟子 / 师傅左全,银子还在。

quit.lpcmud_age < 1800 会删 login.o(真正 rm 没有 wizardp())。和 zxty08 同一既有政策,未改,本轮不 quit

发现并修复的 PROGRAMMING bug

1. cmds/usr/save.lpc 把真正的 link_ob->save() / me->save() 注释掉了,只打印「档案储存完毕」。 和 yxjh 同一形状。已恢复 成真正调用两个 save()

2. securityd.lpc valid_read() 里对 /log/ 的拒绝会 log_file("file/bug_read") 再入。zmud/bzhou 的巫师 (包括 fluffos)登陆会 Too deep recursion。加了 in_valid_read 重入保护(和 zxty08/yxjh 同形状;允许 id 在这里 是 zmud/bzhou)。修复后登陆两行警告,clone 一行警告加黄金 复制成功,本 boot 零 recursion。