背景:
阅读文章

从头打造mudlib

与Akuma一起从头打造mudlib--【第五讲】

[日期:2011-03-01] 来源:泥巴创世纪  作者:Akuma [字体: ]

----一些新的想法实现以及关于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

【内容导航】
第1页:Akuma一起从头打造mudlib--【第零讲】 第2页:与Akuma一起从头打造mudlib--【第一讲】
第3页:与Akuma一起从头打造mudlib--【第二讲】 第4页:与Akuma一起从头打造mudlib--【第三讲】
第5页:与Akuma一起从头打造mudlib--【第四讲】 第6页:与Akuma一起从头打造mudlib--【第五讲】
收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容       mudlib  mud 
本文评论   [发表评论]   全部评论 (3)
第 3 楼
* 匿名 发表于 2013/8/16 3:08:48
老大,文章实在好,可是附件在哪里下载啊?
第 2 楼
* baobao会员 发表于 2011/6/8 10:57:42
你好,我是新来的,请问有问题如何在论坛中提问呢?
先谢谢了就
第 1 楼
* 匿名 发表于 2011/3/8 21:42:30
请问,这篇教程的后序还有吗?去年就是看到这里就没有了。。。
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论
* 匿名 发表于 2013/8/16 3:08:48
老大,文章实在好,可是附件在哪里下载啊?
* baobao会员 发表于 2011/6/8 10:57:42
你好,我是新来的,请问有问题如何在论坛中提问呢?
先谢谢了就
* 匿名 发表于 2011/3/8 21:42:30
请问,这篇教程的后序还有吗?去年就是看到这里就没有了。。。