Fingertip MUD

✅ 可玩

指尖MUD

zjmudhell

🔑 fluffos / Mud@2026 更新 37d89d4 2026-09-03 源码 下载 ZIP

▶ 开始游玩 · Play Now

《指尖MUD》从嵌套压缩包中提取而来(`zjmud.7z` 内的 `指间mud服务器+手机版客户端.zip`,内部文件夹名为 `hell`),核心系统档案(`master.lpc`/`logind.lpc` 等)为配合自定义手机客户端协议被大幅重写、注册流程和 master 文件哈希都与其他版本不同,但地图内容仍属于本项目"地狱"/Doing 血统六件套家族(与 `hell`、`zjdy2008wzb`、`zjdyaryl`、`zjdywzb`、`zjdyzj` 同源)——逐字节比对显示与 `zjdyzj` 相似度高达 83%,与 `zjdyaryl` 约 79%,与 `zjdy2008wzb` 约 76%,与 `hell`、`zjdywzb` 则更疏远、约 67%,说明这是把同一套门派/城市江湖世界整体搬到一套完全独立开发的手机客户端引擎上,而不是简单的引擎内衍生版本;本作和 [shujian3](../shujian3/) 同属一个手机 App 协议、同一套自定义 `logind.lpc` 血统,但密码学挑战是真正校验的(真实的 `crypt(ZJKEY, ...)` 握手,没有任何万能旁路字符串),是这批档案里手机协议实现最严谨的一个;不过核心系统重写也带来代价——留言板发帖、玩家商店、邮件等旧系统专属功能在重写时没有被移植过来,深度测试确认这些功能在这套引擎里本来就不存在,并非隐藏的 bug。

English

Extracted from a nested archive (zjmud.7z, containing a folder named 'hell'). Its core system files (master.lpc, logind.lpc, and others) were heavily rewritten to support a custom mobile-phone client protocol — different master-file hash, different registration flow — but the map itself belongs to the same six-way 'Hell'/Doing-lineage family as this collection's hell, zjdy2008wzb, zjdyaryl, zjdywzb, and zjdyzj: a byte-level, line-ending-normalized comparison found its /d room tree 83% identical to zjdyzj, 79% to zjdyaryl, 76% to zjdy2008wzb, and 67% to both hell and zjdywzb — the entire sect-and-city world ported onto an independently developed mobile client engine rather than a simple in-engine derivative. It shares the same mobile-app protocol and custom logind.lpc lineage as shujian3, and unlike shujian3 its password field is genuinely cryptographically verified (a real crypt(ZJKEY, ...) challenge with no bypass string) — the most carefully-implemented of this family's mobile protocols. The system rewrite came at a cost: legacy features tied to the old core (bulletin-board posting, player-run shops, mail) were never carried over to the new engine and simply don't exist here.

README

内容亮点

注册流程(手机 App 协议)

1. 连线后驱动打印一次 ver1.0,<str> 握手横幅,input_to("jiance", ...) 等待客户端回应 crypt(ZJKEY, str[2..3])str 本身是 crypt(ZJKEY, "zj"),一个真实的、需要正确计算的密码学挑战——和 shujian3 不同,这里没有任何万能旁路字符串)。 2. 一次性发送 账号║密码║密文║email——只认字面 分隔符,不会做逗号自动替换;密文字段是真实校验的 crypt(ZJKEY,账号)+crypt(ZJKEY,密码),同样没有旁路。 3. 新账号则紧接着发送 性别║图片║中文昵称,例如 m║img1║指剑

本次修复的关键 bug

- adm/daemons/versiond.lpc(~2200 行的版本同步守护进程): in_server()/connect_server()/send_command()/ send_client_pending_msg()/syn_finish()/in_listen_callback()/ in_write_callback()/in_close_callback()/cmd_close()/ send_pending_msg()/send_result()/clear_syn_info() 内的 socket_close() 分支,共 12 处——这个文件不是"多功能大文件"的 例外情况(is_version_ok()/is_release_server() 等非 socket 函数被 questd.lpc 等广泛调用),但整个文件因为散落各处的 socket_* 调用无法编译,实际上在运行时导致 collect_all_quest_information() 崩溃——之前的记录把这个当作 "非致命错误,保持原样"是不准确的。 - adm/daemons/payd.lpc(HTTP 充值回调服务器)。 - adm/daemons/network/dns_master.lpc(跨服 intermud UDP 层)。

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

