作者laechan (小太保)
看板mud
标题Re: [闲聊] tmi2-mudlib 的更改
时间Tue Jun 24 17:05:45 2014
闲聊一下 boss 系统。
大抵上会有个 /std/bmonster.c,不用 /std/boss.c 是因为这样比较
有统一性(gmonster, smonster, bmonster, ..),但使用者可以依自己
喜好新增 #define BOSS BMONSTER 这个我就不干涉。
这个 boss 具有我在 sanc 为旧版 boss 所设定的一些特性,例如血量
可以破 22 亿就是它其中一种特性。
再来的话就是新的东西,有的我在 sanc 有提出过但没有实装。
简单的说 tmi2_v3_改 的 boss 分为三种
1.小王型
这种 boss 基本的会带小兵,它的重生比较随兴,例如使用者可以在
area_room.X 里面控制它的生出之类的。我限制它可带的小兵必须是
跟它同目录的(因为这可透过 #define CLONE_MOBS 去产生),而且该
小王生出的唯一条件就是小兵的档案已经先产生。
2.地图 BOSS
这种 boss 跟小王一样会带小兵,但是它也可以带小王,带着小王的
情况小王就不生小兵。
这种 boss 就类似地图巡逻者,由 boss 管理系统生出及控管,也就
是说该 boss 不 follow area_room.X 的设定,是自成一格的,管理
系统会随时掌控 boss 目前所在的位置,以及当 boss 被清掉时,控
制隔多久後再生出等等。
有这系统的好处就是容易实装所谓的 boss 雷达。
3.BOSS 房间内的 BOSS
这种 boss 一样会带小兵,而且一样可以带小王。
这种 boss 比较特别的就是「多血条」,我会设定 boss 有五条血,
所有的这种类 boss 都一样,它不受 boss 管理系统的控制,但是它
会有资料纪录在 boss 管理系统。
什麽资料呢?比方「该 boss 什麽时间被打倒的、打倒该 boss 的玩
家有哪几位、队伍有哪几队、打该 boss 花了多久、..」
这种的只纪录一次,也就是「第一次被打倒」。
打倒这种 boss 後就可以推进下一层区域。
基本上第一次打倒这种 boss 的玩家都可直接升一级。
前面两种 boss 都是 inherit BMONSTER,但是第三种 boss 会比较特
别 inherit SMONSTER。
在实装 boss 之前,我会先实装特攻系统,所以这是实装特攻系统以後
的事,倒是趁现在可以提一下,boss 很简单就是有特殊攻击,以及阵
亡时的处理比较特别。
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 210.61.157.53
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/mud/M.1403600749.A.8C0.html
※ 编辑: laechan (210.61.157.53), 06/24/2014 17:06:26
1F:推 tenyfish :现在是不是货币尚未实装呢? 114.37.59.169 06/24 22:22
还没。如果要简单点就是 ppl->query("balance") 是银行存款,
ppl->query("wealth") 是身上现金,然後平常采单一货币,有需
要第二种货币比方 gold 时就是 ppl->query("gold")。
也就是说假设把底层的货币当成银币,那 balance 跟 wealth 就
是「银币」,而「金币」另外放。
或者 wealth 是银币,balance 是金币,也曾有 mud 这样子做过
,例如假设做成 100:1 的比例,要存钱一定要 100 银以上才能存
,存进去的就是金币。
然後要做成泛用的呼叫就是函数化,也就是说例如
ppl->query_wealths(); // 预设读银币
ppl->query_wealths("gold"); // 读取身上的金币
ppl->query_balances(); // 预设读银币存款
ppl->query_balances("gold"); // 读取金币存款
ppl->add_wealths(100); // 身上的银币增加 100
ppl->add_wealths("gold",100); // 身上的金币增加 100
.
.
然後玩家身上 wealth 与 balance 的栏位就用 "wealth" 与
"balance"。
> data me
balance : ({银币的量,金币的量})
wealth : ({银币的量,金币的量})
这是我预计要做的,没排入优先事项,我猜是因为我不满意这样的
做法,然後我期望这段期间我有想到更好的做法这类的。
(我是有想过直接用 query_moneys 更简洁一点)
※ 编辑: laechan (61.224.75.82), 06/24/2014 22:55:26
2F:推 tenyfish :其实非欧美那种超多种族的旧式MUD 114.37.59.169 06/24 23:02
3F:推 tenyfish :是不用太多语言和货币,我只是刚才 114.37.59.169 06/24 23:11
4F:推 tenyfish :用TEST站时发现买东西都不用钱而己 114.37.59.169 06/24 23:25
5F:推 tenyfish :有到到被注解掉的部份,正好研究一下 114.37.59.169 06/24 23:55
6F:推 tenyfish :改过shop.c如何让它可用?update无效 114.37.59.169 06/25 00:05
7F:推 tenyfish :有指令可write(me->(query_"?"))吗? 114.37.59.169 06/25 00:13
8F:推 tenyfish :虽然我自己写了一个指令出来用... 114.37.59.169 06/25 00:49
9F:推 tenyfish :所以call me;query;xxx 这样用吗? 114.37.59.169 06/25 01:37
10F:推 tenyfish :call成功了,谢谢 114.37.59.169 06/25 01:41
call 物件;函数;要带的参数...
例如 call me;set;"level";10 相当於 me->set("level",10);
call me;query;"level" 相当於 me->query("level")
simul_efun 的 call 则可以这样做
> call /adm/obj/simul_efun;atoi;"123"
房间(/adm/obj/simul_efun)-> atoi( "123" ) = 123
(more /adm/obj/simul_efun.c 就能发现它 include 了一堆档案,
那些档案就放在 /adm/simul_efun 下,因此 call simul_efun.c
就能呼叫被它 include 进来的所有 simul_efun)
但是要 call efun 呢?
running 指令就提供了更简易的方法
> running
编辑结束并存档(.). 中途放弃编辑(~q).讯息暂时中断。
__________________________________________________________________
obs=users();
foreach(ob in obs)
if(ob && ob->query("level")>0)
tmp+=sprintf("%-12s 等级 %3d\n",
ob->query("name"),
ob->query("level"));
me->more(explode(tmp,"\n"),1,1);
.
========== 程式执行区 ==========
jana 等级 65
blancneige 等级 120
pss2 等级 120
teresa 等级 120
lannssssyy 等级 120
.
.
========== 程式执行区 ==========
简易的 running code 及其执行结果就像底下
> running
编辑结束并存档(.). 中途放弃编辑(~q).讯息暂时中断。
__________________________________________________________________
write("hello, world!\n");
write("你的等级: "+me->query("level")+".\n");
.
========== 程式执行区 ==========
hello, world!
你的等级: 120.
========== 程式执行区 ==========
其中,me、ob、obs、i、j、tmp、.. 等等就是内建变数,内建了
哪些变数可自行 more /cmds/wiz/_running.c,若你懂了该指令
也可以视自己的需要扩充内建变数:
int running(object me,object env)
{ ^^^^^^^^^^连这个也是内建变数
// 变数可依需要自己新增
int i,j,k;
mixed obs=({});
object ob;
string tmp;
mapping data=([]);
// 注意:新增了什麽变数, 就要相对初始化什麽变数
ob=me;
obs=({});
i=0;j=0;k=0;
tmp="";
我会内建这些变数是因为大部份的情况通常用到这些变数就已足
够,顶多再增加一个 mixed tmps=({}) 几乎就够用了。
running code 就是「所见即所执行」,它可以让 wiz 横空执行
一段程式码,而不需藉助工具物件或 workroom 或其它指令的帮
助,只要靠 running 指令就够了,而且它也会受到权限的限制.
因为 call 有它的极限,而总不能每每想要执行什麽,就得去改
workroom 来做或是写物件,「如果有更方便的东西就好了」。
※ 编辑: laechan (61.224.75.82), 06/25/2014 06:33:25
11F:推 tenyfish :那update後如何让修改反应出来? 114.37.52.81 06/25 08:54
12F:→ laechan :update後修改不是就更新了吗 42.79.52.226 06/25 09:19
13F:推 tenyfish :update shop.c後 买东西仍是旧讯息 114.37.39.235 06/25 09:40
14F:推 dannielz :再update here试试看 14.216.16.91 06/25 10:53
15F:推 tenyfish :好的,所以inherit的物件也需update 42.67.2.30 06/25 12:19
如果有 a b 两个物件,a 里面有函数这样写
void xxx()
{
b->xxx();
}
那只要 update b,呼叫 a 执行 xxx 的结果就会更新。
但如果 a inherit b:
void xxx()
{
::xxx();
}
那 update b 後 a 不会更新,因为 a 还骑在旧的 b 上面,
这时简易的 update 方法是
update -R a
它会先对 a 所继承的 b 做 update,做完才做 a 的 update
※ 编辑: laechan (210.61.157.53), 06/25/2014 12:47:05