From 25479f183d2de7c5cd9ac3e5d7dac7a9fd328801 Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Wed, 7 Aug 2013 22:29:32 -0400 Subject: [PATCH 01/10] Prevent ScaledSpace crash --- Plugin/ScaledSpaceFix.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Plugin/ScaledSpaceFix.cs b/Plugin/ScaledSpaceFix.cs index 1a71470..410cff2 100644 --- a/Plugin/ScaledSpaceFix.cs +++ b/Plugin/ScaledSpaceFix.cs @@ -8,6 +8,7 @@ internal class ScaledSpaceFix : MonoBehaviour { public void Start() { + if (ScaledSpace.Instance == null || ScaledSpace.Instance.scaledSpaceTransforms == null) { return; } ScaledSpace.Instance.scaledSpaceTransforms.RemoveAll(t => t == null); if (HighLogic.LoadedScene == GameScenes.MAINMENU) { From e890eb5f5b2bc9d5e521072c93e670a8a39758bf Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Wed, 7 Aug 2013 22:37:24 -0400 Subject: [PATCH 02/10] Use KSPAddonFixed to fix mod incompatibility --- Plugin/InstallChecker.cs | 2 +- Plugin/KSPAddonFixed.cs | 37 +++++++++++++++++++++++++++++++++++++ Plugin/Kethane.csproj | 1 + Plugin/SettingsManager.cs | 2 +- 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 Plugin/KSPAddonFixed.cs diff --git a/Plugin/InstallChecker.cs b/Plugin/InstallChecker.cs index bde00d4..2686dd2 100644 --- a/Plugin/InstallChecker.cs +++ b/Plugin/InstallChecker.cs @@ -6,7 +6,7 @@ namespace Kethane { - [KSPAddon(KSPAddon.Startup.MainMenu, true)] + [KSPAddonFixed(KSPAddon.Startup.MainMenu, true, typeof(InstallChecker))] internal class InstallChecker : MonoBehaviour { protected void Start() diff --git a/Plugin/KSPAddonFixed.cs b/Plugin/KSPAddonFixed.cs new file mode 100644 index 0000000..591b4d0 --- /dev/null +++ b/Plugin/KSPAddonFixed.cs @@ -0,0 +1,37 @@ +using System; + +namespace Kethane +{ + /// + /// KSPAddon with equality checking using an additional type parameter. Fixes the issue where AddonLoader prevents multiple start-once addons with the same start scene. + /// + public class KSPAddonFixed : KSPAddon, IEquatable + { + private readonly Type type; + + public KSPAddonFixed(KSPAddon.Startup startup, bool once, Type type) + : base(startup, once) + { + this.type = type; + } + + public override bool Equals(object obj) + { + if (obj.GetType() != this.GetType()) { return false; } + return Equals((KSPAddonFixed)obj); + } + + public bool Equals(KSPAddonFixed other) + { + if (this.once != other.once) { return false; } + if (this.startup != other.startup) { return false; } + if (this.type != other.type) { return false; } + return true; + } + + public override int GetHashCode() + { + return this.startup.GetHashCode() ^ this.once.GetHashCode() ^ this.type.GetHashCode(); + } + } +} diff --git a/Plugin/Kethane.csproj b/Plugin/Kethane.csproj index bb3bdc5..4850b43 100644 --- a/Plugin/Kethane.csproj +++ b/Plugin/Kethane.csproj @@ -68,6 +68,7 @@ + diff --git a/Plugin/SettingsManager.cs b/Plugin/SettingsManager.cs index a71179d..d8b3f8f 100644 --- a/Plugin/SettingsManager.cs +++ b/Plugin/SettingsManager.cs @@ -2,7 +2,7 @@ namespace Kethane { - [KSPAddon(KSPAddon.Startup.Instantly, true)] + [KSPAddonFixed(KSPAddon.Startup.Instantly, true, typeof(SettingsManager))] internal class SettingsManager : MonoBehaviour { private static ConfigNode node; From 5a28ec5ba6e8d1a7abe75bcc597b403d48667971 Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Thu, 8 Aug 2013 04:00:36 -0400 Subject: [PATCH 03/10] Converter supports multiple input and output resources --- Parts/kethane_1m_converter/part.cfg | 54 +++++++------- Parts/kethane_2m_converter/part.cfg | 56 +++++++++----- Plugin/KethaneConverter.cs | 110 ++++++++++++++++------------ Plugin/Misc.cs | 10 +++ 4 files changed, 140 insertions(+), 90 deletions(-) diff --git a/Parts/kethane_1m_converter/part.cfg b/Parts/kethane_1m_converter/part.cfg index ee49df2..c7fe66d 100644 --- a/Parts/kethane_1m_converter/part.cfg +++ b/Parts/kethane_1m_converter/part.cfg @@ -47,40 +47,44 @@ fuelCrossFeed = True MODULE { name = KethaneConverter - SourceResource = Kethane - TargetResource = LiquidFuel - ConversionEfficiency = 0.97 - SourceConsumption = 2.25 - PowerConsumption = 6 + Label = Rocket Fuel + InputRates + { + Kethane = 2.25 + ElectricCharge = 6 + } + OutputRatios + { + LiquidFuel = 0.99 + Oxidizer = 0.99 + } } MODULE { name = KethaneConverter - SourceResource = Kethane - TargetResource = Oxidizer - ConversionEfficiency = 1.01 - SourceConsumption = 2.75 - PowerConsumption = 4 + InputRates + { + Kethane = 1.5 + ElectricCharge = 8 + } + OutputRatios + { + MonoPropellant = 0.3 + } } MODULE { name = KethaneConverter - SourceResource = Kethane - TargetResource = MonoPropellant - ConversionEfficiency = 0.3 - SourceConsumption = 1.5 - PowerConsumption = 8 -} - -MODULE -{ - name = KethaneConverter - SourceResource = Kethane - TargetResource = XenonGas - ConversionEfficiency = 0.4 - SourceConsumption = 1.5 - PowerConsumption = 3 + InputRates + { + Kethane = 1.5 + ElectricCharge = 3 + } + OutputRatios + { + XenonGas = 0.4 + } } } diff --git a/Parts/kethane_2m_converter/part.cfg b/Parts/kethane_2m_converter/part.cfg index 8cf4290..f37a447 100644 --- a/Parts/kethane_2m_converter/part.cfg +++ b/Parts/kethane_2m_converter/part.cfg @@ -51,44 +51,60 @@ MODULE MODULE { name = KethaneConverter - SourceResource = Kethane - TargetResource = LiquidFuel - ConversionEfficiency = 1.03 - SourceConsumption = 6.75 - PowerConsumption = 12 HeatProduction = 600 + InputRates + { + Kethane = 6.75 + ElectricCharge = 12 + } + OutputRatios + { + LiquidFuel = 1.03 + } } MODULE { name = KethaneConverter - SourceResource = Kethane - TargetResource = Oxidizer - ConversionEfficiency = 0.99 - SourceConsumption = 8.25 - PowerConsumption = 8 HeatProduction = 800 + InputRates + { + Kethane = 8.25 + ElectricCharge = 8 + } + OutputRatios + { + Oxidizer = 0.99 + } } MODULE { name = KethaneConverter - SourceResource = Kethane - TargetResource = MonoPropellant - ConversionEfficiency = 0.85 - SourceConsumption = 3 - PowerConsumption = 10 HeatProduction = 1200 + InputRates + { + Kethane = 3 + ElectricCharge = 10 + } + OutputRatios + { + MonoPropellant = 0.85 + } } MODULE { name = KethaneConverter - SourceResource = Kethane - TargetResource = XenonGas - ConversionEfficiency = 0.25 - SourceConsumption = 2 - PowerConsumption = 8 HeatProduction = 300 + InputRates + { + Kethane = 2 + ElectricCharge = 8 + } + OutputRatios + { + XenonGas = 0.25 + } } } diff --git a/Plugin/KethaneConverter.cs b/Plugin/KethaneConverter.cs index 280b473..af1595f 100644 --- a/Plugin/KethaneConverter.cs +++ b/Plugin/KethaneConverter.cs @@ -8,20 +8,26 @@ namespace Kethane { public class KethaneConverter : PartModule { - [KSPField(isPersistant = false)] - public string SourceResource; - - [KSPField(isPersistant = false)] - public string TargetResource; + private struct ResourceRate + { + public String Resource { get; private set; } + public double Rate { get; private set; } - [KSPField(isPersistant = false)] - public float ConversionEfficiency; + public ResourceRate(String resource, double rate) + : this() + { + Resource = resource; + Rate = rate; + } - [KSPField(isPersistant = false)] - public float SourceConsumption; + public static ResourceRate operator *(ResourceRate rate, double multiplier) + { + return new ResourceRate(rate.Resource, rate.Rate * multiplier); + } + } [KSPField(isPersistant = false)] - public float PowerConsumption; + public String Label; [KSPField(isPersistant = false)] public float HeatProduction; @@ -29,6 +35,11 @@ public class KethaneConverter : PartModule [KSPField(isPersistant = true)] public bool IsEnabled; + public ConfigNode config; + + private ResourceRate[] inputRates; + private ResourceRate[] outputRates; + [KSPEvent(guiActive = true, guiName = "Activate Converter", active = true)] public void ActivateConverter() { @@ -61,14 +72,48 @@ public void ToggleConverterAction(KSPActionParam param) public override string GetInfo() { - return String.Format("{0}:\n- Conversion Efficiency: {1:P0}\n- {4} Consumption: {2:F1}L/s\n- Power Consumption: {3:F1}/s", TargetResource, ConversionEfficiency, SourceConsumption, PowerConsumption, SourceResource); + return String.Format("{0} Converter:\n> Inputs:\n", Label) + String.Join("\n", inputRates.Select(r => String.Format(" - {0}: {1:N2}/s", r.Resource, r.Rate)).ToArray()) + "\n> Outputs:\n" + String.Join("\n", outputRates.Select(r => String.Format(" - {0}: {1:N2}/s", r.Resource, r.Rate)).ToArray()) + "\n"; + } + + public override void OnLoad(ConfigNode config) + { + if (this.config == null) + { + this.config = new ConfigNode(); + config.CopyTo(this.config); + } + + loadConfig(); + } + + private void loadConfig() + { + var definitions = PartResourceLibrary.Instance.resourceDefinitions; + + inputRates = loadRates(config.GetNode("InputRates")).ToArray(); + var inputMassRate = inputRates.Sum(p => p.Rate * definitions[p.Resource].density); + + outputRates = loadRates(config.GetNode("OutputRatios")).Select(r => r * (inputMassRate / definitions[r.Resource].density)).GroupBy(r => r.Resource).Select(g => new ResourceRate(g.Key, g.Sum(r => r.Rate))).Concat(loadRates(config.GetNode("OutputRates"))).ToArray(); + + if (Label == null) + { + Label = String.Join("/", outputRates.Select(r => r.Resource).ToArray()); + } + } + + private static IEnumerable loadRates(ConfigNode config) + { + return (config ?? new ConfigNode()).values.Cast().Where(v => PartResourceLibrary.Instance.resourceDefinitions.Any(d => d.name == v.name)).Select(v => new ResourceRate(v.name, Misc.Parse(v.value, 0.0))).Where(r => r.Rate > 0); } public override void OnStart(PartModule.StartState state) { - Actions["ActivateConverterAction"].guiName = Events["ActivateConverter"].guiName = String.Format("Activate {0} Converter", TargetResource); - Actions["DeactivateConverterAction"].guiName = Events["DeactivateConverter"].guiName = String.Format("Deactivate {0} Converter", TargetResource); - Actions["ToggleConverterAction"].guiName = String.Format("Toggle {0} Converter", TargetResource); + loadConfig(); + + Actions["ActivateConverterAction"].guiName = Events["ActivateConverter"].guiName = String.Format("Activate {0} Converter", Label); + Actions["DeactivateConverterAction"].guiName = Events["DeactivateConverter"].guiName = String.Format("Deactivate {0} Converter", Label); + Actions["ToggleConverterAction"].guiName = String.Format("Toggle {0} Converter", Label); + if (state == StartState.Editor) { return; } this.part.force_activate(); } @@ -83,24 +128,8 @@ public override void OnFixedUpdate() { if (!IsEnabled) { return; } - var conversionRatio = PartResourceLibrary.Instance.GetDefinition(SourceResource).density / PartResourceLibrary.Instance.GetDefinition(TargetResource).density; - - double requestedSpace = SourceConsumption * conversionRatio * ConversionEfficiency * TimeWarp.fixedDeltaTime; - double requestedSource = SourceConsumption * TimeWarp.fixedDeltaTime; - double requestedEnergy = PowerConsumption * TimeWarp.fixedDeltaTime; - - double availableSpace = 0; - var listPartResource = Misc.GetConnectedResources(this.part, TargetResource); - if (listPartResource.Count > 0) - availableSpace = listPartResource.Max(r => r.maxAmount - r.amount); - var availableSource = Misc.GetConnectedResources(this.part, SourceResource).Max(r => r.amount); - var availableEnergy = Misc.GetConnectedResources(this.part, "ElectricCharge").Max(r => r.amount); - - var spaceRatio = availableSpace / requestedSpace; - var sourceRatio = availableSource / requestedSource; - var energyRatio = availableEnergy / requestedEnergy; - - var ratio = Math.Min(Math.Min(Math.Min(spaceRatio, sourceRatio), energyRatio), 1); + var rates = outputRates.Select(r => r * -1).Concat(inputRates).Select(r => r * TimeWarp.fixedDeltaTime).ToArray(); + var ratio = rates.Select(r => Misc.GetConnectedResources(this.part, r.Resource).Select(c => r.Rate > 0 ? c.amount : c.maxAmount - c.amount).DefaultIfEmpty().Max() / Math.Abs(r.Rate)).Prepend(1).Min(); var heatsink = this.part.Modules.OfType().SingleOrDefault(); if (heatsink != null) @@ -109,19 +138,10 @@ public override void OnFixedUpdate() ratio *= heatsink.AddHeat(heatRequest) / heatRequest; } - requestedSource *= ratio; - - var drawnSource = this.part.RequestResource(SourceResource, requestedSource); - - ratio *= drawnSource / requestedSource; - requestedEnergy *= ratio; - - var drawnEnergy = this.part.RequestResource("ElectricCharge", requestedEnergy); - - ratio *= drawnEnergy / requestedEnergy; - requestedSpace *= ratio; - - this.part.RequestResource(TargetResource, -requestedSpace); + foreach (var rate in rates) + { + this.part.RequestResource(rate.Resource, rate.Rate * ratio); + } } } } diff --git a/Plugin/Misc.cs b/Plugin/Misc.cs index 4d95c37..ca9eca1 100644 --- a/Plugin/Misc.cs +++ b/Plugin/Misc.cs @@ -90,6 +90,16 @@ public static float Parse(string s, float defaultValue) return value; } + public static double Parse(string s, double defaultValue) + { + double value; + if (!double.TryParse(s, out value)) + { + value = defaultValue; + } + return value; + } + public static int Parse(string s, int defaultValue) { int value; From 9f81128c72adc63536c4a7f0d875642753692eda Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Tue, 6 Aug 2013 21:24:55 -0400 Subject: [PATCH 04/10] Add Dani-Sang flag --- Flags/Kethane 1.png | Bin 0 -> 52133 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Flags/Kethane 1.png diff --git a/Flags/Kethane 1.png b/Flags/Kethane 1.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc151e657cde876fc1af5c16938c9e1f666dabf GIT binary patch literal 52133 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 k2w$iKo@? Date: Sun, 11 Aug 2013 20:00:28 -0400 Subject: [PATCH 05/10] Included detector parts only detect Kethane --- Parts/kethane_highGain/part.cfg | 4 ++++ Parts/kethane_sensor_1m/part.cfg | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/Parts/kethane_highGain/part.cfg b/Parts/kethane_highGain/part.cfg index 44ebdd4..15ed157 100644 --- a/Parts/kethane_highGain/part.cfg +++ b/Parts/kethane_highGain/part.cfg @@ -42,6 +42,10 @@ MODULE DetectingPeriod = 1.5 DetectingHeight = 250000 PowerConsumption = 0.8 + Resource + { + Name = Kethane + } } MODULE diff --git a/Parts/kethane_sensor_1m/part.cfg b/Parts/kethane_sensor_1m/part.cfg index eb3e452..1cc8fb3 100644 --- a/Parts/kethane_sensor_1m/part.cfg +++ b/Parts/kethane_sensor_1m/part.cfg @@ -45,6 +45,10 @@ MODULE { DetectingPeriod = 0.9 DetectingHeight = 1200000 PowerConsumption = 2.5 + Resource + { + Name = Kethane + } } MODULE From 0bcfe4e28eaf1e2657954f97dd13199799df2702 Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Sun, 11 Aug 2013 20:01:25 -0400 Subject: [PATCH 06/10] Configurable wet mass indicator label --- Plugin/KethaneWetMassIndicator.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Plugin/KethaneWetMassIndicator.cs b/Plugin/KethaneWetMassIndicator.cs index 9ef0cf2..705a2a7 100644 --- a/Plugin/KethaneWetMassIndicator.cs +++ b/Plugin/KethaneWetMassIndicator.cs @@ -5,9 +5,12 @@ namespace Kethane { public class KethaneWetMassIndicator : PartModule { + [KSPField(isPersistant = false)] + public String Label; + public override string GetInfo() { - return String.Format("Wet Mass: {0}", (float)this.part.Resources.Cast().Sum(r => r.maxAmount * PartResourceLibrary.Instance.GetDefinition(r.resourceName).density) + this.part.mass); + return String.Format("{0}: {1}", Label ?? "Wet Mass", (float)this.part.Resources.Cast().Sum(r => r.maxAmount * PartResourceLibrary.Instance.GetDefinition(r.resourceName).density) + this.part.mass); } } } From c0278842fe953f7a59ea7b2c3e7355f19eef9a98 Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Sun, 11 Aug 2013 20:25:38 -0400 Subject: [PATCH 07/10] Load actual ScenarioModule after creating prototype (if applicable to scene) --- Plugin/KethaneData.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Plugin/KethaneData.cs b/Plugin/KethaneData.cs index d64da21..92fadaf 100644 --- a/Plugin/KethaneData.cs +++ b/Plugin/KethaneData.cs @@ -17,6 +17,10 @@ public static KethaneData Current if (!game.scenarios.Any(p => p.moduleName == typeof(KethaneData).Name)) { var proto = game.AddProtoScenarioModule(typeof(KethaneData), GameScenes.FLIGHT, GameScenes.TRACKSTATION); + if (proto.targetScenes.Contains(HighLogic.LoadedScene)) + { + proto.Load(ScenarioRunner.fetch); + } } return game.scenarios.Select(s => s.moduleRef).OfType().SingleOrDefault(); From 1a26c436008487408f1a4c0c91fda6f13dabdd33 Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Sun, 11 Aug 2013 20:54:05 -0400 Subject: [PATCH 08/10] Only fetch KethaneData once per batch cell refresh --- Plugin/MapOverlay.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Plugin/MapOverlay.cs b/Plugin/MapOverlay.cs index 4bf7883..daf6a87 100644 --- a/Plugin/MapOverlay.cs +++ b/Plugin/MapOverlay.cs @@ -213,24 +213,25 @@ public void RefreshCellColor(GeodesicGrid.Cell cell, CelestialBody body) { if (body != this.body) { return; } var colors = mesh.colors32; - refreshCellColor(cell, body, colors); + refreshCellColor(cell, body, colors, KethaneData.Current); mesh.colors32 = colors; } private void refreshCellColors() { var colors = new Color32[mesh.vertexCount]; + var data = KethaneData.Current; foreach (var cell in grid) { - refreshCellColor(cell, body, colors); + refreshCellColor(cell, body, colors, data); } mesh.colors32 = colors; } - private void refreshCellColor(GeodesicGrid.Cell cell, CelestialBody body, Color32[] colors) + private void refreshCellColor(GeodesicGrid.Cell cell, CelestialBody body, Color32[] colors, KethaneData data) { - var deposit = KethaneData.Current.GetCellDeposit(resource.Resource, body, cell); - var scanned = KethaneData.Current.Scans[resource.Resource][body.name][cell]; + var deposit = data.GetCellDeposit(resource.Resource, body, cell); + var scanned = data.Scans[resource.Resource][body.name][cell]; var color = (revealAll ? deposit != null : scanned) ? getDepositColor(resource, deposit) : colorUnknown; setCellColor(cell, color, colors); } From b229f60c1034364812b5d17b0f52a9284d4bd1b5 Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Sun, 11 Aug 2013 21:06:07 -0400 Subject: [PATCH 09/10] Remove obsolete CanExtract property --- Plugin/KethaneExtractorAnimatorLanded.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Plugin/KethaneExtractorAnimatorLanded.cs b/Plugin/KethaneExtractorAnimatorLanded.cs index b2df454..6f4c500 100644 --- a/Plugin/KethaneExtractorAnimatorLanded.cs +++ b/Plugin/KethaneExtractorAnimatorLanded.cs @@ -6,7 +6,6 @@ public class KethaneExtractorAnimatorLanded : PartModule, IExtractorAnimator public ExtractorState CurrentState { get; private set; } public void Deploy() { CurrentState = ExtractorState.Deployed; } public void Retract() { CurrentState = ExtractorState.Retracted; } - public bool CanExtract { get { return vessel.LandedOrSplashed; } } public KethaneExtractorAnimatorLanded() { From b06d2bd945db57e013ffac7d5f4ba08b4c1af4cd Mon Sep 17 00:00:00 2001 From: Majiir Paktu Date: Sun, 11 Aug 2013 21:09:11 -0400 Subject: [PATCH 10/10] Version 0.7.6 --- Plugin/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugin/Properties/AssemblyInfo.cs b/Plugin/Properties/AssemblyInfo.cs index 0811b1e..c748168 100644 --- a/Plugin/Properties/AssemblyInfo.cs +++ b/Plugin/Properties/AssemblyInfo.cs @@ -33,4 +33,4 @@ // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyInformationalVersion("0.7.5")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("0.7.6")] \ No newline at end of file