Ultimate Hell: Complete Edition

✅ 可玩

终极地狱完整版

zjdywzb

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

▶ 开始游玩 · Play Now

《终极地狱完整版》(游戏内横幅:EMPEROR OF ULTRA HELL(BLOOD & MAGIC) FROM 2002.06.2)同样是本项目"地狱"/Doing 血统六件套的一员——与 `hell`、`zjdy2008wzb`、`zjdyaryl`、`zjdyzj`、`zjmudhell` 共享同一套少林、武当、峨嵋、丐帮、"屠龙"、"血刀"门派地图,逐字节比对显示整个家族地图相似度约 67-76%,本作与 `zjdy2008wzb` 最接近,与结成更紧密一组的 `zjdyaryl`、`zjdyzj` 相比则更疏远一些,属于同一份原作世界的又一个快照而非独立设计;本版的构建/同步精灵 `versiond.lpc`(2194 行)比 `zjdy2008wzb` 那份完整得多,且出厂时就带有 `log/nosave/` 目录、存档权限判断也已写对,因此没有撞上 `zjdy2008wzb` 那份"每个新连线都被直接断线"的致命问题。

English

Ultimate Hell: Complete Edition (in-game banner: 'Emperor of Ultra Hell (Blood & Magic), from 2002.06.2'). Part of the same six-way 'Hell'/Doing-lineage map family as this collection's hell, zjdy2008wzb, zjdyaryl, zjdyzj, and zjmudhell (the original archive was itself named hell) — its adm/single/master.lpc, logind.lpc and named.lpc are structurally near-identical to zjdy2008wzb's, and a byte-level, line-ending-normalized room-tree comparison found the shared map is roughly 67-76% identical across the family (closest to zjdy2008wzb, more diverged from the tighter zjdyaryl/zjdyzj cluster), covering the same Shaolin/Wudang/Emei/Beggars'-Sect/'Dragon Slaying'/'Blood Blade' zones. This build's own versiond.lpc (2,194 lines) is a substantially more complete build/sync daemon than zjdy2008wzb's. It includes 43 bulletin boards spread across its sect and city zones.

README

内容亮点

本次修复的关键 bug

1. 经典 §8.1 GBK 字节区间 is_chinese()str[i] 字节对判 断,161/255/176/248 阈值 + i%2 奇偶判断)——改成逐码点的 0x4e00-0x9fffcheck_legal_name() 对应的下限从 2 改成 1,maxlen 没有减半的上限也一并改成 maxlen/2。 2. master.lpcadm/single/master.lpc)的 valid_read()/valid_write() 都缺少标准的 user == this_object() 短路判断——都补上了。 3. 姓名组合最短长度检查get_name() 里的 strlen(fname)<4,字节数没减半)和 named.lpcinvalid_new_name() 滑窗查重逻辑(下限 2→1,切片 name[i..i+3]/name[i..i+5]name[i..i+1]/ name[i..i+2],循环上限 l-4l-2,判断门槛 i+6<=li+3<=l),都按 hell 家族已经确认的减半模式修 了——修好前,单字姓氏和任何两字全名都会被误判"太短"。 4. §7.50 is_killing(object)is_killing(string id) 类型 不匹配,修好了 11 处呼叫点(几个门派 suck/tan/zhua/ hua/huolang 档案、clone/user/user.lpcd/city/npc/guidao.lpccmds/std/ansuan.lpccmds/std/surrender.lpc)。 5. versiond.lpc(2194 行,比 zjdy2008wzb 那份完整很多的 构建/同步版本精灵,但属于同一类 socket 精灵 bug)——通过 logind.lpc logon() 里直接、没有保护的 VERSION_D->is_version_ok()/query_temp() 呼叫触发,所以即 使不在 adm/etc/preload 里,每次连线都会被编译——按 AGENTS.md §7.52 掏空了 in_server()connect_server()clear_syn_info()(只去掉 socket_close 循环)、 send_command()send_client_pending_msg()syn_finish()(只去掉 socket_close)、 in_listen_callback()in_write_callback()in_close_callback()cmd_close()send_pending_msg()send_result()remove_connection()(只去掉 socket_close)里所有真正碰 socket 的呼叫;确认掏空后档案里 已经没有任何裸的 socket_*() efun 呼叫,大括号也配平 (145==145)。