管理员账号 / Admin account

管理员名单存储在纯文本文件 adm/etc/wizlist 里;账号本身通过正常注 册流程创建。

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

本地运行

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

游戏端口:40204

NOTES · 移植与修复记录

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

从 zjmud.7z(指间mud服务器+手机版客户端.zip)里嵌套的一个 zip 中提取,内部文件夹字面命名为 'hell'——和已有的 hell/zjdywzb 世纪家族无关,master 哈希不同。修复了 efun::message() 因 exc_target=0 被拒绝的问题;创建了缺失的 /log/nosave 目录。同样是 shujian3 血统的手机 app 协议和自定义 logind.lpc。需要完整的 WASM 修复:(1)crypt(ZJKEY, 0) 客户端握手的非确定性问题(AGENTS.md §7.14)——已修复为 crypt(ZJKEY, "zj"),和 zjdyzj 一样;和 shujian3 不同,这份档案里 get_user() 中基于 crypt 的密文检查没有被注释掉,也没有逗号到 ║ 的便利替换,所以注册需要字面的 ║ 分隔符和真实的 id/密码密文(crypt(ZJKEY,id)+crypt(ZJKEY,密码));(2)经典的 §8.1 GBK 字节区间 is_chinese() 检查修复成 CJK 码点区间;(3)clone/user/user.lpc 的 accept_kill() 里 is_killing() 物件对字符串参数不匹配(§7.50,这是第三个撞上这个 bug 的血统);(4)按 §7.52 掏空了三个纯 socket 精灵(versiond.lpc——create/in_server/connect_server/send_command 等一共 12 个函式,不像之前那条笔记说的那样"保持原样",因为它实际上在运行时破坏了 questd.lpc 的 collect_all_quest_information();payd.lpc 的 HTTP 支付回呼;adm/daemons/network/dns_master.lpc 的 intermud UDP 层)。管理员(fluffos/Mud@2026)通过真实注册加 adm/etc/wizlist 播种。score 对刚创建的角色正确地被一个'born'标记挡住(游戏设计如此,不是 bug)——改用 look+quit 验证。

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

本次先按 AGENTS.md §11 通读了 zjmudhell 自己的 README("核心系统改写、 地图原样保留"血统关系)以及同一份手机 App 协议血统的 shujian3 README/NOTES.md,逐条对照其已知 bug(§7.68 复活软锁、commandd.lpc .c 后缀死循环、securityd.lpc valid_read() 误伤等),但假设 移植——每一条都在 zjmudhell 自己的代码里单独核实。

§7.52 追加实例(2026-08-18):adm/daemons/network/messaged.lpcsocket_bind() 崩溃

作为 hell 那份档案(AGENTS.md §7.52)发现的同一个 bug 的跨库排查 一环,确认这份档案(和 hell 属于同一个 shujian3/"Doing" 手机 App 血统家族,goto.lpc 也共用完全相同的 MESSAGE_D->find_user(arg) 兜底逻辑)现场复现了完全一致的崩 溃:巫师账号第一次执行 goto(触发 messaged.lpc 首次懒编译) 时,执行时段错误:*Bad argument 2 to socket_bind(); Expected: int Got: "10".——根因和 hell 完全相同(LOCAL_PORT()(int) 转 型对 get_config() 实际返回的非数字值在运行时不起作用)。这份档 案自己早前的 WASM 修复记录里提到过"按 §7.52 掏空了三个纯 socket 精灵"(versiond.lpcpayd.lpcdns_master.lpc),但 messaged.lpc(第四个碰 UDP socket 的精灵)当时被漏掉了——和 hell 自己的 versiond.lpc-修过-但-messaged.lpc-漏掉是完全相 同的疏漏模式。修复:startup_udp() 掏空成 return 0send_udp() 补上 !socket_id 保护。现场验证:重启全新驱动进 程,goto 干净执行,debug.log 里不再出现任何 socket_bind/Bad argument 记录。

