public static MachineRun RunMachine(MachineRun machine) { var averageFailureRate = Setting.GetSetting(machine.SettingsList, Settings.AverageFailureRate); var failureRateVariability = Setting.GetSetting(machine.SettingsList, Settings.FailureRateVariability); var averageProductionTime = Setting.GetSetting(machine.SettingsList, Settings.AverageProductionTime); var productionTimeVariability = Setting.GetSetting(machine.SettingsList, Settings.ProductionTimeVariability); var machineFailureRate = Setting.GetSetting(machine.SettingsList, Settings.MachineFailureRate); var adjFailureRate = averageFailureRate; if (machine.Machine.Broken) { adjFailureRate = averageFailureRate * 10000; } //produce widgets var baseProduction = ActionCheck.GenerateInt((int)(averageProductionTime * 2), (int)productionTimeVariability); var baseFailure = ActionCheck.GenerateFloat(adjFailureRate * 2, failureRateVariability) / 2; baseFailure = baseFailure > 1 ? 1 : baseFailure < 0 ? 0 : baseFailure; machine.CompletedOutput = (int)Math.Ceiling(baseProduction * (1 - baseFailure)); machine.FailedOutput = baseProduction - machine.CompletedOutput; //check to see if machine broke var machineAge = (DateTime.UtcNow - machine.Machine.CreateDate).TotalHours / 100; var failureChance1 = ActionCheck.GenerateFloat(machineFailureRate, (float)machineAge); var failureChance2 = ActionCheck.GenerateFloat(machineFailureRate, (float)machineAge); var failureChance3 = ActionCheck.GenerateFloat(machineFailureRate, (float)machineAge); if (!machine.MachineBroken && !ActionCheck.Check(failureChance1) && !ActionCheck.Check(failureChance2) && !ActionCheck.Check(failureChance3)) { machine.MachineBroken = true; } return(machine); }