Ultimate Hell 2008: Complete Edition

✅ 可玩

终极地狱2008完整版

zjdy2008wzb

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

▶ 开始游玩 · Play Now

《终极地狱2008完整版》(REVIVE OF ULTRA HELL(BLOOD & MAGIC) FROM 1999.11.13,CDS 出品)是本项目"地狱"/Doing 血统六件套之一——与 `hell`、`zjdyaryl`、`zjdywzb`、`zjdyzj`、`zjmudhell` 共享同一个门派江湖世界,逐字节地图比对显示彼此高度重合(与 `hell` 约 88% 一致,与 `zjdyaryl` 高达 95%、与 `zjdyzj` 约 90%,与 `zjdywzb`、`zjmudhell` 则更疏远、约 76%),是同一份原作世界的六个快照/变体而非各自独立设计;本版特色是注册时姓氏、名字分开输入并附 1-5 号角色类型菜单,新角色从"世外桃源"而非常见的南城客栈开局,门派地图除少林、武当、峨嵋、丐帮、明教外,还有呼应金庸原著兵器/门派的"屠龙"、"血刀"场景。

English

Ultimate Hell 2008: Complete Edition ('Revive of Ultra Hell (Blood & Magic)', originally from 1999.11.13, produced by CDS). Part of this collection's wider 'Doing'/Hell-lineage family rooted in the hell archive — its master.lpc, logind.lpc, named.lpc, and versiond.lpc are structured almost line-for-line the same. A byte-level, line-ending-normalized comparison of the /d room tree confirms the shared world runs deeper than the engine files: this build is 88% identical to hell's own map, and even closer to its own zjdy-branded siblings — 95% to zjdyaryl, 90% to zjdyzj, and 76% to both zjdywzb and zjmudhell — so all six archives (hell, zjdy2008wzb, zjdyaryl, zjdywzb, zjdyzj, zjmudhell) are snapshots/variants of one authored wuxia world rather than independently-designed games. This edition's own distinguishing touches: registration splits surname and given name into separate prompts and adds an explicit 1-5 character-type menu, new characters start from 'Peach Blossom Spring' (世外桃源) rather than the more common south-city inn, and the sect map includes 'Dragon Slaying' (屠龙) and 'Blood Blade' (血刀) rooms nodding to specific Jin Yong weapons/factions alongside the standard Shaolin/Wudang/Emei/Beggars'-Sect/Mingjiao roster.

README

内容亮点

本次修复的关键 bug

1. 经典 §8.1 GBK 字节区间 is_chinese()str[i..i+1] 字节 对判断,176-247/161-254 区间)——改成逐码点的 0x4e00-0x9fffcheck_legal_name() 对应的 maxlen 没有减半的上限也一并改成 maxlen/2,下限从 2 改成 1。 2. master.lpcadm/single/master.lpc)的 valid_read()/valid_write() 都缺少标准的 user == this_object() 短路判断——都补上了。 3. §7.50 is_killing(object)is_killing(string id) 类型 不匹配,修好了 12 处呼叫点(几个门派 suck/tan/zhua/ hua 档案、clone/user/user.lpcd/city/npc/guidao.lpccmds/std/ansuan.lpccmds/std/surrender.lpc)。 4. 档案里没有 log/nosave/ 目录,导致 logon() 一开始的 log_file() 呼叫就报"Wrong permissions for opening file /log/nosave/logon",直接把每一个连线的玩家断线("logon() ... has failed")——建好了这个目录。这和 yxxcii 那份档案的同 类问题相比,这里是会挡住整个连线的严重 bug,不只是巫师丢东西 时的日志噪音。 5. 姓名组合最短长度检查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 家族已经确认的减半模式修 了——修好前,单字姓氏和任何两字全名都会被误判"太短"。 6. versiond.lpcin_server()(通过 logind.lpc logon() 里直接、没有保护的 VERSION_D->is_version_ok()/ query_temp() 呼叫触发,所以即使不在 adm/etc/preload 里, 第一次连线时也会被编译)和 hell 那份 versiond.lpc 一样, 有真正没被掏空的 socket_create()/socket_bind() 呼叫——按 AGENTS.md §7.52 掏空了全部 13 个碰 socket 的函式(做法和 hell 的修复几乎一样)。

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

深度功能测试(§10.7,2026-08-08)修复的 bug

手足档案 zjdywzb 的 §10.7 深挖发现的 §7.88/§7.89 逐条重新核实 ("移植的修复仍需逐库验证"),另外发现两处已知 bug 类别(§7.80、 §7.81)在这份档案里的独立命中。详见 NOTES.md;摘要:

管理员账号 / Admin account

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

本地运行

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

游戏端口:40110

NOTES · 移植与修复记录

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

