Skip to content

Commit

Permalink
Hide Ultra Dense Deuterium
Browse files Browse the repository at this point in the history
  • Loading branch information
sswelm committed Jan 28, 2021
1 parent 5ceb136 commit 41a363d
Show file tree
Hide file tree
Showing 6 changed files with 164 additions and 201 deletions.
4 changes: 2 additions & 2 deletions FNPlugin/Reactors/InterstellarFissionMSRGC.cs
Original file line number Diff line number Diff line change
Expand Up @@ -328,12 +328,12 @@ public double ReprocessFuel(double rate)
Part.RequestResource(fluorineGasDefinition.id, -depletedFuelsProduced * fluorineDepletedFuelVolumeMultiplier * (1 - receivedEnrichedUraniumFraction), ResourceFlowMode.STAGE_PRIORITY_FLOW);

var reactorFuels = CurrentFuelMode.Variants.First().ReactorFuels;
var sumUsagePerMw = reactorFuels.Sum(fuel => fuel.AmountFuelUsePerMJ * fuelUsePerMJMult);
var sumUsagePerMw = reactorFuels.Sum(fuel => fuel.AmountFuelUsePerMj * fuelUsePerMJMult);

foreach (ReactorFuel fuel in reactorFuels)
{
var fuelResource = part.Resources[fuel.ResourceName];
var powerFraction = sumUsagePerMw > 0.0 ? fuel.AmountFuelUsePerMJ * fuelUsePerMJMult / sumUsagePerMw : 1;
var powerFraction = sumUsagePerMw > 0.0 ? fuel.AmountFuelUsePerMj * fuelUsePerMJMult / sumUsagePerMw : 1;
var newFuelAmount = Math.Min(fuelResource.amount + ((depletedFuelsProduced * 4) + (depletedFuelsProduced * receivedEnrichedUraniumFraction)) * powerFraction * depletedToEnrichVolumeMultiplier, fuelResource.maxAmount);
fuelResource.amount = newFuelAmount;
}
Expand Down
2 changes: 1 addition & 1 deletion FNPlugin/Reactors/InterstellarFusionReactor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ private void SwitchToPreviousFuelMode(int initialFuelMode)

private bool FullFuelRequirements()
{
return HasAllFuels() && FuelRequiresLab(CurrentFuelMode.RequiresLab);
return !CurrentFuelMode.Hidden && HasAllFuels() && FuelRequiresLab(CurrentFuelMode.RequiresLab);
}

private bool HasAllFuels()
Expand Down
12 changes: 6 additions & 6 deletions FNPlugin/Reactors/InterstellarReactor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2059,7 +2059,7 @@ private List<ReactorFuelType> GetFuelGroups(int maximumFuelTechLevel)
&& FusionEnergyGainFactor >= fm.MinimumFusionGainFactor
&& (fm.Aneutronic || canUseNeutronicFuels)
&& maxGammaRayPower >= fm.GammaRayEnergy)
.GroupBy(mode => mode.ModeGUIName).Select(group => new ReactorFuelType(group)).OrderBy(m => m.TechLevel).ToList();
.GroupBy(mode => mode.ModeGuiName).Select(group => new ReactorFuelType(group)).OrderBy(m => m.TechLevel).ToList();
return groups;
}

Expand Down Expand Up @@ -2183,7 +2183,7 @@ protected List<ReactorFuelType> GetReactorFuelModes()

Debug.Log("[KSPI]: found " + filteredFuelModes.Count + " valid fuel types");

var groups = filteredFuelModes.GroupBy(mode => mode.ModeGUIName).Select(group => new ReactorFuelType(group)).ToList();
var groups = filteredFuelModes.GroupBy(mode => mode.ModeGuiName).Select(group => new ReactorFuelType(group)).ToList();

Debug.Log("[KSPI]: grouped them into " + groups.Count + " valid fuel modes");

