War God of Mountains and Seas

✅ 可玩

山海战神

shzs

🔑 fluffos / Mud@2026 更新 66a3bd8 2026-10-28 源码 下载 ZIP

▶ 开始游玩 · Play Now

不要被"山海战神"这个名字骗了——这并不是传统武侠/仙侠泥巴,而是史巴克(Spock)开发的英文科幻引擎"Final Frontier v0.6e"(`simple`/ES II 引擎系列)二次改造而成的中文版硬科幻"战斗模拟"游戏:人物属性叫力量/敏捷/智力/注意/体质/技术,护甲分传统、动能、光学、粒子、爆破五种类型,攻击方式带着浓厚的机甲/激光对抗色彩,是这批归档里题材最"硬科幻"的一个。整体规模不大,更像是一个演示引擎战斗系统的小型试验场,而非内容丰富的大型世界。

English

A Chinese-language adaptation of Spock's English-language science-fiction engine "Final Frontier v0.6e," part of the simple/ES II engine family. Despite the wuxia-sounding name, it's not a martial-arts MUD but a hard-sci-fi combat simulator, with stats like Strength, Agility, and Technique and mecha- and laser-flavored battles.

README

在线试玩

https://mudlibs.fluffos.info/shzs/

管理员账号 / Admin account

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

本地运行

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

游戏端口:40001。

NOTES · 移植与修复记录

山海战神.rar → shzs

Status: DONE — boots clean, playable over telnet

Login banner, Chinese prompts, and character-creation flow all render correctly. This lib was the pilot used to build scripts/convert_lib.sh and the fix catalog in AGENTS.md — see that file's "Common driver-compatibility issues" catalog (§1-§14) for the general write-up of every issue found here. Lib-specific specifics only, below.

What was fixed

