private Proc GetProc(string damageType, WeaponStats weaponStats, double weight, double timeBetweenTicks, double timeToLive, double baseDamagePerTick, double typeDamagePerTick, out double initialDamage) { var timeBetweenShots = (1 / weaponStats.ShotsPerSecond); double weightedDamage = 0; if (typeDamagePerTick > 0) { weightedDamage = (weaponStats.BaseDamage * baseDamagePerTick + weaponStats.DamageDictionary[damageType] * typeDamagePerTick) * weight * weaponStats.StatusChance * weaponStats.getAverageCritMultiplier(); } else { weightedDamage = (weaponStats.BaseDamage * baseDamagePerTick) * weight * weaponStats.StatusChance * weaponStats.getAverageCritMultiplier(); } initialDamage = calculateDamage(damageType, weightedDamage); //Initial Tick var proc = new Proc { timeLeft = timeToLive, damageType = damageType, damagePerShot = weightedDamage * (timeBetweenShots / timeBetweenTicks) }; return(proc); }
private double calculateWeaponDamage(WeaponStats weaponStats) { double sum = 0; foreach (KeyValuePair <string, double> kvp in weaponStats.DamageDictionary) { var dmgCrit = kvp.Value * weaponStats.getAverageCritMultiplier(); sum += calculateDamage(kvp.Key, dmgCrit); } return(sum); }
private double calculateNewProcs(WeaponStats weaponStats) { double sum = 0; Dictionary <string, double> weightDict = weaponStats.getStatusWeights(); double weightSum = weightDict.Sum(x => x.Value); foreach (var weight in weightDict) { double initialDamage = 0; switch (weight.Key) { case "Corrosive": this.Armor.CurrentAmount -= this.Armor.CurrentAmount * (weightDict[weight.Key] / weightSum) * 0.25; break; case "Toxin": procList.Add(GetProc(damageType: weight.Key, weaponStats: weaponStats, weight: weight.Value / weightSum, timeBetweenTicks: 1, timeToLive: 8, baseDamagePerTick: 0.5, typeDamagePerTick: 0.5, initialDamage: out initialDamage)); break; case "Slash": procList.Add(GetProc(damageType: "Finisher", weaponStats: weaponStats, weight: weight.Value / weightSum, timeBetweenTicks: 1, timeToLive: 6, baseDamagePerTick: 0.35, typeDamagePerTick: 0, initialDamage: out initialDamage)); break; case "Heat": procList.Add(GetProc(damageType: weight.Key, weaponStats: weaponStats, weight: weight.Value / weightSum, timeBetweenTicks: 1, timeToLive: 6, baseDamagePerTick: 0.5, typeDamagePerTick: 0.5, initialDamage: out initialDamage)); break; case "Electricity": var procDmg = (weaponStats.BaseDamage + weaponStats.DamageDictionary[weight.Key]) / 2; var finalDmg = procDmg * (weight.Value / weightSum) * weaponStats.StatusChance * weaponStats.getAverageCritMultiplier(); initialDamage = calculateDamage(weight.Key, finalDmg); break; //case "Gas": // var procDmg = (weaponStats.BaseDamage + weaponStats.DamageDictionary[weight.Key]) / 2; // var finalDmg = procDmg * (weight.Value / weightSum) * weaponStats.StatusChance * weaponStats.getAverageCritMultiplier(); // initialDamage = calculateDamage(weight.Key, finalDmg); // break; default: break; } sum += initialDamage; } return(sum); }