→ laechan:才值16銀..打很久捏.. 08/21 19:33
賺個 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