----一些新的想法实现以及关于id()和present()的应用
嗯。。。。迟到的第五讲。。。。
因为想到要在这个lib上继续写点东西,所以看起来这个连载还会继续一段时间。
之前在lib上胡乱写了一些东西,我已经尽量清理了,可能偶尔还有漏网之鱼。。。。不管他了
比较之前的版本,这次增加了两个新内容:
1. 道具。
由于我比较倾向于使用统一object来管理道具,因此这个lib里的物品可能和一般lib不太一样。
道具的基础文件在/obj/item.c,继承了一些东西,实际上目前与玩家的dbase 之类基本一致,但是为了未来比较清晰,所以独立成继承文件。
/cmds/usr/test.c(指令i可以看身上的东西)是测试指令,用于生成一个“道具”,通过调用/adm/daemons/item_d.c的接口来获得一个生成好的道具。(实际上由于装备,药品等非常不同,因此在item_d下边还会有其他的equip负责真正的生成,使用等功能。。。。)
目前这个版本,没有对道具的实际ob进行管理,单纯是用的时候new,然后setup。未来会变成物件池的模式。。。。未来。
2.id()
id()是一个apply,通常我们不直接调用他,而是通过present()来生效。我把这个函数的实体放在了/std/body/name.c中,可以看看。
注:直接用query("id")的方法来进行比对是很烂而且很懒的做法,事实上这个lib里到目前为止,连save和restore所依据的id判断也是用的query("id"),这样不是很安全,未来会改掉。
实际可见的例子是修改过的cmd look,现在这个版本终于可以“看”房间中的人/物,或者身上的物品了。甚至可以用look xxx 3这种形式。
这不是我的功劳,而是present()本身的实现。
======分割线=======
这个版本到此为止。下个版本我希望可以写一个简单的战斗系统,包括结仇以及简单的仇恨判断,出招等。
当然,不会真的出招(因为连hp/mp这些都还没有呢),只要能正确的找到目标,并给出“某某向某某出招就好”。
提示:下个版本就终于要有heart_beat()了。。。oh yeah
======分割线=======
以下是这次lib的目录:
lib
|-- adm
| |-- daemons
| | |-- char_d.c
| | |-- chinese_d.c
| | |-- cmd_d.c
| | |-- equip_d.c
| | |-- item_d.c
| | |-- login_d.c
| | `- security_d.c
| |-- obj
| | |-- master.c
| | `-- simul_efun.c
| `-- simul_efuns
| `-- file.c
|-- cmds
| |-- gm
| | `-- update.c
| `-- usr
| |-- build.c
| |-- go.c
| |-- hp.c
| |-- i.c
| |-- look.c
| |-- quit.c
| |-- say.c
| `-- test.c
|-- d
| `-- wiz
| |-- center.c
| `-- westyard.c
|-- data
|-- etc
| |-- equip.csv
| |-- level_modify
| |-- preload
| |-- welcome
| `-- wizlist
|-- include
| |-- ansi.h
| |-- equip_d.h
| |-- globals.h
| |-- item_d.h
| `-- socket.h
|-- log
|-- obj
| |-- item.c
| |-- login.c
| |-- mob.c
| `-- user.c
`-- std
|-- body
| |-- item_dbase.c
| |-- item_move.c
| |-- mob_dbase.c
| |-- move.c
| |-- name.c
| |-- room_dbase.c
| |-- user_dbase.c
| `-- user_save.c
`-- room.c
另外/adm/daemons/zhiyuan_d.c不用管,那个是测试class的遗留物。下个版本就会不见。
我必须说明一下。。。。
这个版本里边我仿佛用到了iexplode()函数,正常的mudos是没有的。
我之前在mudos还是本版有写过这个函数的添加方法。
如果没有。。。。就比较麻烦。。。。
稍后我补一个iexplode的simul实现吧。
(iexplode简单来说就是在explode的基础上,如果判断分割后的内容是数字,就将其直接转变为int,而不必经过atoi)
efun:iexplode()的mudos实现(添加到efuns_main.c当中)
#ifdef F_IEXPLODE
void
f_iexplode PROT((void))
{
array_t *vec;
int i,size;
int tmp;
char tmp2[16];
vec = explode_string((sp-1)->u.string,SVALUE_STRLEN(sp-1),sp->u.string,SVALUE_STRLEN(sp));
size = vec->size;
for(i=0;i<size;i++) {
tmp = atoi((vec->item+i)->u.string);
sprintf(tmp2,"%d",tmp);
//if( tmp || (SVALUE_STRLEN(vec->item+i)==1 && (vec->item+i)->u.string[0]=='0') ) {
if(strcmp(tmp2 ,(vec->item+i)->u.string) == 0 ) {
free_string_svalue((vec->item+i));
(vec->item+i)->u.number = tmp;
(vec->item+i)->type = T_NUMBER;
}
}
free_string_svalue(sp--);
free_string_svalue(sp);
put_array(vec);
}
#endif
#ifdef F_IEXPLODE
void
f_iexplode PROT((void))
{
array_t *vec;
int i,size;
int tmp;
char tmp2[16];
vec = explode_string((sp-1)->u.string,SVALUE_STRLEN(sp-1),sp->u.string,SVALUE_STRLEN(sp));
size = vec->size;
for(i=0;i<size;i++) {
tmp = atoi((vec->item+i)->u.string);
sprintf(tmp2,"%d",tmp);
//if( tmp || (SVALUE_STRLEN(vec->item+i)==1 && (vec->item+i)->u.string[0]=='0') ) {
if(strcmp(tmp2 ,(vec->item+i)->u.string) == 0 ) {
free_string_svalue((vec->item+i));
(vec->item+i)->u.number = tmp;
(vec->item+i)->type = T_NUMBER;
}
}
free_string_svalue(sp--);
free_string_svalue(sp);
put_array(vec);
}
#endif