九州书剑录 · 代码导航手册
目的:帮「接手源码的人」快速建立全局地图,把零散的文件/函数联系起来。适用对象:想从底层修改(数值/存档/技能/物品/任务/机制)的开发者。
左侧是目录树:点击跳转、滚动阅读时自动高亮你所在的篇/章节;右侧为全部内容,一次贴入即可,无需翻页、不触发加载动画。配套索引工具:../code-tools/index.ps1。
篇1 · 入门与核心机制
0.〔篇一〕这是什么项目
- 类型:LPMUD(文字 MUD 游戏),武侠题材,源自「侠客行 / 东方故事2(ES2)」体系。
- 驱动:FluffOS(根目录
driver.exe= 驱动,lpcc.exe= LPC 编译器,startlib.bat= 启动脚本,config.ini= 运行配置)。 - 框架:泥芯 MudCore v1.5(
mudcore/目录)。这是底层框架,不要直接改,要用「继承 + 覆盖」扩展。 - 语言:LPC(类 C 的 MUD 脚本语言),源码都是
.c/.h。
一句话:游戏逻辑写在无数个 .c 对象里,驱动负责编译运行;mudcore/ 提供框架,/feature /inherit /adm/daemons /cmds /include 是你的”系统代码”,其余大目录是”内容数据”。
2.〔篇一〕全局地图:include/globals.h 关键宏速查
globals.h 用宏把每个系统的路径都定义好了。改任何东西前先在这里定位入口:
- 对象:
USER_OB /clone/user/user、LOGIN_OB /clone/user/login、CHARACTER /inherit/char/char、NPC /inherit/char/npc、ITEM /inherit/item/item、ROOM /inherit/room/room、QUEST_OB /inherit/misc/quest、SKILL /inherit/skill/skill、FORCE /inherit/skill/force。 - 守护进程:
COMBAT_D /adm/daemons/combatd、SKILLS_D /adm/daemons/skillsd、QUEST_D /adm/daemons/questd、ITEM_D /adm/daemons/itemd、WEAPON_D /adm/daemons/weapond、EQUIPMENT_D /adm/daemons/equipmentd、MERIDIAN_D /adm/daemons/meridiand、BUFF_D /adm/daemons/buffd、LOGIN_D /adm/daemons/logind、CHAR_D /adm/daemons/chard。 - 功能片段:
F_ATTRIBUTE /feature/attribute.c、F_SKILL /feature/skill.c、F_KUNGFU /feature/kungfu.c、F_SAVE /feature/save.c、F_DBSAVE、F_DBASE(=feature/dbase.c)、F_ATTACK /feature/attack.c、F_DAMAGE /feature/damage.c、F_CONDITION /feature/condition.c、F_EQUIP /feature/equip.c、F_QUESTER /feature/quester.c。 - 路径构造:
SKILL_D(x) "/kungfu/skill/"+x、CLASS_D(x)、CONDITION_D(x)、BINGQI_D(x) "/clone/weapon/"+x、ARMOR_D(x)、DATA_DIR "/d/"、SAVE_EXTENSION ".o"。
3.〔篇一〕启动与热更新
- 启动:运行根目录
startlib.bat(它会拉起driver.exe读config.ini)。 - 编译:
.c由lpcc.exe在加载时编译;改完代码一般不用重启。 - 热更新(MUD 内指令,需 wizard 权限):
update <对象路径>重新加载对象;call在线上执行函数;改globals.h/mudcore// 守护进程才需要重启驱动。 - 配置:
config.ini(驱动配置)、include/globals.h(游戏内路径/宏)、include/config.h/runtime_config.h(运行参数)。
4.〔篇一〕核心运行机制(必须懂,否则处处联系不上)
4.1 对象 + 继承
LPC 一切皆对象。玩家、房间、武器、NPC、技能都是对象。inherit X; 表示继承(复用)某基础类。例:user.c 里 inherit CHARACTER; inherit F_SAVE;,即玩家同时是”角色”且”可存档”。
4.2 dbase:属性怎么存
feature/dbase.c(F_DBASE)提供 query(prop) / set(prop, val) / add(prop, val) / delete(prop),把数据存进对象内部的 dbase 映射。所有数值(如 query("str")、query("combat_exp"))都走它。路径属性用 / 分层:query("zjvip/times")。
临时数据用 query_temp/set_temp(不存档,重启即丢)。这是区分”持久属性”和”临时状态”的关键。
4.3 存档:save_object
feature/save.c 调 FluffOS 内置 save_object(file) 把对象序列化到磁盘;restore_object(file) 读回。存档路径由对象的 query_save_file() 决定:
- 玩家:
/d/user/X/角色名(二进制.o,见user.c)。 - 登录对象:
/d/login/X/账号(见login.c)。 - 用
nosave/protected关键字控制变量是否入档(globals.h里#define nosave static、#define protected static)。
⚠️ 兼容性:存档是二进制 .o。新增 dbase 字段对旧档安全(旧档缺省 0/undefined);改名/删除已有字段会让旧存档读不到数据,必要时写迁移。
4.4 驱动内置函数(efun)与模拟函数(simul_efun)
efun:驱动提供,如this_object()、environment()、all_inventory()、save_object()、call_out()、time()。simul_efun:框架/游戏在adm/simul_efun/、mudcore/system/kernel/simul_efun/里扩展的”伪内置函数”,如ansi()、msg()、config()。遇到不认识的函数先怀疑是不是 simul_efun。
6.〔篇一〕读码方法论(怎么下手,见配套说明)
1. 先读 globals.h + 本手册,建立”哪个系统在哪”的地图。
2. 改某系统时:先用 index.ps1 def <函数名> 找定义,用 index.ps1 callers <函数名> 找所有调用点,避免漏改。
3. 遇到英文注释/不懂的函数:先查 index.ps1 grep + 本手册术语表;仍不懂再让我翻译具体文件。
4. 改完用测试角色验证,优先改 attribute.c 这类”改了立刻看得见”的地方入手。
5. 绝不改 mudcore/;要扩功能就继承后覆盖(参考 mudcore/README.md)。
7.〔篇一〕中英术语对照表(专治英文注释)
| 英文 | 中文 | 备注 |
|---|---|---|
| inherit | 继承 | inherit X; |
| clone / clonep() | 复制 / 是否复制体 | 玩家是 user 的 clone |
| dbase | 对象属性库 | query/set/add |
| efun | 驱动内置函数 | 驱动直接提供 |
| simul_efun | 模拟外部函数 | 框架/游戏扩展的”伪内置函数” |
| daemon | 守护进程 | 系统服务单例 |
| query / set | 读取 / 设置属性 | 走 dbase |
| apply | 装备附加属性 | 如 apply/str |
| temp (query_temp) | 临时属性 | 不存档 |
| heart_beat | 心跳 | 对象定时循环 |
| call_out | 延时调用 | 几秒后执行某函数 |
| room | 房间 | 场景对象 |
| living | 生物 | 有心跳的对象 |
| npc | 非玩家角色 | |
| player / user | 玩家 / 角色 | |
| skill_map | 技能映射 | 把招式绑定到某武功 |
| combat_exp | 实战经验 | 杀怪获得 |
| potential | 潜能 | 用于练功 |
| neili / jingli | 内力 / 精力 | 内功消耗 |
| force | 内功 | 一类技能 |
| condition | 状态 | 多为负面(中毒/疾病) |
| buff | 增益 | 正面状态 |
| meridian | 经脉 | 修炼体系 |
| nosave / protected | 不存档 / 受保护 | 控制是否入档 |
| varargs | 可变参数 | 函数参数可选 |
| nomask | 禁止覆盖 | 防止被继承覆盖 |
| efUN / mapping / array | 映射 / 数组 | LPC 数据类型 |
8.〔篇一〕配套工具用法(../code-tools/index.ps1)
cd ../code-tools
# 首次构建索引(扫描 九州书剑录 全部 .c/.h,较慢,只跑一次)
powershell -ExecutionPolicy Bypass -File index.ps1 build "C:\Users\aym35\Desktop\新建文件夹\九州书剑录"
# 查某个函数定义在哪些文件
powershell -ExecutionPolicy Bypass -File index.ps1 def query_str
# 查某个函数被哪些文件调用(含定义文件,自行区分)
powershell -ExecutionPolicy Bypass -File index.ps1 callers query_str
# 查某个宏 / 继承关系
powershell -ExecutionPolicy Bypass -File index.ps1 macro SAVE_EXTENSION
powershell -ExecutionPolicy Bypass -File index.ps1 inherit F_SAVE
# 任意正则搜索(类似 grep)
powershell -ExecutionPolicy Bypass -File index.ps1 grep "save_object"
篇2 · 目录总览(全景)
1.〔篇二〕目录总览:哪些是系统、哪些是内容
根目录全部顶层文件夹/文件如下,按”能不能改、改了影响什么”分 5 类。加新内容去”内容层/资源层”建文件;改规则/机制去”系统层/框架层”;运维/文案去
adm/etc/、help/、news/、gift/。
1.1 框架层(⚠️不要直接改,用继承+覆盖扩展)
| 目录/文件 | 说明 |
|---|---|
mudcore/ | MudCore 底层框架(master/simul_efun/登录/玩家基类)。改错全服崩。 |
1.2 系统代码层(改规则/机制来这)
| 目录 | 说明 |
|---|---|
include/ | 全局头文件 .h,globals.h 是全局地图,先读它。 |
feature/ | 可继承功能片段 F_*(attribute/skill/save/combat 等)。 |
inherit/ | 可继承基础类(char/item/skill/room 等)。 |
adm/ | 管理与核心服务总根:daemons/(守护进程)、simul_efun/、single/(master)、etc/(配置)、go-cqhttp/(QQ)、item/(装备模板)、npc/(系统NPC)、socket/(预留)。详见第36节。 |
cmds/ | 玩家/管理员指令实现(std/usr/skill/chat/adm/wiz…)。 |
1.3 内容数据层(加新武功/物品/任务/房间来这,建文件即可)
| 目录 | 说明 |
|---|---|
clone/ | 可克隆实例:武器/防具/物品/NPC/货币/user/user.c(玩家)、user/login.c(登录)。 |
kungfu/ | 武功/内功/状态:kungfu/skill/ 3800+ 武功文件。 |
obj/ | 少量特殊物品。 |
quest/ | 任务实例(176+);newbiequest/ 是新手任务。 |
fuben/ | 副本/活动。 |
maze/ | 迷宫基类与实例。 |
worldmap/ | 世界地图。 |
d/ | 游戏世界房间(各门派城市),兼玩家存档 /d/user/X/角色名.o、/d/login/ 登录档。 |
u/ | 杂项对象/NPC。 |
1.4 运行期资源 / 数据(文本与配置,多数不用编译)
| 目录 | 说明 | 改了动哪 |
|---|---|---|
adm/etc/ | 主配置 config、预加载 preload、欢迎/公告、封禁、wizlist、字体/副本/自然数据 | 运维参数(见第36.2) |
help/ | 游戏内 help 文本库(activity/book/skills/newbie/pay/tit… + 城市地图 map_*、faq、channels 等) | 玩家看到的帮助/地图说明 |
news/ | 新闻/公告文本(baodian/item/jingmai/shenbing/youxi…) | 游戏内新闻滚动 |
gift/ | 礼包定义(如 sword.c 登录/活动礼包) | 礼包内容 |
shadow/ | 分身系统(no_init.c/telnet.c) | 分身/影子机制 |
date/ | 运行期数据目录(当前为空,预留外部数据落地) | — |
1.5 外部接口 / 顶层文件
| 目录/文件 | 说明 |
|---|---|
www/ | Web 根(mudh.html),外网/统计页面(与 mud_web/ 同源)。 |
driver.exe | 驱动(运行核心)。 |
lpcc.exe | LPC 编译器(加载时编译 .c)。 |
startlib.bat | 启动脚本。 |
config.ini | 驱动运行配置(区别于 adm/etc/config 的游戏配置)。 |
记法:改”规则/公式/机制”→ feature/、inherit/、adm/daemons/、include/;加”新武功/新物品/新任务”→ 在 kungfu/、clone/、quest/ 里新建文件;运维/文案→ adm/etc/、help/、news/、gift/。
篇3 · 角色与成长体系
9.〔篇三〕角色创建与初始化全流程(必读,改数值的入口)
新手从”连上”到”进游戏”的关键链路:
1. 连接 → 驱动创建 LOGIN_OB(clone/user/login.c),logon() 委托 LOGIN_D->logon()。
2. 鉴权/建号 → adm/daemons/logind.c。新角色在 make_body() 里被赋予初始属性:
代码位置:adm/daemons/logind.c(行 276–281)
user->set("str", 10);
user->set("dex", 10);
user->set("con", 10);
user->set("int", 10);
user->set("kar", 10);
user->set("per", 10);
⚠️ 这就是”初始五维=10″的出生点。想改出生数值,改这里(或后续新手引导/门派入门再追加)。注意还有 kar(福缘)也是初始 10。
3. 角色对象诞生 → USER_OB(clone/user/user.c)被创建,调用 setup():
代码位置:clone/user/user.c(行 230–246)
void setup()
{
last_age_set = 0;
update_age(); // 先定年龄(影响 per 等)
::setup(); // 调用父类(char.c)的 setup,完成技能/条件/装备等初始化
set_temp("user_setup", 1);
restore_autoload();
...
}
4. 父类装配 → inherit/char/char.c(角色基类 CHARACTER)是”所有角色能力的装配中心”。它一次性继承了所有功能片段:
代码位置:inherit/char/char.c(行 17–34)
inherit F_ACTION; // 行动/出手
inherit F_ALIAS; // 别名
inherit F_APPRENTICE; // 师徒
inherit F_ATTACK; // 攻击/战斗启动
inherit F_ATTRIBUTE; // 五维属性
inherit F_COMMAND; // 指令解析
inherit F_CONDITION; // 状态(中毒/疾病等)
inherit F_DAMAGE; // 受伤结算
inherit F_DBASE; // 属性存储
inherit F_EDIT; // 在线编辑
inherit F_FINANCE; // 钱银
inherit F_MESSAGE; // 消息广播
inherit F_MORE; // 翻页显示
inherit F_MOVE; // 移动
inherit F_NAME; // 名字
inherit F_SKILL; // 技能数据
inherit F_TEAM; // 组队
inherit F_SUIT; // 套装
记法:要加一个”所有角色都该有的能力”,就在 char.c 里 inherit 一个新的 F_XXX 片段;改某类角色的差异,再在 boss.c/npc.c/user.c 等子类里覆盖。
修改建议:若想”改初始分配规则”(比如属性随机范围、按门派给不同初始值),优先改
logind.c::make_body()+ 门派入门逻辑;若想”改属性成长公式”,改feature/attribute.c(见第 10 节)。
10.〔篇三〕五维属性公式逐条拆解(feature/attribute.c)
属性 = query("xx") 基值 + 各项加成。基值来自:出生 10(logind.c)+ 天赋点 up_tianfu(见第 11 节)+ 门派/任务/转生等写入。各维加成来源如下:
| 属性 | 主要武功加成 | 阵营加成(+5%) | 关键临时/称号/肉身来源 |
|---|---|---|---|
| str 力量 | unarmed/cuff/finger/strike/hand/claw 各 ÷30;longxiang-gong ÷30;套装 suit_skill/* ÷30 | 魔门 | apply/str、suit_eff/strength、title_imp/str、titlea_obtian/膂力、zhujis/str、宠物力大无穷、talent/str、肉身12部位 |
| int 悟性 | literate ÷10 + 套装 | 佛门 | apply/int、suit_eff/intelligence、title_imp/int、titlea_obtian/悟性、zhujis/int、宠物聪明绝顶、talent/int、肉身 |
| con 根骨 | force ÷10 + 套装 | 道门 | apply/con、suit_eff/constitution、title_imp/con、titlea_obtian/根骨、zhujis/con、宠物绝世天才、talent/con、肉身 |
| dex 身法 | dodge ÷10 + 套装 | 妖庭 | apply/dex、suit_eff/spirituality、title_imp/dex、titlea_obtian/身法、zhujis/dex、宠物快速闪避、talent/dex、肉身 |
| per 容貌 | art-cognize ÷20(且 age>30 时随年龄递减,age>70 扣 6) | — | apply/per、肉身;special_skill/youth 时直接返回基值 |
关键结构:每个 query_xx() 末尾都遍历 12 个肉身部位 头/躯/臂/手/腿/脚/皮/心/肝/脾/肾/肺,累加 query("肉身_<部位>/属性")["str"等] —— 这是”肉身/部位锻造”系统的数值出口,改装备/肉身数值看这里。
改属性时影响面:在 attribute.c 改公式后,凡是调用 query_str() 等的地方(战斗伤害、负重 query_backpack_limit = 300 + query_str()/10、NPC 强度等)都会自动跟着变。改完用 index.ps1 callers query_str 核对调用点即可。
11.〔篇三〕等级 / 经验 / 天赋点(feature/level.c)
- 升级不改变战斗经验(只比较
combat_exp与阈值),函数improve_level(me)。 - 升级所需经验
level_max_exp(me)分段递增(单位已随等级数量级放大):
| 等级段 | 公式 |
|---|---|
| <5 | lvl×10+1000 |
| 5–9 | lvl×15+20000 |
| 10–19 | lvl×20+50000 |
| 20–29 | lvl×30+100000 |
| …逐级放大… | 到 59–68 段 lvl×1000+百万级 |
| 109+ | lvl×5000000+5亿 |
- 每升 10 级送 1 点
tianfu_point(天赋点)(level%10==0时add("tianfu_point",1))。 - 天赋点用法
up_tianfu(me, arg):arg为str/int/con/dex时,add("xx",1)(直接加在基值上,永久),并消耗 1 点。 - 注意:天赋能加的只有 str/int/con/dex 四维,不含 per;per 主要靠年龄/容貌技能/肉身。
17.〔篇三〕修炼 · 境界 · 五行 · 肉身体系(修炼成长的另一条大线,含原第33节)
与 attribute.c 的 query_con() 强相关(内功 force ÷10 计入根骨)。相关文件:
adm/daemons/meridiand.cmeridian2d.cjingmaid.c(经脉/内功修炼、冲穴、运行)inherit/skill/force.c(内功基类 FORCE,含exert运功效果)feature/kungfu.c(exert/perform 公共函数,见第12.2)- 内功实例在
kungfu/下(force 类)
修炼大境界:char.c 的 life_base 映射(寿元表)揭示了本游戏境界体系:苦海(22–37重)→命泉→神桥→彼岸→道宫(38–42)→四极(43–46)→化龙(47–50)→仙台(51–56)→准帝(57–65)→大帝(66)→红尘仙及以上(68+)。每突破一重对应不同”寿元”,境界名存 query("jingjie_1_name"),在 damage.c 里换算成减伤比例(灵启1% … 苍穹傲世51%,见第12.3第1步)。
五行:combatd.c 定义 skill_shuxing = ({"金","木","水","火","土"}),配合 include/combat/wuxing.h 做”五行相生相克”判定(法术/修仙功法伤害加成)。
肉身12部位:全局常量 roshen_buwei = ({"头","躯","臂","手","腿","脚","皮","心","肝","脾","肾","肺"}),是 attribute.c(属性加成) 与 damage.c(减伤) 共同使用的”肉身锻造”维度(见第10节”遍历12肉身部位”)。
改成长/境界/五行/肉身曲线:联动
meridiand.c(冲穴)、attribute.c(con/境界减伤/肉身累加)、char.c(life_base)、kungfu/内功文件、include/combat/wuxing.h(五行)。
28.〔篇三〕门派 / 家族系统(familyd)
- 守护进程
familyd.c(FAMILY_D) 管门派关系、技能授予、叛门、贡献等。 - 门派专属 NPC 在
inherit/char/family_npc.c及d/<门派>/目录下(如d/shaolin/的罗汉/僧侣)。 - 门派与武功绑定:很多武功的
valid_learn直接查me->query("family/family_name"),例如bagua-bu.c限制只有”雁荡派”能学。改门派收徒规则/可学武功看familyd.c+ 对应family_npc+ 各武功valid_learn。 - 玩家门派数据存
query("family/family_name")、query("family/skill")等(dbase 路径式)。
29.〔篇三〕经济 / 货币系统(moneyd + money clone)
- 守护进程
moneyd.c(MONEY_D) 管货币换算/发放。 - 货币是对象:
/clone/money/<type>(铜钱/银两/金子等),NPC 用add_money(type, amount)造钱(npc.c见第25节)。 - 玩家钱袋子走 dbase(如
query("money/<type>")或专门字段),交易/商店逻辑在feature/finance.c(F_FINANCE) +dealer.c/dealers.c/banker.c(商人/钱庄)。 - 修改经济(掉率/物价/兑换比):先看
moneyd.c与各dealer;调某 NPC 卖什么改其carry_object/商品列表。
篇4 · 战斗与 PK 体系
12.〔篇四〕战斗系统深度(底层逻辑核心)
战斗相关文件:feature/attack.c(F_ATTACK)、feature/damage.c(F_DAMAGE)、feature/kungfu.c(F_KUNGFU)、adm/daemons/combatd.c(COMBAT_D)、inherit/char/fighter.c、include/combat.h。
12.1 战斗启动(attack.c)
fight_ob(ob):把ob加入enemy数组、开启心跳set_heart_beat(1);受房间no_fight、是否 living 等限制;守卫还会kill_enemy呼叫支援。kill_ob(ob):进入”仇杀”状态,写入killer名单;有保护人/主人/体验NPC等豁免。is_fighting(ob):判断是否交战;注意队伍联合作战(is_comb_ob/fight_team)——多人合击时enemy取自队伍。- 常量
#define MAX_OPPONENT 4:同一目标最多同时被 4 个敌人锁定。
12.2 命中率(kungfu.c::hit_rate)
- 等级制:
rate_level0–18 共 19 级,S级(95%)→F-级(5%),对应系数表rate_coef。 - 身法影响:
idata1 = idata1*(owner->query("dex")+150)/180(身法越高越容易命中)。 - 攻方可经
query_enhance("HitRate")上调最多 3 级;守方可经query_proof("AntiHitRate")下调最多 5 级(即apply/kf_hit_rate、apply/kf_anti_hr这两个常见属性的底层)。 hit_rate_sk是简化版(用于 skill 判定,查dex_tz表),降低计算量。- 判定:
random(idata1) > random(idata2)*100/rate_coef[rate_level]则返回命中(1)。
12.3 伤害结算(damage.c::receive_damage)
入参 type 只能是 "jing"(精) 或 "qi"(气),who 为攻击者。结算链路(按顺序):
1. 境界减伤:读 query("jingjie_1_name")(灵启/神游/逍遥/…/苍穹傲世),分别对应减伤 n%(灵启1% … 苍穹傲世51%),damage = damage*(100-n)/100。
2. 肉身部位减伤:遍历 12 部位累加 roushen_jianshang,总和 roushen 封顶 60%,damage*(100-roushen)/100。
3. 气血转内力:30% 概率按 apply/qi_abs_neili 比例把受损气血转成内力。
4. 宠物”掩青”:pet/掩青 在冷却(120s)外自动回血。
5. 装备减伤:apply/jian_damage + zhujis/jian_damage,30% 触发,封顶 90%。
6. 快活林”春去来”:1 小时内 20% 概率回满半血半精。
7. 天赋守护:talent/fa_gong 按 talent/shouhu 减伤。
8. 先天之炁抵消:query("xiantian") 直接抵消伤害(可完全免伤)。
- 常量:
PVP_DAMAGE_SCALE=70、PVP_WOUND_SCALE=60(玩家互伤的缩放系数,在combatd调用时传入)。 - 受伤过重(>150) 触发
improve_craze(狂暴)。
改伤害/命中:优先改
damage.c各减伤系数与封顶、kungfu.c的rate_coef/rate_level逻辑;改 PVP 烈度调PVP_DAMAGE_SCALE/PVP_WOUND_SCALE。注意这些都是数值,改完用测试角色对打验证。
12.4 PK 系统(pkd / pksd / combatd)
- 守护进程
pkd.c(PK_D)、pksd.c(PKS_D) 记录杀戮/仇杀数据。 combatd.c头部定义 PK 统计字段(玩家数据在/combat/下):PKS(杀玩家数)、MKS(打没NPC数)、WPk(主动打没玩家次数)、DPS(打晕玩家次数)、dietimes(死亡次数) 等,并区分正派/邪派(shen)统计。- 每日 PK 上限:
#define DEFAULT_MAX_PK_PERDAY 3、DEFAULT_MAX_PK_PERMAN 1,由CONFIG_D->query_int("max pk perday/perman")读取(可在运行配置里调)。 - 正邪
shen值:角色有shen(神/正邪值),正派shen>500、邪派shen<-500,影响 PK 统计与门派态度。 - 改 PK 烈度/惩罚:调
combatd的 PK 常量、pkd/pksd的惩罚逻辑、globals.h的PVP_DAMAGE_SCALE/PVP_WOUND_SCALE(见 12.3)。
12.5 状态 / BUFF(负面状态与增益)
- 框架:
feature/condition.c(F_CONDITION) 管理中毒/疾病等负面状态;buffd(/adm/daemons/buffd.c) 管理增益 BUFF。 - 状态对象:具体的状态/BUFF 定义放在
/kungfu/condition/下(每个状态一个对象,描述持续效果、到期、解除条件)。 - 与战斗联动:伤害结算(
damage.c)会触发/受状态影响;命中(kungfu.c)也可能被状态修正。新增/调整状态:在/kungfu/condition/建对象 + 改condition.c/buffd。
篇5 · 内容创作(造东西)
18.〔篇五〕物品 / 装备体系细节
- 基类:
inherit/item/item.c(ITEM) 为总类;inherit/weapon/(51) 与inherit/armor/(19) 为武器/防具细分。 - 实例:
clone/weapon/(276)、clone/armor/(106)、clone/misc/、clone/box/(宝箱/礼包)。 - 生成随机属性:
equipmentd.c/equipmentd1.c(装备)、equifabaod.c(法宝)、itemd.c(普通物品掉落)。 - 穿戴:
feature/equip.c(F_EQUIP) 处理穿/脱;装备加成通过apply(即attribute.c里的query_temp("apply/str")等)流入五维。 - 物品属性存储:同样用
query("xxx")/set("xxx",...),随save_object入档。典型字段:equipped(是否装备)、apply/str、apply/dex、耐久max_endure/endure、价值value。 - 新增物品:在
clone/weapon|armor|misc/建.c继承对应WEAPON/ARMOR/ITEM基类,设name/unit/weight/value/apply/*。
19.〔篇五〕任务体系细节
- 基类:
QUEST_OB = inherit/misc/quest。状态机常量在include/quest.h:QUEST_CREATE/created、QUEST_READY/ready、QUEST_FINISH/finish。 - 任务对象需实现:
name()、can_know_by(who)(谁能接)、change_status(status)(状态流转)、奖励发放等。 - 玩家侧接口:
feature/quester.c(F_QUESTER) 提供接/交任务、查询可接任务。 - 任务守护进程:
QUEST_D = adm/daemons/questd.c,外加adm/daemons/task/(25个系统任务脚本)、newbiequest/(新手任务)。 - 任务实例:
/quest/(176+,按剧情分目录如quest/tulong/、quest/quest_jun/、quest/job/)。 - 新增任务:建对象继承
QUEST_OB,实现状态机,放回/quest/下,questd会自动管理。
24.〔篇五〕房间与世界系统(ROOM + d/ 目录)
世界就是成千上万个 ROOM 对象,每个文件是一个场景。
- 基类:
ROOM /inherit/room/room.c,另有 17 个细分(室外/室内/城市/商店/战斗房/迷宫房等)。 - 房间文件结构(以
d/baiyun/xiaolu1.c为例):
代码位置:d/baiyun/xiaolu1.c(行 7–19)
void create()
{
set("short","小路"); // 房间短名(进房显示)
set("long","这里是小路,..."); // 详细描述
set("exits", ([ // 出口:方向->相邻房间路径
"north" : __DIR__"xiaolu2",
"south" : __DIR__"chengwai1",
]));
set("fuben2", 1);
set("objects", ([ ])); // 房内刷新的NPC/物品(空)
setup();
}
exits:方向(north/south/east/west/up/down/enter等) → 目标房间路径,__DIR__指当前文件所在目录。objects:房内常驻对象(NPC/物品)定义,格式([ 路径 : 数量 ])。- 其它常见字段:
no_fight(禁止战斗)、no_clean_up(不回收)、outdoors(室外)、coor/x|y|z(坐标,地图用)。 - 移动机制:
feature/move.c(F_MOVE) 处理move(ob)/ 玩家go指令,校验exits并搬运对象到目标房。 d/世界地图(按门派/城市分目录,改世界、加房间看这里):- 门派/武林势力:
shaolin(少林)、wudang(武当)、emei(峨眉)、huashan(华山)、songshan(嵩山)、quanzhen(全真)、mingjiao(明教)、gumu(古墓)、lingjiu(灵鹫)、tangmen(唐门)、wudu(五毒)、xingxiu(星宿)、heimuya(黑木崖)、taohua(桃花)、xiaoyao(逍遥)、shenlong(神龙)、kunlun(昆仑)、taishan(泰山)、hengshan(恒山)、henshan(衡山)、qingcheng(青城)、tiezhang(铁掌)、jueqing(绝情)、yihua(移花)、xueshan(雪山)、xuedao(血刀)、baiyun(白云城)、huanggon、lingxiao、wanjiegu、xuantian、yashan、motianya、xuanminggu、wanmei、wanmeishanzhuan等。 - 城市/地图:
beijing(北京,463)、changan(长安)、dali(大理)、hangzhou(杭州)、suzhou(苏州)、xiangyang(襄阳)、fuzhou(福州)、quanzhou(泉州)、guanwai(关外)、hainan(海南)、loulan(楼兰)、yingtian(应天) 等。 - 特殊区域:
pk/(PK场)、death/(地府)、dujie/(渡劫)、maze/(迷宫)、migong/(迷宫,1853个房间)、newbie/(新手村)、wizard/(巫师区)、zhutian/(诸天,1.2万房间,最大)、obj/(世界物品)、item/(世界物品)、npc/(世界NPC)、register/(注册相关)、fuben*/(各类副本)。 - 房间也是存档:玩家档在
/d/user/,但房间本身.c是代码不是存档(除/d/login、/d/user是数据)。**不要手改/d/user/*.o二进制档**。
25.〔篇五〕NPC 系统(inherit/char/npc.c)
npc.c 继承 CHARACTER + F_CLEAN_UP,是所有 NPC 的通用基类。关键能力:
| 函数 | 作用 |
|---|---|
npc_item(type, pin, only_npc, info) | 给 NPC 生成专属装备(EQUIMENT_D->create_equipment)并穿/持 |
npc_fabao(type, pin, only_npc, info) | 生成专属法宝(EQUIFABAO_D) |
carry_object(file) | new(file) 造一个对象并 move 到 NPC 身上(拿在手里/穿身上) |
add_money(type, amount) | 给 NPC 加钱(/clone/money/<type> 并 set_amount) |
accept_fight(who) | 被挑战时的反应;依据 query("attitude")(态度) 与当前气血/精决定是否应战/主动 kill |
scan() / chat() / heal_self() | NPC 的心跳行为:巡视、闲聊、自疗 |
exert_function(func) | 运功 |
- NPC 放置:由房间的
set("objects", ([ 路径:数量 ]))在房间setup()时刷新,或脚本动态new()+move()。 - NPC 强度来源:同样走
attribute.c的query_str()等(NPC 也继承 CHARACTER),其属性在 NPC 对象create()里set("str",...)等写入;装备经apply/*加成。 - 特化 NPC:
inherit/char/下boss.c(BOSS)、guarder.c(守卫)、family_npc.c(门派NPC)、smith.c(铁匠)、waiter.c(店小二)、trainee.c(学徒)、quarry.c(打手)、punisher.c(执法)、snake.c/worm.c/insect.c(动物/虫) 等,按需继承覆写。 - NPC 的”态度/性格”:
attitude(heroism/aggressive/peaceful…)、character(心狠手辣/国士无双…)、can_speak(能否对话) 等字段驱动 AI,改 NPC 行为看这些字段 +accept_fight/scan/chat。
26.〔篇五〕单个武功文件结构模板(kungfu/skill/xxx.c)
每个武功是独立对象,继承 SKILL。典型 API(从 abc-unarmed.c、aikido.c、badao.c、bagua-*.c 等归纳):
| 函数/字段 | 作用 | 示例 | ||
|---|---|---|---|---|
inherit SKILL; | 继承武功基类 | — | ||
valid_learn(me) | 能否学习(学习条件);返回 notify_fail("理由") 即禁止 | 需 query_skill("force",1)>=80、需空手、需特定 family_name、需 max_neili>=1200、需 character=="心狠手辣"、需已婚(couple/have_couple)、需某前置武功等级 | ||
valid_enable(usage) | 该武功能”启用”到哪类基本武功(unarmed/blade/sword/staff/dodge/parry/...) | `return usage==”blade” | usage==”parry”;` | |
valid_combine(combo) | 能否与某招式组合 | combo=="tmzhang" | ||
practice(me) / practice_skill | 练习(熟练度)逻辑 | — | ||
skill_improved(me) | 升级时触发的提示/额外加成 | cuff.c:每整除30级提示”后天膂力提高” | ||
perform(me, ...) / exert(me, ...) | 特技(绝招)/运功效果 | 调 F_KUNGFU 的 hit_rate 等 | ||
query_damage(...) / query_dodge_msg(limb) | 伤害/闪避表现文本 | balei.c 的 query_dodge_msg | ||
main_skill() | 主技能名 | return "bagua-zhang"; | ||
power_point() / success() | 威力/成功率参数 | baiyun-xinfa.c:success()10; power_point()1; | ||
type() | 技能大类(art/force/…) | art-cognize.c:return "art"; |
- 命名约定:文件名即技能 ID(如
cuff.c=拳脚,badao-daofa.c=霸刀刀法)。skill.c::set_skill会按SKILL_D(skill)找/kungfu/skill/<skill>.c。 - 战斗联动:武功的
valid_enable("blade")决定它强化”刀”类攻击;实际伤害/命中在feature/kungfu.c+attack.c+damage.c统一结算(见第12节)。 - 新增武功:在
/kungfu/skill/建.c继承SKILL,实现valid_learn等,驱动自动加载;需要配套的map_skill/prepare由玩家在游戏内绑定。
27.〔篇五〕颜色与消息系统(ansi.h + 消息函数)
27.1 颜色码(include/ansi.h)
常用前景色:RED(红) GRN(绿) YEL(黄) BLU(蓝) MAG(紫) CYN(青) WHT(白);高亮版 HIR HIG HIY HIB HIM HIC HIW。背景色 BRED…BWHT。NOR = 清除所有特效(每段彩色文本结尾务必加 NOR,否则颜色串到后面)。还有 BOLD(加粗)、U(下划线)、BLINK(闪烁)、REV(反显)。256色用 FCC(x)(前景)/BCC(x);RGB 用 RGB(r,g,b)/BRGB(...)。光标/清屏类:CLR(清屏)、HOME、ECL(清行) 等。
27.2 消息函数(常见于 simul_efun / message 系统)
message_vision(fmt, ob):向房间内所有人广播,$N=主语(ob)、$n=宾语、$w=武器等占位符自动替换。例:message_vision("$N对$n出手!\n", me, target)。tell_object(ob, msg):只发给某个对象。tell_room(env, msg, exclude):发给房间(可排除某些人)。command("look"):让对象执行指令。- 文本拼接常量(combatd 里大量使用):
guard_msg(守卫监视)、catch_hunt_msg(仇杀)、winner_msg(胜利台词)、roshen_buwei(12肉身部位) 等。
写界面/提示文本时:颜色常量来自
ansi.h;$N/$n/$w占位符靠message_vision/tell_object解析;多段文本记得每段后NOR收尾。
34.〔篇五〕常见”内容文件”骨架(新建时照抄)
新建武功 kungfu/skill/my-skill.c:
inherit SKILL;
int valid_enable(string usage) { return usage=="unarmed"; }
int valid_learn(object me) { return 1; } // 或加学习条件
int skill_improved(object me) { ... }
新建武器 clone/weapon/my-blade.c:继承 /inherit/weapon/blade,设 name/unit/weight/value/apply/str 等。
新建防具 clone/armor/my-armor.c:继承 /inherit/armor/...,设 apply/con 等。
新建物品 clone/misc/my-item.c:继承 ITEM。
新建任务 quest/my-quest.c:继承 QUEST_OB,实现 name()/can_know_by()/change_status()。
新建NPC d/<area>/my-npc.c:继承 NPC,create() 里 set("name",...)、set("str",...)、carry_object(...)、set("attitude",...)。
新建房间 d/<area>/my-room.c:继承 ROOM,create() 里 set("short",...)、set("exits",([...]))、set("objects",([...]))、setup()。
篇6 · 系统代码层
13.〔篇六〕feature/ 功能片段全清单(F_ 系统代码)
| 文件 | 作用(中文) |
|---|---|
attribute.c | 五维属性计算(F_ATTRIBUTE,见第10节) |
skill.c | 技能数据:skills/learned/skill_map/prepare(F_SKILL) |
kungfu.c | 命中率/出招公共函数(F_KUNGFU) |
attack.c | 战斗启动/锁定敌人(F_ATTACK) |
damage.c | 受伤结算(F_DAMAGE,见12.3) |
condition.c | 负面状态(中毒/疾病)框架(F_CONDITION) |
equip.c | 穿戴/卸下装备(F_EQUIP) |
quester.c | 玩家侧任务接口(F_QUESTER) |
save.c | 存档/读档(F_SAVE) |
dbase.c | 属性存储 query/set/add(F_DBASE) |
treemap.c | 树状映射(F_TREEMAP,dbase 的路径式存取底层) |
move.c | 移动(F_MOVE) |
action.c | 行动/出手动作(F_ACTION) |
message.c | 消息广播(F_MESSAGE) |
command.c | 指令解析(F_COMMAND) |
alias.c | 别名(F_ALIAS) |
apprentice.c | 师徒(F_APPRENTICE) |
team.c | 组队(F_TEAM) |
suit.c | 套装效果(F_SUIT) |
level.c | 等级/经验(见第11节) |
name.c | 名字/称谓(F_NAME) |
finance.c | 钱银(F_FINANCE) |
more.c | 翻页显示(F_MORE) |
edit.c | 在线编辑(F_EDIT) |
food.c | 食物/吃喝 |
liquid.c | 液体/饮酒 |
poison.c | 毒 |
medicine.c(位于 inherit) | 医药 |
itemmake.c | 造物/合成 |
unique.c | 唯一性控制 |
noclone.c | 禁止复制 |
clean_up.c | 对象清理/回收 |
shadow.c | 分身/影子 |
master.c/autoload.c | 师徒/自动加载 |
coagent.c/guarder.c/boss相关 | 伙伴/守卫/BOSS AI |
dealer.c/dealers.c/banker.c | 商人/钱庄 |
escort.c/transport.c | 押镖/运输 |
sserver.c | 简单服务器 |
test.c/annie.c | 测试/辅助 |
注:文件名带
.1/- 副本的是备份/冲突副本,不要改(如attack.c.1、suit - 副本.c、yaotiand - 副本.c)。改之前确认你打开的是正式文件。
14.〔篇六〕inherit/ 基类全清单(继承体系)
| 目录/文件 | 基类 | 用途 |
|---|---|---|
char/char.c | CHARACTER | 角色总基类(见第9节装配所有 F_) |
char/npc.c | NPC | 非玩家角色(继承 char) |
char/boss.c challenger.c family_npc.c haogang.c hufa.c insect.c knower.c punisher.c quarry.c smith.c snake.c trainee.c waiter.c worm.c | 各类特化 NPC | BOSS/挑战者/门派NPC/护法/虫/打手/铁匠/蛇/学徒/店小二等 |
item/item.c | ITEM | 物品总基类 |
item/ 下 9 个 | 细分物品 | 容器/食物/书/钥匙/钱等 |
weapon/ 51 个 | WEAPON 细分 | 刀/剑/枪/棍/鞭/暗器…每种武器一个基类 |
armor/ 19 个 | ARMOR 细分 | 头盔/甲/靴/护腕/腰带…每种防具一个基类 |
skill/skill.c | SKILL | 武功总基类(valid_learn/practice/伤害) |
skill/force.c | FORCE | 内功基类 |
skill/ 其它 | 招式/法术基类 | |
room/room.c 及 17 个 | ROOM | 房间总基类 + 室外/室内/城市/商店/战斗房等 |
misc/quest | QUEST_OB | 任务对象基类 |
condition/ | CONDITION | 状态对象基类(中毒/疾病/BUFF 定义处) |
medicine/ | — | 医药相关基类 |
maze/ | — | 迷宫基类 |
wield.c sserver.c vrm.c insect.c worm.c | 杂项基类 | 持械/虚拟/虫类 |
继承规律:user.c(玩家)继承 CHARACTER + F_SAVE;NPC 继承 NPC(再继承 CHARACTER);具体武器/防具实例继承 WEAPON/ARMOR 细分基类;具体武功继承 SKILL/FORCE;具体任务继承 QUEST_OB;具体房间继承 ROOM 细分。
15.〔篇六〕adm/daemons/ 守护进程大全(系统服务)
守护进程是”全局单例服务”,一般通过
宏_D(如COMBAT_D)在globals.h引用。改动某系统先看这里有没有对应 daemon。
| 守护进程 | 中文 | 管什么 |
|---|---|---|
combatd.c | 战斗 | 战斗调度、伤害/命中汇总、PVP 系数 |
skillsd.c | 技能 | 技能注册、学习规则、技能列表 |
questd.c | 任务 | 任务注册/分发/完成结算 |
itemd.c miscd.c miscd1.c | 物品 | 物品生成/拾取/掉落规则 |
weapond.c | 武器 | 武器生成/属性 |
equipmentd.c equipmentd1.c | 装备 | 装备随机属性生成 |
equifabaod.c | 法宝 | 法宝生成 |
meridiand.c meridian2d.c jingmaid.c | 经脉 | 经脉/内功修炼体系 |
buffd.c | BUFF | 增益状态管理 |
chard.c | 角色 | 角色数据/创建辅助 |
statusd.c | 状态 | 在线状态/查询 |
rankd.c paimingd.c topd.c | 排行 | 各类排行榜 |
titled.c | 称号 | 称号授予/加成 |
pkd.c pksd.c | PK | 杀人/仇杀记录与惩罚 |
familyd.c | 门派 | 门派/师徒关系 |
vipd.c | VIP | 会员体系 |
moneyd.c | 货币 | 金钱/兑换 |
mapd.c worldmapd.c mazed.c | 地图 | 世界地图/迷宫 |
fubend.c fubendd.c fuben_*d.c | 副本 | 各副本活动 |
channeld.c | 频道 | 聊天频道 |
named.c rnamed.c cnamed.c random_name.c | 名字库 | 命名/随机名 |
logind.c logind1.c | 登录 | 鉴权/建号(见第9节) |
backupd.c | 备份 | 自动备份存档 |
updated.c | 更新 | 热更新分发 |
npcd.c npcsd.c | NPC | NPC 管理 |
auctiond.c salad.c bidd.c | 拍卖 | 拍卖行 |
teamd.c | 组队 | 队伍服务 |
commandd.c | 指令 | 指令注册 |
configd.c | 配置 | 运行配置读取 |
securityd.c punishd.c monitord.c cpud.c | 安全 | 反作弊/监控/CPU |
eventd.c storyd.c skybookd.c | 活动 | 活动/剧情/天书 |
bossd.c bossd4.c qybossd.c | BOSS | BOSS 刷新 |
invasion/ fairyland_quest/ story/ task/ race/ paiming/ network/ event/ | 子目录 | 入侵玩法/仙境任务/剧情/任务/种族/排名/网络/活动 的配套对象 |
子目录
task/(25个)是系统级任务脚本;quest/(根目录)是任务实例对象(176+)。两者都归questd管。
16.〔篇六〕cmds/ 指令体系
指令 = 玩家输入命令的实现。按权限/类别分目录:
| 目录 | 使用者 | 内容 |
|---|---|---|
cmds/std/ | 所有玩家 | 标准指令(look/move/get/drop/kill/score… 88个) |
cmds/usr/ | 玩家 | 玩家常用指令(275个,聊天/技能/交易/社交等) |
cmds/skill/ | 玩家 | 武功相关指令(learn/perform/exert 等) |
cmds/chat/ | 玩家 | 聊天频道指令 |
cmds/adm/ | 管理员 | 管理指令(76个) |
cmds/arch/ cmds/imm/ cmds/wiz/ | 巫师/神祇 | 高阶/建筑/即时管理指令 |
cmds/d/ cmds/bz/ | 杂项 | 特殊指令 |
指令如何生效:在 globals.h/commandd 注册;玩家输入 → F_COMMAND 解析 → 匹配 cmds/ 下对应 .c 的 main()/create() 里 set("verb","xxx")。新增指令:在对应目录建 .c 继承 CMD(或 COMMAND),set("verb","指令名") 并实现 main(string arg)。
22.〔篇六〕include/ 头文件详解(不止 globals.h)
include/ 下几十个 .h 是全局声明集中地。除已说的 globals.h 外,最常用、你必须认识的:
| 头文件 | 作用 |
|---|---|
ansi.h | 颜色/光标转义码(见第27节颜色码表) |
dbase.h | dbase 存取相关宏/声明;query/set/add/delete、query_temp/set_temp 的底层声明常在这里 |
skill.h | 技能相关常量(SKILL、skill 类型、query_skill 原型) |
combat.h | 战斗常量(攻击类型 TYPE_*、结果 RESULT_*、伤害类型) |
combat/ 子目录 | 战斗细分:wuxing.h(五行相生相克)、family_pfm.h(门派神通) |
condition.h | 状态(condition)相关声明 |
command.h | 指令系统声明(COMMAND、verb 相关) |
move.h | 移动/exit 相关 |
name.h | 名字/称谓系统 |
user.h | 玩家对象相关声明 |
room.h | 房间相关常量 |
weapon.h armor.h | 武器/防具类型常量 |
char.h | 角色相关声明 |
quest.h | 任务状态机常量(QUEST_CREATE/READY/FINISH 等) |
family.h | 门派/家族声明 |
title.h titles.h | 称号 |
message.h msg.h | 消息函数声明 |
time.h ctime_format_func.h localtime.h | 时间函数 |
math.h | 数学辅助 |
config.h runtime_config.h getconfig.h | 运行配置 |
origin.h | 来源/出处标记 |
type.h | 通用类型 |
jingmai.h | 经脉 |
zhenying.h | 阵营(魔门/佛门/道门/妖庭) |
function.h database.h mysql.h | 数据库/外部调用 |
random_name.h random_map.h | 随机名/随机地图 |
net/ 子目录(16个) | 网络/socket 相关声明 |
npc/ race/ 子目录 | NPC/种族声明 |
改代码时若报”函数/宏未声明”,先来
include/找对应.h并#include它。
23.〔篇六〕simul_efun:常用”伪内置函数”从哪来
LPC 里你到处会用到 message_vision()、tell_object()、tell_room()、ansi()、msg()、chinese()、to_chinese() 等”看起来像内置”的函数——它们不是驱动 efun,而是框架在 adm/simul_efun/ 下用 .c 扩展的”模拟外部函数”。该目录现有:
| 文件 | 提供的典型能力 |
|---|---|
message.c | 消息排版(sort_msg 按中文宽度自动换行、剥离转义) |
ntefun.c | 一批通用辅助 efun |
file.c | 文件读写类 efun |
json.c jsons.c | JSON 编解码(与外部系统/接口通信常用) |
util.c | 通用工具 efun |
object.c | 对象操作类 efun |
chinese.c gender.c | 中文处理、性别 |
path.c user.c wizard.c override.c atoi.c compatibility.c | 路径/玩家/巫师/覆盖/转换/兼容层 |
遇到不认识的函数,先用
index.ps1 def <函数名>查;若定义在adm/simul_efun/或mudcore/下,就是 simul_efun。在mudcore/system/kernel/simul_efun/也可能有底层定义(框架层)。
篇7 · adm 内核与管理区
36.〔篇七〕adm/ 顶层目录全解(管理与核心服务的总根)
adm/(administration,管理区)是整个 MUD 的”系统内核层”:主控对象、守护进程、模拟函数、配置数据、外部对接都在这里。它共 8 个子目录,除第 15 节(daemons)、第 23 节(simul_efun)已详解外,本节把其余全部补齐。
36.0 adm/ 子目录总览
| 子目录 | 中文 | 作用 | 本手册章节 |
|---|---|---|---|
single/ | 单例核心 | master.c 主控对象 + simul_efun 挂载 + 用户档案导入器 | 见 36.1 |
daemons/ | 守护进程 | 全局单例服务(战斗/技能/任务/登录…333个 .c) | 第 15 节 |
simul_efun/ | 模拟函数 | message_vision/tell_object 等”伪内置函数”(15个) | 第 23 节 |
etc/ | 配置与数据 | 运行配置、欢迎语、预加载表、封禁表、字体/副本/自然数据 | 见 36.2 |
go-cqhttp/ | QQ 机器人 | 游戏 ↔ QQ 群消息互通(socket 客户端/服务端) | 见 36.3 |
item/ | 装备模板 | 装备/物品生成用的基类模板与头文件(f_/u_ 前缀) | 见 36.4 |
npc/ | 系统 NPC | 功能型 NPC(赞助/铸造/理财/裁判/抽奖/签文…) | 见 36.5 |
socket/ | 套接字 | 目前为空目录(预留 socket 相关脚本) | 见 36.6 |
36.1 adm/single/ —— 单例核心(最重要,改这里要极其谨慎)
single/ 存放全局唯一的核心对象,MUD 启动时由驱动 driver.exe 直接加载。共 3 个文件:
| 文件 | 作用 | 关键点 |
|---|---|---|
master.c | 主控对象(MASTER) | 驱动的”总管家”,几乎所有系统级回调都在这里 |
simul_efun.c | simul_efun 挂载点 | 驱动通过它把 adm/simul_efun/ 下的函数注册为全局可用(见第23节) |
importer.c | 用户档案导入器 | 跨服/旧版存档迁移工具,继承 ITEM+F_SAVE,从 /data.3k/ 读旧档转新档 |
master.c 关键回调(改动前必读):
| 函数 | 触发时机 | 作用 |
|---|---|---|
connect(int port) | 玩家连上端口 | 创建 LOGIN_OB(登录对象);port==6166 时用 GBK 编码,其它端口走 config 的编码。多端口/编码问题看这里 |
compile_object(str) | 加载”虚拟对象”(不存在的文件路径) | 委托 VIRTUAL_D->compile_object 动态生成(副本、迷宫等动态房间靠它) |
crash(error, ...) | 驱动崩溃/段错误 | 崩溃前 shout 广播 + 可选 INSTALL_CRASH_SAVE 紧急存档所有在线玩家 |
valid_read/valid_write | 任意文件读写鉴权 | 决定哪个对象能读写哪个路径(权限安全的总闸) |
error_handler | 运行时报错 | 收集 runtime error 并写日志 |
epilog/preload | 启动完成后 | 按 etc/preload 列表预加载守护进程(见 36.2) |
⚠️
master.c是全服唯一、驱动强依赖的对象。改错会导致整服无法启动。改前务必备份,改后先在测试库startlib.bat验证能正常起服。
36.2 adm/etc/ —— 配置与静态数据
纯数据/文本文件(多数无扩展名),由 CONFIG_D、master.c、各 daemon 读取。改这些不用编译,但多数要重启或让对应 daemon 重读才生效。
顶层配置/文本文件:
| 文件 | 作用 |
|---|---|
config | 主配置文件(key : value 格式)。含最大人数 max users:500、MUD 名 带着系统走江湖、外网 IP my_ip、驱动版本 mudos:FluffOS v2019、编码 encoding:UTF-8、SMTP 邮件参数、互联 mudlist、PK 上限等。& 开头的是加密/受控项 |
preload | 预加载表:起服时按行加载的对象清单(go-cqhttp、logind、rankd、commandd、channeld、backupd、questd、bossd… 见 master.c::preload)。想让某 daemon 开机常驻就加到这里 |
welcome | 登录欢迎画面(连上先看到的 ASCII/文字) |
motd | Message Of The Day,进游戏后的今日公告 |
unreg_motd | 未注册用户看到的公告 |
new_player | 新玩家提示语(”欢迎来到「MUD」!”) |
ftpd_welcome | FTP 服务欢迎语 |
wizlist | 巫师(管理员)名单及等级/权限(鉴权用) |
banned_sites | 封禁 IP/站点列表 |
mud_addresses mud_services | MUD 互联的地址与服务表 |
fuben_private | 副本私有配置 |
kuafupk.zip | 跨服 PK 相关打包数据(备份/资源,勿解压误用) |
数据子目录:
| 子目录 | 内容 |
|---|---|
fonts/ | 字体资源(15 个),用于图形化/字符画显示 |
fuben/ | 副本数据(*.data 15 个 + .back 备份),各副本的配置/进度快照 |
nature/ | 自然/环境数据(15 个),天气/昼夜/季节等系统的数据源 |
改运营参数(人数上限、公告、封禁、SMTP、PK 上限)优先来
etc/;改数值逻辑仍回feature//daemons/。config里max users、ask_recreate(存档损坏是否要求重建)等是常调项。
36.3 adm/go-cqhttp/ —— QQ 群 ↔ 游戏消息互通
基于 go-cqhttp(QQ 机器人框架)的对接,让游戏内消息与 QQ 群互发。用 FluffOS 的 socket_* efun 走 TCP。
| 文件 | 作用 |
|---|---|
client.c | TCP 客户端:socket_create/socket_connect 连到 go-cqhttp 服务(ADDR "8.130.68.223 5700"),read_callback/write_callback/close_callback 处理收发;QQ 常量是机器人 QQ 号 |
server.c | TCP 服务端:监听端口接收 go-cqhttp 推送的群消息,转发到游戏频道 |
chatk / chatkc | 聊天转发的数据/脚本文件 |
qqface.h | QQ 表情码映射(把 [CQ:face,id=x] 转成文字) |
- 消息流向:游戏频道消息 →(
client.c)→ go-cqhttp →QQ 群;QQ 群消息 → go-cqhttp →(server.c)→ 游戏频道(配合channeld)。 - 两者都在
etc/preload里(开机常驻),见第 36.2。 - 改群号/服务器地址:改
client.c的ADDR/QQ/IP宏;改转发格式看read_callback与channeld联动。
注意:这里硬编码了外部服务器 IP 与 QQ 号,属于部署相关配置,迁服/换机器人时必须同步修改。
36.4 adm/item/ —— 装备/物品生成模板
不是物品实例(实例在 clone/),而是装备生成器用的基类模板与字段定义头,被 equipmentd/equifabaod(第15节)等引用来批量生成随机装备。
clone/ 子目录:
| 文件 | 作用 |
|---|---|
f_weapon.c / f_armor.c | 法宝/仙器级武器、防具模板(f_ 前缀,高级装备) |
u_weapon.c / u_armor.c | 普通(user)级武器、防具模板(u_ 前缀) |
item.h | 物品通用字段/常量定义 |
armorfj.h / armorzy.h | 防具附加(fj)/主要(zy)属性表 |
item_fabao.h | 法宝属性定义 |
item_material.h | 材质/材料定义(打造/合成用) |
shenqi/ 子目录:神器(顶级装备)专属模板/数据。
装备的随机属性池、品级、词条多来自这些
.h。想调”爆装属性范围/品质概率”,先看equipmentd.c(逻辑)+ 这里的.h(数据表)。
36.5 adm/npc/ —— 系统级功能 NPC
区别于 d/<门派>/ 下的场景 NPC,这里是跨区域、承担系统功能的特殊 NPC(继承 NPC),被各系统按需 new() 或放到功能房间。
顶层功能 NPC(挑重点):
| 文件 | NPC | 功能 |
|---|---|---|
wizard.c | 赞助向导 | VIP/赞助体系:ask_viplv/ask_newvip/ask_fanli(返利)/ask_xiandan(仙丹),按累计赞助额发 vip1~vip10 与武功奖励(sk_list) |
ganjiang.c / moye1.c | 干将/莫邪 | 铸造/打造武器(名匠 NPC) |
luban.c | 鲁班 | 打造/工匠系统 |
hongniang.c | 红娘 | 婚姻系统(结为夫妻,关联 couple/have_couple,见第35节) |
licai.c | 理财 | 钱庄/理财/利息 |
referee.c | 裁判 | 比武/擂台判定 |
beastseller.c | 兽贩 | 宠物/坐骑出售 |
daoshi.c / qingyangzi.c / nanxian.c | 道士/清扬子/南仙 | 引导/剧情/传功 |
jiangziya.c | 姜子牙 | 特殊剧情/封神 |
jiaoshi.c | 教师 | 新手教学 |
shangren.c / shangren1.c | 商人 | 通用买卖 |
zuixia.c / youxun.c / beichou.c / huisho.c / shizhe.c / tiaoz.c / pingwei.c / bao.c | 醉侠/游巡/悲愁/回收/使者/挑战/评委/报童 | 各类活动/回收/使者功能 |
renou.c | 人偶 | 傀儡/测试用 NPC(renou - 副本.c 是副本,勿改) |
子目录:
| 子目录 | 内容 |
|---|---|
ddz/ | 斗地主小游戏(棋牌玩法 NPC/逻辑) |
obj/ | 系统对象:auctionsd.c(拍卖)、caipiao_ban.c(彩票摊)、juanxian.c(捐献)、weituo.c(委托)、haixianbipin.c(海鲜比拼活动)、ding_wm.c、boss_ces.c(BOSS测试) |
qian/ | 求签/签文系统(100 个 .txt 签文 + 2 个 .c 逻辑) |
room/ | 这些功能 NPC 配套的功能房间 |
rzr/ | 特定活动/NPC 组(按需查看) |
想调”赞助档位/返利”改
wizard.c;”打造规则”改ganjiang/luban;”婚姻”改hongniang.c;”签文内容”改qian/*.txt;”拍卖/彩票/捐献”改obj/对应文件。注意所有- 副本文件是备份,勿动。
36.6 adm/socket/ —— 套接字(预留)
当前为空目录,用于放置 socket 通信相关脚本(与 go-cqhttp 的 TCP 对接、外部接口等配套)。若将来新增自定义网络服务(如 Web 接口、跨服通信),惯例放这里。
36.7 adm/ 速查:改 X 动哪(补充第 20 节)
| 你想改的 | 主改位置 |
|---|---|
| 服务器最大人数/MUD名/编码/SMTP | adm/etc/config |
| 开机自动加载哪些 daemon | adm/etc/preload |
| 欢迎画面/今日公告/新手提示 | adm/etc/welcome、motd、new_player |
| 封禁 IP / 管理员名单 | adm/etc/banned_sites、wizlist |
| 登录端口/编码/崩溃保存 | adm/single/master.c(connect/crash) |
| 文件读写权限 | adm/single/master.c(valid_read/valid_write) |
| 动态副本/迷宫房间生成 | adm/single/master.c(compile_object) + VIRTUAL_D |
| 旧存档迁移 | adm/single/importer.c |
| QQ 群互通/机器人号 | adm/go-cqhttp/client.c(ADDR/QQ) + server.c |
| 爆装属性池/品质 | adm/item/clone/*.h + equipmentd.c |
| 赞助/VIP 档位与奖励 | adm/npc/wizard.c |
| 打造/婚姻/理财/拍卖/签文 | adm/npc/(ganjiang/hongniang/licai/obj/auctionsd/qian/) |
至此
adm/八个子目录全部展开。搭配第 15 节(daemons)、第 23 节(simul_efun)即为adm/完整地图。
篇8 · 附录速查
5.〔篇八〕子系统导航索引(改什么 / 去哪篇看)
本节只做”指路”;每个系统的原理与改法在对应篇的专节。所有”改 X 动哪”的终极速查见 第20节。
| 子系统 | 去哪看 | 主改文件(速记) |
|---|---|---|
| 人物数值/属性 | 篇三 · 第10节 | feature/attribute.c |
| 等级/经验/天赋 | 篇三 · 第11节 | feature/level.c |
| 技能 | 篇六 + 第26节 | feature/skill.c + kungfu/skill/ |
| 战斗/命中/伤害 | 篇四 · 第12节 | feature/attack.c damage.c kungfu.c combatd |
| 状态/BUFF | 篇四 · 第12.5节 | feature/condition.c + buffd |
| 修炼/境界/五行/肉身 | 篇三 · 第17节 | meridiand.c attribute.c char.c |
| 物品/装备 | 篇五 · 第18节 | inherit/item/weapon/armor + equipmentd |
| 任务 | 篇五 · 第19节 | inherit/misc/quest + /quest/ |
| 房间/世界 | 篇五 · 第24节 | inherit/room/room.c + d/ |
| NPC | 篇五 · 第25节 | inherit/char/npc.c |
| 门派/家族 | 篇三 · 第28节 | familyd.c |
| 经济/货币 | 篇三 · 第29节 | moneyd.c + feature/finance.c |
| 登录/角色创建 | 篇三 · 第9节 | clone/user/login.c + logind.c |
| PK | 篇四 · 第12.4节 | pkd/pksd + combatd |
| 其它守护进程 | 篇七 · 第15节 | 按需查 adm/daemons/(globals.h 找宏) |
20.〔篇八〕「我想改 X,该动哪」速查表
| 你想改的 | 主改文件 | 辅助/相关 | ||
|---|---|---|---|---|
| 出生属性数值 | adm/daemons/logind.c(make_body) | feature/attribute.c | ||
| 属性成长公式 | feature/attribute.c | feature/level.c(天赋点) | ||
| 身法/悟性等加成系数 | feature/attribute.c | feature/skill.c(skills映射) | ||
| 升级所需经验 | feature/level.c(level_max_exp) | combatd(给经验) | ||
| 命中率 | feature/kungfu.c(hit_rate/rate_coef) | attribute.c(dex) | ||
| 伤害/减伤 | feature/damage.c(receive_damage) | combatd(PVP系数) | ||
| 战斗启动/锁定 | feature/attack.c | inherit/char/fighter.c | ||
| 状态/中毒/BUFF | feature/condition.c + kungfu/condition/ | buffd | ||
| 技能学习规则 | feature/skill.c + kungfu/skill/xxx.c | skillsd | ||
| 内功/经脉 | adm/daemons/meridiand.c + inherit/skill/force.c | attribute.c(con) | ||
| 装备属性 | `inherit/item | weapon | armor + adm/daemons/equipmentd` | feature/equip.c |
| 物品掉落 | adm/daemons/itemd/miscd | clone/ 实例 | ||
| 任务 | inherit/misc/quest + /quest/ 实例 | feature/quester.c + questd | ||
| 存档路径/内容 | feature/save.c + clone/user/user.c(query_save_file) | feature/dbase.c | ||
| 登录/注册 | clone/user/login.c + adm/daemons/logind.c | /d/login/ 存档 | ||
| 门派 | adm/daemons/familyd.c | inherit/char/family_npc.c | ||
| 排行榜 | adm/daemons/rankd.c | statusd | ||
| 聊天频道 | adm/daemons/channeld.c | cmds/chat/ | ||
| 副本 | adm/daemons/fubend.c + fuben_* | /fuben/ |
32.〔篇八〕对象生命周期(create → setup → heart_beat → reset/clean_up)
理解对象何时被创建/初始化/回收,是改代码不出 bug 的关键:
| 阶段 | 函数 | 说明 |
|---|---|---|
| 创建 | create() | 对象加载时调用一次,设置初始 set(...)、set("exits",...) 等 |
| 装配 | setup() | 多数基类在 create() 末尾调 setup();玩家 user.c::setup()(见第9节) 在这里定年龄、还原 autoload |
| 心跳 | heart_beat() + set_heart_beat(1) | 定时循环(NPC 的 scan/chat/heal_self、战斗 tick 都靠它);战斗时 attack.c 开启 |
| 重置 | reset() | 房间/NPC 定时重置(刷新怪物、复位状态) |
| 回收 | clean_up() / F_CLEAN_UP | 无人时对象被销毁回收;no_clean_up 可禁止。NPC 继承 F_CLEAN_UP |
| 断线 | net_dead() / user_dump() | 玩家断线/空闲超时处理(user.c 见第9节) |
| 存读 | save() / restore_object() | 由 F_SAVE 封装,上线/下线/心跳触发 |
改
create()加字段时,旧存档可能没有该字段(缺省 0/undefined),要做好默认值兜底;改heart_beat注意性能(高频 tick 别写重逻辑)。
21.〔篇八〕调试与排错(接手期必备)
1. 编译报错:.c 由 lpcc.exe 编译。改完加载时若报语法错,看 MUD 内回显的行号定位。常见:中文全角符号、缺分号、inherit 路径错、函数未声明(加 .h 或 prototype)。
2. 热更新:改完系统代码后,MUD 内(巫师)用 update <对象路径> 重新加载;改守护进程(*d.c)或 globals.h 一般要重启 driver.exe(运行 startlib.bat)。
3. 在线执行:call <对象> <函数>(参数) 可在线上直接调函数验证;eval 求值表达式。
4. 查调用/定义:用配套 code-tools/index.ps1:
def <函数>找定义位置callers <函数>找所有调用点(防漏改)grep "<正则>任意搜inherit F_XXX/macro XXX查继承与宏
5. 存档损坏排查:玩家档在 /d/user/X/角色名.o。若某字段读不到,多半是改了 dbase 字段名/结构导致旧档不兼容——用 backupd 的备份恢复,或写迁移把旧字段映射到新字段。
6. 不要碰:mudcore/(框架)、*.1/ - 副本/.zip 文件(备份/冲突副本)、/d/(世界房间+玩家存档,勿手改二进制)。
7. #pragma 指令:文件头常见 #pragma save_binary(存档用二进制)、#pragma optimize(优化编译)、#pragma strict_types(严格类型,易报类型错)。遇到奇怪编译问题先检查文件头 pragma。
维护提示:本手册随你对代码的理解逐步补全。每深入一个系统,就把”主改文件 + 关键函数 + 调用点”补进对应小节;配合
code-tools/index.ps1的def/callers双查,可保证改动不漏、不改错。
31.〔篇八〕备份系统(backupd)
- 守护进程
backupd.c(BACKUP_D) 定期把玩家存档/d/user/X/角色名.o复制备份。 - 存档损坏/误删时,从备份恢复(具体备份目录在
backupd内定义,通常有/d/backup/或类似)。 - 改存档结构(加字段安全、改名/删字段需迁移)时,先确认
backupd有近期备份再动手,出问题可回滚。
35.〔篇八〕游戏概念速查(读代码常遇到的字段/词)
| 字段/词 | 含义 |
|---|---|
shen | 神/正邪值(正派>500,邪派<-500) |
attitude | NPC 态度(heroism 英雄/aggressive 好斗/peaceful 平和…),驱动 accept_fight |
character | 玩家性格(心狠手辣/国士无双…),部分武功 valid_learn 限制 |
couple/have_couple | 是否已婚/有伴侣,部分武功限制 |
family/family_name | 所属门派 |
combat_exp | 实战经验(杀怪获得,决定等级) |
potential | 潜能(练功消耗) |
neili/jingli | 内力/精力 |
max_qi/max_jing | 气血/精神上限 |
qi/jing | 当前气血/精神 |
str/int/con/dex/per/kar | 臂力/悟性/根骨/身法/容貌/福缘 |
tianfu_point | 天赋点(每10级+1,up_tianfu 用) |
jingjie_1_name | 修炼境界名(影响减伤) |
xiantian | 先天之炁(抵消伤害) |
zhenying | 阵营(魔门/佛门/道门/妖庭,影响属性+5%) |
apply/xxx | 装备/状态附加的属性(流入 attribute.c) |
title_imp/xxx titlea_obtian/xxx | 称号/成就给的属性 |
zhujis/xxx | 注灵/附魔属性 |
suit_skill/xxx suit_eff/xxx | 套装技能/套装效果 |
pet/xxx | 宠物天赋(力大无穷/聪明绝顶/绝世天才/快速闪避/掩青…) |
talent/xxx | 先天天赋(talent/str/con/dex/int/fa_gong/shouhu…) |
skill_map | 招式→武功映射(战斗出招用) |
roshen_<部位>/属性 | 肉身部位锻造属性(12部位) |
no_fight | 房间禁战标记 |
equipped | 物品是否已装备 |
维护提示(续):本手册已覆盖”系统代码 + 内容模板 + 游戏概念”三层。后续每接手一个具体玩法(副本/活动/排行/聊天等),把对应 daemon 与
d//kungfu//quest/实例补成专节即可。所有”改 X 动哪”的索引仍以第20节速查表 +code-tools/index.ps1的def/callers为准。