adm/daemons/ftpd.lpc(117 处 socket 呼叫)和 adm/daemons/network/dns_master.lpc(5 处)都已经在 adm/etc/preload 里被注释掉,剩下的呼叫者也都是受保护的巫师指 令,属于完全休眠,本次没有改动。

另外确认了几处从共同的 hell 源码继承下来、已经是正确写法、不 需要修的地方:securityd.lpcsave_object valid_write() 判断已经正确比较 query_save_file()+__SAVE_EXTENSION__SECURITY_D 宏和 adm/etc/preload 里的路径本来就是对的, adm/daemons/securityd 也已经在列表最前面;log/nosave/ 目录 本来就存在(不像 zjdy2008wzb 那份缺目录导致每个连线都被断开的 致命 bug,这份档案没有这个问题)。

启动过程和退出时会反复出现一个 Bad argument 4 to EFUN message() 运行时错误(几个精灵的 create()/sys_info() 经由 channeld.lpc 呼叫 simul_efun.lpcmessage() 时第四个参数传了 int(0)); WASM 阶段曾判定为"不影响功能的驱动签名怪癖"予以保留,深度功能 测试(§10.7)发现这个判断是错的——它会把每一个新角色永久卡死在 人物创建流程里,详见下方"深度功能测试"一节。

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

管理员账号 / Admin account

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

本地运行

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

游戏端口:40109

NOTES · 移植与修复记录

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

