info.html · 介绍 · play.html · 游玩 · llms.txt · 下载与本地运行 · ZIP · GitHub
以古龙小说世界观为背景的武侠 MUD,与 jyqxc、jyqxc2、jyqxc2013fwq、xkx2017 同属"金庸群侠传"/XKX 引擎家族,共享同一份 `adm/obj/master.lpc`;此前记录称其游戏内容与家族其他成员"完全不同",但逐文件比对发现这一说法有所夸大——约三成域文件与同属 XKX 框架的 `fy330` 逐字节相同,连中心广场"凤求凰"及晨香镇的房间命名骨架都完全一致,说明两者其实脱胎于同一套"风云"世界模板,各自在其上独立改写而成。注册时需选择民族(汉族/苗族/满族/蒙古族),呼应古龙江湖的跨民族设定;密码规则要求同时包含大小写字母和特殊符号,是本合集里最严格的之一。负伤会持续降低气血上限而非只扣当前气血,伤势越重上限掉得越低;风云衙门的衙役会主动追击逃跑的玩家至相邻房间,这在本合集大多数"逃跑即安全"的战斗设计里较为少见。
English
A wuxia MUD set in Gu Long's jianghu, built on the "Jinyong Qunxiazhuan"/XKX framework — it shares the same adm/obj/master.lpc as siblings jyqxc, jyqxc2, jyqxc2013fwq, and xkx2017. It was previously catalogued as having "entirely different" game content from every other sibling, but a file-level check found that overstated: roughly 30% of its domain files are byte-identical to fy330's (also an XKX-framework game), including the exact room-name skeleton for the central Fengqiuhuang square and Chenxiang Town — both draw on the same underlying Fengyun-world template, each independently re-skinned on top of it rather than built from nothing. Distinctive touches of its own: a registration password rule requiring mixed case plus a special character (matched byte-for-byte by fy330, but stricter than most of this collection), ethnicity selection at signup, wounds that permanently lower a character's HP ceiling instead of just draining current HP, and government constables who — unlike most NPCs in this collection — actively chase fleeing players into adjacent rooms.
README
内容亮点
- 虽然和
jyqxc/jyqxc2/jyqxc2013fwq/xkx2017共享同一份adm/obj/master.lpc("金庸群侠传"/XKX 框架家族),但这份档案取 材古龙小说世界观,游戏内容完全不同,因此在本项目里单独编号。 - 注册密码要求比较特殊:不是单纯的长度下限,而是必须同时包含大小 写字母和特殊符号,是这批档案里密码复杂度要求最严格的一个。
- 注册时要选择民族(汉族/苗族/满族/蒙古族),呼应古龙小说里跨民族 的江湖设定。
- 负伤会持续降低气血上限(不只是扣当前气血),伤越重上限掉得越低; 角色气血逼近临界值时会自动逃跑求生,实测这个安全机制即使被对手 一路追击到重伤(半昏迷)也依然可靠生效。
- 风云衙门的衙役对玩家有主动追击行为——逃到相邻房间后对方会跟过 来,和本合集里大多数"逃跑=安全"的战斗设计不同。
- 更正(2026-08-05):上面提到的"7.68 复活软锁"修复已经撤销——经重新评估,鬼魂"不在场"时放弃复活流程更可能是有意的游戏设计(多数这类档案里鬼魂本身就无法自行移动,离开是一种游荡机制,回来时 init() 会重新触发流程),不是需要强制重试的 bug;详见 NOTES.md。
深度功能测试新发现的 bug(详见 NOTES.md)
adm/daemons/logind.lpc 里有两处调试用的 printf("%O\n", ob)
(AGENTS.md §7.34,两条平行的姓名输入路径各一处,和姊妹档案
fy330 逐字节相同)——已删除。另外在死亡/复活系统里发现并修复了
AGENTS.md §7.68 归档的复活软锁死 bug 类的又一实例:d/death/npc/
{wgargoyle,bgargoyle}.lpc(白无常/黑无常,和 bixiecanyang/fy330
同宗)的 death_stage() 把"对象已不在场"和"对象已销毁"这两种本质
不同的情况混在同一个 return 里,导致复活序列一旦被打断就会永久
卡死。已按已验证过的修法拆分;本轮测试里角色的自动逃跑机制即使在
被追杀到重伤时依然可靠生效,没能真正把角色打死,所以这个修复是照
抄其他姊妹档案已验证过的修法应用的,未在这份档案本身现场复现死亡
→复活的完整流程。
注册流程
new 触发注册 → 英文 id(3-12 个英文字母)→ 确认创建(y/n)→ 中文
名字(1-6 个中文字,留空则随机取名)→ 密码(需同时包含大写字母、
小写字母和特殊符号,仅满足长度下限不够)→ 确认密码 → 电子邮件
地址 → 性别(m/f)→ 民族选择(0=汉族,1=苗族,2=满族,3=蒙古族)。
本次修复的关键 bug
adm/daemons/logind.lpc:make_body()里的seteuid(getuid())会 把create()刚设置好的 euid 重置为空字符串,已改为显式seteuid(ROOT_UID)。check_legal_name():沿用旧版 GBK 字节长度界(提示语说"一到六个 中文字",实际检查的却是字节数 2-12),已改为按字符数(1-6)+ 逐字符is_chinese()判断,并去掉隔位检查。adm/daemons/securityd.lpc:get_status()加了防御性mapp()/arrayp()检查(未实际观察到重入崩溃,但成本很低)。
管理员账号 / Admin account
- id:
fluffos - 密码 / password:
Mud@2026x(普通密码含大小写字母 + 特殊符号, 满足本代码线的密码复杂度要求) - 权限 / level:
(admin)
管理员名单存储在纯文本文件 adm/etc/wizlist 里,格式为
id (level)。修正(round-two 深度测试发现):wizlist 里虽然早就
有 fluffos (admin) 这一行,但从未有匹配的角色存档被真正提交
过——wizlist 只决定"这个 id 拥有什么权限",不会凭空创建这个 id 本
身的角色;此前的播种记录只做了第一步。已用真实注册流程走完全程创建
角色,update 指令验证可正常编译,管理权限真正生效。
警告:这是一个公开的默认密码,仅供本地/浏览器试玩。正式对外开服前
请务必修改此密码。
在线试玩
https://mudlibs.fluffos.info/fy2mg/
本地运行
cd libs/fy2mg
~/src/fluffos/build-debug/src/driver config.fluffos游戏端口:40198。
NOTES · 移植与修复记录
WASM 修复摘要(迁移自 meta.json 的 group_note)
adm/obj/master.lpc 和 jyqxc(086)/jyqxc2(087)/jyqxc2013fwq(088)/xkx2017(112)逐字节相同——同一个"金庸群侠传"/XKX 框架家族,游戏内容不同,按本项目对这个家族已有的惯例单独编号;启动干净,零修复。完整 WASM 修复:给 band.lpc 加了本地回环放行;修复了 logind.lpc 的 make_body() 里 seteuid(getuid()) 把 euid 重置掉的 bug;修复了 check_legal_name() 过时的 GBK 字节长度界限,去掉了 i%2==0 门槛;给 securityd.lpc 的 get_status() 加上了防御。注册流程里有两步是本次会话其它血统档案里没见过的:密码复杂度要求(必须同时包含大小写字母和特殊符号,不只是长度下限),以及性别之后、进入游戏前的民族选择(0-3)——需要照实读取 input_to() 调用链,不能假设它和 jym/hy 系那种更短的流程一样。管理员账号通过纯文本的 adm/etc/wizlist 播种。注册流程到进入游戏世界、look/score/quit、管理员权限识别都已干净验证。
深度功能测试(§10.7,2026-08-04)
原生 driver(端口 40198)跑了一遍超出注册流程的完整游玩,先读了
doc/help/newbie(风云系《新手指南》,和 fy330 的版本几乎同源但不
完全相同)作为测试路线图——这一版明确给出了一份从弱到强排序的安全
陪练对象列表("无知小童,教书先生,落第书生,乞丐,收破烂的,醉汉,
农夫..."),本轮据此思路(虽然这几个具体名字在这份档案自己的地图
里大多没被实际放置,是家族共享的文档模板,不是这份档案专属的内容)
挑选了地图上实际存在、战力由弱到强的几个 NPC 做陪练。
主动检查命中 2 处,都在 adm/daemons/logind.lpc 里(AGENTS.md
§7.34):随机姓名分支和手动输入姓名分支各有一处紧挨在
ob->set("name", ...) 之前的 printf("%O\n", ob) 调试残留,和
fy330(同一 XKX 框架家族的姊妹档案)逐字节相同,已一并删除。
command_hook 是干净的 nomask,没有 MESSAGE_D-> 未防护调用、
stat/water 键名不一致、或 §8.9 食物/饮水按错误对象 age 初始化的问题。
注册与地图探索:注册测试角色(秦北 / id qinbei),落在"凤求凰
客栈"。i/hp/score 输出格式和数值范围与新手指南的范例基本一致。
探索了风云城的主要街道——南风大街(注意同名但内容不同的两个"南风
大街"房间前后相邻,靠东西方向区分,不是 bug,只是两段街道恰好同
名)、风云广场、西云大路、天主教堂(no_fight,"这里不准战斗。",
符合宗教场所设定)、风云衙门、玉龙珠宝店等,移动和出口全部正常。
商店测试:玉龙珠宝店的 list 正确显示商品和黄金标价(玉指/玉
簪/玉花/玉镯),vendor 链路工作正常。
战斗测试(三个不同强度的目标):
- 凤求凰客栈的"店小二"(combat_exp 5,
attitudefriendly)——用kill绕开 friendly 的 fight-拒绝判定(和bixiecanyang/fy330发现的技巧一致),双方命中率都很低,气血从 250 缓慢降到 137 后主 动移动脱离战斗,气血随即回升——确认战斗判定和脱离机制正常。 - 考场的"考生"(combat_exp 50000,friendly)——发现但受时间限制未 实际交手。
- 风云衙门的"风云衙役"(combat_exp random(500000),
attitudeheroism)——连续三次kill,每次都在气血逼近临界值时触发角色自 身的自动逃跑("看来该找机会逃跑了..."),但这个对手会主动跟到玩 家撤离的房间("风云衙役走了过来。")——和fy330/bixiecanyang遇到的"逃跑必定安全"不同,这里首次观察到追击行为,气血/气血上限 一度降到 4/29(11%),角色进入"半昏迷"重伤状态但最终还是在下一次 自动逃跑里脱险,全程没有真正死亡。气血上限随着伤势加重而持续下 降(250→163→29)是这条血统的负伤机制,不是数值错乱。
死亡/复活系统:发现并修复 §7.68 的又一实例(未做到现场完整复
现):虽然被追杀到气血 11% 也没有真正死亡,但主动读了死亡系统代
码,d/death/npc/{wgargoyle,bgargoyle}.lpc(白无常/黑无常)和
bixiecanyang/fy330 的死亡系统同宗(revive_loc/death_msg 文
本逐字节相同),death_stage() 都有同样的 if (!ob || !present(ob))
return; 复活软锁死守卫(AGENTS.md §7.68 第四例)。已按已验证过的
修法拆分:!ob 仍然永久放弃,!present(ob) 改为 5 秒后重试同一阶
段。两个文件的改动逻辑与 bixiecanyang 完全对应——wgargoyle.lpc
是纯粹的多阶段复活序列,bgargoyle.lpc 在复活序列之前还多一段"活
人闯入阴间就攻击"的判断,两处guard 都属于同一个多阶段流程的一部
分,都需要修。
诚实记录:本轮三场战斗测试都没能把角色真正打死(自动逃跑机制
即使在被追击、气血跌到 11% 的极端情况下依然生效),所以
wgargoyle.lpc/bgargoyle.lpc 的修复是照抄已经在 bixiecanyang/
fy330 现场验证过的修法应用的,不是本轮独立复现死亡→鬼门关→复活
全流程后现场验证的。这个自动逃跑安全网在两个不同的姊妹档案
(fy330、本档案)里都表现得相当可靠,值得作为这整个 ES2 大家族的
一个共性记录下来。
quit 正常退出(丢下一件不值钱的布衣,"欢迎下次再来!"),
formatter 检查(三个改动文件均已是干净格式,无需重排版)、
git status --short libs/fy2mg/ 复查均确认改动范围干净——只有
logind.lpc/wgargoyle.lpc/bgargoyle.lpc 三处源码修改是跟踪变
更,测试角色的新存档保持未跟踪、未提交。debug.log 全程没有真实
的 error:/denied/Bad argument/Too deep recursion 行。
更正(2026-08-05):§7.68 复活软锁"修复"已撤销
上面提到的"鬼魂离开/不在场时被永久放弃复活流程"曾被当作 AGENTS.md
§7.68 记录的一类 bug 修复(把单次判定改成每 5 秒重试)。经用户指出并
重新审视:这更可能是有意的游戏设计,不是 bug——大多数这类档案里
鬼魂根本无法自行移动,所以"不在场"要么从未真正发生,要么是"离开去
在阴间游荡,想回来时再走回这个房间、流程会通过 init() 重新从头开始"
这种有意为之的宽松机制,而不是需要强制追上玩家的错误。强行重试还可能
引入新问题:如果鬼魂之后又走回这个房间,旧的重试和 init() 重新触发的
新一轮流程可能同时运行,导致对话重叠错乱。已把这处改动撤销,恢复成
原始的 if (!ob || !present(ob)) return; 单次判定写法(bmxkx2001
除外——那份档案里这确实是一个真实存在、经过实际复现验证的 bug:鬼魂
本身完全无法移动,是另一个不相关的 NPC 强行把鬼魂拖走导致的)。详见
AGENTS.md §7.68 顶部的撤销说明。
§7.86 跨库扫描修复(留言板 post 崩溃)
BULLETIN_BOARDinherit+ 多余replace_program()致命形状(AGENTS.md §7.86,post命令崩溃):全档案 7 处命中,已删除多余的replace_program(...)调用(保留inherit),逐文件保留原有行尾格式(CRLF/LF 按文件原样)。本次为跨库 §7.86 扫描修复(触发原因:该 bug 已在 6+ 个互不相关的血统家族独立确认,属于近乎普遍的拷贝粘贴模式),仅做编译检查(驱动干净启动、端口正常监听),未做完整 §10.7 深度游玩测试。
深度功能测试(2026-08-12,round two,新驱动重测)
Re-tested against the freshly-rebuilt build-debug/src/driver(post
全库 quest_times/win_times %-operator 修复 + Warning/warning
驱动文本回退)。
发现并修复的 PROGRAMMING bug
1. log_error()(adm/obj/master.lpc)完全没有严重度检查(AGENTS.md
§7.34-class,与本轮 wdxtym/ffxymud/fqyy2 同一原始形状):
if (this_player(1)) efun::write("编译时段错误:" + message +
"\n");——不区分巫师/玩家,也不区分警告/错误,无条件把所有编译诊断
转发给当前连线的任何人。真实复现:全新驱动进程下首次注册
fluffos 管理员账号触发的冷编译级联(/std/char 及其十余个
feature/*.lpc inherit 链首次编译),修复前屏幕上连续刷出二十多
行原始 "Warning: Unused local variable"/"Unknown #pragma" 诊断。
修复:加上 strsrch(message, "arning:") == -1 判断,只有真正的错
误才转发。已用同一新驱动进程下的完整重新注册复测:零次诊断刷屏。
2. log_file()(adm/simul_efun/file.lpc)完全没有 assure_file()
保护(AGENTS.md §7.11-class 的又一确认实例,与 fqyy2 同一形
状):LOG_DIR 下的 nosave/ 子目录在全新检出里不存在,
suicide/崩溃日志/purge/巫师晋升等管理指令路径的
log_file("nosave/...", ...) 调用会在首次使用时未捕获抛出。注册
/登录本身只写顶层文件(USAGE/ATTEMPT_LOGIN,无子目录,本来就
存在),不受影响,但这是一个明确存在的 bug,按标准模式补上
assure_file(LOG_DIR + file);(含前向声明)。
3. 管理员账号从未真正创建(AGENTS.md §1.5 的"wizlist 有记录但角色
从未真正建立"形状,与本次会话开头几个档案的 commit 记录同一
模式):adm/etc/wizlist 里早就有 fluffos (admin) 这一行,
但 wizlist 只决定权限等级,不会凭空创建这个 id 的角色本身——用
README 记录的密码尝试登录时,系统把它当成一个从未注册过的全新
id(提示"这个名字将会创造一个新的人物"),而不是要求密码,证
实此前从未有人真正走完注册流程。已用真实注册流程完整创建
fluffos 角色(密码沿用 README 已记录的 Mud@2026x,本代码线密
码复杂度要求最严格,需同时含大小写字母+特殊符号),score 确认
显示"目前权限:(admin)",update /adm/daemons/securityd 确认可
正常重新编译(验证的是真正的写权限,不只是"看起来是 admin")。
README 已同步更正这段记录。
Proactive checks(无需改动)
win_times修复确认存在且正确:u/wind/refereew.lpc:176(string)(to_int(query("win_times")) % 5);姊妹文件u/wind/refereew2.lpc:184同样已修(% 3)。- 未发现
message()simul_efun 包装函数——不适用 message()-missing-varargs 这一类 bug。
实测过程
fluffos 管理员账号完整注册(英文 id → 确认建立 → 中文名,直接设定
不需要二次确认 → 密码 → 确认密码 → 邮箱 → 性别 → 民族选择 0-3,此前
未在 README 的注册流程摘要之外单独强调过这一步是新号注册流程的最后
一环)进入"凤求凰客栈"起始区域。修复前后各做一次全新驱动进程下的完
整注册;修复前复现了上述诊断刷屏,修复后干净。log/debug.log
全程时间戳未变化,确认无新增未捕获运行期错误。中途一度因为清理测试
存档时用错了路径(这份档案的 query_save_file() 比大多数档案多嵌套
一层:/data/user/f/fluffos/fluffos.o,不是常见的
/data/user/f/fluffos.o)而误以为存档失败,重新确认路径后排除是自
己的操作失误,非真实 bug。驱动最终按精确 PID kill,ps -p 确认已
退出。
已清理
- 管理员
fluffos的存档已提交(data/{login,user}/f/fluffos/ fluffos.o,注意这份档案的嵌套路径)。
§7.100 扫描修复(ROOM 基类多余 replace_program())
#define ROOM "/std/room":删除 525 处多余的、独立成行的
replace_program(ROOM);(保留 inherit ROOM;),524 处脚本自动
删除;另 1 处在本库房间建造工具 obj/roommaker.lpc"克隆我所在的
房间"命令的字符串拼接模板里,与手足档案 fy2/fy2qh 同一形状,
已同步手动修正。work/data 下未找到额外 .lpc 源文件(与
fy2/fy2qh 不同,本库这里没有该变体)。修复后全库仅剩 3 处历史
遗留的 //-注释掉实例,均确认无害、未改动。已用 build-debug 驱
动干净启动验证(0 个新增编译错误,端口 40198 正常监听,
debug.log 无新增 "cannot replace"/"cannot bind" 行);未做完整
§10.7 深度游玩测试。
§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.
深度功能测试(2026-09-04,round three,shop + 拜师)
新角度:玉龙珠宝店购物 + 金钱帮荆无命拜师。2026-08-04 那一轮只
list 过珠宝店,没有买成、也没有拜师。这是风云/fy 血统,不是
tianya 的醉仙楼/左全路线。
实测过程
管理员 fluffos / Mud@2026x。第一输入是 您的英文名字:,密码
后有 MOTD + 请敲回车键[RETURN]。落地凤求凰客栈。
goto /d/fy/yuljade,list 黄金标价(玉指 1 两 / 玉簪 2 两 /
玉花 2 两 / 玉镯 3 两)。clone /obj/money/gold 后
buy jade ring from seller 成功(「你向商玉龙买下一个玉指」)。
1 两黄金刚好等于玉指 value 10000;cmds/std/buy.lpc 的
pay_him() 在找零 < 1 时硬给一文钱,所以 i 剩「一文钱」+
玉指。这是这条 fy buy.lpc 的既有找零地板,不是新崩溃,未改。
goto /d/fy/jbang,荆无命 id 是 master jin(不是单独的
jin),apprentice jin 会「你想拜谁为师?」——id() 做精确
匹配,内容规则。apprentice master jin 一次成功:荆无命收徒,
score 「金钱帮第三代弟子」、师父荆无命。cmds/usr/save.lpc
真正调用两个 save()(没有 fy3xd 那种 cmds/std/save.lpc 影子
文件)。user.o(嵌套路径
work/data/user/f/fluffos/fluffos.o)立刻带上
family_name":"金钱帮" / master_name":"荆无命"。玉指未进
autoload,quit 后不在身上,符合该血统普通物件惯例。
本轮没有新的 programming bug。securityd 没有 tianya 那种
/log/ + log_file 再入。live debug.log 是
libs/fy2mg/log/debug.log(Boot Time Fri Sep 4 00:38:46 2026),
无 error: / Too deep recursion。work/log/debug.log 停在
2026-08-18,是死文件;error_handler 把轨迹交回驱动 debug.log。
work/log/log 只有编译期 Unused local variable 警告。
深度功能测试(§10.7,2026-10-04)— negative range ends
scripts/lpc_fix_negative_ranges.py: 9 line(s) in 3 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)— 编译警告整理
scripts/lpc_warnings.py fy2mg --fix 加 scripts/lpc_fix_no_effect.py --apply,共改动 245 个 .lpc(多为删去未用的局部变量)。HEAD 与工作树分别加载(新进程):230 -> 230 通过,无回退。启动时警告 16 -> 0;新进程登录(输入名字)正常。
- 2026-10-10:编译警告第二轮(按驱动报告逐条修):按位 & 改逻辑运算 0 处,返回类型/原型 3 处,NPC+F_UNIQUE 的 init() 0 个,带初始化的未用局部变量 0 个,只在 #if 分支用的声明移进分支 1 个文件;改动 3 个文件,HEAD 与工作树各载入一次无回退(3 objects; HEAD PASS 1, tree PASS 1; regress 0; newly loading 0),这些文件的警告 3 -> 0。
深度功能测试(§10.7,2026-10-12):编译警告收尾
能编译的文件里的警告 131 -> 0(scripts/lpc_warnings.py fy2mg 重扫:3626 个文件可编译,0 条警告)。fys 同日也收尾,但两库不是同码(lpc_twin_port.py classify:fys 改过的 52 个文件在本库 48 个没有、3 个头文件内容不同),没有可直接搬的修改。
真问题: std/weapon/_dagger.lpc 本应是“作为 feature 继承”的匕首(同目录 _sword.lpc、_blade.lpc 等以及 fy330/fys/zzfy 等兄弟库的 _dagger.lpc 都是两行 #define AS_FEATURE + #include "dagger.lpc"),这里却是一份 dagger.lpc 的旧拷贝,自己 inherit EQUIP。唯一用它的 d/qianfo/obj/silver_clasp.lpc 银簪(inherit HEAD; inherit F_DAGGER;,可戴可当匕首用)因此把 F_DBASE/F_MOVE/F_NAME 等继承两份(7 条 Redeclaration:dbase、weight、my_id……两套变量)。按兄弟库改回两行,银簪只剩一套。
其余: toolkit_fix.sh 删去 10 个多余的 inherit(d/city/npc/* 等 NPC 再继承 F_SKILL/F_CLEAN_UP,std/char/npc.lpc 已带上);daemon/skill/hubo.lpc(ITEM+SKILL 双继承)点名 clean_up() 的赢家 skill::clean_up(),行为不变。
验证:改动的 13 个对象 HEAD 与工作树各用新进程载入:12 -> 13 通过,regress 0(银簪原先编译不过,现在能载入)。删除声明审计 0 项待看。13 个对象载入无回退。
无门派玩家的 family 映射(2026-10-15,KB 05 §7.30 第三种)
mapping fam = ob->query("family"); 之后直接 fam["family_name"]:没有门派(新人或叛师后)的玩家在学习、练功、拜师、进入门派房间时报 Value being indexed is zero,而不是作者写好的提示。1 处在声明行加上 if (!mapp(fam)) fam = ([ ]);(scripts/lpc_fix_family_guard.py)。
其他体系的属性名(2026-10-15,KB 06 §7.241 第三类,--any-file)
73 个文件(技能、绝招、兵器、书籍、区域 NPC 等)来自侠客行体系(qi/jing/neili),而本库人物是 gin/kee/sen/force:receive_damage("qi", ...) 报 伤害种类错误,query("neili") 永远为 0。按 qi→kee、jing→sen(本库学习/读书指令消耗的就是它)、neili→force、max_neili→max_force、jiali→force_factor 改名(scripts/lpc_port_es_props.py --any-file)。
治疗/疗伤的属性名(2026-10-15,KB 06 §7.241)
receive_heal()/receive_curing() 也只接受本库的种类。4 个文件(多为只调用 receive_heal/receive_curing 的药物、NPC)来自侠客行体系,按 qi→kee、jing→本库学习指令消耗的池、neili→force 改名(scripts/lpc_port_es_props.py --any-file)。
技能名拼错(2026-10-15,KB 06 §7.249)
query_skill() 里的技能名拼错了,或用的是本库改名前的旧名;本库没有这个技能,调用永远得 0:门槛(< N 就拒绝)永远过不去,相关功夫或绝招学不了、用不了;内功互斥(> N 就拒绝)从不生效;公式里这一项一直是 0。经汉字名(提示文字或中文名词典)或纯拼写差异(_/-、少一个连字符、相邻字母颠倒)核对后,改为本库的技能名(scripts/lpc_fix_skill_typo.py):beimin-shengong→beiming-shengong(jiuyang-shengong、liumai-shenjian、taiji-shengong)。
NPC 带着本库没有的物品,载入失败(2026-10-15,KB 06 §7.73)
31 个文件、35 处在 create() 里 carry_object("<本库没有的文件>")->wear()(或 wield()、set_amount()):carry_object() 得 0,接着的调用报 Bad argument 1 to EFUN call_other(),NPC 根本载入不了,该有它的房间里就少了这个人。多是从别的系统搬来的 NPC 用了原系统的物品路径(最常见:/d/city2/obj/jinduan、/clone/misc/cloth、/clone/weapon/gangzhang)。每处改为 { object carried_ob = carry_object(...); if (carried_ob) carried_ob->wear(); }(scripts/lpc_guard_carry_object.py):NPC 照常出现,只是不带这件东西;文件补回来(或是虚拟对象)照样会带上。载入检查:改动的文件改前能载入 0 个,改后 29 个(29 个原来载入不了),没有退步;其余 2 个另有原因(多为 set_skill() 了本库没有的武功)。
去掉的预定义宏 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、cmds/arch/purge.lpc、include/net/fs.h、include/net/ftpdsupp.h、obj/token.lpc。token 是帮派领袖信物;purge 是清除玩家档案的巫师指令;netmail 是网络邮件守护进程(本库缺 mailer.h 等头文件,改后仍载入不了)。改后用 lpcc 逐个载入这些对象:2 个通过,1 个还有别的错误(adm/daemons/network/netmail:/adm/daemons/network/netmail.lpc:17: error: Cannot #include mailer.h)。
补回丢掉的基类宏(2026-10-18,KB 04 §6.13)
inherit F_XXX; 里的宏本库任何头文件都没有定义,报 syntax error, unexpected L_IDENTIFIER, expecting L_STRING or '(',整个对象载入不了;宏指向的基类文件本库其实有,别的库都把这个宏定义成同一个路径。在全局头文件 include/globals.h 里补上:F_DEALER → /feature/dealer(3 个文件)。(scripts/lpc_restore_macros.py)改后用 lpcc 逐个载入这些对象:3 个里 0 个通过,其余 3 个还有别的错误(d/city/npc/obj/yang.lpc:Undefined variable 'MONEY_D';d/city/obj/yang.lpc:Undefined variable 'MONEY_D';d/city/zuixianlou2.lpc:Undefined variable 'MONEY_D')。
set_skill() 遇到本库没有文件的武功不再抛错(2026-10-18,KB 06 §7.256)
feature/skill.lpc 里的 set_skill()、map_skill()、prepare_skill() 碰到没有武功文件的名字就 error("F_SKILL: No such skill (…)"),调用它们的 NPC create() 整个中断:NPC 载入不了,刷出它的房间也少一个人。本库目前没有对象设了缺失的武功;三处都改成 return:这一门武功不给、不映射,对象照常载入,只是少了它(缺的武功本身仍是内容缺口)。(scripts/lpc_guard_set_skill.py)
武功名拼错的 NPC(2026-10-19,KB 06 §7.258)
set_skill("kunlun-shnfa", …)、map_skill("dodge", "shaolin-shnfa") 这样的调用把武功名拼错了:本库没有这个武功文件,有的是拼对的那个。以前这种 NPC 在 create() 里报 No such skill 载入不了;武功缺失时跳过之后它们能载入,可是少了那门武功(set_skill 被跳过,map_skill 映射不到,门派弟子用普通轻功/拳脚)。按核对过的对照表改正,共 1 处、1 个文件:xinxiu-duzhang→xingxiu-duzhang(1 处)。(scripts/lpc_fix_skill_names.py)
武功基类缺少 NewRandom()(2026-10-19,KB 06 §7.261)
基本武功(boxing、houquan、westsword、taiji-quan 等)用 action[NewRandom(i, 20, level/5)] 挑招式;NewRandom() 和它调用的 sum() 在别的库的武功基类里有,本库的 /std/skill.lpc 是更精简的版本,没有,于是这些武功全都报 Undefined function NewRandom 编译不过,有这门武功的人物只能空手。把这一对函数(115 个库共用的同一份文字)补进武功基类,受益武功 52 个:/daemon/skill/banruo-zhang.lpc、/daemon/skill/cibei-dao.lpc、/daemon/skill/damo-jian.lpc、/daemon/skill/dashou-yin.lpc。(scripts/lpc_restore_skill_helpers.py)
技能基类丢了“预备武功”那一段(2026-10-19,KB 06 §7.262)
feature/skill.lpc 有 skill_map/map_skill(),却没有预备武功(prepare_skill)这一块:变量 skill_prepare、prepare_skill()、query_skill_prepared()、query_skill_prepare()。来自 xkx 系列的 NPC 在 create() 里调用 prepare_skill("cuff", ...),于是 Undefined function prepare_skill 整个 NPC 载入不了。从同系的 xkx100 把这一块原样补回(声明加在 skill_map 后面,函数加在文件末尾),受益 NPC 10 个:d/huashan/npc/dayou、d/huashan/npc/gao、d/huashan/npc/laodenuo、d/huashan/npc/liangfa。(scripts/lpc_transplant_function.py)
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 文件。
补回本库没有的基类文件,第二轮(2026-10-19,KB 04 §6.15、§6.18)
宏有定义、基类文件却不在档案里:继承它的对象载入时报 Inherited file '…' does not exist!,编译扫描看不到这一类(scripts/lpc_missing_inherits.py 能列出)。同系的库里有同一个文件,原样拷来(scripts/lpc_restore_bases.py);基类和继承它的对象 include 而本库没有的头文件一起带来。每个基类补回后单独载入,再载入使用它的对象,载不进来、或一个用户也载不进来的撤掉了。
/inherit/weapon/weapon(宏M_WEAPON)←cctx:5/5 个继承它的对象载入- 玩家打造兵器的模板(5 个文件)这回有了基类,照 KB 06 §7.275 加上没有打造者时的保护(
scripts/lpc_fix_forge_template.py)。
逐个与 HEAD 对比载入,没有退步。
标准整理轮,第二轮(2026-10-19,scripts/toolkit_fix.sh)
本库在新驱动下重扫,机械修复:5 个未使用的局部变量。修后与 HEAD 逐个物件对比载入,没有退步。
行编辑器指令编译失败:(: this_object(), ({ "do_to", me, arg }) :)(2026-10-20,KB 06 §7.284)
Illegal to use local variable in functional.:call_other 形式的函数指针 (: ob, ({ "函数", 参数 }) :) 的数组里只能是常量,写了局部变量 me / arg 整个指令就编译不过,to 这类先开编辑器、再回调自己的指令因此从未能用。改成 (: call_other, this_object(), "do_to", me, arg :)(参数在建立指针时绑定,编辑器再把输入的文字接在最后,do_to(me, arg, text) 收到全文;scripts/lpc_fix_functional_locals.py)。改动:/cmds/wiz/to.lpc(1 处)。
登录密码超过 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)。
sefun cat():缺文件时 write(0) 报错(2026-10-20,KB 06 §7.297)
void cat(string file) { write(read_file(file)); }:文件不存在(压缩包没带的欢迎/公告文件,或只有运行中的 mud 才会写的日志)时 read_file() 回 0,write(0) 在本驱动里报 Bad argument 1 to receive(),调用者(登录对话、cat 指令)被中断;老驱动什么也不打印。改成 write(read_file(file) || "");(scripts/lpc_fix_cat_unchecked.py)。改动:/adm/simul_efun/file.lpc。
翻页器 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。
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)。改动(1 个文件,括号里是接住 0 的 efun):/cmds/wiz/test.lpc(present)。加载检查 HEAD 与工作树对照,没有退步。
同一轮里 /cmds/arch/tttt.lpc(new("/obj/test.lpc") 之后 user->restore())也报 Bad argument 1 to call_other():本库没有 /obj/test.lpc,new() 答 0。加了 if (!user) return notify_fail(...)。
注册到不存在函数的 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.,同一个动词的其他处理函数不再尝试(不是最新的一条就悄悄跳过)。删除了 16 条注册(9 个文件,scripts/lpc_fix_dead_add_action.py),动词留给别的处理函数:/d/city/npc/aqingsao.lpc(do_buy、do_list、do_sell)、/d/city/npc/huoji.lpc(do_buy、do_list)、/d/city/npc/huoji2.lpc(do_buy、do_list)、/d/city/npc/smith.lpc(do_buy、do_list)、/d/city/npc/xian.lpc(do_buy)、/d/city/npc/xiaoer2.lpc(do_buy、do_list)、/d/city/npc/yang.lpc(do_buy、do_list)、/d/village/npc/seller.lpc(do_buy)、/d/village/npc/smith.lpc(do_buy)。最多的函数名:do_buy 9 处、do_list 6 处、do_sell 1 处。没有动(读过):/d/city/npc/old-qian.lpc 的 do_withdraw(对象本身编译不过,登记留着,等对象能加载再处理)、/d/city/npc/tang.lpc 的 do_list(对象本身编译不过,登记留着,等对象能加载再处理)、/d/city/npc/tang.lpc 的 do_buy(对象本身编译不过,登记留着,等对象能加载再处理)、/d/city/npc/tang.lpc 的 do_sell(对象本身编译不过,登记留着,等对象能加载再处理)、/d/city/npc/tang.lpc 的 do_value(对象本身编译不过,登记留着,等对象能加载再处理)。
(: 函数 :) 指针指向对象自己没有定义的函数(2026-10-22,KB 06 §7.355)
item_desc / inquiry / chat_msg_combat 里的 (: 函数名 :) 指向本对象(含包含文件、继承的父类)没有函数体的函数:编译不报错,用到时驱动报 *Undefined lfun pointer called: 函数名(look 某物、ask NPC about 话题 直接出错,战斗 / 闲聊里的指针在 NPC 的 chat() 里出错,这一拍心跳的后半段被跳过)。scripts/lpc_scan_callout_targets.py --kinds=lfun。 还剩 1 个函数没有补(inquiry 1):原型还在函数体丢了、或者根本没写过,没有可以直接补回的捐赠(别的库同一路径的文件里没有这个函数,或者它还要用本库没有的辅助函数、签名不同),不编造:/d/huashan/npc/teller.lpc:tell_fortune。
运行期目录 log/nosave 不存在,写日志的 write_file() 直接报错(2026-10-22,KB 03 §4.3 补充)
这个库的 6 个文件里有 9 处 write_file("/log/nosave/...") / log_file("nosave/...")(static 改 nosave 时连字符串里的日志路径一起改了,原来是 log/static/):nosave/CRASHES、nosave/promotion、nosave/PURGE 等。压缩包和站点包里没有这个目录,write_file() 在目录不存在时抛 *Wrong permissions for opening file /log/nosave/... for append. "No such file or directory",调用它的函数(杀人记录、重启记录、call 日志……)当场中断。把 log/nosave 记进 scripts/wasm_keep_dirs.txt(站点和 pristine 树都按它建空目录);没有把字符串改回 static。证明(scripts/lpcc_eval.py,catch(write_file("/log/nosave/ZZTEST", ...)),fqyy2 / hy5 / bmxkx2001 的新进程):补目录前报上面的错误,补后写成功。
读不到的留言板:"/clone/board/x"->foo(); 在 create() 里报错(2026-10-22,KB 06 §7.357)
xkx 系的房间在 setup() 之后写 "/clone/board/gaibang_r"->foo(); 来加载留言板(foo() 本来就没有定义,只为了触发加载)。这个库没有这个文件,call_other() 报 *call_other() couldn't find object '/clone/board/gaibang_r',对象留在内存里、load_object() 却抛错:玩家第一次走进房间就看到错误,写在 create() 中间的还会切掉后半段。scripts/lpc_fix_missing_foo.py 把 3 条单独成行的语句(/clone/board/gaibang_r、/clone/board/kedian_b、/clone/board/gaibang_b;/d/city/gbxiaowu.lpc、/d/city/kedian.lpc、/d/city/pomiao.lpc)注释掉并写明原因(别的房间里同样的语句本来就是作者自己注释掉的)。证明和 45 个库的整体加载检查见 KB 06 §7.357。
(: 函数名 :) 指针指向本库没有的函数:只含这个指针的行加了注释(2026-10-22,KB 06 §7.355 补充)
inquiry / item_desc / chat_msg* 里的 (: 函数名 :) 指向本对象(含包含文件、继承的父类)没有函数体的函数:用到时(ask、look、NPC 闲聊)驱动抛 *Undefined lfun pointer called: 函数名,这一拍心跳的后半段被跳过。这些函数没有可以补回的来源(别的库同一路径的文件里没有,或者它还要用本库没有的东西),所以 1 个文件里 1 行只含这个指针的行("算命": (: tell_fortune :),)加了注释,原文保留并写明原因,这一项当作没有这个话题 / 物品 / 闲聊条目(scripts/lpc_fix_dangling_lfun.py;#include 的文件在库里缺失的对象、指针不在整行上的写法没动)。 前提(function_exists())和加载检查(HEAD 与工作区对比,本库改动的 .lpc 文件)的结果见 KB 06 §7.355:没有一个回归。
汉字按字节切片的老写法没有换成按字符:改法名 "澄" + name[2..3]、辈分判断 name[0..1] == "澄" 等 2 处(2026-10-22,KB 06 §7.360)
原档按字节算字符串区间(一个汉字 2 字节):name[2..3] 是名字的第二个字,name[0..1] == "澄" 问名字是不是以「澄」开头。转成 UTF-8 之后,这个驱动的区间和 strlen() 都按字符算(strlen("澄观") 是 2,"澄观"[0..1] 是两个字),老算术原样留着、意思全变:拜入少林 / 武当 / 峨嵋等派的玩家被改成错误的法名(二字名 张三 变成一个字的 澄,更长的名字取到第三个字)。
本库 2 处(2 个文件):拼名字的赋值 2 处。例:name[0..1] → name[0..0](/d/qianfo/npc/master2.lpc:105)。scripts/lpc_fix_gbk_slice.py 把下标按字符重算(社区的 UTF-8 版 xkx100utf8 里就是同样的写法,作对照);没有改的:截断(name = name[0..7],现在最多 8 个字,只是放宽)、ASCII 的区间(fname[0..3] == "room"、ctime(time())[4..19])和上下文看不出是汉字的区间。证明(scripts/lpcc_eval.py,bixiecanyang;其余各库是同一份文本):让澄字辈掌门 attempt_apprentice() 一个名叫「张三」的访客,HEAD 的法名是 慧,改后是 慧三;抽样 28 个库的 HEAD / 工作树加载对比 0 退步。工具不幂等([0..3] 折半得 [0..1],又是对齐区间),改过的文件记在 scripts/gbk_slice_converted.txt,不要重跑。
长度检查按字节写,旁边的提示按汉字写:12 处(2026-10-22,KB 06 §7.362)
老档的 strlen() 数字节(一个汉字 2 字节),转成 UTF-8 后它数字符:提示写「必须是 2 到 6 个中文字」的检查还是 strlen(name) < 4 || strlen(name) > 12,于是两三个字的房名、帮会名、群名、聊天室名、称号被提示自己说允许的那句话拒绝,上限却是提示的两倍;留言板的标题检查 i < 4 || i > 24 || i % 2 还会拒绝所有奇数个字的标题(post 你好吗)。本库 12 处(6 个文件):if ((strlen(name) < 2) || (strlen(name) > 12)) {(/adm/daemons/logindol.lpc:552);if ((strlen(name) < 2) || (strlen(name) > 40)) {(/d/fengyun/npc/caifeng.lpc:142)。scripts/lpc_fix_strlen_gate.py 以提示为准:条件里每个 strlen 门槛都恰是提示所说数字的两倍才折半,存长度的变量(i = strlen(arg);)的门槛和 || i % 2 奇偶项、其后循环的 i % 2 == 0 && 一并处理;提示里有英文 / 字母 / 字节的不动。证明(scripts/lpcc_eval.py,bxsj 的留言板,求值对象继承 NPC 并重写 edit() 记录调用,command("post 标题")):HEAD 拒绝「你好」和「你好吗」、放行 23 个字的标题;改后接受前两个、拒绝第三个;shenmo 的 named.lpc invalid_new_name("张三"):HEAD 回 名字只能是2-4个中文字。,改后回 0。抽样 24 + 15 个库的 HEAD / 工作树加载对比 0 退步。
按字节写的汉字循环、茶馆猜诗和同盟频道标题(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 区间 7 个文件。证明(scripts/lpcc_eval.py):sjplii 的 check_legal_name 在 HEAD 接受「张a」、改后拒绝,两边都接受「张三」;xkx100 的 clubpoem->mixup("离离原上草") 得到「离离原草上」(真交换汉字);nitan_san 两字同盟名得到 【 兄 弟 】。关键对象加载通过。
深度功能测试(2026-10-27,§6.10 未知 pragma save_binary/optimize)
删除本库中 FluffOS 不认的 #pragma save_binary / #pragma optimize… 行。