public static void Calculate(float bonusDamage, Race attacker, Race[] targets) { var stat = attacker.GetModule <StatModule> (); foreach (var target in targets) { var targetStat = target.GetModule <StatModule> (); var isHit = AccuracyCalculator.IsHit(stat.attackRating, targetStat.attackRating); isHit = !isHit?AccuracyCalculator.MakeSureHit(attacker) : isHit; if (isHit) { var isCritHit = AccuracyCalculator.IsCriticalHit(attacker, stat.criticalRating); isCritHit = !isCritHit?AccuracyCalculator.MakeSureCritical(attacker) : isCritHit; // optional Damage var outputDamage = AttackPowerCalculator.TakeDamage(bonusDamage, targetStat.magicResist, isCritHit); AccuracyCalculator.HandleCriticalDamage(ref outputDamage, attacker, target); AttackPowerCalculator.HandleDamage(ref outputDamage, attacker, target); target.GetModule <HealthPowerModule> (x => x.SubtractHp(outputDamage)); } else { var isCritHit = AccuracyCalculator.IsCriticalHit(attacker, stat.criticalRating); var damage = AttackPowerCalculator.TakeDamage(bonusDamage, targetStat.physicalDefend, isCritHit); Affect.GetSubAffects <IMissingHandler>(target, handler => handler.HandleMissing(damage, attacker)); } } }
public float GetStat(string name) { var val = .0f; Affect.GetSubAffects <GearAffect> (_race, x => { var fi = x.GetType().GetField(name); if (fi != null) { var v = fi.GetValue(x); val += (float)System.Convert.ChangeType(v, typeof(float)); } }); return(val); }
public static bool IsCriticalHit(Race who, float attackerCHC) { var addition = 0f; var percentCHC = attackerCHC * 100f; Affect.GetSubAffects <IAdditionalCriticalHitChange> (who, x => { addition += x.additionalCriticalHitChange; }); addition *= 100f; percentCHC = Mathf.Min(percentCHC + addition, 100f); var chcProbability = Probability.Initialize(new bool[] { false, true }, new float[] { 100f - percentCHC, percentCHC }); var chcResult = Probability.GetValueInProbability(chcProbability); return(chcResult); }