wiki上的ダメージ計算式基本算是完全正确,这里结合逆向的代码随意解释分析一下。
出発前ATK是TSKBattleNote$$GetBaseAttack,也是在有着出击的编队界面点点右上角的反转按钮能看到的ATK数值。
出発前ATK与ATK倍率(加算倍率)计算后的ATK是TSKBattleNote$$GetAttack,也就是战斗中选技能前你能看到的ATK数值。
EXスキル倍率(A)可以通过TSKBattleCalculationManager$$CaluculationNormalDamage的args[4]获取。
クリティカルダメージ倍率(B)通过TSKBattleCalculationManager.CriticalOffset(...args)获取;同时该函数可以了解是否暴击: const isCritilal = args[0];。
属性ダメージ倍率(C)通过TSKBattleCalculationManager.AttributeOffset(...args)获取。
スタンダメージ倍率(D)通过TSKBattleCalculationManager.DownOffset(...args)获取。
被ダメージ増減倍率(E)理论是会在TSKBattleNote$$GetDamageRateValue的代码中,但我没找到,不过可以通过defencer的unit.field("skillEffectList").value as Il2Cpp.Object;得到所有SkillEffect,其中targer==SkillType.DmgUpAllyRateBit的就是易伤值,effect.field("<SkillEffectValue>k__BackingField")得到的effectValue=3000就代表30%,List中可能有多个易伤,相加就行了,别忘了最后加上1。(该SkillEffect中还有个value=600的值,意义不明)
デバフダメージ倍率(F) 是在TSKBattleNote$$GetDamageRateValue中计算的。典型的[霹靂の射手]梨緒赋予的是標的,50%额外易伤,SkillEffect的形式是SkillType.Target,effect 13: type=Target time=16 value=5000 effectValue=0,这里就存在effect.field("<SkillValue1>k__BackingField"),和上述的易伤(E)存在class TSKBattleSkillData中不同的变量,很变态,不知道它这样做的理由。然后各个属性的融解,極冷以及各个攻撃タイプ的裂傷,破砕等专属易伤没仔细看,不过代码中都有,似乎是直接相加,TSKBattleNote$$GetDamageRateValue中搜索TSKBattleNote$$GetSkillEffect都能找到,例如TSKBattleNote$$GetSkillEffect(param_1,0x1a7,0);,423对应SkillType.Collapse。(16进制->10进制->enum->英文->日语,要对应谁是谁太头大了,虽然可以通过上面代码的
| |
来定位attacker的属性和攻击类型,但也看的很累;且这里翻译完马上就忘了。
(这里去查了下,attacker + 0x98是private TSKBattleUnit <UnitData>k__BackingField; //Field offset: 0x98,TSKBattleUnit的+0x34是private int <AttrType>k__BackingField; //Field offset: 0x34,AttrType==5是什么意思呢,让我猜猜,Collapse的中文翻译是坍塌,日文翻译是崩壊,看来它是对应崩壊: 闇属性から受けるダメージ。好恶心好恶心。)
ラッシュ倍率(G)通过TSKBattleCalculationManager.RushOffset(...args)获取。一般情况的上限是RushOffset = 6.699999809265137,与wiki中的ただし、RUSH倍率はRUSH101の+570%で頭打ちになるようで、そこから先はどれだけRUSH数を伸ばしても倍率は変わらない一致。
ダメージBOOST(H)没找,它目前是討伐イベント特有的,一般也用不上。
被ダメージカット率(I) 没找到,不过有在TSKBattleNote$$GetDamageRateValue中看到如下代码:
| |
只有它会导致伤害为1,所以大抵具体计算也在该函数中。
乱数(J)通过TSKBattleCalculationManager.FluctuationOffset获取。我测试下来也是1.00倍~1.01倍(100%~101%)
ユニゾンアタック不讲,这个应该不能暴击。
总之 Damage = ATK * A * B * … * I * J。去寻找你所爱的乘区吧。