篇一 · 入门与核心机制

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"