Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 89 additions & 77 deletions Source/Modules/ModuleSystemHeatAsteroidHarvester.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using UnityEngine;
using KSP.Localization;
using Unity.Profiling;

namespace SystemHeat
{
Expand All @@ -24,7 +24,7 @@ public class ModuleSystemHeatAsteroidHarvester : ModuleAsteroidDrill
// Map system outlet temperature (K) to heat generation (kW)
[KSPField(isPersistant = false)]
public float systemPower = 0f;
//
//
[KSPField(isPersistant = false)]
public float shutdownTemperature = 1000f;

Expand All @@ -37,128 +37,140 @@ public class ModuleSystemHeatAsteroidHarvester : ModuleAsteroidDrill
[KSPField(isPersistant = false, guiActive = true, guiActiveEditor = true, guiName = "Harvester Efficiency")]
public string HarvesterEfficiency = "-1%";

// base paramters
private List<ResourceBaseRatio> inputs;
private List<ResourceBaseRatio> outputs;
protected ModuleSystemHeat heatModule;

private static readonly ProfilerMarker BaseFixedUpdateMarker = new("ModuleAsteroidDrill.FixedUpdate");

public override string GetInfo()
{
string info = base.GetInfo();

int pos = info.IndexOf("\n\n");
if (pos < 0)
return info;
else
return info.Substring(0, pos) + Localizer.Format("#LOC_SystemHeat_ModuleSystemHeatHarvester_PartInfoAdd",
Utils.ToSI(systemPower,"F0"),
systemOutletTemperature.ToString("F0"),
shutdownTemperature.ToString("F0")
) + info.Substring(pos);

var extraInfo = Localizer.Format("#LOC_SystemHeat_ModuleSystemHeatHarvester_PartInfoAdd",
Utils.ToSI(systemPower, "F0"),
systemOutletTemperature.ToString("F0"),
shutdownTemperature.ToString("F0")
);
return info.Substring(0, pos) + extraInfo + info.Substring(pos);
}

public void Start()
{
heatModule = ModuleUtils.FindHeatModule(this.part, systemHeatModuleID);
heatModule = ModuleUtils.FindHeatModule(part, systemHeatModuleID);

Utils.Log("[ModuleSystemHeatAsteroidHarvester] Setup completed", LogType.Modules);
Fields["HarvesterEfficiency"].guiName = Localizer.Format("#LOC_SystemHeat_ModuleSystemHeatHarvester_Field_Efficiency", ConverterName);
}

public override void FixedUpdate()
{
if (HighLogic.LoadedSceneIsFlight)
{
SetupResourceRatios();
FixedUpdateFlight();
}
else
{
SetupResourceRatios();
UpdateFlux();
}
Utils.Log("[ModuleSystemHeatAsteroidHarvester] Setup completed", LogType.Modules);
Fields["HarvesterEfficiency"].guiName = Localizer.Format("#LOC_SystemHeat_ModuleSystemHeatHarvester_Field_Efficiency", base.ConverterName);
}

public override void FixedUpdate()
void Update()
{
base.FixedUpdate();
if (heatModule != null)
{
if (HighLogic.LoadedSceneIsFlight)
{
GenerateHeatFlight();
UpdateSystemHeatFlight();
}
if (HighLogic.LoadedSceneIsEditor)
{
GenerateHeatEditor();
}
}
if (!part.IsPAWVisible())
return;

HarvesterEfficiency = Localizer.Format(
"#LOC_SystemHeat_ModuleSystemHeatHarvester_Field_Efficiency_Value",
(GetHeatThrottle() * 100f).ToString("F1")
);
}

void Update()
void OnDisable()
{
if (heatModule != null && part.IsPAWVisible())
{
HarvesterEfficiency = Localizer.Format("#LOC_SystemHeat_ModuleSystemHeatHarvester_Field_Efficiency_Value", (systemEfficiency.Evaluate(heatModule.currentLoopTemperature) * 100f).ToString("F1"));
}
heatModule?.AddFlux(moduleID, 0f, 0f, false);
HarvesterEfficiency = "-";
}

protected void GenerateHeatEditor()
void FixedUpdateFlight()
{
if (base.IsActivated)
if (heatModule == null)
{
heatModule.AddFlux(moduleID, systemOutletTemperature, systemPower, true);
}
else
{
heatModule.AddFlux(moduleID, 0f, 0f, false);
// This disables this module entirely, so it won't be called every frame.
enabled = false;
return;
}

CheckOverheat();

if (!IsActivated && !AlwaysActive)
enabled = false;

using (BaseFixedUpdateMarker.ConditionalAuto())
base.FixedUpdate();
}

protected void GenerateHeatFlight()
void UpdateFlux() => UpdateFlux(lastTimeFactor);
void UpdateFlux(double timeFactor)
{
if (base.ModuleIsActive())
if (heatModule == null)
return;

if (ModuleIsActive())
{
float fluxScale = 1f;
if (base.lastTimeFactor == 0d)
{
fluxScale = 0f;
}
heatModule.AddFlux(moduleID, systemOutletTemperature, systemPower * fluxScale, true);
float scale = timeFactor != 0.0 ? 1f : 0f;
if (HighLogic.LoadedSceneIsEditor)
scale = 1f;

heatModule.AddFlux(moduleID, systemOutletTemperature, systemPower * scale, true);
}
else
{
heatModule.AddFlux(moduleID, 0f, 0f, false);
}
}

protected void UpdateSystemHeatFlight()
void CheckOverheat()
{
if (base.ModuleIsActive())
{
if (heatModule.currentLoopTemperature > shutdownTemperature)
{
ScreenMessages.PostScreenMessage(
new ScreenMessage(
Localizer.Format("#LOC_SystemHeat_ModuleSystemHeatHarvester_Message_Shutdown",
part.partInfo.title),
3.0f,
ScreenMessageStyle.UPPER_CENTER));
ToggleResourceConverterAction(new KSPActionParam(0, KSPActionType.Activate));
Utils.Log("[ModuleSystemHeatConverter]: Overheated, shutdown fired", LogType.Modules);
}
}
if (!ModuleIsActive())
return;
if (heatModule.currentLoopTemperature <= shutdownTemperature)
return;

ScreenMessages.PostScreenMessage(
new ScreenMessage(
Localizer.Format(
"#LOC_SystemHeat_ModuleSystemHeatHarvester_Message_Shutdown",
part.partInfo.title),
3.0f,
ScreenMessageStyle.UPPER_CENTER));
StopResourceConverter();

Utils.Log("[ModuleSystemHeatConverter]: Overheated, shutdown fired", LogType.Modules);
}

public override void StartResourceConverter()
{
enabled = true;
base.StartResourceConverter();
}

private void SetupResourceRatios()
// In stock this would use the ModuleCoreHeat on the same part. We don't
// want that, and just override it to point to our own efficiency multiplier.
public override float GetHeatThrottle()
{
inputs = new List<ResourceBaseRatio>();
outputs = new List<ResourceBaseRatio>();
if (heatModule == null)
return 1f;

for (int i = 0; i < inputList.Count; i++)
{
inputs.Add(new ResourceBaseRatio(inputList[i].ResourceName, inputList[i].Ratio));
}
for (int i = 0; i < outputList.Count; i++)
{
outputs.Add(new ResourceBaseRatio(outputList[i].ResourceName, outputList[i].Ratio));
}
return systemEfficiency.Evaluate(heatModule.currentLoopTemperature);
}

protected override void PostProcess(ConverterResults result, double deltaTime)
{
base.PostProcess(result, deltaTime);
UpdateFlux(result.TimeFactor);
}
}
}

Loading
Loading