close

這一篇寫了蠻久的,主要是難度上的考量,
List跟一些比較難的東西扯上關係,大概只有forall比較簡單可以上手,
因為我不了解讀者的定位在哪裡,
寫太簡單怕會覺得很多東西沒寫出來沒寫清楚,寫太難怕新手整篇都看不懂。
如果有任何疑問或遺漏,請在下面回應給我。

第0章 簡介

字串列表、列表、String List、List,
在我的blog跟zmud的help裡,這些詞彙指的是相同的東西。

List是一種特別的變數,裡面包含多個資料,具有順序性

第1章 建立一個List

List是一種特別的變數,它的宣告方式跟變數完全一樣
差別在於內容的資料是用|將多筆資料分開
可以用

#var numlist {1|1|2|3|5|8}



numlist = {1|1|2|3|5|8}

來宣告

如同變數內容帶有空白時要用{}或""包起來,list一律要用{}或""包起來

透過zmud介面也可以建立List,
新建一個變數,Style的地方選擇String List
可以一個一個資料填進去
當然style選zmud script(預設的),然後把資料用|分隔填進去也可以。

第2章 List的使用:配合#forall

#forall指令的第一個參數是一個List,每次會取出List裡的一個資料執行指令
當要loop的資料沒有規則時,直接對一個list做loop就很方便。

例如在rw裡面魚有很多種,名字並沒有規則,
當我想買走全部的魚時,如果不想一個一個打名字,
可以用

fish_list = "Abalone|Sailfish|Poulp|Langouste|Black-Tuna|Dolphin|Pompano"
#forall @fish_list {buy all %i}


或者合成一句

#forall {Abalone|Sailfish|Poulp|Langouste|Black-Tuna|Dolphin|Pompano} {buy all %i}


第3章 List常用的操作函式


%numitems(list)
  • 回傳list裡資料的個數,注意list裡可以有空白資料,例如 a_list = "a||b|c"叫做4個資料
  • %numitems(Athos|Bertrand|Caesar) 會得到 3
%item(list, n)
  • 回傳list裡第n個資料,注意n由1開始算
  • %item("Athos|Bertrand|Caesar",3) 會得到 Caesar
%ismember(s,list)
  • 檢查s是不是在list裡,存在的話,會回傳所在的位置,不在的話,回傳0
  • %ismember("abc","def|ghi jk|abc") 會得到 3
  • %ismember("cde","def|ghi jk|abc") 會得到 0
第4章 List的使用:循環取值

這是我的機裡非常常見的手法

如果有個機要對相同的句子循環做10件事,
例如遇到 休息完畢 時要依序跑10個不同的點,

一個常見的寫法是,寫10個class,分別叫做sit1、sit2、sit3、...、sit10
把10個點寫在10個class裡,
然後每個class各自關掉自己的class並打開下一個class


這種機我叫它t+/t-機,正確性上是沒什麼問題,但是
  1. 重覆的觸發會很多,每個class裡的東西可能只差一點點
  2. 增加或減少事情的數量時,會改的比較辛苦而且容易錯
假設我今天寫一個alias叫set_next_thing
內容是

#math my_idx {@my_idx\%numitems( @my_cmd_list) + 1}
my_cmd = %item( @my_cmd_list, @my_idx)

而另外有一個List變數叫my_cmd_list,內容是{goto_1|goto_2|...|goto_10}

則每次你下set_next_thing時,my_cmd的內容就會依序為goto_1到goto_10

相對於t+/t-機來說,
set_next_thing就是 #t- sit1;#t+ sit2 的動件,
而各class裡小差異的部分就用my_cmd來取代

對於上面的二個問題
  1. 全部的觸發都變同一套了
  2. 事情有變動時,只要改my_cmd_list這一個變數的內容,整個機完全不必改

以上是紅貓機常用的東西,好學者可繼續看進階內容
arrow
arrow
    全站熱搜

    suzin 發表在 痞客邦 留言(1) 人氣()