作者k0286 (22k age)
看板WOW
標題[無用] 優先度巨集猜想
時間Fri Aug 19 00:53:40 2011
看到之前的 [巨集] 技能冷卻中施放寫法 討論串
其中ironsalami salami zonhan 的一些對於 施法佇列的解釋 讓我產生了一些想法、臆
測
不過由於內容過於瑣碎,版上能看得懂的人大概不超過30位,並由於疏於排版導致不易閱
讀,故視為無用文
由於我原文是打在notepad上,轉貼過來時,可能出現了某些排版錯誤,不過反正對此有
興趣的人也不多,我就不修正了
若有大德願意幫我重新排版,自然感激不盡。
另外附上google doc版,給有興趣深入瞭解者。
http://goo.gl/qngs4
我在此假設 4.X 巨集冷卻判斷施法 可能是由兩個主要機制決定
分別是 施法佇列 和 巨集執行 兩個內建規則決定
並非吾人之前以為的單一機制決定
所以我在此建立一個簡單的測試
首先 先解釋 施法佇列機制 和巨集的執行 如何影響巨集
引用 zonhan的圖
Player Client Network Server
───── ───────────────── ──── ───────
無法施放
↑
│yes 無施放中
│ 進入 技能 施放開始 處理施法時間後
按技能1 →判定cd┴─→施法佇列─────→並送出訊息──→ 判定施法完成
↑ no ↑ │
│ │ │
按技能2 ─┘ │ │
│ │
│ │
└──────────────────┘
送回施法完成訊息
而巨集的執行 按照目前已知的模式 推測是由 "由上而下"(top to down) 並且每執行一
次(相當於每按一次) 巨集都會從新讀取一次
如欲錯誤則當掉跳開(即不執行巨集=巨集無效)
故當吾人巨集寫作
/cast 技能A
/cast 技能B
若 技能A是屬於一需要冷卻之技能 ex: 閃電鏈 神聖之火
技能B是不需要冷卻之技能 ex: 閃電箭 懲擊
當吾人spam巨集時
開始唱 技能A 接著 因為施法佇列的緣故 會將技能B排進 佇列
但當技能A施放完畢 進入CD後 受到 巨集執行偵測到 技能A無法使用導致巨集錯誤跳開,
則不會施放技能B
用時間流程圖來看
SPAM巨集
詠唱技能A 技能A進入CD 詠唱技能B 技能A結束CD
詠唱技能A
施法佇列 空 技能B 技能B 空 空
技能B
巨集真假值 真 真 假 假 真
真
若吾人更仔細測試 會發現 施法佇列 只能儲存一個法術 並且是最後施放的法術
當吾人將巨集改為
/cast 技能A
/cast 技能B
/cast 技能C
若 技能A是屬於一需要冷卻之技能 ex: 閃電鏈 神聖之火
技能B是不需要冷卻之技能 ex: 閃電箭 懲擊
技能C是另外一個不需要冷卻之技能 ex: 閃電箭 懲擊
測試結果會發現 技能B 不會出現 正確的說法是 被技能C給擠掉了,這同時也能證明巨集
的執行模式是從上而下的
用時間流程圖來看
SPAM巨集
詠唱技能A 技能A進入CD 詠唱技能B 技能A結束CD
詠唱技能A
施法佇列 空 技能C 技能C 空 空
技能C
巨集真假值 真 真 假 假 真
真
接著吾人來對/castsequence進行測試
在之前我已提到了 利用塞進 "無主動技能的物品" 取代 空值 原因與理由在此不再重複
敘述
/castsequence 技能A,1
/castsequence 1,技能B
若 技能A和技能B是均屬不需要冷卻之不同技能並且在不設reset條件(或長時間reset條件
) 由於技能AB均不需要CD,故巨集執行必為真
結果基本等於
/castsequence 技能A,技能B
並且有無spam巨集 結果均相同 但在此吾人無法判斷出施法佇列對此巨集的影響
固進一步
/castsequence 技能A,1,1
/castsequence 1,技能B,1
/castsequence 1,1,技能C
若 技能A和技能B和技能C是均屬不需要冷卻之不同技能並且在不設reset條件(或長時間
reset條件)
這時結果就出現差異
沒有spam時結果相當於
/castsequence 技能A,技能B,技能C
有spam時結果就與spam頻率有關出現隨機施法
可能出現ABCBCBABCACA 這其中要注意到的一點是
任一技能不會連續出現
(利用這個特性,吾人可以做到與/castrandom不同的特點 => 不重複隨機施法 ,取
決於spam速度)
至於實際上有沒有用,鄙人就不知道了
另一要注意的點是
若將巨集後綴省略的話
/castsequence 技能A
/castsequence 1,技能B
/castsequence 1,1,技能C
沒有spam時結果相當於
/castsequence 技能A
有spam時結果就與spam頻率有關出現隨機施法
這一點表示吾人可以同時針對場合將不同需求的巨集放在一起
以上出現隨機施法結果吾人應該即視為 施法佇列的影響
接著吾人加入reset=0的條件進行測試
/castsequence reset=0 技能A,1,1
/castsequence reset=0 1,技能B,1
/castsequence reset=0 1,1,技能C
沒有spam時結果相當於
/castsequence 技能A
有spam時結果就與spam頻率有關出現隨機施法
可能出現AACBBCCACA 這其中要注意到的一點是
任一技能會重複出現,即相當於舊版(2.X)/castrandom的功能!!
並且加入reset=0條件後
是否省略巨集後綴,其結果與加上後綴並無差異!!
接著吾人要加入判斷巨集執行的條件加以測試/castsequence 即加入需要冷卻的技能!!!
也就是本篇主題 優度順序巨集施放探討的重點
吾人將巨集
/castsequence 技能A,1
/castsequence 1,技能B
若技能A和技能B都是需要冷卻且冷卻時間不同的技能
其結果
不論是否spam均可視為 /castsequence 技能A,技能B
這表示吾人會受限於技能A的冷卻時間(其原因是當技能A進入冷卻時,會判斷巨集當掉)
另外當吾人省略掉巨集後綴時
/castsequence 技能A
/castsequence 1,技能B
其結果
不spam時 為 /castsequence 技能A
spam時 為 /castsequence 技能A,技能B
但這裡要特別注意 若吾人將 行次 順序變更
/castsequence 1,技能B
/castsequence 技能A,1
將會發現 決定巨集可否執行的關鍵變為技能B
所以從此結果我們可以知道
關鍵在於 第一行 我們要放無CD之技能
接著我們更進一步研究 三層的技能組
/castsequence 技能A,1,1
/castsequence 1,技能B,1
/castsequence 1,1,技能C
若技能ABC都是需要冷卻且冷卻時間不同的技能
其結果
不論是否spam均可視為 /castsequence 技能A,技能B,技能C
其他結果均跟上述2層測試差不多,故省略之
接著我們加入reset=0 之條件
/castsequence reset=0 技能A,1,1
/castsequence reset=0 1,技能B,1
/castsequence reset=0 1,1,技能C
若技能ABC都是需要冷卻且冷卻時間不同的技能,且冷卻時間A > B > C
其結果
不spam時 為 /castsequence reset=0 技能A
但spam時,會因為頻率的不同而產生很大的差異,可能會出現以下結果
A
AB
AC
ABC
也就是說第一行的技能和spam頻率會決定結果
若我們改變行次順序時
/castsequence reset=0 1,1,技能C
/castsequence reset=0 1,技能B,1
/castsequence reset=0 技能A,1,1
其結果
不spam時 為 /castsequence reset=0 技能A
但spam時,能夠完美達到冷卻CD完成即施放,
其原因在於行次的改變使巨集不會因為長CD之技能A在首行而導致巨集被當掉
若吾人省略巨集後綴時
/castsequence reset=0 技能A
/castsequence reset=0 1,技能B
/castsequence reset=0 1,1,技能C
或改變行次順序並省略後綴
/castsequence reset=0 1,1,技能C
/castsequence reset=0 1,技能B
/castsequence reset=0 技能A
均與上述不省略結果相同
接著討論最後一項問題,這也是我目前還搞不清的迷茫地帶之一,也是本篇最難懂的部分
即 優先度要如何安排
比方說,有兩個技能同時CD好,我要如何優先施放A而不是技能B
目前吾人從上述之測試可以看出 spam影響的是施法佇列 而 技能的行次則影響巨集的執
行或當掉
另外 是否加入reset=0條件 和 巨集後綴的變更(即升冪或降冪) 則對技能優先似乎有特
別的影響
就我觀察歸納,推測
巨集後綴的變更(即升冪或降冪)主要影響需冷卻之技能技能優先權
reset=0條件 主要決定是否需要跳開冷卻技能
比方說 我引用前述
/castsequence 技能A,1
/castsequence 1,技能B
若技能A和技能B都是需要冷卻且冷卻時間不同的技能
其結果
不論是否spam均可視為 /castsequence 技能A,技能B
這表示吾人會受限於技能A的冷卻時間(其原因是當技能A進入冷卻時,會判斷巨集當掉)
當巨集改成
/castsequence 1,技能A
/castsequence 技能B,1
其結果會變成
/castsequence 技能B,技能A
但巨集執行仍受限於技能A之CD
而若 加入reset=0條件
/castsequence reset=0 技能A,1
/castsequence reset=0 1,技能B
/castsequence reset=0 1,技能A
/castsequence reset=0 技能B,1
此兩種寫法 在spam下結果均與上述不加入reset相同
從此可推得,除了行次序外,巨集的後綴次序(即升冪或降冪)安排也會影響巨集是否會被
當掉
以下兩點注意
若技能A CD時間 > 技能B
/castsequence reset=0 技能A,1
/castsequence reset=0 1,技能B
會因為技能A進入CD 使巨集當掉
但修正成
法一 改變行次
/castsequence reset=0 1,技能B
/castsequence reset=0 技能A,1
法二 改變冪次
/castsequence reset=0 1,技能A
/castsequence reset=0 技能B,1
但遇到3層以上,狀況就會相當複雜
我在此假設遇到一狀況要求如下
吾人有ABCDEF六項技能
其中ABCDE是需要冷卻之技能,且優先度A >> B >> C >> D >> E
且CD時間C >> D >> E >> A >> B
其餘空檔則使用F技能(無冷卻之技能)
撇開起手順序不講,我們只討論輸出中的優先順序施放
我們可以做出如下之巨集,當然這只是我的理論推測,並無實際驗證支持
先由優先順序排出
A,1,1,1,1,1
1,B,1,1,1,1
1,1,C,1,1,1
1,1,1,D,1,1
1,1,1,1,E,1
1,1,1,1,1,F
再由CD長短排列
1,1,1,1,1,F
1,B,1,1,1,1
A,1,1,1,1,1
1,1,1,1,E,1
1,1,1,D,1,1
1,1,C,1,1,1
再由是否有冷卻CD加入reset=0條件
/castsequence 1,1,1,1,1,F
/castsequence reset=0 1,B,1,1,1,1
/castsequence reset=0 A,1,1,1,1,1
/castsequence reset=0 1,1,1,1,E,1
/castsequence reset=0 1,1,1,D,1,1
/castsequence reset=0 1,1,C,1,1,1
估計大概結果就長這模樣吧,不過由於都是推測居多,大概9成機會還需要修正
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.120.222.219
※ 編輯: k0286 來自: 140.120.222.219 (08/19 00:53)
推 anumber:得證 08/19 01:06
推 asgard1991:故得證 08/19 01:10
推 clse0190:Q.E.D 08/19 01:13
推 eDrifter:看沒有, 不過還是推. 另外求高手幫給個精簡版. 08/19 01:14
推 Cycylno:推薦這篇文章 08/19 01:24
→ anumber:實測後的確能接近目標要求,但是技能序列越多,要跳過的1 08/19 01:26
→ anumber:越多,故無法達到無縫接續施法? 08/19 01:26
→ zonhan:技能越多會卡越多1, 可能要設按鍵連發才能接近無縫吧 XD 08/19 01:31
→ anumber:而且這招對中文版有利 英文版排三個技能就滿了阿!!(翻桌 08/19 01:33
推 Cycylno:測試到三層就怪怪的 = =" 是我spam的不夠快嗎? 08/19 01:35
→ anumber:因為每按一次就要跳過一次1 08/19 01:42
推 Cycylno:三層可行,不過每招都要在GCD結束前半秒按才行 08/19 01:54
→ Cycylno:如果GCD結束才按就會亂掉,不然就很完美 08/19 01:55
推 hollynight:這寫法 是在寫論文嗎XD 08/19 02:04
推 lisyu:還是射擊獵安定,三個技能擺上去就收工了 08/19 02:35
推 salami:其實這些iron以前幾乎都測過了...我們才會說 不是只是佇列 08/19 02:38
→ salami:問題 而是巨集本身也有很大的影響 08/19 02:38
→ salami:後來發現跟上進度的沒幾個人 還有HQ版友出來亂..乾脆不說了 08/19 02:39
推 salami:只用佇列 根本沒辦法解釋所有的現象 08/19 02:41
→ salami:而且後端要開發實用的巨集 也不可能停在佇列的部分 08/19 02:41
→ salami:很早就在開發巨集部分 特別是連續施法這一塊了.. 08/19 02:42
推 Wolfen:得證! 08/19 02:58
推 holymars:看起來最需要克服的問題是同一個巨集中有數個cast 08/19 03:33
→ holymars:sequence,同時帶有reset條件時,client端執行的判斷機制 08/19 03:33
→ holymars:我心中有些初步想法了 之後上線測試看看對不對好了.. 08/19 03:34
推 galaxy4552:不無用阿 寫的很好! 有M的價值 08/19 03:40
推 HQ1030:某人很在意被我亂的事情啊? :P 要不要考慮寫個冰法macro 08/19 13:35
→ HQ1030:目前冰法可是有很多短cd的招可以拿來當這測試的範本 08/19 13:35
→ k0286:看到大家很熱心討論 我很高興...可是不要都用寄信的阿~~~~ 08/19 14:23
→ k0286:我quit已久,很多問題 大家寫信給我 我也回答不出來 08/19 14:23
→ k0286:如果PO上來會害羞的話 我可以幫忙匿名代PO 08/19 14:24
→ k0286:需要的話 請跟我說一聲... 08/19 14:24