【教程】莫娜占卜铺 - 从零开始的DSL代码编写(圣遗物自定义配装)_世界信息
由于B站不支持Markdown和富文本,想得到最佳浏览体验请联系本人取得原文档
【资料图】
问题:Mona的计算器使用其内置算法,如“期望伤害”,“最高伤害”的单技能计算。无法计算某些流派和手法的伤害(比如烈绽放烟绯,自定义蒸发和绽放的比例)
解决:自己动手写DSL代码
参考:综合了以下3篇帖子 + Mona的github文档
分享用于莫娜占卜铺的六命/低命/蒸发夜兰DSL代码
如何为了深渊配置自己的圣遗物?以莫娜占卜铺为例
圣遗物配装工具莫娜占卜铺从入门到精
https://github.com/wormtql/genshin_artifact
使用方式
DSL代码有两种使用方式:
在Mona的【计算-计算器】中进行配装
查具体角色的数据
在【MONA-DSL】中列出所有要考虑的dmg
result = 所有dmg的加权和
代码框底下的蓝条[与最大计算伤害的百分比]/[该组圣遗物计算伤害]
在Mona的【附加功能-Playground】中计算伤害
查具体角色的数据
列出所有要考虑的dmg
print()
打印出来
普通&增幅伤害
普通元素/物理伤害、融化/蒸发伤害等
注意:普通伤害有2级属性,都要写
dmg [伤害名] = [角色名].[技能名]([对应状态])
1级属性:
[伤害名].normal
普通
[伤害名].melt
融化
[伤害名].vaporize
蒸发
[伤害名].aggravate
雷激化
[伤害名].spread
蔓激化
.bloom
绽放
hyperbloom
超绽放
burgeon
烈绽放
2级属性:
e
期望伤害
c
暴击伤害
n
非暴击伤害
例:神里,普攻第1段,发生在冲刺之后,融化,期望伤害
dmg a = KamisatoAyaka.Normal1({ after_dash: true })
print(a.melt.e)
剧变反应
聚变反应:扩散、感电、超载、超导、碎冰
路径:mona_core/src/damage/transformative_damage.rs
dmg = [角色名].transformative
属性:
swirl_cryo
冰扩散
swirl_pyro
火扩散
swirl_electro
雷扩散
swirl_hydro
水扩散
overload
超载
electro_charged
感电
super_conduct
超导
shatter
碎冰
crystallize
结晶盾
属性声明
直接取得角色的实时面板属性,例如充能、元素精通等(角色面板在内部采用DAG+懒更新的方式)
prop [变量名] = [角色名].[属性名]
属性:
recharge
充能
atk
攻击
hp
生命
def
防御
em
精通
crit0
暴击率(不含特定技能和特定元素伤害的加成)
cd0
暴击伤害(不含特定技能和特定元素伤害的加成)
heal
治疗加成
注意:
buff的覆盖没法调整,都是按全覆盖来算
获取属性我能想到的一种用法是用来转化成目标函数的一部分,比如说钟离我希望如果生命够高,那伤害低一些就低一些,我可以接受用2伤害换1血量的话,那就可以把生命值x2加到目标函数里,第二种用法就是覆盖率,比如说我知道某几次攻击是在某个攻击力buff消失后,那么我可以给那几次攻击乘上“减去buff的面板攻击力/面板攻击力”这个系数,暴击爆伤都有类似的转换方法,但是增伤不行,因为增伤在dsl里没法获取
内置函数
print()
type()
max()
min()
查询具体角色
具体角色的数据:mona_core/src/character/characters
元素:anemo
风、cryo
冰、Pyro
火、Hydro
水、Electro
雷、Dendro
草
搜索CharacterName
—— CharacterName::RaidenShogun
搜索skillmap
—— 技能名,和网站上的技能名是对应的(通用技能的中文名不会写出来)
搜索ItemConfig
—— 特殊的状态,比如烟绯的灼灼、雷神的环
例:雷神大招,在其e技能下,愿力层数57
dmg q = RaidenShogun.Q1({under_e:true,resolve_stack:57})
例子
夜兰
// 列出所有伤害
dmg Q1=Yelan.Q1
//Q开启伤害
dmg Q2=Yelan.Q2 //Q协同伤害(每跳)
dmg E=Yelan.E1 //E伤害
dmg C6=Yelan.Charged3C6 //C6破局矢伤害
dmg Z=Yelan.Charged3 //破局矢伤害
// result=所有伤害的加权和
result=Q1.normal.e +Q1.normal.e * 0.9014 * 7 + //利用Q开启伤害的90.14%倍模拟C2的14%生命倍率水箭,需将Q设置为13级才是此比例,10级比例为1.0646
Q2.normal.e * 3 * 16
+E.normal.e * 2 +C6.normal.e * 5 +Z.normal.e *2 //两次手动重击的破局矢,依据自己的手法不同可以去掉,大约占总倍率的4%
神里
// 1 设置Q最大
dmg Q = KamisatoAyaka.Q1({after_dash:true}) //冲刺天赋触发后
result = Q.normal.e
// 2 大招期望输出融化和普通各占一半,且伤害发生在冲刺之后(天赋18%冰伤加成)
dmg q = KamisatoAyaka.Q1({ after_dash: true })
normal = q.normal.e
melt = q.melt.e
result = normal + melt
甘雨
名字:Ganyu
技能:
pub enum GanyuDamageEnum { Normal1, Normal2, Normal3, Normal4, Normal5, Normal6, Charged1, // 瞄准 Charged2, // 一段蓄力 Charged3, // 霜华失 - 命中 Charged4, // 霜华失 - 绽放 Plunging1, Plunging2, Plunging3, E1, Q1}
特殊状态:
talent1_rate
唯此一心
talent2_rate
天地交泰
纯重击
dmg b = Ganyu.Charged3result = b.normal.e
烟绯
名字:Yanfei
技能:
pub enum YanfeiDamageEnum { Normal1, // 一段伤害 Normal2, // 二段伤害 Normal3, // 三段伤害 Charged1, // 重击-无印 Charged2, // 重击-1层 Charged3, // 重击-2层 Charged4, // 重击-3层 Charged5, // 重击-4层 DmgTalent2, // 天赋2-额外 Plunging1, // 下坠期间 Plunging2, // 低空坠地 Plunging3, // 高空坠地 E1, // E技能 - 丹书立约 Q1, // Q技能 - 凭此结契}
特殊状态:
after_q
灼灼