作者laechan (小太保)
看板mud_sanc
标题[程式] ask xxx about ooo
时间Tue Aug 21 19:33:08 2007
赚个 p 币。
底下介绍的也适用於所有相符的情况, 各位 wiz 可以多多利用。
set("id",({"man of black","black","man","black man"}));
void init()
{
add_action("ask_xxx","ask");
}
// 假设是 ask man about laechan
int ask_xxx(string str)
{
string s1,s2;
if(!str || str=="") return 0;
if(!sscanf(str,"%s about %s",s1,s2) ||
sscanf(str,"%s about %s",s1,s2)!=2) return 0;
程式写到这里, 一般来说, wiz 们会用的写法是...
if(s1!="man") return 0;
推荐的写法有两个...
一、因为该 npc 有四个识别用 id, 如果希望玩家可以用每一个
识别 id 去 ask 都能 ask 成功的话, 可以用底下的写法..
if(!id(s1)) return 0;
上面也等於底下...
if(!this_object()->id(s1)) return 0;
id 函数内建在 MONSTER 中, 它会去判断 s1 是否为该 npc
的 ID 的一部份, 不是的话才 return 0.
二、用物件判定法..
object man;
if(!man=present(s1,environment(this_player())))
return 0;
if(man!=this_object())
return 0;
它会先去读取 man 这个物件是否存在, 理论上你 ask xxx
, 这个 xxx 应该要存在於你所在的房间, 所以它先去读有
没有这个人, 然後再判断它是不是就等於该 npc 物件.
它的好处是, 它会很精准地指向该函数存在的物件主体.
二的最明显例子就是喝药水, 假设身上带了三罐一模一样的 str
potion, 你要喝第二罐时就得下 drink str 2 这样的语法, 在
这情况下如果做上面二的判断, 你就可以准确地喝到第二罐 str
potion, 而不会去喝到第一与第三罐.
不过通常相同的 npc 不会有两只同时存在於该房间, 在这情况
下用一的写法就行了。
换言之,就是依情况,采取适当的做法。一般来说二是较严谨且
通用的做法,一是较简便但不失方便的做法。
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.131.252.64
1F:→ laechan:才值16银..打很久捏.. 08/21 19:33
2F:推 amosdeus:因为用复制贴上是不算钱的呀! 08/21 20:05
3F:推 laechan:我不是用复制贴上的捏... 08/22 15:43
4F:推 coldblade:你这次按键和上次按键(要考虑 lag 因素唷)的时间,在1秒 08/22 16:38
5F:→ coldblade:以上,而且你这次按的键和上次按的键不一样的话,你能赚 08/22 16:38
6F:→ coldblade:的钱就+1 08/22 16:39
7F:→ coldblade:所以我们可以知道laechan打字很快...... 08/22 16:39
8F:→ coldblade:参考知识来源: ptt ask版 08/22 16:40
9F:推 laechan:冏..那我下次要打慢一点 08/22 16:50