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); }
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); } }
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); }