终极地狱2008完整版(REVIVE OF ULTRA HELL(BLOOD & MAGIC) FROM 1999.11.13,CDS 出品),和本次会话已经处理过的 'hell' 档案同属一个 Doing 血统家族——master.lpc/logind.lpc/named.lpc/versiond.lpc 结构几乎逐行一致。WASM 修复了:(1)经典的 §8.1 GBK 字节区间 is_chinese()(用 176-247/161-254 区间做 str[i..i+1] 字节对检查)重写成逐码点 0x4e00-0x9fff 检查;check_legal_name() 对应的、没有减半的 maxlen 界限修复成 maxlen/2,最小值从 2 改成 1。(2)master.lpc(adm/single/master.lpc)的 valid_read()/valid_write() 缺少标准的 'user == this_object()' 保护——两处都已加上。(3)§7.50 类的 is_killing(object) 对 is_killing(string id) 修复了 12 处呼叫点(kungfu/skill/*.lpc 的 suck/tan/zhua/hua 档案、clone/user/user.lpc、d/city/npc/guidao.lpc、cmds/std/ansuan.lpc、cmds/std/surrender.lpc)。(4)缺失的 log/nosave/ 目录导致 logon() 的第一次 log_file() 呼叫抛出'Wrong permissions for opening file /log/nosave/logon',直接把每一个连线用户断线('new_conn_handler: logon() ... has failed')——已创建该目录,和 yxxcii 上见过的同一类 bug 一样,但这里是阻断启动的,不只是外观问题。(5)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 家族的先例完全一致——不修的话,单字姓氏和任何两字全名都会被拒绝为'太短'。(6)versiond.lpc 的 in_server()(通过 logind.lpc 在 logon() 里直接、未加保护的 VERSION_D->is_version_ok()/query_temp() 呼叫触达,所以即使它不在 adm/etc/preload 里,第一次连线时也会被编译)带有和 hell 的 versiond.lpc 一样真实、未掏空的 socket_create()/socket_bind() 呼叫——按照 AGENTS.md §7.52,把全部 13 个碰 socket 的函式(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)都掏空成 no-op/notify_fail,和 hell 的修复方式几乎一致。adm/daemons/ftpd.lpc 和 adm/daemons/network/dns_master.lpc 都处于休眠状态(在 adm/etc/preload 里被注释掉,只有带保护的巫师指令呼叫者)——保持原样。管理员账号播种:fluffos (admin) 加入 adm/etc/wizlist。注册流程在格式化前后都完整验证过(英文 id→y 确认→中文姓→中文名→管理员密码+确认→登录密码+确认→角色类型菜单(1-5,用的 5)→性别→进入世外桃源),管理员权限已通过'目前权限:(admin)'确认。这份档案的提示符会显示实时时钟(符合 AGENTS.md §8.3 第 1 条)——注册测试时用的是 --idle 0.3。LPC 格式化工具对全部 7287 个档案运行(写入 7258 个,1 个转档之前就存在的错误,28 个未改动)。没有 :: 父类呼叫拆分命中,没有 case 标签带尾随注释的候选,没有 CJK 重新加空格/转义损坏命中。

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

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

手足档案 zjdywzb(同一个 Doing/"hell" 血统家族)已经做过 §10.7 深挖, 发现并修复了 §7.88(message() 包装函数漏标 varargs)、§7.89(自带 runtime_config.h 索引错位)、§7.86(留言板 post 崩溃)。本次按照 "移植的修复仍需逐库验证"的项目惯例,逐条重新核实这三处在 zjdy2008wzb 自己代码里的实际形状,而不是直接照搬。

深度功能测试第四轮(§10.7 round-four,2026-08-19)

本轮任务:补测第三轮明确标记为"未测试"的三个系统——门派拜师、商 店购物、邮件系统;并对已经全库扫描完毕的几条 checklist(§7.90、 §7.111-§7.115)做一次本档案专属的抽查。没有发现任何新的编程 bug,三个系统里两个(拜师、购物)完整验证正常工作,第三个(邮 件)确认是这个"hell"血统家族项目本身就蓄意关闭的功能,不是本档 案独有的坏损。

测试前置状况:管理员账号 fluffos 的存档处于损坏的中间状 态——data/login/f/fluffos.o 存在(purename 是"浮浮",明显是 一次未走完的注册残留),但 data/user/f/fluffos.o 完全不存在, 导致用 fluffos 连线会在 logind.lpcuser->restore() 失败 分支直接断线("无法读取你的数据档案,您需要和巫师联系。"),且 这个档案的 CONFIG_D->query_int("ask_recreate") 返回假,连"是否 重新创造玩家"的补救提示都不会出现。判断是第三轮会话在" look/ goto/update 三重验证"之后没有让角色真正存过档(obj/user.lpc 的 存档很可能只在正常 quit/心跳周期性存档时触发,而不是巫师权限检 查本身需要的),随后如果那次会话是直接杀掉驱动进程结束的,新建的 角色存档就会跟着丢失——这本身可能是个值得未来注意的"角色数据只 在正常退出/心跳时落盘,异常关闭会丢刚创建的角色"式的存档可靠性 问题,但和本档案玩家实际测试无关,未展开处理。本轮临时在 adm/etc/wizlist 加了 wztestfour (admin),通过正常注册流程重 新播种了一个可用的管理员测试角色,验证完毕后已经把 wizlist 恢复 原状、删除了 wztestfour/fluffos 的残留存档档案(fluffos 的 损坏 login 存档也一并清掉了,避免下一轮踩同一个坑)。

- §7.111master.lpcstandard_trace() file_name (error["object"]) 崩溃):adm/single/master.lpc 第 230 行已经是 error["object"] ? file_name(error["object"]) : "0" 的三元保护写法,安全。 - §7.112init() 重连叠加 call_out 链): d/death/npc/{wgargoyle,bgargoyle}.lpc 都已经用 query_temp("death_stage_active")/set_temp(...)/ delete_temp(...) 做了防重入闸门,和第三轮"死亡复活流程完 整走通、无卡死"的实测结果一致。 - §7.113(netdead 重连不恢复 heart_beat):adm/daemons/ logind.lpcreconnect() 无条件呼叫 user->reconnect()clone/user/user.lpcreconnect() 里无条件 set_heart_beat(1)——属于 AGENTS.md §7.113 记录的"批次二" 45 库之一,本档案当时就已确认干净,本轮静态复查结论一致。 - §7.114private 修饰的 input_to 回调经 mixin 失效): feature/edit.lpcinput_line() 没有 private 修饰符, 不受影响——而且这次实测走过的"多行输入"路径(bai/buy/ sell 都不需要多行编辑,但拜师确认、购物问答等交互全程响应 正常,没有出现"第一行有效、后续行被吞"的症状),间接佐证这 个档案确实不在 §7.114 名单里。 - §7.115QUEST 宏指向不存在的档案):本档案的 include/quest.h/include/globals.hQUEST_OB/inherit/ misc/quest)、QUEST_D/adm/daemons/questd)两个真正会被 call_other 呼叫的宏对应的档案都真实存在(work/inherit/ misc/quest.lpcwork/adm/daemons/questd.lpc),没有"单纯 叫 QUEST 且指向缺失档案"的那种宏,不适用本条。 - §7.90(eval-cost 配置):config.fluffosmaximum evaluation cost 已经是 5000000(第三轮已修),本轮驱动干 净启动 + 完整拜师/购物/多次巫师 call/goto 操作,全程 debug.log 没有出现任何 cost limit reached/Too long evaluation,佐证了第三轮"那两次 eval-cost 报错是当时会话自 己连续 8 条 update 造成的高强度负载,不是常规游玩会触发的 一般性配置问题"的判断是站得住的,本轮没有推翻这个结论。

清理:临时的 wztestfour 管理员测试账号(存档 + wizlist 条 目)已经清理干净,损坏的 fluffos 残留登录存档也已删除;驱动测 试进程按 PID 正常 kill,未使用 pkill -f

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

ROOM 宏(/inherit/room/room)在本档案 2,306 处房间文件的 create() 里紧跟 inherit ROOM; 之后又多余调用了一次 replace_program(ROOM);——和姊妹档案 zjdywzb/zjdyzj/zjmudhell 同一个 AGENTS.md §7.100 记录的休眠 bug(多余调用给对象打上永久 "pending replace"标记,对象一旦绑定任何闭包就会崩溃)。用 fix_710_room.py(二进制模式,只删除内容严格等于 replace_program(ROOM); 的独立行)扫过 work/,删除 2,305 处;剩 余 1 处是房间生成工具 clone/misc/roommaker.lpcstr += "...replace_program(ROOM);..." 的字符串拼接变体,手工改成 str += "\n\tsetup();\n}\n";。另有 17 处是转档之前已注释掉的 // 行,原样保留;work/version/(一份独立的 46 文件版本同步子树)和 work/data/ 下都没有真实 .lpc 源码命中。git diff --stat 确认 2305 个文件各删 1 行 + roommaker.lpc 1 处字符串编辑,与脚本自报数 字吻合。修复后真实驱动干净启动(零新增编译错误、端口正常监听、 debug.log 无任何"cannot replace"/"cannot bind"行);由于这份档案 先前的 fluffos 存档已被上一轮测试清理删除,重新走了一次完整注 册流程(fluffos/浮浮云/管理密码Mud@2026Adm/登录密码 Mud@2026/均衡型/男),确认"目前权限:(admin)"后 look/goto 两个曾经命中过这个 bug 的房间 (d/mingjiao/shanlu3.lpcd/guanwai/shanhaiguan.lpc)/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.