Re: [闲聊] tmi2_v3_改 目前还缺什么?

楼主: laechan (挥泪斩马云)   2014-06-14 20:05:47
我写了一个说明文的范例,写这个花了我至少一个小时以上,嘛..
因为实际上需要写的东西其实也不可能太多,所以如果使用者可接
受这样的说明文件格式,我是可以花时间一一建立的,甚至将其网
页化(线上观看)或是 word 化(开放下载、打印)亦无不可。
(不过...13 页呢,我对写这个真的不太行,更不用说去啃了)
然后我发现一个问题就是,如果对 LPC 完全无基础,那基本上要
自由使用 tmi2_v3_改 是不可能的,以后我会增加一个建议就是要
使用 tmi2_v3_改 的人最好有 LPC 程式语言基础。
==========================================================
系统名称: 虚拟物品系统
此系统与怪物掉落物系统共存
主要档案: /include/vobj.h
/adm/daemons/vobjd.c
相关档案: /data/vobj.o
/cmds/wiz/_vobj.c
/cmds/std/_ob.c
/std/vobj.c
/include/vobj.h
虚拟物品的相关定义档,所有的定义都是以 VOBJ 开头
VOBJ_DEFAULT_??? 定义一些虚拟物品的默认项目,例如
#define VOBJ_DEFAULT_UNIT "个"
代表在设定一个虚拟物品时如果没有给单位(unit),其单位默认就是“个”
,其它以此类推。
#define VOBJ_DEFAULT_NO_TRADE 0
#define VOBJ_DEFAULT_NO_SELL 0
NO_TRADE 默认为 0 的意思就是“可以 trade”。
NO_SELL 默认为 0 的意思就是“可以 sell”。
VOBJ_???_INDEX 定义虚拟物品资料串阵列各元素的位置
所谓虚拟物品的资料串阵列,类似底下
> call /adm/daemons/vobjd;vobj_data;"query_array";"兔牙"
OBJ(/adm/daemons/vobjd)-> vobj_data( "query_array", "兔牙" ) =
({ "m002","兔牙", "个", "怪掉落", 501, 99, " 可 ", " 可 ",
"一个兔牙,可向收集品商人购买。" })
上面的 ({ }) 内的内容就是虚拟物品的资料串阵列。
#define VOBJ_MARK_INDEX 0
#define VOBJ_NAME_INDEX 1
MARK 的 INDEX 定义为 0,就代表阵列的第 0 个资料 "m002" 就是所谓的
MARK (编号)。
NAME 的 INDEX 定义为 1,就代表阵列的第 1 个资料 "兔牙" 就是所谓的
NAME (名称)。
其它以此类推。比方我们令 arrays = 该阵列,arrays[VOBJ_NAME_INDEX]
就是 arrays[1],也就是 "兔牙" 那个字段,而这个字段就是 NAME。
其它定义详见“怪物掉落物系统”。
/adm/daemons/vobjd.c
此系统档案是以 /adm/系统物件范例.txt 为原型所撰写,了解系统物件范
例档的内容,就能初步了解 vobjd.c 的架构。
mapping vobj_data=([]);
储存所有虚拟物品的资料变量,当这个变量有资料时,其资料分三层
vobj_data = ([
"标头" : ([
"编号" : ([
"name" : "物品名称",
"unit" : "物品单位",
"kind" : "物品种类",
"long" : "物品描述",
"value" : 物品价格,
"carry" : 物品可携带量,
"no_trade" : 能否交易,
"no_sell" : 能否贩售,
]),
]),
]);
“标头”使用的是“编号”的第一个字母,假设 "兔牙" 这项虚拟物品的
编号是 "m002",标头就是 "m"。假设其价格为 501,其资料如下
vobj_data["m"]["m002"]["name"] = "兔牙"
vobj_data["m"]["m002"]["value"] = 501
其它没有设定的资料就会套用“默认资料”,例如单位就是“个”,种类
就是“怪掉落”,可携带量就是“99”,其它以此类推,详见 vobj.h。
static mixed vobj_names;
在 vobjd.c 被系统加载时,create 函数首先会被呼叫,vobj_data 变量
资料会被加载,再之后就会对 vobj_names 变量资料做处理。
假设目前有两笔虚拟资料
vobj_data = ([
"m" : ([
"m001" : ([ "name" : "兔毛",
"value" : 362 ]),
"m002" : ([ "name" : "兔牙",
"value" : 501 ]),
]),
]);
则 vobj_names 经过 create 函数处理后其资料内容就如下:
编号 名称 编号 名称
vobj_names = ({ "m001", "兔毛", "m002", "兔牙" })
这个变量之所以存在、是因为大部份情况我们只需要读取一个虚拟物品编
号所对映的“名称”,因此对名称做特别的处理。
当呼叫 vobj_data 函数进行虚拟物品的增减或更名时,也会连带变更到这
个变量资料。
void create()
这个函数就是 vobjd.c 被加载时会呼叫的函数,它会做几件事
if(file_exists("/data/vobj.o"))
restore_object("/data/vobj");
当 /data/vobj.o 资料档存在时,就加载 /data/vobj.o 的内容。
if(!vobj_names)
{
mixed tmps=keys(vobj_data),tmps2=({});
string tmp,tmp2;
vobj_names=({});
foreach(tmp in tmps)
{
tmps2=keys(vobj_data[tmp]);
foreach(tmp2 in tmps2)
vobj_names+=({tmp2,vobj_data[tmp][tmp2]["name"]});
编号 名称
}
}
它会去读每一笔虚拟物品的资料,然后把名字取出来,跟编号放在一起后
放进 vobj_names 里面,所以 vobj_names 的资料才会是编号, 名称, 编
号, 名称, ...
int save_room()
当我们要储存 vobjd.c 的变量资料时,呼叫这个函数即可进行储存。
mixed query_vobj_names()
回传 vobj_names 的内容。
void set_ob_data(string keyname,string tmp)
这主要是 wiz 指令 vobj -set 时会呼叫的函数
> vobj -set 兔毛;m001;个;怪掉落;一个兔毛。;362;99;0;0
当 wiz 下这个指令时
keyname = "兔毛"
tmp = "兔毛;m001;个;怪掉落;一个兔毛。;362;99;0;0"
然后 set_ob_data 就会对 tmp 做底下动作
tmps = explode(tmp, ";"); // 对 ";" 号进行拆解
接着就将拆解的资料一一设进 vobj_data["m"]["m001"] 里头,比方
vobj_data["m"]["m001"]["name"] = "兔毛"
vobj_data["m"]["m001"]["value"] = 362
.
.
varargs mixed vobj_data(string key1,string key2,mixed vars)
函数名 vobj_data 与变量名 vobj_data 是可以并存的。
只要是参考 /adm/系统物件范例.txt 档写成的系统物件,其参数格式都
类似上面,有 key1、key2,以及 vars。
key1 一般指“功能项”,比方
vobj_data("query", ..) 一般就是用来读取 vobj_data 的资料
vobj_data("set", ..) 一般就是用来设定 vobj_data 的资料
vobj_data("del", ..) 一般就是用来删除 vobj_data 的资料
所以一开始一定会看到针对 key1 所做的 switch:
switch(key1)
{
case "query":
.
.
key2 一般就是指当你使用 query/set/del 等功能时要存取的目标。
vars 则用来放“其它你想带过来给 vobj_data 函数的参数”。
void vobj_list()
当 wiz 下指令 vobj -list 时会呼叫这个函数,其内容就是做虚拟物品
资料的相关列表。
void vobj_export()
当 wiz 下指令 vobj -export 时会呼叫这个函数,其内容就是汇出所有
虚拟物品的设定资料。
其它可参考怪物掉落物系统说明。
/data/vobj.o
/adm/daemons/vobjd.c 的资料储存盘。
/cmds/wiz/_vobj.c
请参考“指令”目录的关于 vobj 指令的说明。下指令 vobj 亦可看到
基本的指令说明。
操作这个指令可对 /adm/daemons/vobjd.c 档案进行资料的存取。
/cmds/std/_ob.c
请参考“指令”目录的关于 ob 指令的说明。下指令 ob ? 亦可看到基
本的指令说明。
/std/vobj.c
这个物件用于 ob view 时,ob view 会将欲观看的虚拟物品之资料,暂
时 set 到一个 clone 出来的 /std/vobj.c 物件里头,再送至 _view.c
指令的 view_object 函数,借由该函数处理虚拟物品资料的观看。
详见“指令”目录的关于 view 指令的说明。
laechan@sanc 2014/06/14

Links booklink

Contact Us: admin [ a t ] ucptt.com