private static bool MineAsteroidComet(IResourceManager resMan, ModuleSpaceObjectInfo spaceObjectInfo, List <ModuleSpaceObjectResource> asteroidCometResources, double drillSize, double effectiveness, double percentPower)
        {
            // TODO - can we add a bonus multiplier here? Perhaps based on asteroid mass?
            double bonusMultiplier = 0.05; // 0.0005
            double minedAmount     = bonusMultiplier * drillSize * effectiveness * percentPower;

            minedAmount = Math.Min(minedAmount, (spaceObjectInfo.currentMassVal - spaceObjectInfo.massThresholdVal));
            if (minedAmount < 1e-6)
            {
                spaceObjectInfo.currentMassVal = spaceObjectInfo.massThresholdVal;
                return(false);
            }

            foreach (var resource in asteroidCometResources)
            {
                var def = PartResourceLibrary.Instance.GetDefinition(resource.resourceName);
                if (def == null)
                {
                    continue;
                }

                var amount = (minedAmount * resource.abundance) * def.density;

                if (amount == 0)
                {
                    continue;
                }

                var resId = KITResourceSettings.NameToResource(resource.resourceName);
                resMan.Produce(resId, amount);
            }

            spaceObjectInfo.currentMassVal = Math.Max(spaceObjectInfo.massThresholdVal, spaceObjectInfo.currentMassVal - (minedAmount * resMan.FixedDeltaTime()));

            return(true);
        }
Esempio n. 2
0
        public GasLiquidConversion()
        {
            if (_conversionTable != null)
            {
                return;
            }
            _conversionTable = new Dictionary <ResourceName, Conversion>(24);

            var rootNode = GameDatabase.Instance.GetConfigNodes("KIT_GAS_LIQUID_CONVERSION");

            if (rootNode == null || rootNode.Length == 0)
            {
                Debug.Log("[GasLiquidConversion] Can not find configuration node KIT_GAS_LIQUID_CONVERSION");
                return;
            }

            foreach (var node in rootNode[0].GetNodes("Conversion"))
            {
                string secondaryResourceName;

                double maxPowerSecondary, primaryConversionEnergyCost, secondaryConversionEnergyCost;

                var primaryResourceName = secondaryResourceName = "";
                var maxPowerPrimary     = maxPowerSecondary = primaryConversionEnergyCost = secondaryConversionEnergyCost = 0;
                var failed = !node.TryGetValue(nameof(primaryResourceName), ref primaryResourceName);

                if (!node.TryGetValue(nameof(secondaryResourceName), ref secondaryResourceName))
                {
                    failed = true;
                }
                if (!node.TryGetValue(nameof(maxPowerPrimary), ref maxPowerPrimary))
                {
                    failed = true;
                }
                if (!node.TryGetValue(nameof(maxPowerSecondary), ref maxPowerSecondary))
                {
                    failed = true;
                }
                if (!node.TryGetValue(nameof(primaryConversionEnergyCost), ref primaryConversionEnergyCost))
                {
                    failed = true;
                }
                if (!node.TryGetValue(nameof(secondaryConversionEnergyCost), ref secondaryConversionEnergyCost))
                {
                    failed = true;
                }

                if (failed)
                {
                    Debug.Log($"[GasLiquidConversion] unable to parse the entry of {primaryResourceName} / {secondaryResourceName} / {maxPowerPrimary} / {maxPowerSecondary}");
                    continue;
                }

                var primaryId   = KITResourceSettings.NameToResource(primaryResourceName);
                var secondaryId = KITResourceSettings.NameToResource(secondaryResourceName);

                if (primaryId == ResourceName.Unknown || secondaryId == ResourceName.Unknown)
                {
                    Debug.Log($"[GasLiquidConversion] can't convert either {primaryResourceName} or {secondaryResourceName} to KIT resource");
                    continue;
                }

                var primaryDefinition   = PartResourceLibrary.Instance.GetDefinition(primaryResourceName);
                var secondaryDefinition = PartResourceLibrary.Instance.GetDefinition(secondaryResourceName);

                if (primaryDefinition == null || secondaryDefinition == null)
                {
                    Debug.Log($"[GasLiquidConversion] unable to find resource definition {primaryResourceName} and/or {secondaryResourceName}");
                    return;
                }

                if (primaryDefinition.density == 0 || secondaryDefinition.density == 0)
                {
                    Debug.Log("[GasLiquidConversion] why is the definition density 0 on {primaryResourceName} and/or {secondaryResourceName}");
                    return;
                }

                _conversionTable[primaryId] = new Conversion(maxPowerPrimary, maxPowerSecondary, primaryConversionEnergyCost, secondaryConversionEnergyCost, primaryDefinition, secondaryDefinition);
            }
        }
Esempio n. 3
0
        public bool ProvideResource(IResourceManager resMan, ResourceName resource, double requestedAmount)
        {
            var gasToLiquidRequest = (resource >= LiquidStart && resource <= LiquidEnd);
            var liquidToGasRequest = (resource >= GasStart && resource <= GasEnd);

            if (gasToLiquidRequest == liquidToGasRequest)
            {
                throw new NotImplementedException($"Neither a gas nor a liquid request {resource} and {KITResourceSettings.ResourceToName(resource)}");
            }

            if (gasToLiquidRequest)
            {
                ConvertGasToLiquid(resMan, resource, requestedAmount);
            }
            else
            {
                ConvertLiquidToGas(resMan, resource, requestedAmount);
            }

            return(true);
        }