判斷表達式,判斷式(Option Set):由若幹判斷項組成,封閉在方括號[]中的真值表達式。繼承自安全模板,能在受保護環境下允許運作的唯壹判斷形式。
壹,寫宏的基本法則
宏最主要的應用是帶有判斷的施法,這也是下文主要應用的模型。壹個典型的這種宏可以抽象成以下形式:
Code(c):
/cast [表達式1-1][表達式1-2]技能1;[表達式2]技能2;技能3
--宏的模型
[項1,項2,項3, ...]
--表達式的模型
--註:表達式中定義單位target=或@不是壹種判斷條件,但它重新指定了後續所有涉及目標的判斷和最終技能施放的對象。比如指定了@mouseover後,後續的help/exists/dead之類的判斷都會基於鼠標懸停的單位。
在這個模型下,討論:
1.邏輯及判斷順序(法則壹,!極為重要)
涉及判斷就有真值,但是不要被這個帶有濃重編程和數學色彩的詞嚇倒。概括來說就兩句話:
<1>方括號內各分項之間是AND的關系,用逗號間隔,只有各個分項都為真整個方括號(表達式)才為真。方括號內各項之間沒有順序要求。
<2>各個方括號之間是OR的關系,判斷順序是從左至右,遇到第壹個方括號為真時即結束判斷,而忽略其後的所有項目。
大部分宏出錯/不能用/判斷混亂的原因就是在此。寫宏的時候必須把條件強的(或者說優先級高的)判斷放到前面,弱的(泛用型的)判斷放到後面。舉個例子,昨天回答了問答區壹個人的提問,他的宏
Code(c):
1:#showtooltip
2:/cast [nomod,spec:2]煉獄沖擊;[nomod,target=mouseover,exists,harm,spec:2]煉獄沖擊
無法對鼠標懸停目標放。究其原因就是,[nomod,spec:2]這壹個表達式弱於後者
[nomod,target=mouseover,exists,harm,spec:2],後者不僅需要無修飾鍵和第二專精,同時需要存在壹個可攻擊的鼠標懸停目標才會為真,導致了後者為真時前者壹定為真。
按照上文的<2>,從左至右的順序將永遠是前者表達式率先為真,因而無法對懸停目標施放煉獄沖擊。修改的方法很簡單,把兩個判斷調換位置即可:
Code(c):
1:#showtooltip
2:/cast [nomod,target=mouseover,exists,harm,spec:2]煉獄沖擊;[nomod,spec:2]煉獄沖擊
3:--修改後的宏
當然我在回答中還給出了優化方案,後文會詳細介紹如何優化。
2. 技能整合(法則二)
對於把多個技能整合進壹個/cast命令裏,在不同的條件下自動判斷施放不同的技能,只有壹條格式法則:不同技能之間用分號;間隔。具體可以參照本章開頭提出的宏模型。
要註意,壹個/cast任何情況下至多只能施放壹個技能,而且各個方括號之間仍舊遵循上文提出的<2>判斷順序法則。
3. 技能堆疊(法則三)
如果要做到壹鍵同時放出兩個或更多的技能,必須有多行/cast命令,這就是技能堆疊。這種宏通常用於爆發技能,喝藥開飾品開技能需要同時完成。
其法則是:至多只能擁有壹個產生/受到GCD影響的技能,幸運的是爆發類技能和藥水等物品幾乎都設計成不占用GCD。
Code(c):
1:#showtooltip
2:/cast 奧術強化
3:/use 13
4:/use 14
這樣的宏是可行的,因為飾品和[奧術強化]本身並不產生GCD,甚至再加兩行
Code(c):
/cast 氣定神閑
/cast 奧術沖擊
也是合法的。但是,形如以下的宏是非法的:
Code(c):
1:#showtooltip
2:/cast 驅邪術
3:/cast 審判
4:/cast 十字軍打擊
因為三者都產生GCD和/或被GCD影響,最終的效果是只相當於第壹行[驅邪]有用。不要妄圖這種方法能實現按優先級施放技能。
4. 技能替代(法則四)
技能替代是壹個十分有意思的機制,自CTM引進。這種機制允許某[基礎技能]在特殊情況下被另壹個[替代技能]替代,而即便在替代的情況下,通過宏命令施放[基礎技能]時會自動定向到[替代技能],其最終的結果是正常施放[替代技能],宏的圖標也會隨之變化。
這種機制有兩種情況:
1)單向的替代,/cast [替代技能]不會施放出基礎技能,但是/cast [基礎技能]是任何情況下通用的。
舉例:神牧的[聖言術:罰]在黃輪和藍輪下轉換成[靜]和[佑],只要宏
Code(c):
1:#showtooltip
2:/cast 聖言術:罰
就能自動根據輪的顏色轉換技能,但因為這是[罰]被單向地替代,反過來如果宏裏寫[靜]或[佑],在紅輪下就會放不出技能。
2)雙向的等價,[基礎技能]和[替代技能]是完全等價的,就如同壹個技能,任何情況下用宏施放任意壹個技能的結果都是放出當前激活的那壹個。比如[腐蝕術]和[獻祭]兩者,SS玩家可以分別在不同天賦下試試。
這種機制對於寫宏非常有利,我們不需要為了技能被替換而另開壹個宏。更深入的壹點,以下兩個技能需要重點提及:
Code(c):
1:#showtooltip
2:/cast 秘法炸彈
3:--這個技能對應法師75級天賦中的[虛空風暴],[寒冰炸彈]和[活動炸彈]。[秘法炸彈]被單向替代。
Code(c):
1:#showtooltip
2:/cast 神聖爆發
3:--這個技能對應牧師90級天賦,也是單向替代。
如果其他職業也有類似的天賦基礎技能,請歡迎補充。
二,寫宏的靈魂:邏輯和優先級
筆者和自己圈子裏的很多人說過,寫宏其實和編程沒多大關系,需要的是壹點數學的邏輯思維。尤其是那些技能整合宏,對在各種判斷條件下到底哪壹個技能才是優先的必須心裏有譜。
實際上這是上文中法則壹之<2>的推演,本質上仍舊是按照越優先越靠前的方式排列整個技能和判斷序列。正因如此,上文法則壹才是宏最最重要的法則,而優先級正是寫宏的靈魂。
Code(c):
1:#showtooltip
2:/cast [help,dead][mod:shift,help][mod:shift,@player]Soulstone;[mod]Soul?
Link;Unending Resolve
3:/targetlasttarget [help,dead]
4:--比如這個術士宏,它的邏輯等價於:
5:--如果[目標死亡且可協助]或[按住shift並且目標可協助]或[其他按住shift的情況下對自己]施放[靈魂石]
6:--否則,如果[有按下其他任何修飾鍵]則施放靈魂鏈接
7:--否則任何其他情況下放盾墻
8:--此外,如果[目標死亡且可協助]還會順帶切換回之前的目標,目的是戰復後目標切回怪身上
有人可能會問,[help,dead][mod:shift,help][mod:shift,@player]這壹串看不懂,為什麽先來個shift修飾後面又來壹個,這裏就涉及到優先級的問題了。
首先[help,dead]指定了[目標死亡且可協助]的情況,它是優先級最高的,只要滿足這兩個條件,其他任何條件不管滿足不滿足都會戰復目標。
其次,[mod:shift,help]這壹判斷代表[按住shift並且目標可協助],但是它還有個隱藏條件。因為要判斷到這壹層,首先必須前者[help,dead]為假,也就是當[目標不可協助或者目標不死]的情況。
所以其實這個判斷應該是[(目標不可協助或者目標不死)並且按住shift並且目標可協助],由於不可協助和可協助互斥,所以實際判斷的真值應該是[目標不死並且按住shift並且目標可協助],滿足這個條件,對目標放靈魂石。
再次,[mod:shift,@player],這裏只用了壹個判斷即shift修飾,上文說過@player不是判斷條件。但因為前壹個判斷已經有壹種按下shift的情況被取走了,那麽這裏的判斷表示[其他按住shift的情況下對自己]施放靈魂石。
然後,[mod]是個廣義的修飾鍵判斷,當alt/shift/ctrl中任何壹個或多個被按下是都為true。當然shift在前面的判斷中被取走,那麽這裏表示的是[按下alt/ctrl中任何壹個或兩個],他等同於[有按下其他任何修飾鍵]則施放靈魂鏈接。
最後,無盡決心沒有任何判斷,它是恒真的。也就是在其他任何條件下都會施放無盡決心。
上面這個例子有些復雜,下面會通過壹個相對簡單的實例來闡述如何運用這種模式寫宏。
法師法術反制及焦點反制/懸停解詛咒整合宏
要求是:焦點可攻擊按住任何修飾鍵都是焦點反制,不按修飾鍵且敵對目標是對目標反制,鼠標懸停到友善目標是解詛咒,目標是友善目標是解詛咒,默認狀況下是對目標的反制。
首先就是厘清優先級。
那麽整理之後的優先級就是:
第壹優先級:焦點反制敵對目標,判斷式[mod,@focus,exists,harm]
第二優先級:懸停解可協助目標詛咒,判斷式[@mouseover,exists,help]
第三優先級:對友善目標解詛咒,判斷式[help]
第四優先級:敵對目標反制,判斷式[harm]
第五優先級:反制,無判斷式(恒真)
*要註意,harm和help有關系,但並不是help=noharm或者harm=nohelp。harm代表目標可攻擊,help代表目標可協助(能給他加血上buff等),此外還有壹種既不能攻擊也不能協助的狀態,稱為"被動(Passive)"。
現在可以直接寫出宏了,那就是:
Code(c):
1:#showtooltip
2:/cast [mod,@focus,exists,harm]法術反制;[@mouseover,exists,help][help]解除詛咒;[harm]法術反制;法術反制
3:--第壹行的#showtooltip不是命令行,它的作用是能在鼠標提示上顯示技能的有關信息
這個宏運作起來是符合要求的,但是可以繼續優化。從邏輯上而言,第四與第五優先級可以合並,而且exists沒必要與harm和help連用。因此最終的宏是:
Code(c):
1:#showtooltip
2:/cast [mod,@focus,harm]法術反制;[@mouseover,help][help]解除詛咒;法術反制
擴展資料:
常用宏模板:
1.治療/傷害技能混合宏,附帶指向施法,或者用於解buff和攻擊性技能組合:
Code(c):
1:#showtooltip
2:/cast [@mouseover,help]治療技能;[harm]攻擊技能;治療技能
2. 治療指向宏,無指向對目標:
Code(c):
1:#showtooltip
2:/cast [@mouseover,help][]治療技能
3. 經典的修飾鍵整合宏:
Code(c):
1:#showtooltip
2:/cast [mod]技能1;技能2
或者更多的技能:
Code(c):
1:#showtooltip
2:/cast [mod:shift]技能1;[mod:ctrl]技能2;[mod]技能3;技能4
4. 翻頁宏:
Code(c):
1:#showtooltip
2:/cast 技能
3:/changeactionbar n
這個宏最近已經被玩壞了,n可取1-6。
5. 花式宏,雙修飾鍵/三修飾鍵判斷:
Code(c):
1:#showtooltip
2:/cast [mod:alt,mod:ctrl,mod:shift]技能
按照需要自己整合,就是這個套路。
6. 花式用法:
拆分1+alt和alt+1(按鍵順序)。
*1+alt指的是先按住1然後不放去按alt,保持alt松開1(此時放技能),最後松開alt。
這個用法需要關閉界面設置中的點擊施法選項。
按鍵綁定中綁定alt+1,在這個動作按鈕上放技能1
建立壹個宏
Code(c):
1:#showtooltip
2:/cast [mod]技能2;技能3
把這個宏放到鍵1上。
其結果就是alt+1放出技能1,1+alt放出技能2,直接按1是技能3。