跨库排查结论(截至本次):这个 bug 在 hell/zjmudhell 这两 个同源手机 App 血统档案上都 100% 复现;但在完全不相关的血统 aoxiangtianji(西游记题材)上用同样的方法(call/eval 直接触 发 create()没有复现——get_config(__MUD_PORT__) 在那份档 案上正确返回了数字端口。这说明这不是一个对所有携带这段代码的档案 都必然触发的 bug,可能和具体的血统/配置有关,不能不加验证就对 AGENTS.md §7.52 列出的其余 14 个档案批量套用同一个修复——已经把这 个结论更新回 AGENTS.md §7.52 本身,留给下一轮继续逐个排查。 记录以供以后有更完整客户端模拟能力时补测。

AGENTS.md §7.100 fix (2026-08-19): redundant replace_program(ROOM) landmine

Same corpus-wide bug as the batch-1-6 sweep (ROOM macro "/inherit/room/room" from include/globals.h). Deleted 2,315 live standalone replace_program(ROOM); lines under work/ via fix_710_room.py, plus hand-fixed the room-building tool's string-builder template (work/clone/misc/roommaker.lpc). 3 real .lpc files under work/data/ checked — none had the bug pattern. Remaining matches after the fix are all pre-existing //-commented.

Verified: clean build-debug boot (zero new compile errors, zero "cannot replace"/"cannot bind" in debug.log; log/ directory didn't exist for this lib and had to be created before the driver would boot). Live admin login through this lib's custom 指间MUD crypt()-challenge protocol (same ZJKEY/handshake as sibling zjdyzj) as fluffos/Mud@2026 — entered 客店, look/quit both worked cleanly. Incidental data/{login,user}/f/fluffos.o save drift from the login test was reverted via git checkout HEAD before committing.

§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-21):真正的战斗/死亡/复活、商店、拜师

上一轮(2026-08-08)只走完了注册仪式(世外桃源→east→out),从未真正 玩过游戏本体。本轮用管理员账号 fluffos(现场重连,账号早前登记) 补测了战斗死亡复活、商店购买、拜师三项,外加一遍标准检查清单快速核 实。全程用 /home/sunyc/src/fluffos/build-debug/src/driver 加载 config.fluffoswork/log/debug.log 全程零 Error(只有大量正常 的懒编译期 Warning,不是运行时报错)。

AGENTS.md §8.3a variant fix (2026-08-27): feature/action.lpc::eval_function() and inherit/item/combined.lpc::destruct_me() wrongly private

Same targeted follow-up as libs/hell (see that lib's NOTES.md entry of the same date for the full writeup) — libs/revive's own §8.3a deep-test finding explicitly named zjmudhell as a sibling in the hell/"Doing" lineage still carrying this bug. Confirmed present here, byte-identical file layout and content to hell:

Fix: dropped private from both declarations (function bodies unchanged), matching the established revive/hell/§8.3a pattern.

Verified live: native build-debug driver, port 40204, using this lib's custom mobile-app crypt-challenge login protocol (ZJKEY-based handshake per this lib's own earlier §7.14 fix notes) to log in as the existing fluffos/Mud@2026 admin account. goto'd to the sleep_room /d/guanwai/xiuxishi and ran sleep: with the fix in place, wakeup() fired correctly within its 12 + random(10) second delay window ("你迷迷糊糊的睁开双眼,爬了起来。"), confirming start_call_out()/eval_function() actually dispatches post-fix. (Not independently re-tested with private restored on this lib — hell's identical before/after test already demonstrated the failure mode live, and this lib's source was byte-identical before the fix.) debug.log clean of any 执行时段错误/Bad argument post-fix. Incidental data/user/f/fluffos.o save drift from the test login reverted via git checkout before committing.