Re: [學術] 蘿蔔PseudoCode

作者: deathcustom (第三人的到來)   2023-04-18 11:57:05
這裡對於原文中的判斷順序要稍微修正一下,並說明修正的原因
1. 看到mob是否進入戰鬥的判斷
判斷順序一、當前是否有戰鬥
因此一格中始終只有第一個(存在於MOB DB的)MOB會觸發攻擊
判斷順序二、是否有CAST
視使用的User Interface不同,可以使用的語法也不同,甚至可以使用
#IF (!@fight && @castall) {enterfight} {do nothing};
2. 進入一格後判斷是否移動的順序
原來的順序是(由外而內)
#ALA +0.5 {#IF @castall {#IF !@fight {walk}} {home}}
等待0.5秒,先判斷是否有castall->沒有就歸位
有的話判斷是否有進入戰鬥->沒有的話就可以移動位置
這裡(在極少數的狀況下)會發生BUG
就是當遇到MOB時還有CASTALL於是進入戰鬥,但是恰好一進戰鬥就掉CAST
於是會發生沒有CASTALL該歸位了,卻因為戰鬥中無法歸位
如果在其他的地方沒寫好(或是個別MUD系統規則不同)可能會造成BOT當機
所以這個地方的判定要倒轉過來
#ALA +0.5 {#IF !@fight {#IF @castall {walk} {home}}}
先判斷是否在戰鬥,如果沒戰鬥,判斷有無CAST
有CAST就移動到下一格
沒CAST就歸位
※ 引述《deathcustom (Full House)》之銘言:
: 說到MUD,早年最讓WIZ討厭的除了Multi就是蘿蔔
: 但是現在的MUD大多都沒有真的認真在抓蘿蔔了
: 蘿蔔一般來說就是用來打怪賺經驗(就算JY的UQ,也是要打怪才能賺到經驗啊)
: 基本上蘿蔔需要具備幾個基本的組成成分
: 1. 狀態判定
: 以萬王之王為例
: 需要判斷自己是否在"castall"的狀態
: 判斷方式有兩個
: (1) score check
: 如果score有抓到 ^身體狀況%1朦朧術
: KK自己的cast狀態,基本上朦朧術之後只會有鎮定術
: (2) 觸發調整
: 使用常用的castg當castall完成後,觸發 #MATH castall 1
: 等最後一個cast掉(以我自己常用的是迅捷術掉cast)抓觸發字觸發 #MATH castall 0
: (3) 例外調整
: 其他事件:死亡
: (有些MUD斷線可能會掉光狀態,請自己確認)
: 抓觸發字觸發 #MATH castall 0
: 2. 行走
: 有些mud(例如kk)有每回合(2 sec)指令上限(7)
: 有些沒有
: 沒有的直接錄製path之後用zmud的slow walk trigger可以隨時停下打怪
: 有限制的,我是這樣
: #TR {路徑上房間名稱} {#ALA +0.5 {#IF @castall {#IF !@fight {walk}} {回定點的指
: 令}}
: walk是一個alias,內容大致是
: #CASE @room {direction} {direction}......{direction}
: #ADD room 1
: tintin的話
: #SWITCH $room
: {
: #CASE {1} {direction};
: #CASE {2} {direction};
: ...
: #CASE {N} {direction}
: };
: #MATH {room} {$room+1};
: 機制是這樣,進入房間後0.5秒判斷有無castall, 如果沒有,自動歸位重補cast
: 如果有,判斷有無進入戰鬥,沒有戰鬥就繼續移動
: TINTIN的話#ALA +0.5 {}可以用#DELAY 0.4 {}取代
: 理論上TINTIN的極限可以到0.01,但是kk的限制下,最短應該是0.34
: (第一個指令起算2秒內只能再接受6個指令,每個指令間隔0.333秒,所以取0.34
: 但是為了保險起見我會選擇 0.4)
: 3. 觸發戰鬥
: #TR {中文名{(}%1{)}} {
: #IF @castall {
: #IF !@fight {
: 戰鬥指令(such as kill %left(%1,2));
: #MATH fight 1;
: }
: }
: }
: %left(%1,2)表示kill指令下只有該字串的頭兩個英文字母被使用
: KK中最短的ID是三個英文字母,我待的國家又有很多MOB實際上有對應的實際玩家
: 為了避免自己變成pker,我習慣加上這一層保險
: 4. 戰鬥結束
: 以kk為例
: 最容易判斷戰鬥結束的
: (1)戰士系/魔劍士/神官
: #TR {得到%1經驗} {#MATH fight 0;afterfight指令}
: 效果是只要你得到經驗就會把戰鬥歸零
: BUG:如果同一區有狂戰,很容易發生你開打後還沒碰到怪他就死了
: 此時你不會得到任何經驗......
: 修正的方式很簡單
: 在一開始開打的地方,設定#VAR mob %1
: 如果抓到XXX死了的訊息,你就kill @mob
: 此時可以判斷是否還在戰鬥中(出現這裡沒有這個人 表示戰鬥結束)
: (2)咒/巫/賢/祭
: 使用戰鬥型法術(stun/mind_blast/dragon_breath/soul_steal/holy_word
: 如果戰鬥已經結束會跳出 你現在不在戰鬥中的訊息
: #TR {^你現在不在戰鬥中} {#MATH fight 0;afterfight指令}
: 5. 戰鬥結束的動作不外乎
: (1) 撿屍
: (2) 確認自己狀態
: (3) 移動
: 這部分就大家各自有各自的手段
: 6. 戰鬥中補施法
另外來提一下戰鬥中補施法
這需要考慮兩個情境
1. 傷害性法術
2. 輔助性法術(所有不是施法結果必然直接造成傷害者都算, 例如mage的火龍變幻)
前者無論戰鬥的哪一個階段都可以施法,因為施法完的結果就是造成傷害
後者則不一定,通常輔助性法術的施法回合較長,而且施法中不會造成傷害,也無法移動
如果在施放法術後的判定階段(遠端server還沒計算、回饋結果)MOB就受傷死亡
則可能會造成戰鬥結束判定上的當機(因為你正在忙XDDD)
因此我曾經用過的處理方式有
(1) 加上一個casting的判定值
如果戰鬥結束,casting判定值為真,則不進行戰鬥後的動作
如果戰鬥結束,casting判定值為否,則進行戰鬥後的動作
如果casting判定值由真變否時,戰鬥尚未結束,不進行戰鬥後動作
如果casting判定值由真變否時,戰鬥已經結束,進行戰鬥後的動作
但是這個邏輯有點複雜,而且觸發失敗的話容易當機
所以我還用過另外一個機制:
(2) MOB 紅血狀態時禁止施放輔助性法術
加上一個紅血判定值,由XXX已經奄奄一息觸發修正判定值為1(true)
當輔助狀態消失觸發要補施放輔助性法術(mage: coating, ogre_power/ pal: pure_blade)
先判定是否紅血,如果紅血則不施放輔助法術
從這裡延伸
紅血狀態還可以做一件事
KK的法術中,咒術的主要傷害法術mind_blast根據友人統計,施放成功率只有62%
換句話說
一發成功率 =62%
雙發成功率 =0.38*0.62 = 23.56%
三發成功率 =8.95%
四發成功率 =3.4%
基本上四發失敗也不是不可能~"~
但是咒術的傷害法術還有stun (成功率超過八成)
再來就是跟前面一樣的問題
法術系可以使用"你現在不在戰鬥中"作為觸發判斷離開戰鬥
但是常常在紅字階段會發生的是
"唱法(需要兩回合),第一回合結束時SERVER判定MOB死亡"
結果就是這個唱法是無效施法(有耗用MP但是實質上沒有任何效果)
對於咒術來說,這有個問題-無效施法造成OOM風險上升
對應修正方式大約是
1. MOB紅血階段施法節奏放慢(本來是#ALA +0.5,改成#ALA +1甚至+2)
2. MOB紅血階段計算mind_blast次數,滿足次數後施法節奏放慢
作者: tsetsethatha (吉星麥造~~~我來了)   2023-04-18 21:50:00
感謝!

Links booklink

Contact Us: admin [ a t ] ucptt.com