Beispiel #1
0
 // 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);
            }
        }
Beispiel #3
0
        /// <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);
            }
        }
Beispiel #4
0
        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;
                            }
                        }
                    }
                }
            }
        }
Beispiel #5
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);
            }
        }
Beispiel #6
0
        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);
                }
            }
        }
Beispiel #7
0
        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);
            }
        }
Beispiel #8
0
        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);
        }
Beispiel #9
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);
                    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);
        }
Beispiel #10
0
        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);
            }
        }
Beispiel #11
0
        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;
                }
            }
        }
Beispiel #12
0
 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;
        }
Beispiel #15
0
 public override void OnStart(StartState state)
 {
     base.OnStart(state);
     if (inputList.Count >= 3)
     {
         closedRatio = inputList[1];
         openRatio   = inputList[2];
     }
     updateRecipe();
 }
Beispiel #16
0
        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);
            }
        }
Beispiel #18
0
        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);
                }
            }
Beispiel #20
0
        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);
                    }
                }
            }
        }
Beispiel #21
0
        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);
        }
Beispiel #23
0
        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);
                }
            }
        }
Beispiel #26
0
        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);
                }
            }
        }
Beispiel #27
0
        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);
        }
Beispiel #29
0
        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;
                    }
                }
            }
        }
Beispiel #30
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);
        }
Beispiel #31
0
        /**
         * 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;
        }