using System.Collections.Generic;
static void Main(string[] args)
List<int> diceRolls = new List<int>();
CalculateSavageAttackerDamage(diceRolls, baseDamage);
private static void CalculateSavageAttackerDamage(List<int> diceRolls, int baseDamage)
Random rnd = new Random();
string diceRollCountText = GetDiceRollText(diceRolls);
Console.WriteLine($"Attacking with {diceRollCountText} + {baseDamage}...");
for (int i = 0; i < iterations; i++)
totalDamage += baseDamage;
foreach (int diceRoll in diceRolls)
totalDamage += rnd.Next(1, diceRoll + 1);
float averageDamage = totalDamage / iterations;
Console.WriteLine($"Average damage was {averageDamage.ToString("#.##")})");
for (int i = 0; i < iterations; i++)
totalDamage += baseDamage;
foreach (int diceRoll in diceRolls)
int firstRoll = rnd.Next(1, diceRoll + 1);
int secondRoll = rnd.Next(1, diceRoll + 1);
int highRoll = firstRoll > secondRoll ? firstRoll : secondRoll;
float savageAverageDamage = totalDamage / iterations;
float percentualDamageIncrease = (1 - averageDamage / savageAverageDamage) * 100f;
Console.WriteLine($"With Savage Attacker, average damage was {savageAverageDamage.ToString("#.##")} (increase of +{percentualDamageIncrease.ToString("#.##")}%)");
private static string GetDiceRollText(List<int> diceRolls)
string diceRollCountText = string.Empty;
HashSet<int> usedDiceRolls = new();
foreach (int diceRoll in diceRolls)
if (usedDiceRolls.Contains(diceRoll)) { continue; }
usedDiceRolls.Add(diceRoll);
int diceRollCount = diceRolls.Where(d => d == diceRoll).Count();
diceRollCountText += diceRollCount.ToString();
diceRollCountText += ", ";
diceRollCountText += $"d{diceRoll}";
return diceRollCountText;