楼主:
laechan (挥泪斩马云)
2023-01-17 14:26:50先执行 moball,再执行 moball -filter getpearl1
> moball -filter getpearl1
/d/ppl/bdlen/fish/mob/king.c
经确认只有一只 mob 即普赛顿有判断该参数。
这时改以房间做为搜寻标的,经玩家回报,善见是最可能的地点,
但是找不到,所以我决定全域搜寻。
$ cd /d/ppl
$ grep -r getpearl1
bdlen/fish/mob/king.c: if(query("leaveobj")&&ppl->query_temp("getpearl1"))
bdlen/lock/area/fish.c:this_player()->set_temp("getpearl1",1);
它只有一行会对玩家设定 getpearl1 参数,这行与 hold 指令有
关,即 hold 定海珠:
int hold_xx(string str)
{
int stt,i,j;
mapping stat;
object obs,ppl,mob; // obs2;
mixed allppl;
ppl=this_player();
stat=ppl->query("stat");
allppl=all_inventory(environment(ppl));
if(query("over")) return 0;
stt=stat["str"]*2+stat["fel"]*4+stat["dex"]*3+stat["con"]*4+
stat["air"]*3+stat["int"]*4+stat["mag"]*3;
if(stt<20000)
return notify_fail(HIB"定海珠"NOR+HIW"缓缓亮了起来不久后又暗了下?h\n"NOR);
stt=stt-20000;
stt=stt/2000;
tell_room(this_object(),ppl->query("chi_name")+HIW"将力量输进"+
HIB"定海珠"NOR+","+HIB"定海珠"NOR+HIW"发出强大的光茫\n");
if(stt>=4)
if(mob=present("Poseidon",find_object_or_load(BR"43")))
{
mob->set("leaveobj",1);
this_player()->set_temp("getpearl1",1);
}
obs->remove();
write(HIB"定海珠"NOR+HIW"发出一股力量击向你, 你觉得一阵晕眩后, "+
"你发现你到了一个?s的地方\n"NOR);
上面的意思是,玩家想要在打普赛顿的时候拿到海神珠,它的前提就是
你要在某个地方 hold 定海珠,hold 的条件是
你的七属性依照上面 stt 的加权计算公式,总和要达 20000,
不然你 hold 定海珠会失败,这里会给失败讯息,ok
getpearl1 参数设定的条件是
放好后,(该总和-20000)/2000 要至少 4,即总和至少要 28000,
并且普赛顿此时必须在他所在的房间是活着存在的状态。这里不ok
/d/ppl/bdlen/lock/area/fish.c 不备份修改
首先,加权计算后的要求 20000 没问题,但后面又要求要 28000 不合
理,这会造成玩家如果 hold 定海珠成功,就会以为他接下来去打普赛
顿时就应该会掉落海神珠──但实际上玩家有可能无法满足28000 的数
值要求而怎么打都打不到,而且还无任何提示讯息。
再来,它还要求你 hold 海神珠“成功后”,普赛顿这时也必须在,若
不在“它也不会给你任何讯息”(等于白白 hold 损失一颗定海珠),这
也不合理,因为这会造成玩家在下 hold 海神珠的指令后,成功了,但
是要去打普赛顿时,他不在!!?? 那怎么打海神珠!!??
所以做以下修改:
1. hold 定海珠时,若普赛顿不在,hold 不会成功;若普赛顿在,hold
就会成功。
2. 已将 28000 调整成 20000,亦即你满足 hold 定海珠的条件也 hold
成功后,接着去打普赛顿,就会掉海神珠。
Laechan