用户:Ning殇/atlas的ai等相关内核写法介绍
有人问到或者讨论到就写一点,希望在我退坑之前能写完
svt ai
priority&weight
有能使用的高priority时必使用高priority。同priority下,根据weight随机在可用行动里面挑
condition
行动使用的条件
注意所有higher/lower都是包含等于的
check selfnpturn指距满格剩多少
check pt lower tdturn和上面那个差不多,不过是检查全队的。
check sum opponent buff等写法表示全部敌方的对应效果的总量。self表示自身,party表示己方全体等。
turn multiple为这个面的倍数回合,在进入这个面后开始计数,其他条件同理
fieldturn multiple为该角色登场后的倍数回合,可以参考大菩萨,除了多了个清空机制外同turn系,注意清空血槽和登场的回合记为0,只有经历了回合数+1,这个fieldturn才会一起+1,另外,在敌方回合末turn end上来的敌人,下回合仍然是0,得到行动完一轮后才+1,或许+1的时间点是敌方最后一动动完reaction enemyturn end的时候?另外,如果初始在场的情况,第一回合行动的fieldturn是0
character turn=fieldturn(大概,也可能+1的触发时间点不一样,目前已知第一回合敌方行动前上来的敌人,在第三回合敌方行动结束时的character turn是2)
opponent have是需要在场的,check opponent all是算后备的
check space检查是否有空位,多个空位也可以满足低的数量
check pt alive检查活着的己方数量
check Ai174 检查御主是否使用了衣服技能
check buff individuality 检查是否有对应buff trait的效果,individuality前面加active和passive可能与是否将带框的归入进去有关
total count individuality 可能同时检查buff trait和trait。(上方opponent have可能只检测trait)
count equal buff individuality sum pt 检查友方的trait,目前看来add trait of是计入的,原本看起来应该对应的buff trait等待更多测试。
act count 注意是cond=63的,为本回合之前行动过几次
actcount 注意是cond=20的,可能为本回合宝具以外的第x次行动,等待更多测试
act type
执行的行动类型。
skill 123和random skill为释放持有技能,会被技封影响。
skill Id为释放ai技能,不受技封影响。
skill Idcheckbuff虽然也释放ai技能,但会受技封影响。
当skill被技封时,对应act type变为attack,但不改变weight占比也不改变攻击对象的目标选择。非常规技能时机下的技封无效。
当被控制时,无法执行act num为正数或anytime的行动,但其他的依然可以。
none为跳过该次行动。
attack为普攻,attack B/Q/A为特定色卡攻击,critical attack为强制暴击攻击(无视降低暴击率,至少200以内的降暴是阻止不了的)
noble phantasm为宝具,一般只在非敌方行动回合才会显式地用上,一般宝具为actnum=usenptarget,priority=0,weight=100,target=random,next ai=none的隐式存在于所有svt ai段落里,当然在actnum=maxnp之类的里面用上也是可以的。
act num
行动时机。
正数x代表该ai段内宝具以外的第x次行动,1.0里比较常见,目前基本弃用状态。
-1会显示为anytime,表示ai段内每一次行动,或者你可以理解为是act num=1~无穷大的全部正数。
maxnp为满气时抢在宝具前发动的通常行动。
为负数但不为-1的是特殊时间点,归类于特殊行动,不占用行动数,同样也不会引起巴姐的反击。
shiftservantafter为破槽后必定发动的行动,复活卡不掉
afterturnplayerend以前为破槽后的行动,目前用的很少,同样复活卡不掉。
reaction enemyturn start如果我方全灭需要复活的话,会被卡掉放不出来,以此类推,reaction enemyturn end应该也会被卡掉
reaction playerturn end同样可以被复活卡掉
但无前排能卡掉的只有正数act num和maxnp,所有负数act num都卡不掉
以此类推,复活应该能卡掉带reaction的那些,不带的因为不需要可反应,所以不能卡
usenptarget为正常行动宝具选择对象
完整的一回合顺序是:field的turnstart→玩家选卡→field的playerturnstart→svt的reaction playerturnstart→玩家方攻击→svt的reaction playerturnend→(玩家方hot和dot)→回合末trigger→field的playerturnend→svt的shiftservantafter→svt的afterturnplayerend→field的enemyturnstart→svt的reaction enemyturnstart→敌方攻击→svt的reaction enemyturnend→(小安反射→敌方hot和dot)→回合末trigger→field的turnenemyend
如果算上每面开幕的话,完整开幕是:先装载svt和ce的各种passive,这是在出现关卡界面前就装载完毕的。然后正式开始战斗,field的wave start→各种敌我双方的entryfunction→svt的reaction wavestart。之后就开始上面的正式回合,turnstart了
act target
执行该动作的目标,注意出现在这里的只是代表优先该类目标,但如果没有这种目标就会变为random随机选取。与上方condition的情况不同
atlas由于年久失修(我也没想到要用上这个词),一部分优先目标读取有问题,尤其是带-的,-表示优先不持有该特性的目标,atlas对于这种类项识别有困难,一部分会填装失败,此时需要在raw代码里,查看mstaiact里面的数据(由于一个ai段内的数据全部堆积在一起,注意区分不同ai小段的归属,另外chaldea的填装是正常的,所以也可以去配合chaldea看)
field ai
其他和svt ai一样的可以直接参考。注意condition的写法有时候会有点不正常。
timing
1为战斗开始,2为回合开始,3为我方选卡后,4为我方行动结束,5为敌方行动开始,6为回合结束,field的timing不会被复活等行为卡掉。7目前推测为是有人员登场时,不排除其他可能性。9为战斗开始前
行动数
每个field ai每回合每个时间节点只会发动一次,可以视作场边的只有1动的啦啦队
未解之谜
field ai到底加在哪边身上emmmmmm。解决不了,告辞.jpg。目前基本完全成谜,只能靠实地测试了,不过大部分可以靠猜。现在新追加了可以标记buff是否会短半程的秒表符号,那么可以通过加攻是否带或加防是否不带等方式判断技能效果给谁。至于condition,依然没救。(目前有一个不成熟的猜想,condition是根据敌方视点来判定的,也就是opponent就是我方,而技能的效果作用之类的则是以我方视点释放的,party是我方。具体有待进一步测试验证)
在关卡代码可以看到field ai的地方,还有个可以给我方附加svt ai的效果AIlocation,但目前没有很好的检测手段。
关卡代码mstquestphase-script-aiNpc里有摇人的ai,但摇出来的是谁得找其他文件了。
打B3的道具之类的效果在mstQuestBehavior这个文件里。
技能效果
active/passive
active为主动效果,跨血条继承,如果没有procpassive或者passiveframe等类似效果,会被强解
passive为被动效果,跨血条不继承,但如果有procactive那就可以继承了。
linkagetargetindividualty
与addindividuality同步出现,表示两个效果连接起来了,同步获取/消除。
showstate
-1表示不显示
1表示显示
3表示该状态只在攻击伤害时和指令卡界面时显示,其他时刻不显示(必然从属于其他buff标记)
-2是只在被攻击伤害时才显示的效果,其他同3
2可能表示只在人物状态栏显示,其他时刻不显示(一个可能完全用不到的玩意)
userate
trigger效果或者buff的发动概率,数值为百分比概率的10倍,发动不受任何影响(至于发动后的效果能不能上成或者有没有用就是另一个故事了)
trigger比如恐怖,buff比如阿福理性蒸发
rate
命中概率,数值为百分比概率的10倍,会受各种耐性/成功率影响。
value
具体数值,一般数值为百分比概率的10倍,np为百分比np的100倍
turn/count
持续回合/次数。-1为无限
ignoreindividuality
无视其他效果必定生效,同时不与任何其他一般效果产生互动,几乎所有机制技能都有,另外还有永眠也有。要有响应会用includeignoreindividuality
function
一些buff以外的效果分类会在这类里。例如forceinstantdeath是无视即死耐性的,instantdeath就不能无视。
dependfunc
一些和其他效果配合释放的会有这个参数,尤其是吸收buff一定会配一个dependfunc用来解除需要吸收的东西。如果dependfunc是全部强化解除,那么吸收就是全部强化吸收,如果dependfunc是只解1个,那么吸收就同理只吸1个。具体吸几个可以看dependfuncvals,如果是吸收特定数目那么value2就是对应的数目。
forceaddstate/unsubstate
前者是强制施加的状态,后者是不会被解除的状态。两者拼一块也是固定状态。
状态/效果函数
buff group
相同的不可叠加,不同的可一起使用,为0可无限叠加,并且该数据优先度高于是否可被解除。
buff type
attackfunction为带宝具的攻击后置效果
commandattackfunction为指令卡限定,同样后置,纹章中仅梅林与白贞使用这个。
commandcodeattackFunction为指令纹章的效果,前置,仅梅林与白贞两个不使用
buff上限
fgo在计算伤害时采用双上限模式,一个上限是buff本身的上限,可以在raw代码里的maxRate看到。另一个上限是公式里的上限,这个只能靠测试。
此外,虽然色卡耐性下降的maxRate是500%,但由于bug(估计与1.0系统版本下无上限的攻击力一样)导致该部分代码无法生效,由于堕天之槛一直在使用这个特性,所以可视的未来应该也不会修复。
触发条件
atlas由于年久失修(我也没想到居然要用上这个词了),buff之类的条件有可能无法正确读取和填装,尤其是当出现and的时候,此时需要在buff(尤其是需要条件触发的技能)的里面看raw代码,script段落
另外,script里出现checkIndvType类字段时,可能代表某些条件是与的关系(比如ckOpIndv和ckSelfIndv)
checkIndvType=2时应该表示与
如果出现INDIVIDUALITIE_OR需要注意正负号,正号表示任意一个时即可发动,负号表示任意一个时就不发动,与一般编程的(!)OR(!)型门不一致,反而与INDIVIDUALITIE_AND后跟两个负号一样.
敌人属性
攻击类型
单个敌人的raw代码里,mvtSvtCard里存放了普通攻击的数据,0为轻攻击,1为重攻击,attacktype=1为单体,2为全体。