闪耀星骑士的伤害计算

wiki上的ダメージ計算式基本算是完全正确,这里结合逆向的代码随意解释分析一下。

出発前ATKTSKBattleNote$$GetBaseAttack,也是在有着出击的编队界面点点右上角的反转按钮能看到的ATK数值。

出発前ATKATK倍率(加算倍率)计算后的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.Targeteffect 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->英文->日语,要对应谁是谁太头大了,虽然可以通过上面代码的

1
2
3
          if (((*(longlong *)(attacker + 0x10) != **(longlong **)(IntPtr_TypeInfo + 0xb8)) &&
              (*(longlong *)(attacker + 0x98) != 0)) &&
             (*(int *)(*(longlong *)(attacker + 0x98) + 0x34) == 5))

来定位attacker的属性和攻击类型,但也看的很累;且这里翻译完马上就忘了。

(这里去查了下,attacker + 0x98private TSKBattleUnit <UnitData>k__BackingField; //Field offset: 0x98TSKBattleUnit+0x34private 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
2
3
4
5
6
        dVar16 = ceil((double)((float)damage * ((float)(longlong)iVar12 / (float)iVar11)));
        damage = damage + (longlong)dVar16;
        if (damage < 1) {
          damage = 1;
        }
        return damage;

只有它会导致伤害为1,所以大抵具体计算也在该函数中。

乱数(J)通过TSKBattleCalculationManager.FluctuationOffset获取。我测试下来也是1.00倍~1.01倍(100%~101%)

ユニゾンアタック不讲,这个应该不能暴击。

总之 Damage = ATK * A * B * … * I * J。去寻找你所爱的乘区吧。

使用 Hugo 构建
主题 StackJimmy 设计