作者laechan (小太保)
看板mud
标题Re: [闲聊] tmi2_v3_改 目前还缺什麽?
时间Sat Jun 14 20:05:47 2014
我写了一个说明文的范例,写这个花了我至少一个小时以上,嘛..
因为实际上需要写的东西其实也不可能太多,所以如果使用者可接
受这样的说明文件格式,我是可以花时间一一建立的,甚至将其网
页化(线上观看)或是 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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.253.166.191
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/mud/M.1402747550.A.E98.html
※ 编辑: laechan (111.253.166.191), 06/14/2014 20:15:31
※ 编辑: laechan (111.253.166.191), 06/14/2014 20:17:15
1F:推 tenyfish :好强大 推 1.162.184.31 06/14 21:06
2F:推 tenyfish :优先对於比较特别的系统吧,不然太多 1.162.184.31 06/14 21:23
3F:→ laechan :ok应该下次释出的版本会包含这些说明111.253.166.191 06/14 21:44
其实重点是你看了这些说明後对 vobjd.c 是不是就了解了。
如果你能藉说明了解了 vobjd.c,那理论上我後续写的说明
你也能藉着阅读它们去了解其它的系统,重要的系统及修改
我会优先撰写。
然後我是希望能透过 tmi2 频道的互通,有些问题就可直接
问、心得也可直接交流。
※ 编辑: laechan (111.253.166.191), 06/14/2014 21:46:51