// Fetch input/output resources list from reactor ConfigNode protected void ParseResourcesList(Part part) { if (!resourcesListParsed) { ConfigNode node = ModuleUtils.GetModuleConfigNode(part, engineModuleName); if (node != null) { // Load resource nodes ConfigNode[] inNodes = node.GetNodes("INPUT_RESOURCE"); inputs = new List <ResourceRatio>(); for (int i = 0; i < inNodes.Length; i++) { ResourceRatio p = new ResourceRatio(); p.Load(inNodes[i]); inputs.Add(p); } ConfigNode[] outNodes = node.GetNodes("OUTPUT_RESOURCE"); outputs = new List <ResourceRatio>(); for (int i = 0; i < outNodes.Length; i++) { ResourceRatio p = new ResourceRatio(); p.Load(outNodes[i]); outputs.Add(p); } } resourcesListParsed = true; } }
public override void OnLoad(ConfigNode node) { base.OnLoad(node); /// Load resource nodes ConfigNode[] inNodes = node.GetNodes("INPUT_RESOURCE"); inputs = new List <ResourceRatio>(); for (int i = 0; i < inNodes.Length; i++) { ResourceRatio p = new ResourceRatio(); p.Load(inNodes[i]); inputs.Add(p); } ConfigNode[] outNodes = node.GetNodes("OUTPUT_RESOURCE"); outputs = new List <ResourceRatio>(); for (int i = 0; i < outNodes.Length; i++) { ResourceRatio p = new ResourceRatio(); p.Load(outNodes[i]); outputs.Add(p); } }
/// <summary> /// Used primarily for simulations, returns the consumed and produced resources for the given unit of time. /// </summary> /// <param name="crewCount">The number of crew to simulate.</param> /// <param name="secondsPerCycle">The number of seconds to calculate total inputs and outputs.</param> /// <param name="consumedResources">The list of consumed resources to add the inputs to.</param> /// <param name="producedResources">The list of produced resources to add the outputs to.</param> public virtual void AddConsumedAndProducedResources(int crewCount, double secondsPerCycle, List <ResourceRatio> consumedResources, List <ResourceRatio> producedResources) { if (crewCount <= 0) { return; } ResourceRatio resourceRatio; //Process input list int count = inputList.Count; for (int index = 0; index < count; index++) { resourceRatio = new ResourceRatio(); resourceRatio.ResourceName = inputList[index].resourceName; resourceRatio.Ratio = inputList[index].amount * crewCount; consumedResources.Add(resourceRatio); } //Process output list count = outputList.Count; for (int index = 0; index < count; index++) { resourceRatio = new ResourceRatio(); resourceRatio.ResourceName = outputList[index].resourceName; resourceRatio.Ratio = outputList[index].amount * crewCount; producedResources.Add(resourceRatio); } }
private void ConsumeResource(ResourceRatio resourceRatio, double percentage) { var resourceName = resourceRatio.ResourceName; var needed = resourceRatio.Ratio * percentage; var sourceParts = LogisticsTools.GetRegionalWarehouses(vessel, nameof(USI_ModuleResourceWarehouse)); foreach (var sourcePart in sourceParts) { if (sourcePart != part) { var warehouse = sourcePart.FindModuleImplementing <USI_ModuleResourceWarehouse>(); if (warehouse != null && warehouse.localTransferEnabled && sourcePart.Resources.Contains(resourceName)) { var resource = sourcePart.Resources[resourceName]; if (resource.flowState) { if (resource.amount >= needed) { resource.amount -= needed; needed = 0; break; } else { needed -= resource.amount; resource.amount = 0; } } } } } }
public override void AddConsumedAndProducedResources(int crewCount, double secondsPerCycle, List <ResourceRatio> consumedResources, List <ResourceRatio> producedResources) { if (crewCount <= 0) { return; } ResourceRatio resourceRatio; //Calculate amount //Start with total snacks consumed per day, accounting for crew count. double amount = SnacksProperties.SnacksPerMeal * SnacksProperties.MealsPerDay * crewCount; //Now get snacks per second consumed. amount /= SnacksScenario.GetSecondsPerDay(); //Finally, account for seconds per cycle amount *= secondsPerCycle; //Add snacks resourceRatio = new ResourceRatio(); resourceRatio.ResourceName = SnacksProperties.SnacksResourceName; resourceRatio.Ratio = amount; consumedResources.Add(resourceRatio); //Add soil if (SnacksProperties.RecyclersEnabled) { resourceRatio = new ResourceRatio(); resourceRatio.ResourceName = SnacksProperties.SoilResourceName; resourceRatio.Ratio = amount; producedResources.Add(resourceRatio); } }
public override void OnLoad(ConfigNode node) { base.OnLoad(node); if (PowerGeneratedOffline) { // Process nodes ConfigNode[] inNodes = node.GetNodes("INPUT_RESOURCE"); ConfigNode[] outNodes = node.GetNodes("OUTPUT_RESOURCE"); powerInputs = new List <ResourceRatio>(); powerOutputs = new List <ResourceRatio>(); for (int i = 0; i < inNodes.Length; i++) { ResourceRatio p = new ResourceRatio(); p.Load(inNodes[i]); powerInputs.Add(p); } for (int i = 0; i < outNodes.Length; i++) { ResourceRatio p = new ResourceRatio(); p.Load(outNodes[i]); powerOutputs.Add(p); } } }
public void OnLoad(ConfigNode node) { // Process nodes node.TryGetValue("DisplayName", ref modeName); node.TryGetValue("ModeID", ref modeID); node.TryGetValue("ModeColor", ref modeColor); node.TryGetValue("PowerGeneration", ref powerGeneration); ConfigNode[] inNodes = node.GetNodes("INPUT_RESOURCE"); ConfigNode[] outNodes = node.GetNodes("OUTPUT_RESOURCE"); inputs = new List <ResourceRatio>(); for (int i = 0; i < inNodes.Length; i++) { ResourceRatio p = new ResourceRatio(); p.Load(inNodes[i]); inputs.Add(p); } outputs = new List <ResourceRatio>(); for (int i = 0; i < outNodes.Length; i++) { ResourceRatio p = new ResourceRatio(); p.Load(outNodes[i]); outputs.Add(p); } }
List <ResourceRatio> ProcessRatio(List <ResourceRatio> mass_ratios, double mass = 1) { var unit_ratios = new List <ResourceRatio> (); for (int i = 0; i < mass_ratios.Count; i++) { var ratio = new ResourceRatio(); var def = PartResourceLibrary.Instance.GetDefinition(mass_ratios[i].ResourceName); if (def == null) { Debug.LogError(String.Format("[EL Converter] unknown resource '{0}'", mass_ratios[i].ResourceName)); continue; } ratio.ResourceName = mass_ratios[i].ResourceName; ratio.Ratio = mass * mass_ratios[i].Ratio; if (def.density > 0) { ratio.Ratio /= def.density; } ratio.DumpExcess = mass_ratios[i].DumpExcess; ratio.FlowMode = mass_ratios[i].FlowMode; unit_ratios.Add(ratio); } return(unit_ratios); }
// Prepare the recipe with regard to the amount of crew in this module protected override ConversionRecipe PrepareRecipe(double deltatime) { ConversionRecipe recipe = base.PrepareRecipe(deltatime); if (recipe != null) { //change the rate of the inputs for (int i = 0; i < recipe.Inputs.Count; i++) { ResourceRatio res = recipe.Inputs[i]; res.Ratio = inputList[i].Ratio * (productionSpeed / 100f); recipe.Inputs[i] = res; } //change the rate of the outputs for (int i = 0; i < recipe.Outputs.Count; i++) { ResourceRatio res = recipe.Outputs[i]; res.Ratio = outputList[i].Ratio * (productionSpeed / 100f); recipe.Outputs[i] = res; } //change the value of the requirements for (int i = 0; i < recipe.Requirements.Count; i++) { ResourceRatio res = recipe.Requirements[i]; res.Ratio = reqList[i].Ratio * (productionSpeed / 100f); recipe.Requirements[i] = res; } } return(recipe); }
public void Scale(double scale, MemberUpdater source) { if (_field == null && _property == null) { return; } object newValue = source.Value; if (MemberType == typeof(float)) { RescaleFloatRange((float)scale); Set((float)newValue * (float)scale); } else if (MemberType == typeof(double)) { RescaleFloatRange((float)scale); Set((double)newValue * scale); } else if (MemberType == typeof(int)) { Set((int)Math.Round((int)(newValue) * scale)); } else if (MemberType == typeof(Vector3)) { Set((Vector3)newValue * (float)scale); } else if (MemberType == typeof(FloatCurve)) { AnimationCurve curve = (newValue as FloatCurve).Curve; AnimationCurve tmp = new AnimationCurve(); for (int i = 0; i < curve.length; i++) { Keyframe k = curve.keys[i]; k.value *= (float)scale; k.inTangent *= (float)scale; k.outTangent *= (float)scale; tmp.AddKey(k); } (Value as FloatCurve).Curve = tmp; } else if (MemberType == typeof(List <ResourceRatio>)) { List <ResourceRatio> l = (newValue as List <ResourceRatio>); //List<ResourceRatio> l2 = new List<ResourceRatio>(); for (int i = 0; i < l.Count; i++) { ResourceRatio tmp = l[i]; tmp.Ratio *= scale; (Value as List <ResourceRatio>)[i] = tmp; } } else if (MemberType == typeof(ConversionRecipe)) { ConversionRecipe l = (newValue as ConversionRecipe); ScaleResourceList(l.Inputs, scale); ScaleResourceList(l.Outputs, scale); ScaleResourceList(l.Requirements, scale); } }
public override void OnLoad(ConfigNode node) { if (inputList == null) { inputList = new List <ResourceRatio>(); } if (outputList == null) { outputList = new List <ResourceRatio>(); } if (reqList == null) { reqList = new List <ResourceRatio>(); } if (node.HasNode("INPUT_RESOURCE")) { inputList.Clear(); } if (node.HasNode("OUTPUT_RESOURCE")) { outputList.Clear(); } if (node.HasNode("REQUIRED_RESOURCE")) { reqList.Clear(); } var count = node.CountNodes; for (int i = 0; i < count; ++i) { var subNode = node.nodes[i]; var newResource = new ResourceRatio() { FlowMode = ResourceFlowMode.NULL }; if (!subNode.HasValue("ResourceName") && subNode.name.EndsWith("_RESOURCE")) { Debug.Log("Resource must have value 'ResourceName'"); continue; } newResource.Load(subNode); switch (subNode.name) { case "INPUT_RESOURCE": inputList.Add(newResource); break; case "OUTPUT_RESOURCE": outputList.Add(newResource); break; case "REQUIRED_RESOURCE": reqList.Add(newResource); break; } } }
public void ScaleResourceList(List <ResourceRatio> l, double scale) { for (int i = 0; i < l.Count; i++) { ResourceRatio tmp = l[i]; tmp.Ratio *= scale; l[i] = tmp; } }
/** * Prepare the recipe with regard to the amount of crew in this module */ protected override ConversionRecipe PrepareRecipe(double deltatime) { double rate = currentRate; ConversionRecipe newRecipe = new ConversionRecipe(); //the amounts (use?) newRecipe.FillAmount = 1; newRecipe.TakeAmount = 1; if (ModuleIsActive()) { status = "In Progress"; } else { status = "Inactive"; } //the amounts (use?) newRecipe.FillAmount = 1; // (float)rate; newRecipe.TakeAmount = 1; // (float)rate; //add the inputs to the recipe foreach (ResourceRatio res in inputList) { ResourceRatio newRes = new ResourceRatio(); newRes.ResourceName = res.ResourceName; newRes.FlowMode = res.FlowMode; newRes.Ratio = res.Ratio * rate; newRes.DumpExcess = res.DumpExcess; newRecipe.Inputs.Add(newRes); } //add the outputs to the recipe foreach (ResourceRatio res in outputList) { ResourceRatio newRes = new ResourceRatio(); newRes.ResourceName = res.ResourceName; newRes.FlowMode = res.FlowMode; newRes.DumpExcess = res.DumpExcess; newRes.Ratio = res.Ratio * rate; newRecipe.Outputs.Add(newRes); } //only add the fertilizer as a requirement when it is used foreach (ResourceRatio res in reqList) { ResourceRatio newRes = new ResourceRatio(); newRes.ResourceName = res.ResourceName; newRes.FlowMode = res.FlowMode; newRes.DumpExcess = res.DumpExcess; newRes.Ratio = res.Ratio * rate; newRecipe.Outputs.Add(newRes); } return(newRecipe); }
/** * Prepare the recipe with regard to the amount of crew in this module */ protected override ConversionRecipe PrepareRecipe(double deltatime) { double rate = currentRate; ConversionRecipe newRecipe = new ConversionRecipe(); //the amounts (use?) newRecipe.FillAmount = 1; newRecipe.TakeAmount = 1; if (ModuleIsActive()) { status = "In Progress"; } else { status = "Inactive"; } //the amounts (use?) newRecipe.FillAmount = 1;// (float)rate; newRecipe.TakeAmount = 1;// (float)rate; //add the inputs to the recipe foreach (ResourceRatio res in inputList) { ResourceRatio newRes = new ResourceRatio(); newRes.ResourceName = res.ResourceName; newRes.FlowMode = res.FlowMode; newRes.Ratio = res.Ratio * rate; newRes.DumpExcess = res.DumpExcess; newRecipe.Inputs.Add(newRes); } //add the outputs to the recipe foreach (ResourceRatio res in outputList) { ResourceRatio newRes = new ResourceRatio(); newRes.ResourceName = res.ResourceName; newRes.FlowMode = res.FlowMode; newRes.DumpExcess = res.DumpExcess; newRes.Ratio = res.Ratio * rate; newRecipe.Outputs.Add(newRes); } //only add the fertilizer as a requirement when it is used foreach (ResourceRatio res in reqList) { ResourceRatio newRes = new ResourceRatio(); newRes.ResourceName = res.ResourceName; newRes.FlowMode = res.FlowMode; newRes.DumpExcess = res.DumpExcess; newRes.Ratio = res.Ratio * rate; newRecipe.Outputs.Add(newRes); } return newRecipe; }
public override void OnStart(StartState state) { base.OnStart(state); if (inputList.Count >= 3) { closedRatio = inputList[1]; openRatio = inputList[2]; } updateRecipe(); }
private bool HasResource(ResourceRatio resInfo) { var resourceName = resInfo.ResourceName; var costMultiplier = USI_ConverterOptions.ConverterSwapCostMultiplierValue; if (costMultiplier <= ResourceUtilities.FLOAT_TOLERANCE) { return(true); } var needed = resInfo.Ratio * costMultiplier; var whpList = LogisticsTools.GetRegionalWarehouses(vessel, "USI_ModuleResourceWarehouse"); //EC we're a lot less picky... if (resInfo.ResourceName == "ElectricCharge") { whpList.AddRange(part.vessel.parts); } var count = whpList.Count; for (int i = 0; i < count; ++i) { var whp = whpList[i]; if (whp == part) { continue; } if (resInfo.ResourceName != "ElectricCharge") { var wh = whp.FindModuleImplementing <USI_ModuleResourceWarehouse>(); if (wh != null) { if (!wh.localTransferEnabled) { continue; } } } if (whp.Resources.Contains(resourceName)) { var res = whp.Resources[resourceName]; if (res.amount >= needed) { needed = 0; break; } else { needed -= res.amount; } } } return(needed < ResourceUtilities.FLOAT_TOLERANCE); }
protected void getConverterResources(string nodeName, List <ResourceRatio> resourceList, ConfigNode node) { ConfigNode[] resourceNodes; ConfigNode resourceNode; string resourceName; ResourceRatio ratio; resourceNodes = node.GetNodes(nodeName); for (int resourceIndex = 0; resourceIndex < resourceNodes.Length; resourceIndex++) { //Resource name resourceNode = resourceNodes[resourceIndex]; if (resourceNode.HasValue("ResourceName")) { resourceName = resourceNode.GetValue("ResourceName"); } else { resourceName = ""; } //Skip electric charge if (resourceName == "ElectricCharge") { continue; } //Ratio ratio = new ResourceRatio(); ratio.ResourceName = resourceName; if (resourceNode.HasValue("Ratio")) { double.TryParse(resourceNode.GetValue("Ratio"), out ratio.Ratio); } //Flow mode if (resourceNode.HasValue("FlowMode")) { switch (resourceNode.GetValue("FlowMode")) { case "NO_FLOW": case "NULL": ratio.FlowMode = ResourceFlowMode.NO_FLOW; break; default: ratio.FlowMode = ResourceFlowMode.ALL_VESSEL; break; } } //Add to the list resourceList.Add(ratio); } }
private bool IsResourceSatisfyingMiningRequirement(ResourceRatio resource) { if (!ColonizationResearchScenario.Instance.TryParseTieredResourceName(resource.ResourceName, out TieredResource tieredResource, out TechTier tier) || tieredResource != ColonizationResearchScenario.Instance.CrushInsResource) { return(false); } // TODO: Validate that the amount is sufficient; return(true); }
public BoiloffFuel(ConfigNode node, Part p) { part = p; node.TryGetValue("FuelName", ref fuelName); node.TryGetValue("BoiloffRate", ref boiloffRate); outputs = new List <ResourceRatio>(); ConfigNode[] outNodes = node.GetNodes("OUTPUT_RESOURCE"); for (int i = 0; i < outNodes.Length; i++) { ResourceRatio r = new ResourceRatio(); r.Load(outNodes[i]); outputs.Add(r); } }
private void LoadPlanetYields(List <ResourceRatio> inputs) { _lastLoadedPlanet = vessel.mainBody.flightGlobalsIndex; List <string> inputResourcesNames = GetResourceNames(inputs); Dictionary <string, double> planetResourceAbundance = GetResourceAbundance(vessel.mainBody.flightGlobalsIndex, inputResourcesNames); var totalAbundance = planetResourceAbundance.Sum(r => r.Value); _resourceYields = new List <ResourceRatio>(); foreach (var res in planetResourceAbundance) { if (res.Value > MinAbundance) { var resourceYield = Yield * res.Value / totalAbundance; var newYield = new ResourceRatio { FlowMode = ResourceFlowMode.ALL_VESSEL, Ratio = resourceYield, ResourceName = res.Key, DumpExcess = true }; var con = KolonizationSetup.Instance.AutoConverters.Where(c => c.InputResource == res.Key).ToArray(); var count = con.Count(); if (count > 0) { for (int i = 0; i < count; ++i) { var thisCon = con[i]; var conYield = new ResourceRatio { FlowMode = ResourceFlowMode.ALL_VESSEL, Ratio = newYield.Ratio * thisCon.yield, ResourceName = thisCon.OutputResource, DumpExcess = true }; _resourceYields.Add(conYield); } } else { _resourceYields.Add(newYield); } } } }
private void TakeResources(ResourceRatio resInfo) { var resourceName = resInfo.ResourceName; var costMultiplier = USI_ConverterOptions.ConverterSwapCostMultiplierValue; if (costMultiplier > 0) { var needed = resInfo.Ratio * costMultiplier; //Pull in from warehouses var whpList = LogisticsTools.GetRegionalWarehouses(vessel, "USI_ModuleResourceWarehouse"); var count = whpList.Count; for (int i = 0; i < count; ++i) { var whp = whpList[i]; if (whp == part) { continue; } var wh = whp.FindModuleImplementing <USI_ModuleResourceWarehouse>(); if (wh != null) { if (!wh.localTransferEnabled) { continue; } } if (whp.Resources.Contains(resourceName)) { var res = whp.Resources[resourceName]; if (res.amount >= needed) { res.amount -= needed; needed = 0; break; } else { needed -= res.amount; res.amount = 0; } } } } }
// Prepare the recipe with regard to the amount of crew in this module protected override ConversionRecipe PrepareRecipe(double deltatime) { ConversionRecipe recipe = base.PrepareRecipe(deltatime); if (recipe != null) { //change the rate of the inputs for (int i = 0; i < recipe.Inputs.Count; i++) { ResourceRatio res = recipe.Inputs[i]; res.Ratio = inputList[i].Ratio * (productionSpeed / 100f); recipe.Inputs[i] = res; } //change the rate of the outputs for (int i = 0; i < recipe.Outputs.Count; i++) { ResourceRatio res = recipe.Outputs[i]; res.Ratio = outputList[i].Ratio * (productionSpeed / 100f); //Dump oxygen when set to true if (res.ResourceName == "Oxygen") { if (dumpOxygen) { res.DumpExcess = true; } else { res.DumpExcess = false; } } recipe.Outputs[i] = res; } //change the value of the requirements for (int i = 0; i < recipe.Requirements.Count; i++) { ResourceRatio res = recipe.Requirements[i]; res.Ratio = reqList[i].Ratio * (productionSpeed / 100f); recipe.Requirements[i] = res; } } return(recipe); }
public static bool PrintIngredient(StringBuilder sb, Ingredient ingredient, string unit) { string name = ingredient.name; double ratio = ingredient.ratio; ResourceRatio Ratio = new ResourceRatio(name, ratio, false); var def = PartResourceLibrary.Instance.GetDefinition(name); if (def != null) { if (def.density > 0) { Ratio.Ratio /= def.density; } PrintResource(sb, Ratio, unit); return(true); } return(false); }
List<ResourceRatio> ProcessRatio (List<ResourceRatio> mass_ratios, double mass = 1) { var unit_ratios = new List<ResourceRatio> (); for (int i = 0; i < mass_ratios.Count; i++) { var ratio = new ResourceRatio (); var def = PartResourceLibrary.Instance.GetDefinition (mass_ratios[i].ResourceName); if (def == null) { Debug.LogError (String.Format ("[EL Converter] unknown resource '{0}'", mass_ratios[i].ResourceName)); continue; } ratio.ResourceName = mass_ratios[i].ResourceName; ratio.Ratio = mass * mass_ratios[i].Ratio; if (def.density > 0) { ratio.Ratio /= def.density; } ratio.DumpExcess = mass_ratios[i].DumpExcess; ratio.FlowMode = mass_ratios[i].FlowMode; unit_ratios.Add (ratio); } return unit_ratios; }
protected void loadResourceNodes(ConfigNode node, string nodeName, List <ResourceRatio> resources) { ConfigNode[] resourceNodes; ConfigNode resourceNode; ResourceRatio resourceRatio; if (node.HasNode(nodeName)) { resourceNodes = node.GetNodes(nodeName); for (int index = 0; index < resourceNodes.Length; index++) { resourceNode = resourceNodes[index]; resourceRatio = new ResourceRatio(); resourceRatio.Load(resourceNode); resources.Add(resourceRatio); } } }
public override void OnLoad(ConfigNode node) { base.OnLoad(node); if (node.HasNode("DRAINED_RESOURCE")) { ConfigNode[] nodes = node.GetNodes("DRAINED_RESOURCE"); double ratio = 0; bool dumpExcess = true; ResourceFlowMode flowMode = ResourceFlowMode.ALL_VESSEL; for (int index = 0; index < nodes.Length; index++) { ConfigNode configNode = nodes[index]; if (!configNode.HasValue("ResourceName") && !configNode.HasValue("Ratio")) { continue; } ratio = 0; dumpExcess = true; double.TryParse(configNode.GetValue("Ratio"), out ratio); bool.TryParse(configNode.GetValue("DumpExcess"), out dumpExcess); ResourceRatio resource = new ResourceRatio(node.GetValue("ResourceName"), ratio, dumpExcess); flowMode = ResourceFlowMode.ALL_VESSEL; if (configNode.HasValue("FlowMode")) { flowMode = (ResourceFlowMode)Enum.Parse(typeof(ResourceFlowMode), configNode.GetValue("FlowMode")); resource.FlowMode = flowMode; } else { resource.FlowMode = ResourceFlowMode.ALL_VESSEL; } drainedResources.Add(resource); } } }
protected double FindResourceAvailablePercentage(ResourceRatio resource) { var resourceName = resource.ResourceName; var needed = resource.Ratio; if (needed < ResourceUtilities.FLOAT_TOLERANCE) { return(1d); } var available = 0d; var warehouses = LogisticsTools.GetRegionalModules <USI_ModuleResourceWarehouse>(vessel); if (warehouses == null || warehouses.Count < 1) { return(available); } foreach (var warehouse in warehouses) { if (warehouse.vessel != vessel && !warehouse.localTransferEnabled && resourceName != "ElectricCharge") { continue; } if (warehouse.part.Resources.Contains(resourceName)) { var partResource = warehouse.part.Resources[resourceName]; if (partResource.flowState) { available += warehouse.part.Resources[resourceName].amount; if (available >= needed) { return(1d); } } } } return(available / needed); }
public static void PrintResource(StringBuilder sb, ResourceRatio ratio) { var def = PartResourceLibrary.Instance.GetDefinition(ratio.ResourceName); sb.Append("\n - "); sb.Append(ratio.ResourceName); string unit, period; double rate; if (def.density > 0) { rate = ratio.Ratio * def.density; unit = "t"; } else { rate = ratio.Ratio; unit = "u"; } if (rate < 0.1 / KSPUtil.dateTimeFormatter.Hour) { rate *= KSPUtil.dateTimeFormatter.Day; period = "day"; } else if (rate < 0.1 / KSPUtil.dateTimeFormatter.Minute) { rate *= KSPUtil.dateTimeFormatter.Hour; period = "hr"; } else if (rate < 0.1) { rate *= KSPUtil.dateTimeFormatter.Minute; period = "m"; } else { period = "s"; } sb.AppendFormat(" {0:0.00} {1}/{2}", rate, unit, period); }
private void ConsumeResource(ResourceRatio resInfo, double percentage) { var resourceName = resInfo.ResourceName; var needed = resInfo.Ratio * percentage; //Pull in from warehouses var sourceParts = LogisticsTools.GetRegionalWarehouses(vessel, "USI_ModuleResourceWarehouse"); foreach (var sourcePart in sourceParts) { if (sourcePart == part) { continue; } var warehouse = sourcePart.FindModuleImplementing <USI_ModuleResourceWarehouse>(); if (warehouse != null) { if (!warehouse.localTransferEnabled) { continue; } } if (sourcePart.Resources.Contains(resourceName)) { var res = sourcePart.Resources[resourceName]; if (res.amount >= needed) { res.amount -= needed; needed = 0; break; } else { needed -= res.amount; res.amount = 0; } } } }
private double FindResources(ResourceRatio resInfo) { var resourceName = resInfo.ResourceName; var needed = resInfo.Ratio; if (needed < ResourceUtilities.FLOAT_TOLERANCE) { return(1d); } var available = 0d; var sourceParts = LogisticsTools.GetRegionalWarehouses(vessel, "USI_ModuleResourceWarehouse"); foreach (var sourcePart in sourceParts) { if (sourcePart == part) { continue; } var warehouse = sourcePart.FindModuleImplementing <USI_ModuleResourceWarehouse>(); if (resInfo.ResourceName != "ElectricCharge" && warehouse != null) //EC we're a lot less picky... { if (!warehouse.localTransferEnabled) { continue; } } if (sourcePart.Resources.Contains(resourceName)) { available += sourcePart.Resources[resourceName].amount; if (available >= needed) { return(1d); } } } return(available / needed); }
/** * Init the module on start */ public override void OnStart(PartModule.StartState state) { base.OnStart(state); if (!methodSet) { GameEvents.onVesselSOIChanged.Add(OnBodyChange); methodSet = true; } ResourceRatio resDefault = outputList.ElementAt <ResourceRatio>(0); //get the resources and defs string[] resourcesDef = planetResourceAvailability.Split(';'); for (int i = 0; i < resourcesDef.Length; i++) { //split between planets string[] resource = resourcesDef[i].Split(':'); string[] planets = resource[1].Split(','); resourceNames.Add(resource[0]); bodyNames.Add(planets); } if (resourceNames.Count > 0) { outputResource = resourceNames[0]; } if (numResource != -1) { outputResource = resourceNames[numResource]; } /*if (!HighLogic.LoadedSceneIsEditor) * { * Events["changeResource"].guiActive = false; * }*/ }
protected override ConversionRecipe PrepareRecipe(double deltatime) { ConversionRecipe recipe = base.PrepareRecipe(deltatime); try { int count = outputList.Count; ResourceRatio ratio; recipe.Outputs.Clear(); for (int index = 0; index < count; index++) { ratio = new ResourceRatio(outputList[index].ResourceName, outputList[index].Ratio * productionEfficiency, outputList[index].DumpExcess); ratio.FlowMode = outputList[index].FlowMode; recipe.Outputs.Add(ratio); } } catch (Exception ex) { Debug.Log("[SnackProcessor] - error when preparing recipe: " + ex); } return(recipe); }
// Set ModuleResourceConverter ratios based on an input scale private void RecalculateRatios(float fuelInputScale) { for (int i = 0; i < inputList.Count; i++) { for (int j = 0; j < inputs.Count; j++) { if (inputs[j].ResourceName == inputList[i].ResourceName) { inputList[i] = new ResourceRatio(inputList[i].ResourceName, inputs[j].ResourceRatio * fuelInputScale, inputList[i].DumpExcess); } } } for (int i = 0; i < outputList.Count; i++) { for (int j = 0; j < outputs.Count; j++) { if (outputs[j].ResourceName == outputList[i].ResourceName) { outputList[i] = new ResourceRatio(outputList[i].ResourceName, inputs[j].ResourceRatio * fuelInputScale, outputList[i].DumpExcess); } } } }
private void TakeResources(ResourceRatio resInfo) { var resourceName = resInfo.ResourceName; var needed = resInfo.Ratio; //Pull in from warehouses var whpList = LogisticsTools.GetRegionalWarehouses(vessel, "USI_ModuleResourceWarehouse"); foreach (var whp in whpList.Where(w => w != part)) { var wh = whp.FindModuleImplementing<USI_ModuleResourceWarehouse>(); if (!wh.transferEnabled) continue; if (whp.Resources.Contains(resourceName)) { var res = whp.Resources[resourceName]; if (res.amount >= needed) { res.amount -= needed; needed = 0; break; } else { needed -= res.amount; res.amount = 0; } } } }
private bool HasResource(ResourceRatio resInfo) { var resourceName = resInfo.ResourceName; var needed = resInfo.Ratio; var whpList = LogisticsTools.GetRegionalWarehouses(vessel, "USI_ModuleResourceWarehouse"); //EC we're a lot less picky... if (resInfo.ResourceName == "ElectricCharge") { whpList.AddRange(part.vessel.parts); } foreach (var whp in whpList.Where(w => w != part)) { if (resInfo.ResourceName != "ElectricCharge") { var wh = whp.FindModuleImplementing<USI_ModuleResourceWarehouse>(); if (!wh.transferEnabled) continue; } if (whp.Resources.Contains(resourceName)) { var res = whp.Resources[resourceName]; if (res.amount >= needed) { needed = 0; break; } else { needed -= res.amount; } } } return (needed < ResourceUtilities.FLOAT_TOLERANCE); }
/** * Prepare the recipe with regard to the amount of crew in this module */ protected override ConversionRecipe PrepareRecipe(double deltatime) { double rate = currentRate; if (rate < 0.0d) { rate = maxProductionRate; } //rate = rate *deltatime * 50; ConversionRecipe newRecipe = new ConversionRecipe(); if (this.ModuleIsActive()) { status = "In Progress"; } else { status = "Inactive"; } //the amounts (use?) newRecipe.FillAmount = 1;// (float)rate; newRecipe.TakeAmount = 1;// (float)rate; //add the inputs to the recipe foreach (ResourceRatio res in inputList) { if (useGrowthPromoter || !res.ResourceName.Equals(boosterName)) { ResourceRatio newRes = new ResourceRatio(); newRes.ResourceName = res.ResourceName; newRes.FlowMode = res.FlowMode; newRes.Ratio = res.Ratio * rate; newRes.DumpExcess = res.DumpExcess; newRecipe.Inputs.Add(newRes); } } //add the outputs to the recipe foreach (ResourceRatio res in outputList) { ResourceRatio newRes = new ResourceRatio(); newRes.ResourceName = res.ResourceName; newRes.FlowMode = res.FlowMode; newRes.DumpExcess = res.DumpExcess; //when we have the main resource and the fertilizer active if (useGrowthPromoter && res.ResourceName.Equals(boostedOutputName)) { newRes.Ratio = res.Ratio * rate * fertilizerBenefit; } else { newRes.Ratio = res.Ratio * rate; } newRecipe.Outputs.Add(newRes); } //only add the fertilizer as a requirement when it is used foreach (ResourceRatio res in reqList) { if (res.ResourceName.Equals(boosterName)) { if (useGrowthPromoter) { newRecipe.Requirements.Add(res); } } else { newRecipe.Requirements.Add(res); } } return newRecipe; }