以下内容完全由AI生存,但经人工校验确认无误。
在 FluffOS 中,虚拟对象是一种极为实用的机制,支持你在运行时动态创建对象,即便这些对象并无对应的 .c
源代码文件 。
当驱动(driver)需加载不存在的源文件(如通过 new()
或 call_other()
操作),不会直接报错,而是调用主控对象(master object)里的 compile_object()
这个 apply 。这让 MUDLib 有机会 “凭空” 创建对象,并关联到不存在的文件路径 。
核心 Apply: compile_object()
compile_object()
是实现虚拟对象的关键 。
- 路径:
apply/master/compile_object.c
- 原型:
object compile_object(string pathname)
工作流程
- 触发:尝试加载不存在文件,比如
new("/obj/virtual/sword_123")
,而文件系统中无/obj/virtual/sword_123.c
文件 。 - 调用:驱动捕获 “文件未找到” 情况,调用
master->compile_object("/obj/virtual/sword_123")
。 - 处理:需在
compile_object()
apply 里编写逻辑处理请求,一般解析传入的pathname
,依路径信息决定创建何种对象 。 - 返回:
- 成功:若成功创建对象(如用
clone_object()
克隆基础对象并设置),从compile_object()
返回新对象,驱动会关联该对象与路径/obj/virtual/sword_123
。 - 失败:不想为路径创建虚拟对象或无法处理时,返回
0
。
- 成功:若成功创建对象(如用
关联
一旦 compile_object()
返回有效对象,驱动建立文件名 -> 对象关联。之后再引用路径 /obj/virtual/sword_123
,驱动直接返回之前创建的对象,如同真有 /obj/virtual/sword_123.c
文件且加载后得到该对象 。
典型用例
虚拟对象常用于创建大量相似但有细微差别的物品,无需为每个物品单独建源文件 。
示例:创建不同属性的虚拟武器
若想创建各类剑,ID、名称、伤害值不同,可设计路径格式 /obj/virtual/weapon/<ID>
。
- 基础武器对象:创建
/obj/base/weapon.c
文件,包含设置武器属性(名称、ID、伤害等)的函数 。 - 实现
compile_object()
:
// In /secure/master.c
object compile_object(string path) {
string base_obj, id;
// 解析路径,看是否是我们定义的虚拟武器路径格式
if (sscanf(path, "/obj/virtual/weapon/%s", id) == 1) {
// 克隆一个基础武器对象
object ob = clone_object("/obj/base/weapon");
if (ob) {
// 根据从路径中解析出的 ID 来设置这个克隆体
ob->setup_weapon(id);
// 返回这个设置好的对象
return ob;
}
}
// 如果路径不匹配或克隆失败,返回 0
return 0;
}
- 使用:可随时用
new()
创建带特定 ID 的虚拟剑:
object my_sword = new("/obj/virtual/weapon/longsword_of_fire");
驱动找不到对应 .c
文件,调用 master->compile_object()
,代码克隆基础武器,用 "longsword_of_fire"
ID 初始化,再返回。my_sword
变量即指向这个独特虚拟对象 。
总结
虚拟对象是强大高效的功能,借 compile_object
apply 把加载不存在文件的请求,转化为动态创建和配置对象的过程。大幅减少相似物品重复代码编写,让代码库更整洁、易管理 。