Expand Down Expand Up @@ -2226,7 +2226,7 @@ protected double ConsumeReactorFuel(ReactorFuel fuel, double powerInMj, double d
if (powerInMj.IsInfinityOrNaNorZero())
return 0;

var consumeAmountInUnitOfStorage = FuelEfficiency > 0 ? powerInMj * fuel.AmountFuelUsePerMJ * fuelUsePerMJMult / FuelEfficiency : 0;
var consumeAmountInUnitOfStorage = FuelEfficiency > 0 ? powerInMj * fuel.AmountFuelUsePerMj * fuelUsePerMJMult / FuelEfficiency : 0;
if (resourceControl != null)
{
resourceControl.maxAmount = consumeAmountInUnitOfStorage;
Expand Down Expand Up @@ -2264,7 +2264,7 @@ protected virtual double ProduceReactorProduct(ReactorProduct product, double po
if (powerInMj.IsInfinityOrNaNorZero())
return 0;

var productSupply = powerInMj * product.AmountProductUsePerMJ * fuelUsePerMJMult / FuelEfficiency;
var productSupply = powerInMj * product.AmountProductUsePerMj * fuelUsePerMJMult / FuelEfficiency;
var fixedProductSupply = productSupply * deltaTime;

if (!product.ProduceGlobal)
Expand Down Expand Up @@ -2564,7 +2564,7 @@ private void Window(int windowId)
var variantText = availableResources.Count > 1 ? " (" + availableResources.Count + " variants)" : "";
PrintToGuiLayout(fuel.FuelName + " "+ Localizer.Format("#LOC_KSPIE_Reactor_Reserves"), PluginHelper.FormatMassStr(availabilityInTon) + variantText, boldStyle, textStyle);//Reserves

var tonFuelUsePerHour = ongoing_total_power_generated * fuel.TonsFuelUsePerMJ * fuelUsePerMJMult / FuelEfficiency * PluginSettings.Config.SecondsInHour;
var tonFuelUsePerHour = ongoing_total_power_generated * fuel.TonsFuelUsePerMj * fuelUsePerMJMult / FuelEfficiency * PluginSettings.Config.SecondsInHour;
var kgFuelUsePerHour = tonFuelUsePerHour * 1000;
var kgFuelUsePerDay = kgFuelUsePerHour * PluginSettings.Config.HoursInDay;

Expand Down Expand Up @@ -2626,7 +2626,7 @@ private void Window(int windowId)
GUILayout.Label(PluginHelper.FormatMassStr(availabilityInTon, "0.00000") + " / " + PluginHelper.FormatMassStr(maxAvailabilityInTon, "0.00000"), textStyle, GUILayout.Width(150));
GUILayout.EndHorizontal();

var hourProductionInTon = ongoing_total_power_generated * product.TonsProductUsePerMJ * fuelUsePerMJMult / FuelEfficiency * PluginSettings.Config.SecondsInHour;
var hourProductionInTon = ongoing_total_power_generated * product.TonsProductUsePerMj * fuelUsePerMJMult / FuelEfficiency * PluginSettings.Config.SecondsInHour;
GUILayout.BeginHorizontal();
GUILayout.Label(product.FuelName + " " + Localizer.Format("#LOC_KSPIE_Reactor_Production"), boldStyle, GUILayout.Width(150));//Production
GUILayout.Label(PluginHelper.FormatMassStr(hourProductionInTon) + " / " + Localizer.Format("#LOC_KSPIE_Reactor_hour"), textStyle, GUILayout.Width(150));//hour
Expand Down
152 changes: 60 additions & 92 deletions FNPlugin/Reactors/ReactorFuel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,157 +6,125 @@ namespace FNPlugin.Reactors
{
class ReactorFuel
{
double _tons_fuel_usage_per_mw;
double _amountFuelUsePerMJ;
string _fuel_name;
string _resource_name;
double _density;
double _densityInKg;
double _ratio;
string _unit;
bool _consumeGlobal;
bool _simulate;

public ReactorFuel(ConfigNode node)
{
_fuel_name = node.GetValue("name");
_ratio = node.HasValue("ratio") ? Convert.ToDouble(node.GetValue("ratio")) : 1;
_simulate = node.HasValue("simulate") ? Boolean.Parse(node.GetValue("simulate")) : false;
_resource_name = node.HasValue("resource") ? node.GetValue("resource") : _fuel_name;
_tons_fuel_usage_per_mw = Convert.ToDouble(node.GetValue("UsagePerMW"));
_unit = node.GetValue("Unit");
_consumeGlobal = node.HasValue("consumeGlobal") ? Boolean.Parse(node.GetValue("consumeGlobal")) : true;

Definition = PartResourceLibrary.Instance.GetDefinition(_resource_name);
FuelName = node.GetValue("name");
Ratio = node.HasValue("ratio") ? Convert.ToDouble(node.GetValue("ratio")) : 1;
Simulate = node.HasValue("simulate") && bool.Parse(node.GetValue("simulate"));
ResourceName = node.HasValue("resource") ? node.GetValue("resource") : FuelName;
TonsFuelUsePerMj = Convert.ToDouble(node.GetValue("UsagePerMW"));
Unit = node.GetValue("Unit");
ConsumeGlobal = !node.HasValue("consumeGlobal") || bool.Parse(node.GetValue("consumeGlobal"));

Definition = PartResourceLibrary.Instance.GetDefinition(ResourceName);
if (Definition == null)
Debug.LogError("[KSPI]: No definition found for resource '" + _resource_name + "' for ReactorFuel " + _fuel_name);
Debug.LogError("[KSPI]: No definition found for resource '" + ResourceName + "' for ReactorFuel " + FuelName);
else
{
_density = (double)(decimal)Definition.density;
_densityInKg = _density * 1000;
_amountFuelUsePerMJ = _tons_fuel_usage_per_mw / _density;
DensityInTon = (double)(decimal)Definition.density;
DensityInKg = DensityInTon * 1000;
AmountFuelUsePerMj = TonsFuelUsePerMj / DensityInTon;
}
}

public PartResourceDefinition Definition { get; private set; }

public double Ratio { get { return _ratio; } }
public PartResourceDefinition Definition { get; }

public bool ConsumeGlobal { get { return _consumeGlobal; } }
public double Ratio { get; }

public double DensityInTon { get { return _density; } }
public bool ConsumeGlobal { get; }

public double DensityInKg { get { return _densityInKg; } }
public double DensityInTon { get; }

public bool Simulate { get { return _simulate; } }
public double DensityInKg { get; }

public double AmountFuelUsePerMJ { get { return _amountFuelUsePerMJ; } }
public bool Simulate { get; }

public double TonsFuelUsePerMJ { get { return _tons_fuel_usage_per_mw; } }
public double AmountFuelUsePerMj { get; }

public double EnergyDensity { get { return _tons_fuel_usage_per_mw > 0 ? 0.001 / _tons_fuel_usage_per_mw : 0; } }
public double TonsFuelUsePerMj { get; }

public string FuelName { get { return _fuel_name; } }
public string FuelName { get; }

public string ResourceName { get { return _resource_name; } }
public string ResourceName { get; }

public string Unit { get { return _unit; } }
public string Unit { get; }

public double GetFuelRatio(Part part, double fuelEfficency, double megajoules, double fuelUsePerMJMult, bool simulate)
public double GetFuelRatio(Part part, double fuelEfficiency, double megajoules, double fuelUsePerMjMult, bool simulate)
{
if (CheatOptions.InfinitePropellant)
return 1;

if (simulate)
return 1;

var fuelUseForPower = this.GetFuelUseForPower(fuelEfficency, megajoules, fuelUsePerMJMult);
var fuelUseForPower = GetFuelUseForPower(fuelEfficiency, megajoules, fuelUsePerMjMult);

return fuelUseForPower > 0 ? Math.Min(this.GetFuelAvailability(part) / fuelUseForPower, 1) : 0;
return fuelUseForPower > 0 ? Math.Min(GetFuelAvailability(part) / fuelUseForPower, 1) : 0;
}

public double GetFuelUseForPower(double efficiency, double megajoules, double fuelUsePerMJMult)
public double GetFuelUseForPower(double efficiency, double megajoules, double fuelUsePerMjMult)
{
return efficiency > 0 ? AmountFuelUsePerMJ * fuelUsePerMJMult * megajoules / efficiency : 0;
return efficiency > 0 ? AmountFuelUsePerMj * fuelUsePerMjMult * megajoules / efficiency : 0;
}

public double GetFuelAvailability(Part part)
{
if (!this.ConsumeGlobal)
if (!ConsumeGlobal)
{
if (part.Resources.Contains(this.ResourceName))
return part.Resources[this.ResourceName].amount;
if (part.Resources.Contains(ResourceName))
return part.Resources[ResourceName].amount;
else
return 0;
}

if (HighLogic.LoadedSceneIsFlight)
return part.GetResourceAvailable(this.Definition);
return part.GetResourceAvailable(Definition);
else
return part.FindAmountOfAvailableFuel(this.ResourceName, 4);
return part.FindAmountOfAvailableFuel(ResourceName, 4);
}

}

class ReactorProduct
{
double _tons_product_usage_per_mw;
string _fuel_name;
string _resource_name;
double _density;
double _densityInKg;
string _unit;
bool _isPropellant;
bool _produceGlobal;
bool _simulate;
double _amountProductUsePerMJ;

public ReactorProduct(ConfigNode node)
{
_fuel_name = node.GetValue("name");
_resource_name = node.HasValue("resource") ? node.GetValue("resource") : _fuel_name;
_unit = node.GetValue("Unit");
_simulate = node.HasValue("simulate") ? Boolean.Parse(node.GetValue("simulate")) : false;
_isPropellant = node.HasValue("isPropellant") ? Boolean.Parse(node.GetValue("isPropellant")) : true;
_produceGlobal = node.HasValue("produceGlobal") ? Boolean.Parse(node.GetValue("produceGlobal")) : true;
_tons_product_usage_per_mw = Convert.ToDouble(node.GetValue("ProductionPerMW"));

Definition = PartResourceLibrary.Instance.GetDefinition(_fuel_name);
FuelName = node.GetValue("name");
ResourceName = node.HasValue("resource") ? node.GetValue("resource") : FuelName;
Unit = node.GetValue("Unit");
Simulate = node.HasValue("simulate") && bool.Parse(node.GetValue("simulate"));
IsPropellant = !node.HasValue("isPropellant") || bool.Parse(node.GetValue("isPropellant"));
ProduceGlobal = !node.HasValue("produceGlobal") || bool.Parse(node.GetValue("produceGlobal"));
TonsProductUsePerMj = Convert.ToDouble(node.GetValue("ProductionPerMW"));

Definition = PartResourceLibrary.Instance.GetDefinition(FuelName);
if (Definition == null)
Debug.LogError("[KSPI]: No definition found for ReactorProduct '" + _resource_name + "'");
Debug.LogError("[KSPI]: No definition found for ReactorProduct '" + ResourceName + "'");
else
{
_density = (double)(decimal)Definition.density;
_densityInKg = _density * 1000;
_amountProductUsePerMJ = _density > 0 ? _tons_product_usage_per_mw / _density : 0;
DensityInTon = (double)(decimal)Definition.density;
DensityInKg = DensityInTon * 1000;
AmountProductUsePerMj = DensityInTon > 0 ? TonsProductUsePerMj / DensityInTon : 0;
}
}

public PartResourceDefinition Definition { get; private set; }

public bool ProduceGlobal { get { return _produceGlobal; } }

public bool IsPropellant { get { return _isPropellant; } }

public double DensityInTon { get { return _density; } }

public double DensityInKg { get { return _densityInKg; } }

public double AmountProductUsePerMJ { get { return _amountProductUsePerMJ; } }

public double TonsProductUsePerMJ { get { return _tons_product_usage_per_mw; } }

public double EnergyDensity { get { return 0.001 / _tons_product_usage_per_mw; } }

public string FuelName { get { return _fuel_name; } }
public PartResourceDefinition Definition { get; }

public string ResourceName { get { return _resource_name; } }
public bool ProduceGlobal { get; }

public string Unit { get { return _unit; } }
public bool IsPropellant { get; }
public bool Simulate { get; }
public double DensityInTon { get; }
public double DensityInKg { get; }
public double AmountProductUsePerMj { get; }
public double TonsProductUsePerMj { get; }
public string FuelName { get; }
public string ResourceName { get; }
public string Unit { get; }

public double GetProductionForPower(double efficiency, double megajoules, double productionPerMJMult)
public double GetProductionForPower(double efficiency, double megajoules, double productionPerMjMult)
{
return AmountProductUsePerMJ * productionPerMJMult * megajoules / efficiency;
return AmountProductUsePerMj * productionPerMjMult * megajoules / efficiency;
}
}
}
Loading

0 comments on commit 41a363d

Please sign in to comment.