精華區beta mud_sanc 關於我們 聯絡資訊
賺個 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
laechan:才值16銀..打很久捏.. 08/21 19:33