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