终极地狱完整版(游戏内横幅:EMPEROR OF ULTRA HELL(BLOOD & MAGIC) FROM 2002.06.2),和本次会话已经处理过的 zjdy2008wzb 同属一个 Doing 血统 'hell' 家族——master.lpc/logind.lpc/named.lpc 结构几乎一致(原始压缩包内部文件夹字面就叫 'hell')。WASM 修复了:(1)经典的 §8.1 GBK 字节区间 is_chinese()(用 161/255/176/248 阈值和 i%2 奇偶判断做 str[i] 字节对检查)重写成逐码点 0x4e00-0x9fff 检查;check_legal_name() 对应的界限(最小值 2→1,没有减半的 maxlen → maxlen/2)也做了相应修复。(2)master.lpc(adm/single/master.lpc)的 valid_read()/valid_write() 缺少标准的 'user == this_object()' 保护——两处都已加上。(3)get_name() 里姓+名合并的最小长度检查(strlen(fname)<4,字节数翻倍)和 named.lpc 的 invalid_new_name() 滑动窗口近似名字去重(最小值 2→1,窗口切片 name[i..i+3]/name[i..i+5] → name[i..i+1]/name[i..i+2],循环界限 l-4 → l-2,闸门 i+6<=l → i+3<=l)都修复成减半后的逐码点界限,和 hell 家族的先例一致——不修的话,单字姓氏和任何两字全名都会被拒绝为'太短'。(4)§7.50 类的 is_killing(object) 对 is_killing(string id) 修复了 11 处呼叫点(kungfu/skill/*.lpc 的 suck/tan/zhua/hua/huolang 档案、clone/user/user.lpc、d/city/npc/guidao.lpc、cmds/std/ansuan.lpc、cmds/std/surrender.lpc)。(5)versiond.lpc(2194 行,比 zjdy2008wzb 那份更大更完整的构建同步版本精灵,但属于同一类 socket 精灵 bug)通过 logind.lpc 在 logon() 里直接、未加保护的 VERSION_D->is_version_ok()/query_temp() 呼叫在每一次连线时都能触达,即使它不在 adm/etc/preload 里——按照 AGENTS.md §7.52 掏空了 in_server()、connect_server()、clear_syn_info()(只掏空 socket_close 循环)、send_command()、send_client_pending_msg()、syn_finish()(只掏空 socket_close)、in_listen_callback()、in_write_callback()、in_close_callback()、cmd_close()、send_pending_msg()、send_result()、remove_connection()(只掏空 socket_close)里所有真正的 socket_*() 呼叫点;已确认没有残留的原始 socket_*() efun 呼叫,且大括号配平(145==145)。adm/daemons/ftpd.lpc(117 处 socket 呼叫)和 adm/daemons/network/dns_master.lpc(5 处 socket 呼叫)都处于休眠状态(在 adm/etc/preload 里被注释掉,只有带保护的巫师指令呼叫者)——保持原样,符合 AGENTS.md §7.52 的指引。另外确认了从共享的 hell 源码带过来的一些既有修复本来就是对的:securityd.lpc 的 save_object valid_write() 检查本来就对照 query_save_file()+__SAVE_EXTENSION__,而且 SECURITY_D/preload 路径本来就正确,adm/daemons/securityd 已经排在预加载列表最前面。log/nosave/ 目录本来就存在(和 zjdy2008wzb 不同,这份档案没有撞上那个阻断启动的目录缺失 bug)。管理员账号播种:fluffos (admin) 加入 adm/etc/wizlist(和压缩包原有的 'doing (admin)' 条目并存)。注册流程在格式化前后都完整验证过(英文 id→y 确认→中文姓→中文名→管理员密码+确认→登录密码+确认→角色类型菜单(1-5,用的 5)→性别→进入世外桃源),管理员权限已通过'目前权限:(admin)'确认。这份档案的提示符会显示实时时钟(符合 AGENTS.md §8.3 第 1 条)——这里用 --idle 1.0 就够了,不像 zjdy2008wzb 需要 0.3。有一处转档之前就存在、非致命的'Bad argument 4 to EFUN message()'运行时错误在预加载期间和 quit 期间会反复出现(几个精灵的 create()/sys_info() 路径通过 channeld.lpc 呼叫 simul_efun.lpc 的 message(),传了一个整数 0 作为第 4 个参数)——不会阻挡启动、注册、或管理员权限验证;作为一个转档之前就存在的驱动 message() 签名怪癖保留,不在这次 WASM 修复的范围内。LPC 格式化工具对全部 7080 个档案运行(写入 7025 个,27 个转档之前就存在的错误,28 个未改动)。没有 :: 父类呼叫拆分命中,没有 case 标签带尾随注释的候选,没有 CJK 重新加空格/转义损坏命中。

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

这份档案和手足档案 zjdy2008wzb 都还没做过 §10.7 深挖,这次直接从 AGENTS.md 的已知 bug 类别清单出发逐项排查,而不是 sibling-check(因 为没有已深挖的手足可以参考)。

§7.100 房间基类 replace_program() 扫尾修复(2026-08-19)

ROOM 宏(/inherit/room/room,见 include/globals.h)在 2,310 处 房间文件的 create() 里紧跟 inherit ROOM; 之后又多余地调用了一次 replace_program(ROOM);——和 AGENTS.md §7.100 记录的 jhfy3/其它 姊妹档案同一形状的休眠 bug:这个多余调用给对象打上永久的"pending replace"标记,该对象一旦在生命周期里绑定任何闭包(call_outedit()、自定义 input_to、房间外的 set(..., (: ... :)) 等)就 会崩溃。用已验证过的 fix_710_room.py(二进制模式,只删除内容严 格等于 replace_program(ROOM); 的独立行)扫过 work/,删除 2,309 处;剩余 1 处是房间生成工具 clone/misc/roommaker.lpc 里的 str += "...replace_program(ROOM);..." 字符串拼接变体,手工改成 str += "\n\tsetup();\n}\n";(同一工具另有一处 heredoc 模板已被脚 本正常扫到)。另有 21 处是转档之前就已经被注释掉的 // 行,原样保 留。work/data/ 子目录下没有真实 .lpc 源码被脚本误跳过(唯一的 work/data/room/moman/*.lpc 4 个文件本身没有这个 bug)。git diff --stat 确认 2309 个文件各删 1 行 + roommaker.lpc 1 处字符串编辑, 与脚本自报数字吻合。修复后真实驱动干净启动(零新增编译错误、端口 正常监听、debug.log 里没有任何"cannot replace"/"cannot bind"行), 巫师账号 fluffos/Mud@2026 实测走了 2 个曾经被注释触发过这个 bug 的房间(d/city/library.lpcd/mingjiao/shanlu3.lpc)以及世外桃 源出生点,look/goto/quit 全部正常,无回归。

§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): 5 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.

死亡/复活谜团破案(§10.7 回合四,2026-08-20)

上一轮遗留的"多次 smash 都杀不死角色"谜团这次彻底查清楚了,真相 和上一轮的猜测(combatd.lpcplayer_escape()/want_kill 逃脱 分支意外拦截)完全无关——用临时 tell_object() 插桩逐行追踪 cmds/arch/smash.lpcmain() 才发现真正原因:

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

新角度:扬州醉仙楼购物 + 丐帮李斧头拜师。上一次深挖是 2026-08-20 死亡/复活(smash/death_stage),NOTES 全文没有 buy/商店/ apprentice 实测。sibling zjdyaryl 同日刚走过同一条路径; zjdy2008wzb 2026-08-19 已经 buy jitui + bai li futou

本轮没有新的 programming bug。enter_world() 已经是 ob->set("registered", user->query("registered"))(从 user 抄到 login,和 xkxz2 Bug 2 方向相反)。work/log/nosave/ 目录本来就在, clone 这条路没碰到 ntii 那种缺目录崩溃——但 clone 本身对 (admin) 巫师不可用:is_admin()admin_flag == 1222 || getuid() == "pkyou",和 wizlist (admin) 是两回事(2026-08-20 NOTES 已记录,不改)。env/prompt"time",live clock,idle 0.45。

实测过程

管理员 fluffos / Mud@2026 / 浮浮。第一输入是「您的英文名字」, 没有 BIG5 提示。端口 40109。原先 registered:0qi:1(上次死亡 测试留下的)、startroom 世外桃源。recover 后走完 register [email protected]decidewest/out(阴险奸诈)→ washborn 扬州人氏,落地扬州客店。born 后弹出游戏规则 pager (ENTER/q)。

clone /clone/money/gold 被拒:「你不能复制物品。」(is_admin() 门槛,设计如此)。布衣当铺估价一文不值。改用巫师 update 加载一 个一次性 /clone/misc/_tmp_pay.lpccreate()new 黄金然后 movethis_player();测完已删,未提交),i 出现一两黄金。

goto /d/city/zuixianloulist 包子五十文 / 烤鸡腿八十文。扬州 店小二没有丐帮穷叫化踢人。buy jitui 成功:「你从店小二那里买下 了一根烤鸡腿。」i 剩九十九两白银 + 二十文铜钱(10000−80=9920)。

goto /d/gaibang/underhs(舍身崖下),李斧头 id li / kungfu/class/gaibang/li-futou.lpc,只收男性。apprentice li 一次 成功:「恭喜您成为丐帮的第二十代弟子。」score「你是扬州人氏, 天性阴险奸诈,师父是李斧头。」title「丐帮第二十代传人」。

第一次 save 撞上 30 秒冷却(born 刚写过 last_save)。丢 socket 后重连「重新连线完毕」,再 save「档案储存完毕」。此时 user.o registered:1 + family_name 丐帮 / master_name 李斧头; login.o 仍是 registered:0do_decide 不写 link_ob)。

重启驱动强迫走 enter_world()。重连落地客店而不是世外桃源,没有 「您还没有注册」,score 仍是丐帮二十代 / 李斧头 / 扬州人氏,银 子铜钱还在。烤鸡腿是 F_FOOD,不进 autoload,重启后不在身上—— 不是存档 bug。

live debug.loglibs/zjdywzb/log/debug.log(第一轮 Boot Time Fri Sep 4 03:39:22,persist 轮 03:41:00),无 error: / Too deep recursion。mudlib work/log/log 只有开机/指令编译警告。心跳期 Inherit chain too deep(2026-08-20 已记录、quest/shen.lpc)本轮 短会话没有再出现,不修。管理员存档未提交。