public override int GetHashCode() { int hash = 1; if (defaultValueCase_ == DefaultValueOneofCase.Id) { hash ^= Id.GetHashCode(); } if (defaultValueCase_ == DefaultValueOneofCase.FeatureId) { hash ^= FeatureId.GetHashCode(); } if (defaultValueCase_ == DefaultValueOneofCase.Bval) { hash ^= Bval.GetHashCode(); } if (defaultValueCase_ == DefaultValueOneofCase.Lval) { hash ^= Lval.GetHashCode(); } if (defaultValueCase_ == DefaultValueOneofCase.Sval) { hash ^= Sval.GetHashCode(); } if (defaultValueCase_ == DefaultValueOneofCase.Fval) { hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(Fval); } hash ^= (int)defaultValueCase_; if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } return(hash); }
private float BaseNpDamage(PartyMember partyMember, EnemyMob enemy, Sval svalNp) { int npValue = svalNp.Value; int targetBonusNpDamage = 0; // Add additional NP damage if there is a special target ID if (svalNp.Target > 0) { string traitName = _traitEnumInfo.Property(svalNp.Target.ToString())?.Value.ToString() ?? ""; if (enemy.Traits.Contains(traitName)) { targetBonusNpDamage = svalNp.Correction; } } float constantAttackRate = _constantRate.GetAttackMultiplier("ATTACK_RATE"); float classModifier = _classAttackRate.GetAttackMultiplier(partyMember.ServantNiceInfo.ClassName); float npTypeModifier = _constantRate.GetAttackMultiplier($"ENEMY_ATTACK_RATE_{partyMember.NoblePhantasm.Card}"); // Base NP damage = ATTACK_RATE * Servant total attack * Class modifier * NP type modifier * (20% bonus if undead enemy) * NP damage float baseNpDamage = constantAttackRate * partyMember.TotalAttack * classModifier * npTypeModifier * (npValue / 1000.0f); if (targetBonusNpDamage != 0) { baseNpDamage *= targetBonusNpDamage / 1000.0f; } return(baseNpDamage); }