1. Encoding: all .c/.h files GB18030→UTF-8 (774 converted, 124 already ASCII/UTF-8, 0 hard failures). Also converted data/*.o save files (dict/emote/daemon/ballot_box/stars — these are plain-text save_object() format, not binary) — data/emoted.o needed the lossy -c fallback (one stray invalid byte at position 25324, pre-existing data corruption in the original archive, unrelated to us). Also adm/etc/welcome (login banner) and config.fluffos itself (see AGENTS.md §5 for the double-corruption trap hit here on first attempt — fixed by re-copying fresh from raw/ and converting before any edits). 2. .c → .lpc rename: 855 files. Fixed 117 literal ".c" string references across .lpc files, plus 36 in include/globals.h (the F_DBASE macro — AGENTS.md §2, this is the one that cost the most time to find since it surfaced as a runtime "Inherited file does not exist" rather than a compile error). One orphaned non-LPC file caught by the blind rename (d/shenmin/shenminmap.c, ASCII-art map, unreferenced anywhere) — renamed to .txt instead (AGENTS.md §12). 3. static → nosave: 89 occurrences across the lib (AGENTS.md §3). 4. master.lpc's valid_read()/valid_write() had the lazy load_object(SECURITY_D) recursion bug (AGENTS.md §4) — added the re-entrancy-guard + catch() fix. 5. master.lpc's valid_override() was the old 2-arg signature, which wrongly rejects efun:: overrides written in #included simul_efun fragments (AGENTS.md §14) — added the 3rd main_file parameter. (Never actually manifested in a real boot, only in the lpcc sweep testing a fragment file as a standalone object — fixed anyway since it's free and more correct.) 6. master.lpc does NOT have get_root_uid() (driver printed a non-fatal warning and continued — did not need the AGENTS.md §7 stub fix here; this lib's exit(-1) path apparently doesn't fire the way lib #2's did. Left as-is since the lib boots and plays fine regardless). 7. Config: removed 5 obsolete keys (address server ip/port, binary directory, swap file, reserved size), set port number : 40001, mudlib directory to the absolute work/ path. 8. Full lpcc_check.sh sweep run (854 files after the shenminmap.txt rename; 832 pass / 22 fail). Fixed 6 pre-existing typo bugs found this way (all unrelated to our conversion — verified against raw archive bytes): - d/zuichen/{cdkedian3,cdkedian4,cdyaopu,chengzhong}.lpc: fullwidth comma , used as an argument separator (AGENTS.md §9). - d/shiwang/qianqingon.lpc: fullwidth period in #include <ansi。h> (AGENTS.md §9). - std/room/shop.lpc, cmds/std/put.lpc: missing closing " before string concatenation (AGENTS.md §10). - adm/daemons/rankd.lpc: 8× switch(x) { default: ... } with no real case label (modern grammar requires at least one) — removed the pointless switch wrapper, kept the body (indentation not perfectly preserved, cosmetic only). - cmds/wiz/invis.lpc: declared void main(...) but returned 1/0 (command-dispatch status codes) — changed to int main(...). - obj/weapon/axe.lpc: copy-paste bug, inherit AXE/init_axe(...) but /std/weapon/axe.lpc was never implemented in this lib and the file's own header comment/id/name all say "dagger" — redirected to inherit DAGGER/init_dagger(...) (AGENTS.md §11). - obj/cloth.lpc: same pattern, inherit CLOTH with no /std/armor/cloth.lpc to back it — redirected to inherit U_ARMOR (matches its setup() call and "basic starting equipment" role).

Known remaining issues (not fixed — documented, low priority)

How to run

cd libs/shzs
~/src/fluffos/build-debug/src/driver config.fluffos
# separately:
python3 ../../scripts/mudclient.py 127.0.0.1 40001 --timeout 10 --send "" --send "look" --send "quit"

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

Re-verification pass: driver rebuild + formatter + WASM (2026-07-23)

WASM-enablement pass (2026-07-24): admin seeding only (no gates found)

Checked for all four standard gate classes (AGENTS.md §1.3b/e): no band.lpc/BAN_D-style ban daemon, no site-restriction daemon, no uptime() check anywhere in the login path, and no per-IP anti-flood/ multi-login throttle (logind.lpc/logind2.lpc only use query_ip_number/query_ip_name cosmetically, in log lines and "who connected from where" messages — confirmed by grep, not just absence of symptoms). So items 1-3 of the standard pass (loopback-allow, uptime-bypass, throttle-exemption) are not applicable to this lib — nothing to patch.

Admin account: registered fluffos / Mud@2026 through the real registration flow (id fluffos accepted directly — no length/reserved- word conflict), Chinese name 浮浮, gender m, attributes 10/10/10/10/10/10. Granted (admin) via /adm/etc/wizlist (this file already had a fluffos (admin) line staged from an earlier interrupted pass; verified /adm/daemons/securityd.lpc reads this file for wizard-level decisions). Verified in ONE continuous session: login as fluffos, look, then update /adm/daemons/securityd.lpc recompiled successfully (ACL grants write/compile access), then clean quit. Re-verified a fresh normal registration end-to-end afterwards (id qinfeng, name 秦风, same attribute split) reaching 梦旅馆大厅 with working look/score/quit; its test save (data/login/q/qinfeng.o, data/user/q/qinfeng.o) was removed afterwards. debug.log clean (compiler warnings only, no errors) across both sessions. Save files for the orchestrator to force-add: data/login/f/fluffos.o, data/user/f/fluffos.o (untracked, not gitignored).

Note: an earlier same-batch agent's driver process for this lib (PID 4045698, started 00:37, before this session began) was found still bound to port 40001 with no admin work done yet; it was killed (exact PID) and the driver relaunched fresh before doing the registration above.

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

First genuine hands-on *playthrough* pass on this lib (all prior passes verified registration + look/score/quit/update, never a real walk through content). Native driver (build-debug), one continuous session per check, scripts/mudclient.py. Test character: id linfeng, Chinese name 林风, password Abc12345, attributes 15 力量/ 10 敏捷/10 智力/6 注意/17 体质/2 技术 (the game's own example split from help's attribute-allocation screen) — kept as a representative playthrough character, currently standing on a d/lwe/jie* street (state below). Save files: work/data/user/l/linfeng.o, work/data/login/l/linfeng.o.

This lib's help newbie/help intro don't exist as such; its actual newbie doc is help (topics: story, cmds) — read first, per the checklist, and immediately found broken (see bug 1).

Bug 1 — help/help cmds/help story and the day/night broadcast

text were still raw GBK bytes, never converted (AGENTS.md §4.1 class, just missed on this lib's original pass)

Bug 2 — per-command 指令格式: (syntax) help lines mis-decoded as

GBK when the source byte run was actually BIG5 (same §4.1 class, a narrower/more surgical instance)

Bug 3 — a player who disconnects uncleanly is stranded in the void,

via TWO independent code paths (new bug class — see report for the AGENTS.md draft)

Found by literally doing what §10.7 step 5 asks: quit, grep debug.log, reconnect after a real gap, confirm state — except the very first "reconnect after real gap" (a session that ended by the mudclient.py connection simply going away, i.e. exactly what a real player's dropped wifi/closed laptop lid looks like, not a clean quit) landed linfeng in "影子世界" (obj/void.lpc, the VOID_OB net-dead holding room — zero exits) instead of back where they'd been.

What else was tested and confirmed working

Explicitly NOT verified live (with reason)

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

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

1. config.fluffos:maximum evaluation cost 从 700000(已知 风险区间)提升到 5000000。 2. adm/simul_efun/file.lpc:log_file() 没有 assure_file() 目录预建保护,补上调用及前向声明;cat() 补上 read_file() || "" 空值防护。 3. obj/user.lpc::reconnect()(AGENTS.md §7.108,第五条独立确认 的血统——本档案与此前命中过的 shenzhou/shiji/shujian2008/shujian3 均无关联,是完全不同的 obj/user.lpc 架构,同一 bug 在这条独立 血统上再次出现):adm/daemons/logind.lpc 有同款 exec(old_link, user); 踢掉重复登录写法,reconnect() 缺少 enable_commands()。 按 §7.108 记录的写法预防性修复,现场用两个真实连线复现"保持第一 个连线不断开→第二个连线登录→答 y 踢掉旧连线"验证:score 修复 后立即正常显示完整角色档案。

cmds/wiz/update.lpc(§7.106)与 master.lpc::log_error()(§7.10 的 "arning:" 大小写无关写法)均已是正确写法,无需改动;本档案无 adm/daemons/closed.lpc,不受 §7.107 影响。

现场验证摘要

驱动干净启动,管理员 fluffos/Mud@2026 登录确认 目前权限: (admin),update /adm/daemons/logind 成功验证真实写入权 限。踢掉重复登录重连路径现场验证通过(见上)。debug.log 全程干净 (448 行,无真实错误)。

本轮修改的文件

深度功能测试第三轮 / Deep functional test round three (2026-08-18)

Standard §7.111/§7.112/logind-save/case-mismatch checklist (all clean, no action needed):

Bug found and fixed — adm/simul_efun/gender.lpc was BIG5 bytes

mis-decoded as GBK during the original conversion pass (same class as round two's Bug 2, much wider blast radius)

Bug found and fixed — netdead reconnect never restores heart_beat,

permanently soft-locking anyone who dies and ever has one dropped connection (new bug class, not previously in AGENTS.md)

What else was tested this round

Files modified this round

§7.114 fix: private input_line() broke multi-line to/board/mail input (2026-08-19)

Same ES2/FF-ancestry bug as zzhj/dfgs2 (see AGENTS.md §7.114): work/feature/edit.lpc (this lib's F_EDIT mixin, inherited by std/char.lpc) declared its input_to() re-arm target private: private void input_line(string line, string text, function callback). The recursive re-arm from inside input_line() silently failed to register once reached through the inherited mixin, so any multi-line .-terminated input session (board post, to, mail) dropped everything after the first line. Fix: dropped private.

Live-verified on a fresh driver boot (port 40001), fresh character (秦捌捌/qinbaba): to say → two lines of text → . → resulting say output showed both lines (你 说道: hello line one\nhello line two), not truncated after line 1. This lib has no chfn.lpc and its board object isn't placed in any reachable room in this archive, so cmds/usr/to.lpc (which drives the identical edit()/input_line() flow) was used as the representative live test instead of post. Killed the driver by exact PID when done.

Files modified this pass:

§7.100 sub-threshold instance (2026-08-20)

Found during the §7.100 tail-sweep (below the original 166-lib survey's

=100-occurrence threshold, never checked). 10 live

replace_program(ROOM); occurrences across 10 room files (obj/void.lpc, d/zuichen/jinshedong.lpc, d/shiwang/yongdingmen.lpc, d/mohao/*.lpc x4, d/death/*.lpc x3) — same fatal redundant-replace-after-inherit shape as the rest of the §7.100 family. No room-building tool exists in this lib. Fixed by deleting the redundant lines. Verified via a clean native driver boot (zero new debug.log errors, port listening, killed by exact PID after ~8s).

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

深度功能测试(§10.7,2026-10-04)— negative range ends

scripts/lpc_fix_negative_ranges.py: 1 line(s) in 1 file(s) count a range from the end with < (x[a..-1] -> x[a..<1], x[-2..] -> x[<2..]; KB 06 §7.209). In this driver a negative constant end gave "" / ({ }) and a negative start the whole value, so each of these returned the wrong slice; the compile warning A negative constant as the second element of arr[x..y] is gone from the files that compile. Range lvalues (s[0..-1] = text, the prepend idiom) are left alone. A paired compile of the changed files at HEAD and in the working tree showed no new error.

深度功能测试(§10.7,2026-10-05)— tail() simul_efun

scripts/lpc_add_tail.py --apply: cmds/wiz/tail.lpc calls tail(file), an efun of the MudOS this archive ran on that FluffOS does not have (Undefined function tail: the command did not compile). adm/simul_efun/file.lpc now defines void tail(string file): the last 10 lines of the file, written to the player. Load check (HEAD against the working tree): 1 of the 1 tail command file(s) failed to load at HEAD, all load now, and the simul_efun file loads. KB 04 §6.2.

深度功能测试(§10.7,2026-10-05)— 房间列出的物件缺档时房间照常加载

房间基类 std/room.lpc:make_inventory() 用 catch() 包住 new(file),做不出来就返回 0;reset() 的 case 1: 拿到 0 就跳过这一项(if (!objectp(ob[list[i]])) break;)。档案里没有的 NPC 或物品(或 create() 出错的物件)原先会让列出它的房间整个加载失败(Bad argument 1 to environment(),或对 0 的 call_other()),连带这个房间后面的区域;现在房间照常加载,只是少了那个物件,下次 reset() 再试(KB 05 §7.25;scripts/lpc_resilient_room.py、scripts/lpc_room_reset_guard.py)。 验证:探针(scripts/lpc_room_reset_probe.py:房间基类列出一个不存在的物件,再调用 reset())HEAD 单件 崩溃、多件 崩溃,工作树 单件 OK、多件 OK。

深度功能测试(§10.7,2026-10-07)— 空的 if (current_water == 0) {}

2 个房间的 valid_leave() 里有一行什么也不做的 if (current_water == 0) {}(编译警告 Expression has no side effects),删去,行为不变:d/yishi/samo2.lpc、d/yishi/samo3.lpc。

深度功能测试(§10.7,2026-10-07)— 编译警告整理

scripts/lpc_warnings.py shzs --fix 加 scripts/lpc_fix_no_effect.py --apply,共改动 496 个 .lpc 和 1 个 .h(多为删去未用的局部变量)。HEAD 与工作树分别加载(新进程):490 -> 490 通过,无回退;改过的头文件的 1 个包含者 1 -> 1 通过。启动时警告 17 -> 0;新进程登录(输入名字)正常。

编译警告收尾(2026-10-13)

scripts/toolkit_fix.sh 一轮把 feature/container.lpc、std/equip.lpc、std/money.lpc 的 query_autoload() 改成与 F_AUTOLOAD 一致的 mixed;其余手工,能编译的文件警告清零;改动的 6 个对象在 HEAD 与工作树各载入一次,regress 0。

family 映射(再补)(2026-10-15,KB 05 §7.30)

mapping fam; fam = (mapping)ob->query("family");(先声明后赋值)和泥潭式的 query("family", me) 同样直接取下标:无门派的新人拜师(attempt_apprentice/recognize_apprentice)、NPC 的 greeting、房间的 valid_leave、ask_me 等报 Value being indexed is zero。2 处补上 if (!mapp(fam)) fam = ([ ]);(刚 recruit_apprentice() 之后的除外)。

去掉的预定义宏 SAVE_EXTENSION(2026-10-18,KB 04 §6.11)

老版 MudOS 给每个 LPC 对象预先定义了 SAVE_EXTENSION(".o");FluffOS 的 ChangeLog(COMPAT_BUSTER 一条)把它删了,改用 __SAVE_EXTENSION__。本库没有自己 #define 这个宏,用到它的文件一律 Undefined variable 'SAVE_EXTENSION',整个对象载入不了。改成 __SAVE_EXTENSION__(scripts/lpc_fix_predefined_macro.py):adm/daemons/network/netmail.lpc。netmail 是网络邮件守护进程(本库缺 mailer.h 等头文件,改后仍载入不了)。改后用 lpcc 逐个载入这些对象:0 个通过,1 个还有别的错误(adm/daemons/network/netmail:/adm/daemons/network/netmail.lpc:17: error: Cannot #include mailer.h)。

for (int i ...) 的循环变量在循环外还在用(2026-10-18,KB 04 §6.12)

当铺/商店的 do_buy() 写成 for (int i = 0; ...) if (...) break;,循环一结束又读 if (i == sizeof(inv))。FluffOS 里 for 头里声明的变量只在循环内有效,所以 Undefined variable 'i',整个房间(NPC)载入不了,当铺根本进不去。把 i 声明挪到函数开头(int i, index;),循环改成 for (i = 0; ...):std/room/shop.lpc。改后用 lpcc 逐个载入这些对象:1 个通过。

同一个 init() 写了两遍、内容不同(2026-10-19,KB 06 §7.265)

d/zuichen/huli 里 init() 定义了两次(一个加 buy/work 之类的指令,另一个再加 list/block_cmd),驱动报 Redeclaration of function 'init',整个物件载入不了。两处作者本来都要:把第二个 init() 里的 add_action(...) 并到第一个 init() 末尾,删掉第二个。(scripts/lpc_merge_dup_init.py)

出口指向不存在的房间(2026-10-19,KB 06 §7.257)

下列房间的出口写的文件不存在,而对面恰好只有一个房间的出口指回本房间,所以按对面的房间改正(笔误、大小写、路径少了一级):

改后房间照常载入(与 HEAD 逐个对比,没有退步),出口现在指向存在的房间。

RANK_D 对 0 的称呼(2026-10-19,KB 06 §7.273)

adm/daemons/rankd.lpc 的 query_respect()、query_rude()、query_self()、query_self_rude() 里 4 个函数开头补上 if (!objectp(ob)) ob = this_object();。NPC 在 create() 里写 "…" + RANK_D->query_respect(this_player()) + "…"(inquiry 对话、chat_msg),驱动自己跑 reset() 时没有人在场,this_player() 是 0。旧驱动里 0->query("age") 返回 0,称呼走默认分支;新驱动直接报 Bad argument 1 to EFUN call_other(),房间的 make_inventory() 吞掉错误,被打死的 NPC 再也刷新不回来。用 scripts/lpc_reach_census.py --walk 找到(xkx100 的武当弟子、一灯、汴梁书生…);修在守护程序里,不动 1,800 个 NPC 文件。

socket / dumpsocket 指令:dump_socket_status() 驱动里没有(2026-10-20,KB 06 §7.291)

这些巫师指令 write(dump_socket_status());,MudOS 的 efun 在 FluffOS 里不存在,指令编译不过。在模拟 efun 文件里补了 dump_socket_status():用 socket_status() 排出同样的表(没有 sockets 包的构建,比如 WASM,只有表头;scripts/lpc_add_sefun.py dump_socket_status)。

登录密码超过 255 字节:crypt() 抛错(2026-10-20,KB 06 §7.294)

驱动的 crypt() 对超过 255 字节的密钥直接报错(Error in crypt(), check your salt),老驱动则按任意长度散列。在登录提示符下输入 256 字节以上的密码,密码检查那一行就抛错,连线停在一个裸的 > 提示符上,登录走不完(password 指令的旧密码检查同样);用 300 个 x 当参数的扫描发现的。/adm/obj/simul_efun.lpc 里补了一个同名的 simul_efun crypt(key, salt):只有超长的密钥才被截短(先截到 255 个字符,再逐字符截到 sizeof(to_buffer(key)) <= 255,限制按字节算,一个汉字占三个字节),再交给 efun::crypt();普通密码原样散列,已存的密码散列不受影响(scripts/lpc_add_sefun.py crypt)。

翻页器 start_more(read_file(...)):文件缺失时 explode(0)(2026-10-20,KB 06 §7.300)

东方故事系的翻页器 void start_more(string msg) { ... explode(msg, "\n") ... } 被这样调用:start_more(read_file(HELP_DIR + "help/topics"))、start_more(read_file(NEWS))。压缩包没带的文件使 read_file() 回 0,explode(0, ...) 在本驱动里报 Bad argument 1 to explode()(不带参数的 help 指令就是这样出错的),老驱动把 0 当空文本。在 start_more 开头加了 if (!stringp(msg)) return;(scripts/lpc_fix_start_more.py)。改动:/feature/more.lpc。

disembark:在船舰以外的地方对 0 调用函数(2026-10-21,KB 06 §7.332)

cmds/std/disembark.lpc 只有人在船舱房间里才给 env(船舰对象)赋值,否则 env 是 0,接着 if (!env->is_space_ship() && !env->is_shuttle()) return notify_fail("你不在任何船舰中。\n"); 对 0 调用函数:原驱动答 0,于是走到提示;这个驱动抛 Bad argument 1 to EFUN call_other() Expected: object, string, array, Got: int(0),玩家在任何普通房间敲 disembark 都是运行时错误。条件前面加 !objectp(env) ||,提示文字不变。加载检查通过;扫描时是 disembark 的裸命令触发的。shzs 和 zzhj 同一处(前者简体、后者繁体)。

NPC 的 chat() 在 chat_msg 为空数组时下标越界(2026-10-21,KB 06 §7.334)

NPC 基类的 chat() 是 if (arrayp(msg = query(...))) { if (random(100) < chance) { rnd = random(sizeof(msg)); if (stringp(msg[rnd])) ...,不检查列表是否为空。本库现有的 NPC 文件里没有字面写成空 chat_msg 的(扫描只认 set("chat_msg", ({ })));守卫挡的是运行时才为空的列表和以后新增的 NPC。在 random(100) < chance 前面加 sizeof(msg) &&(scripts/lpc_fix_chat_empty.py;if (random(100) > chance) return 0; 的写法是 !sizeof(msg) ||)。改动:/std/char/npc.lpc(共 1 个文件)。

巫师命令不带参数时对 0 调用 efun(2026-10-21,KB 06 §7.336)

巫师(管理员)把命令敲成不带参数时,驱动把 0 传给字符串参数;下面的命令第一句就把这个 0 交给 efun,运行时报 Bad argument 1 to ...,这条指令从来没有用过。用 scripts/lpcc_bare.py 不登录、在一次 lpcc 求值里以 0 调用 main() 逐个确认后,由 scripts/lpc_fix_bare_arg.py 在第一处使用参数的语句前加守卫:文件自带 int help(object me) 的,守卫是 if (!arg) return help(me);(help() 定义在 main() 之后的 1 个文件补了原型 int help(object me);,否则编译报 Undefined function help);没有 help() 的是 return notify_fail("…\n");。改动(2 个文件,括号里是接住 0 的 efun):/cmds/arch/grep.lpc(sscanf)、/cmds/wiz/test.lpc(present)。加载检查 HEAD 与工作树对照,没有退步。

注册到不存在函数的 add_action(2026-10-21,KB 06 §7.349)

add_action("函数", "动词") 绑定的函数,在对象本身、它包含的头文件、它继承的父类和继承它的子类里都没有定义(scripts/lpc_scan_callout_targets.py 静态解析,子类用传递闭包复核,scripts/lpc_verify_handlers.py 运行时 function_exists() 复核)。驱动从玩家最新的一条动作往回找,遇到这样的句子就报 *Function for verb 'drop' not found.,同一个动词的其他处理函数不再尝试(不是最新的一条就悄悄跳过)。删除了 2 条注册(1 个文件,scripts/lpc_fix_dead_add_action.py),动词留给别的处理函数:/d/mochen/dongwuchang.lpc(do_ci、do_da)。最多的函数名:do_ci 1 处、do_da 1 处。

按字节写的汉字循环、茶馆猜诗和同盟频道标题(2026-10-23,KB 06 §7.363)

老档按字节做「一个汉字」:while (i--) if (i % 2 == 0 && !is_chinese(name[i..<0])) 只检查偶数下标,奇数位上的拉丁字母(张a)会过;茶馆猜诗 mixup() 用 strlen(str)/2 再 j=j+j、str[k..k+1] 交换两字节;泥潭系 channeld 的 switch (strlen(fname)) case 4/6/8/10 和 strlen(family)==4/6 按字节长度给同盟 / 门派名加空格。本驱动的 strlen() 和区间都按字符算。scripts/lpc_fix_byte_char.py:去掉奇偶项、把区间改成 name[i..i],按字符重写 mixup() 并把 strlen(first)>=14 折成 7,频道标题的 case / 门派长度改成字符数(对照 aoxiangtianji)。本库 汉字循环 / is_chinese 区间 1 个文件。证明(scripts/lpcc_eval.py):sjplii 的 check_legal_name 在 HEAD 接受「张a」、改后拒绝,两边都接受「张三」;xkx100 的 clubpoem->mixup("离离原上草") 得到「离离原草上」(真交换汉字);nitan_san 两字同盟名得到 【 兄 弟 】。关键对象加载通过。

血条 / 表情标题按字节算显示宽度(2026-10-23,KB 06 §7.365)

老档把汉字当两字节:bar_string[0..(val * N / max) * 2 - 1] 把「格数」换成字节下标,半格血条在本驱动(按字符算区间)上会整条画满;巫师表情 edemote 的 repeat_string("─", 13 - (strlen(emotion) / 2)) 也会少减汉字宽度。scripts/lpc_fix_display_pad.py:去掉 CJK 血条 / 空白条上的 * 2(jings/qis 赋值和 blank_string3[0..(23-a)] 的 23→11 一并改),表情标题去掉 / 2;ASCII 空格的 none_string / empty_string 仍保留 * 2(一格两个空格)。本库 3 处(1 个文件)。证明(lpcc_eval.py hhsj):tribar_graph(6,9,12) 在 HEAD 画出整条 12 个■,改后为 6 个■+3 个□;麻将 strlen(tempB)/2 是两字符牌码,未改。

无参数时命令对 0 的调用(玩家/--all-dirs 残留,2026-10-27,KB 06 §7.336 Also)

无参数命令把 0 交给 present / sscanf / file_exists 等会运行时报错。lpc_fix_bare_arg.py --all-dirs 在首次使用参数前加守卫。多行 if (arg && !sscanf)(吐纳默认消耗)与已有 can_learn/get_object 守卫的误报已回退;本库本批改动见该提交。

深度功能测试(2026-10-27,§6.10 未知 pragma save_binary/optimize)

删除本库中 FluffOS 不认的 #pragma save_binary / #pragma optimize… 行。