【教程】莫娜占卜鋪 - 從零開始的DSL代碼編寫(圣遺物自定義配裝)
由于B站不支持Markdown和富文本,想得到最佳瀏覽體驗(yàn)請(qǐng)聯(lián)系本人取得原文檔
問題:Mona的計(jì)算器使用其內(nèi)置算法,如“期望傷害”,“最高傷害”的單技能計(jì)算。無法計(jì)算某些流派和手法的傷害(比如烈綻放煙緋,自定義蒸發(fā)和綻放的比例)
解決:自己動(dòng)手寫DSL代碼
參考:綜合了以下3篇帖子 + Mona的github文檔
分享用于莫娜占卜鋪的六命/低命/蒸發(fā)夜蘭DSL代碼
如何為了深淵配置自己的圣遺物?以莫娜占卜鋪為例
圣遺物配裝工具莫娜占卜鋪從入門到精
https://github.com/wormtql/genshin_artifact
使用方式
DSL代碼有兩種使用方式:
在Mona的【計(jì)算-計(jì)算器】中進(jìn)行配裝
查具體角色的數(shù)據(jù)
在【MONA-DSL】中列出所有要考慮的
dmg
result = 所有dmg的加權(quán)和
代碼框底下的藍(lán)條
[與最大計(jì)算傷害的百分比]/[該組圣遺物計(jì)算傷害]
在Mona的【附加功能-Playground】中計(jì)算傷害
查具體角色的數(shù)據(jù)
列出所有要考慮的
dmg
print()
打印出來
普通&增幅傷害
普通元素/物理傷害、融化/蒸發(fā)傷害等
注意:普通傷害有2級(jí)屬性,都要寫
dmg [傷害名] = [角色名].[技能名]([對(duì)應(yīng)狀態(tài)])
1級(jí)屬性:
[傷害名].normal
?普通[傷害名].melt
?融化[傷害名].vaporize
?蒸發(fā)[傷害名].aggravate
?雷激化[傷害名].spread
?蔓激化.bloom
?綻放hyperbloom
?超綻放burgeon
?烈綻放
2級(jí)屬性:
e
期望傷害c
暴擊傷害n
非暴擊傷害
例:神里,普攻第1段,發(fā)生在沖刺之后,融化,期望傷害
dmg a = KamisatoAyaka.Normal1({ after_dash: true })
print(a.melt.e)
劇變反應(yīng)
聚變反應(yīng):擴(kuò)散、感電、超載、超導(dǎo)、碎冰
路徑:mona_core/src/damage/transformative_damage.rs
dmg = [角色名].transformative
屬性:
swirl_cryo
冰擴(kuò)散swirl_pyro
火擴(kuò)散swirl_electro
雷擴(kuò)散swirl_hydro
水?dāng)U散overload
超載electro_charged
感電super_conduct
超導(dǎo)shatter
碎冰crystallize
?結(jié)晶盾
屬性聲明
直接取得角色的實(shí)時(shí)面板屬性,例如充能、元素精通等(角色面板在內(nèi)部采用DAG+懶更新的方式)
prop [變量名] = [角色名].[屬性名]
屬性:
recharge
充能atk
攻擊hp
生命def
防御em
精通crit0
暴擊率(不含特定技能和特定元素傷害的加成)cd0
暴擊傷害(不含特定技能和特定元素傷害的加成)heal
治療加成
注意:
buff的覆蓋沒法調(diào)整,都是按全覆蓋來算
獲取屬性我能想到的一種用法是用來轉(zhuǎn)化成目標(biāo)函數(shù)的一部分,比如說鐘離我希望如果生命夠高,那傷害低一些就低一些,我可以接受用2傷害換1血量的話,那就可以把生命值x2加到目標(biāo)函數(shù)里,第二種用法就是覆蓋率,比如說我知道某幾次攻擊是在某個(gè)攻擊力buff消失后,那么我可以給那幾次攻擊乘上“減去buff的面板攻擊力/面板攻擊力”這個(gè)系數(shù),暴擊爆傷都有類似的轉(zhuǎn)換方法,但是增傷不行,因?yàn)樵鰝赿sl里沒法獲取
內(nèi)置函數(shù)
print()
type()
max()
?min()
查詢具體角色
具體角色的數(shù)據(jù):mona_core/src/character/characters
元素:anemo
風(fēng)、cryo
冰、Pyro
火、Hydro
水、Electro
雷、Dendro
草
搜索CharacterName
—— CharacterName::RaidenShogun
搜索skillmap
—— 技能名,和網(wǎng)站上的技能名是對(duì)應(yīng)的(通用技能的中文名不會(huì)寫出來)
搜索ItemConfig
—— 特殊的狀態(tài),比如煙緋的灼灼、雷神的環(huán)
例:雷神大招,在其e技能下,愿力層數(shù)57
dmg q = RaidenShogun.Q1({under_e:true,resolve_stack:57})
例子
夜蘭
// 列出所有傷害?
dmg Q1=Yelan.Q1?
//Q開啟傷害?
dmg Q2=Yelan.Q2 //Q協(xié)同傷害(每跳)?
dmg E=Yelan.E1 //E傷害?
dmg C6=Yelan.Charged3C6 //C6破局矢?jìng)?
dmg Z=Yelan.Charged3 //破局矢?jìng)?
?// result=所有傷害的加權(quán)和?
result=Q1.normal.e + Q1.normal.e * 0.9014 * 7 + //利用Q開啟傷害的90.14%倍模擬C2的14%生命倍率水箭,需將Q設(shè)置為13級(jí)才是此比例,10級(jí)比例為1.0646?
Q2.normal.e * 3 * 16?
+ E.normal.e * 2 + C6.normal.e * 5 + Z.normal.e *2 //兩次手動(dòng)重?fù)舻钠凭质?,依?jù)自己的手法不同可以去掉,大約占總倍率的4%
神里
// 1 設(shè)置Q最大?
dmg Q = KamisatoAyaka.Q1({after_dash:true}) //沖刺天賦觸發(fā)后?
result = Q.normal.e
// 2 大招期望輸出融化和普通各占一半,且傷害發(fā)生在沖刺之后(天賦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, ? ?// 瞄準(zhǔn)
? ?Charged2, ? ?// 一段蓄力
? ?Charged3, ? ?// 霜華失 - 命中
? ?Charged4, ? ?// 霜華失 - 綻放
? ?Plunging1,
? ?Plunging2,
? ?Plunging3,
? ?E1,
? ?Q1
}
特殊狀態(tài):
talent1_rate
?唯此一心talent2_rate
?天地交泰
純重?fù)?/p>
dmg b = Ganyu.Charged3
result = b.normal.e
煙緋
名字:Yanfei
技能:
pub enum YanfeiDamageEnum {
? ?Normal1, ? ? ? // 一段傷害
? ?Normal2, ? ? ? // 二段傷害
? ?Normal3, ? ? ? // 三段傷害
? ?Charged1, ? ? ?// 重?fù)?無印
? ?Charged2, ? ? ?// 重?fù)?1層
? ?Charged3, ? ? ?// 重?fù)?2層
? ?Charged4, ? ? ?// 重?fù)?3層
? ?Charged5, ? ? ?// 重?fù)?4層
? ?DmgTalent2, ? ?// 天賦2-額外
? ?Plunging1, ? ? // 下墜期間
? ?Plunging2, ? ? // 低空墜地
? ?Plunging3, ? ? // 高空墜地
? ?E1, ? ? ? ? ? ?// E技能 - 丹書立約
? ?Q1, ? ? ? ? ? ?// Q技能 - 憑此結(jié)契
}
特殊狀態(tài):
after_q
?灼灼