public override bool Initialize(PartModule pm) { base.Initialize(pm); gen = (ModuleGenerator)pm; bool toMonitor = false; for (int i = 0; i < gen.resHandler.inputResources.Count; i++) { if (gen.resHandler.inputResources[i].name == "ElectricCharge") { producer = false; consumer = true; savedRate = gen.resHandler.inputResources[i].rate; toMonitor = true; } } for (int i = 0; i < gen.resHandler.outputResources.Count; i++) { if (gen.resHandler.outputResources[i].name == "ElectricCharge") { producer = true; consumer = false; savedRate = gen.resHandler.outputResources[i].rate; toMonitor = true; } } return(toMonitor); }
public static bool HasResourceGenerationData( PartModule m, ProtoPartModuleSnapshot s, Dictionary <String, List <ResourceModuleHandler> > resourceData, HashSet <String> interestingResources ) { bool active = false; Boolean.TryParse(s.moduleValues.GetValue("generatorIsActive"), out active); if (active) { ModuleGenerator g = (ModuleGenerator)m; if (g.resHandler.inputResources.Count <= 0) { foreach (ModuleResource gr in g.resHandler.outputResources) { if (interestingResources.Contains(gr.name)) { return(true); } } } } return(false); }
/// <summary> /// Allows enabling/disabling electric generators (and fuel cells) /// </summary> /// <param name="state"></param> public void ButtonEnableElectricGenerator(bool state) { if (vessel != null) { foreach (PartModule pm in ElectricGenerators(vessel)) { if (pm is ModuleGenerator) { ModuleGenerator gen = pm as ModuleGenerator; if (state) { gen.Activate(); } else { gen.Shutdown(); } } else if (pm is ModuleResourceConverter) { ModuleResourceConverter gen = pm as ModuleResourceConverter; if (state) { gen.StartResourceConverter(); } else { gen.StopResourceConverter(); } } } } }
private void SetGeneratorInfo() { moduleGenerator = selectedPart.GetModule <ModuleGenerator>(); if (moduleGenerator != null) { if (moduleGenerator.inputList.Count > 0) { infoItems.Add(PartInfoItem.Create("Generator Input")); for (int i = 0; i < moduleGenerator.inputList.Count; ++i) { generatorResource = moduleGenerator.inputList[i]; infoItems.Add(PartInfoItem.Create("\t" + generatorResource.name, generatorResource.rate.ToRate())); } } if (moduleGenerator.outputList.Count > 0) { infoItems.Add(PartInfoItem.Create("Generator Output")); for (int i = 0; i < moduleGenerator.outputList.Count; ++i) { generatorResource = moduleGenerator.outputList[i]; infoItems.Add(PartInfoItem.Create("\t" + generatorResource.name, generatorResource.rate.ToRate())); } } if (moduleGenerator.isAlwaysActive) { infoItems.Add(PartInfoItem.Create("Generator is Always Active")); } } }
private double CalculateOtherPower() { double otherPower = 0; foreach (var part in this.vessel.parts) { ModuleGenerator powerModule = part.FindModuleImplementing <ModuleGenerator>(); if (powerModule == null) { continue; } if (powerModule.generatorIsActive || powerModule.isAlwaysActive) { // foreach (var resource in powerModule.outputList) foreach (var resource in powerModule.resHandler.outputResources) { if (resource.name == "ElectricCharge") { otherPower += resource.rate * powerModule.efficiency; } } } } return(otherPower); } // So many ifs.....
internal static double CalculateOtherPower(Vessel vessel) { double otherPower = 0; List <ModuleGenerator> powerModules = vessel.FindPartModulesImplementing <ModuleGenerator> (); for (int i = 0; i < powerModules.Count; i++) { // Find standard RTGs ModuleGenerator powerModule = powerModules [i]; if (powerModule.generatorIsActive || powerModule.isAlwaysActive) { for (int j = 0; j < powerModule.resHandler.outputResources.Count; ++j) { var resource = powerModule.resHandler.outputResources [j]; if (resource.name == "ElectricCharge") { otherPower += resource.rate * powerModule.efficiency; } } } } for (int i = 0; i < vessel.parts.Count; i++) { var part = vessel.parts [i]; // Search for other generators PartModuleList modules = part.Modules; for (int j = 0; j < modules.Count; j++) { var module = modules [j]; // Near future fission reactors if (module.moduleName == "FissionGenerator") { otherPower += double.Parse(module.Fields.GetValue("CurrentGeneration").ToString()); } } // USI reactors ModuleResourceConverter converterModule = part.FindModuleImplementing <ModuleResourceConverter> (); if (converterModule != null) { if (converterModule.ModuleIsActive() && converterModule.ConverterName == "Reactor") { for (int j = 0; j < converterModule.outputList.Count; ++j) { var resource = converterModule.outputList [j]; if (resource.ResourceName == "ElectricCharge") { otherPower += resource.Ratio * converterModule.GetEfficiencyMultiplier(); } } } } } return(otherPower); } // So many ifs.....
private IDictionary <string, Binding> ProcessCompleteModule(ModuleGenerator moduleGenerator, bool ignoreCompletenessErrors) { var bindings = new Dictionary <string, Binding>(StringComparer.Ordinal); var overrides = new Dictionary <string, Binding>(StringComparer.Ordinal); var allModules = new Dictionary <string, ModuleGenerator>(StringComparer.Ordinal); var hasError = false; GatherIncludedModules(moduleGenerator, allModules, new Stack <string>()); var resolver = new Resolver(null, plugin, errors => { if (ignoreCompletenessErrors) { return; } hasError = true; foreach (var e in errors) { errorReporter.LogError(e); } }); foreach (var module in allModules.Values) { // Request entry-point bindings var addTo = module.IsOverride ? overrides : bindings; foreach (var entryPointType in module.EntryPoints) { var key = entryPointType.Resolve().IsInterface ? CompilerKeys.ForType(entryPointType) : CompilerKeys.GetMemberKey(entryPointType); resolver.RequestBinding(key, module.ModuleType.FullName, false, true); } foreach (var providerGenerator in module.ProviderGenerators) { var binding = new CompilerProvidesBinding(providerGenerator); if (addTo.ContainsKey(binding.ProviderKey)) { var message = "Duplicate bindings for {0} in {1}{2}."; var addendum = module.IsOverride ? "overriding module " : string.Empty; throw new ValidationException(string.Format (message, binding.ProviderKey, addendum, module.ModuleType.FullName)); } addTo.Add(binding.ProviderKey, binding); } } resolver.InstallBindings(bindings); resolver.InstallBindings(overrides); var allBindings = resolver.ResolveAllBindings(); return(hasError ? null : allBindings); }
public override void OnStart(StartState state) { try { if (state == StartState.Editor) { return; } moduleGenerator = part.FindModuleImplementing <ModuleGenerator>(); if (moduleGenerator == null) { return; } String[] resources_to_supply = { ResourceManager.FNRESOURCE_MEGAJOULES }; this.resources_to_supply = resources_to_supply; base.OnStart(state); resourceBuffers = new ResourceBuffers(); outputType = resourceType.other; foreach (ModuleResource moduleResource in moduleGenerator.resHandler.outputResources) { // assuming only one of those two is present if (moduleResource.name == ResourceManager.FNRESOURCE_MEGAJOULES) { outputType = resourceType.megajoule; resourceBuffers.AddConfiguration(new ResourceBuffers.MaxAmountConfig(ResourceManager.FNRESOURCE_MEGAJOULES, 50)); mockInputResource = new ModuleResource(); mockInputResource.name = moduleResource.name; mockInputResource.id = moduleResource.name.GetHashCode(); moduleGenerator.resHandler.inputResources.Add(mockInputResource); moduleOutputResource = moduleResource; break; } if (moduleResource.name == ResourceManager.STOCK_RESOURCE_ELECTRICCHARGE) { outputType = resourceType.electricCharge; resourceBuffers.AddConfiguration(new ResourceBuffers.MaxAmountConfig(ResourceManager.STOCK_RESOURCE_ELECTRICCHARGE, 50)); mockInputResource = new ModuleResource(); mockInputResource.name = moduleResource.name; mockInputResource.id = moduleResource.name.GetHashCode(); moduleGenerator.resHandler.inputResources.Add(mockInputResource); moduleOutputResource = moduleResource; break; } } resourceBuffers.Init(this.part); } catch (Exception e) { Debug.LogError("[KSPI] - Exception in FNGeneratorAdapter.OnStart " + e.Message); throw; } }
public Context AddDirectory(string baseDir) { Context context = new Context(this); List <DeclaredKontrolModule> declaredModules = new List <DeclaredKontrolModule>(); foreach (string fileName in Directory.GetFiles(baseDir, "*.to2", SearchOption.AllDirectories)) { // First declare the existence of a module and its types TO2Module to2Module = TO2Parser.ParseModuleFile(baseDir, fileName.Remove(0, baseDir.Length + 1)); DeclaredKontrolModule module = ModuleGenerator.DeclareModule(context, to2Module); declaredModules.Add(module); context.registry.RegisterModule(module); } foreach (DeclaredKontrolModule declared in declaredModules) { // ... so that types can be imported by other modules ModuleGenerator.ImportTypes(declared); } foreach (DeclaredKontrolModule declared in declaredModules) { // ... so that function can be declared (potentially using imported types as arguments or return) ModuleGenerator.DeclareFunctions(declared); } foreach (DeclaredKontrolModule declared in declaredModules) { // ... so that other modules may import these functions ModuleGenerator.ImportFunctions(declared); } foreach (DeclaredKontrolModule declared in declaredModules) { // ... so that we should now be able to infer all types ModuleGenerator.VerifyFunctions(declared); } foreach (DeclaredKontrolModule declared in declaredModules) { ModuleGenerator.CompileStructs(declared); } foreach (DeclaredKontrolModule declared in declaredModules) { // ... and eventually emit the code and bake the modules CompiledKontrolModule compiled = ModuleGenerator.CompileModule(declared); context.registry.RegisterModule(compiled); } return(context); }
private void WriteModuleGraph( ModuleGenerator completeModule, IDictionary <string, Binding> allBindings, string graphvizDirectory) { var safeModuleName = completeModule.ModuleType.FullName.Replace('/', '.'); var fileName = Path.Combine(graphvizDirectory, safeModuleName + ".dot"); using (var fs = File.Open(fileName, FileMode.Create, FileAccess.Write)) using (var dotWriter = new DotWriter(fs)) { new GraphWriter().Write(dotWriter, allBindings); } }
public Context AddFile(string baseDir, string file) { TO2Module to2Module = TO2Parser.ParseModuleFile(baseDir, file); Context context = new Context(this); DeclaredKontrolModule declaredKontrolModule = ModuleGenerator.DeclareModule(context, to2Module); ModuleGenerator.ImportTypes(declaredKontrolModule); ModuleGenerator.DeclareFunctions(declaredKontrolModule); ModuleGenerator.ImportFunctions(declaredKontrolModule); ModuleGenerator.VerifyFunctions(declaredKontrolModule); CompiledKontrolModule kontrolModule = ModuleGenerator.CompileModule(declaredKontrolModule); RegisterModule(kontrolModule); return(context); }
void Process_generator(ModuleGenerator generator, Part p) { // skip launch clamps, that include a generator if (Lib.PartName(p) == "launchClamp1") return; SimulatedRecipe recipe = new SimulatedRecipe(p, "generator"); foreach (ModuleResource res in generator.resHandler.inputResources) { recipe.Input(res.name, res.rate); } foreach (ModuleResource res in generator.resHandler.outputResources) { recipe.Output(res.name, res.rate, true); } recipes.Add(recipe); }
private void Generate(string tablName, string subTablName = null, bool copyRes = true) { var tabls = new TablsList(); using (var db = new DaoDb(TestLib.CopyFile("Generator", "GenData.accdb", "Gen" + tablName + "Data.accdb"))) { tabls.AddStruct(db, "Tabl", "SubTabl", "SubSubTabl"); tabls.AddDbStructs(db); tabls.LoadValues(db, true); } TestLib.CopyFile("Generator", "GenTemplate.accdb", "Gen" + tablName + "Template.accdb"); if (copyRes) { TestLib.CopyFile("Generator", "GenRes.accdb", "Gen" + tablName + "Res.accdb"); } TestLib.CopyFile("Generator", "CorrectGen" + tablName + ".accdb", "Gen" + tablName + "Correct.accdb"); var templatesFile = TestLib.TestRunDir + @"Generator\Gen" + tablName + "Template.accdb"; var table = new GenTemplateTable(tablName, "GenRule", "ErrMess", "CalcOn", "Id"); var subTable = subTablName == null ? null : new GenTemplateTable(subTablName, table, "GenRule", "ErrMess", "CalcOn", "Id", "ParentId"); var logger = new Logger(new AppIndicator()); logger.History = new TestHistory(logger); var generator = new ModuleGenerator(logger, tabls, templatesFile, table, subTable); var s = TestLib.TestRunDir + @"Generator\Gen" + tablName; if (copyRes) { generator.Generate(s + "Res.accdb", tablName, subTablName); } using (var db1 = new DaoDb(s + (copyRes ? "Res" : "Template") + ".accdb")) using (var db2 = new DaoDb(s + "Correct" + ".accdb")) { TestLib.CompareTables(db1, db2, tablName, "Id"); if (subTablName != null) { TestLib.CompareTables(db1, db2, subTablName, "Id"); } } }
private void GatherIncludedModules( ModuleGenerator module, IDictionary <string, ModuleGenerator> modules, Stack <string> path) { var name = module.ModuleType.FullName; if (path.Contains(name)) { var sb = new StringBuilder("Circular module dependency: "); if (path.Count == 1) { sb.AppendFormat("{0} includes itself directly.", name); } else { var includer = name; for (var i = 0; path.Count > 0; ++i) { var current = includer; includer = path.Pop(); sb.AppendLine() .AppendFormat("{0}. {1} included by {2}", i, current, includer); } } throw new ValidationException(sb.ToString()); } modules.Add(name, module); foreach (var typeReference in module.IncludedModules) { path.Push(name); GatherIncludedModules(modulesByTypeName[typeReference.FullName], modules, path); path.Pop(); } }
public void CreateSafeHandleTest() { var moduleGenerator = new ModuleGenerator(); moduleGenerator.InputFile = "test.h"; var handles = Handles.CreateSafeHandle("TestHandle", moduleGenerator).ToArray(); Assert.Equal(2, handles.Length); using (Stream stream = new MemoryStream()) { moduleGenerator.WriteType(stream, handles[0], string.Empty); stream.Position = 0; using (StreamReader reader = new StreamReader(stream)) { var actual = reader.ReadToEnd(); var expected = File.ReadAllText("TestHandle.cs.txt"); Assert.Equal(expected, actual); } } using (Stream stream = new MemoryStream()) { moduleGenerator.WriteType(stream, handles[1], string.Empty); stream.Position = 0; using (StreamReader reader = new StreamReader(stream)) { var actual = reader.ReadToEnd(); var expected = File.ReadAllText("TestHandleDelegateMarshaler.cs.txt"); Assert.Equal(expected, actual); } } }
/// <summary> /// Iterate over the modules in the craft and return all of them that /// implement a ModuleGenerator or ModuleResourceConverter that generates /// electricity that can also be shut down. /// </summary> /// <param name="vessel"></param> /// <returns></returns> private static System.Collections.Generic.IEnumerable <PartModule> ElectricGenerators(Vessel vessel) { foreach (Part part in vessel.Parts) { foreach (PartModule pm in part.Modules) { if (pm is ModuleGenerator) { ModuleGenerator gen = pm as ModuleGenerator; if (gen.isAlwaysActive == false) { for (int i = 0; i < gen.outputList.Count; ++i) { if (gen.outputList[i].name == "ElectricCharge") { yield return(pm); } } } } else if (pm is ModuleResourceConverter) { ModuleResourceConverter gen = pm as ModuleResourceConverter; if (gen.AlwaysActive == false) { ConversionRecipe recipe = gen.Recipe; for (int i = 0; i < recipe.Outputs.Count; ++i) { if (recipe.Outputs[i].ResourceName == "ElectricCharge") { yield return(pm); } } } } } } }
/// <summary> /// Iterate over the modules in the craft and return all of them that /// implement a ModuleGenerator or ModuleResourceConverter that generates /// electricity that can also be shut down. /// </summary> /// <param name="vessel"></param> /// <returns></returns> private static System.Collections.Generic.IEnumerable <PartModule> ElectricGenerators(Vessel vessel) { for (int partID = 0; partID < vessel.Parts.Count; ++partID) { for (int moduleID = 0; moduleID < vessel.Parts[partID].Modules.Count; ++moduleID) { if (vessel.Parts[partID].Modules[moduleID] is ModuleGenerator) { ModuleGenerator gen = vessel.Parts[partID].Modules[moduleID] as ModuleGenerator; if (gen.isAlwaysActive == false) { for (int i = 0; i < gen.outputList.Count; ++i) { if (gen.outputList[i].name == "ElectricCharge") { yield return(vessel.Parts[partID].Modules[moduleID]); } } } } else if (vessel.Parts[partID].Modules[moduleID] is ModuleResourceConverter) { ModuleResourceConverter gen = vessel.Parts[partID].Modules[moduleID] as ModuleResourceConverter; if (gen.AlwaysActive == false) { ConversionRecipe recipe = gen.Recipe; for (int i = 0; i < recipe.Outputs.Count; ++i) { if (recipe.Outputs[i].ResourceName == "ElectricCharge") { yield return(vessel.Parts[partID].Modules[moduleID]); } } } } } } }
public static List <ResourceModuleHandler> GetResourceGenerationData( PartModule m, ProtoPartSnapshot part, Dictionary <String, List <ResourceModuleHandler> > resourceData, HashSet <String> interestingResources ) { List <ResourceModuleHandler> ret = new List <ResourceModuleHandler>(); ModuleGenerator g = (ModuleGenerator)m; if (g.resHandler.inputResources.Count <= 0) { foreach (ModuleResource gr in g.resHandler.outputResources) { if (interestingResources.Contains(gr.name)) { ret.Add(new Generator(gr.name, (float)gr.rate)); } } } return(ret); }
void ShutdownGenerator() { foreach (var mod in part.Modules.OfType <ModuleGenerator> ()) { ModuleGenerator gen = mod as ModuleGenerator; gen.isAlwaysActive = true; gen.generatorIsActive = false; gen.Events["Shutdown"].active = false; gen.Events["Activate"].active = false; gen.Fields["efficiency"].guiActive = false; gen.inputList.Clear(); gen.outputList.Clear(); Type genType = gen.GetType(); FieldInfo [] fields = genType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); foreach (var f in fields) { if (f.FieldType == typeof(int)) { f.SetValue(gen, 0); } } } }
// Returns the info-text of the given part with the given upgrades to be displayed in the GUI-comparison. private String getPartInfo(Part part, KRnDUpgrade upgradesToApply = null) { String info = ""; KRnDUpgrade originalUpgrades = null; try { KRnDModule rndModule = KRnD.getKRnDModule(part); if (rndModule == null || (originalUpgrades = rndModule.getCurrentUpgrades()) == null) { return(info); } // Upgrade the part to get the correct info, we revert it back to its previous values in the finally block below: KRnD.updatePart(part, upgradesToApply); List <ModuleEngines> engineModules = KRnD.getEngineModules(part); ModuleRCS rcsModule = KRnD.getRcsModule(part); ModuleReactionWheel reactionWheelModule = KRnD.getReactionWheelModule(part); ModuleDeployableSolarPanel solarPanelModule = KRnD.getSolarPanelModule(part); ModuleWheelBase landingLegModule = KRnD.getLandingLegModule(part); PartResource electricChargeResource = KRnD.getChargeResource(part); ModuleGenerator generatorModule = KRnD.getGeneratorModule(part); PartModule fissionGenerator = KRnD.getFissionGeneratorModule(part); List <ModuleResourceConverter> converterModules = KRnD.getConverterModules(part); ModuleParachute parachuteModule = KRnD.getParachuteModule(part); ModuleProceduralFairing fairingModule = KRnD.getFairingModule(part); List <PartResource> fuelResources = KRnD.getFuelResources(part); // Basic stats: info = "<color=#FFFFFF><b>Dry Mass:</b> " + part.mass.ToString("0.#### t") + "\n"; info += "<b>Max Temp.:</b> " + part.maxTemp.ToString("0.#") + "/" + part.skinMaxTemp.ToString("0.#") + " °K\n"; if (landingLegModule != null) { info += "<b>Crash Tolerance:</b> " + part.crashTolerance.ToString("0.#### m/s") + "\n"; } if (electricChargeResource != null) { info += "<b>Electric Charge:</b> " + electricChargeResource.maxAmount.ToString() + "\n"; } // Fuels: if (fuelResources != null) { foreach (PartResource fuelResource in fuelResources) { // Reformat resource-names like "ElectricCharge" to "Electric Charge": String fuelName = fuelResource.resourceName.ToString(); fuelName = Regex.Replace(fuelName, @"([a-z])([A-Z])", "$1 $2"); info += "<b>" + fuelName + ":</b> " + fuelResource.maxAmount.ToString() + "\n"; } } // Module stats: info += "\n"; if (engineModules != null) { foreach (ModuleEngines engineModule in engineModules) { info += "<color=#99FF00><b>Engine"; if (engineModules.Count > 1) { info += " (" + engineModule.engineID.ToString() + ")"; } info += ":</b></color>\n" + engineModule.GetInfo(); if (engineModules.Count > 1) { info += "\n"; } } } if (rcsModule) { info += "<color=#99FF00><b>RCS:</b></color>\n" + rcsModule.GetInfo(); } if (reactionWheelModule) { info += "<color=#99FF00><b>Reaction Wheel:</b></color>\n" + reactionWheelModule.GetInfo(); } if (solarPanelModule) { info += "<color=#99FF00><b>Solar Panel:</b></color>\n" + KRnD.getSolarPanelInfo(solarPanelModule); } if (generatorModule) { info += "<color=#99FF00><b>Generator:</b></color>\n" + generatorModule.GetInfo(); } if (fissionGenerator) { info += "<color=#99FF00><b>Fission-Generator:</b></color>\n" + fissionGenerator.GetInfo(); } if (converterModules != null) { foreach (ModuleResourceConverter converterModule in converterModules) { info += "<color=#99FF00><b>Converter " + converterModule.ConverterName + ":</b></color>\n" + converterModule.GetInfo() + "\n"; } } if (parachuteModule) { info += "<color=#99FF00><b>Parachute:</b></color>\n" + parachuteModule.GetInfo(); } if (fairingModule) { info += "<color=#99FF00><b>Fairing:</b></color>\n" + fairingModule.GetInfo(); } info += "</color>"; } catch (Exception e) { Debug.LogError("[KRnDGUI] getPartInfo(): " + e.ToString()); } finally { try { if (originalUpgrades != null) { KRnD.updatePart(part, originalUpgrades); } } catch (Exception e) { Debug.LogError("[KRnDGUI] getPartInfo() restore of part failed: " + e.ToString()); } } return(info); }
private void SetGeneratorInfo() { moduleGenerator = selectedPart.GetModule<ModuleGenerator>(); if (moduleGenerator != null) { if (moduleGenerator.resHandler.inputResources.Count > 0) { infoItems.Add(PartInfoItem.Create("Generator Input")); for (int i = 0; i < moduleGenerator.resHandler.inputResources.Count; ++i) { generatorResource = moduleGenerator.resHandler.inputResources[i]; infoItems.Add(PartInfoItem.Create("\t" + generatorResource.name, generatorResource.rate.ToRate())); } } if (moduleGenerator.resHandler.outputResources.Count > 0) { infoItems.Add(PartInfoItem.Create("Generator Output")); for (int i = 0; i < moduleGenerator.resHandler.outputResources.Count; ++i) { generatorResource = moduleGenerator.resHandler.outputResources[i]; infoItems.Add(PartInfoItem.Create("\t" + generatorResource.name, generatorResource.rate.ToRate())); } } if (moduleGenerator.isAlwaysActive) { infoItems.Add(PartInfoItem.Create("Generator is Always Active")); } } }
private void GatherIncludedModules( ModuleGenerator module, IDictionary<string, ModuleGenerator> modules, Stack<string> path) { var name = module.ModuleType.FullName; if (path.Contains(name)) { var sb = new StringBuilder("Circular module dependency: "); if (path.Count == 1) { sb.AppendFormat("{0} includes itself directly.", name); } else { var includer = name; for (var i = 0; path.Count > 0; ++i) { var current = includer; includer = path.Pop(); sb.AppendLine() .AppendFormat("{0}. {1} included by {2}", i, current, includer); } } throw new ValidationException(sb.ToString()); } modules.Add(name, module); foreach (var typeReference in module.IncludedModules) { path.Push(name); GatherIncludedModules(modulesByTypeName[typeReference.FullName], modules, path); path.Pop(); } }
public override void OnStart(PartModule.StartState state) { BioAnimate[AnimationName].layer = 2; biogen = part.Modules["ModuleGenerator"] as ModuleGenerator; base.OnStart(state); }
private double CalculateOtherPower() { double otherPower = 0; for (int i = 0; i < this.vessel.parts.Count; ++i) { var part = this.vessel.parts[i]; // Find standard RTGs ModuleGenerator powerModule = part.FindModuleImplementing <ModuleGenerator>(); if (powerModule != null) { if (powerModule.generatorIsActive || powerModule.isAlwaysActive) { for (int j = 0; j < powerModule.resHandler.outputResources.Count; ++j) { var resource = powerModule.resHandler.outputResources[j]; if (resource.name == "ElectricCharge") { otherPower += resource.rate * powerModule.efficiency; } } } } // Search for other generators PartModuleList modules = part.Modules; for (int j = 0; j < modules.Count; ++j) { var module = modules[j]; // Near future fission reactors if (module.moduleName == "FissionGenerator") { otherPower += double.Parse(module.Fields.GetValue("CurrentGeneration").ToString()); } // KSP Interstellar generators if (module.moduleName == "FNGenerator") { string maxPowerStr = module.Fields.GetValue("MaxPowerStr").ToString(); double maxPower = 0; if (maxPowerStr.Contains("GW")) { maxPower = double.Parse(maxPowerStr.Replace(" GW", "")) * 1000000; } else if (maxPowerStr.Contains("MW")) { maxPower = double.Parse(maxPowerStr.Replace(" MW", "")) * 1000; } else { maxPower = double.Parse(maxPowerStr.Replace(" KW", "")); } otherPower += maxPower; } } // WBI reactors, USI reactors and MKS Power Pack ModuleResourceConverter converterModule = part.FindModuleImplementing <ModuleResourceConverter>(); if (converterModule != null) { if (converterModule.ModuleIsActive() && ((converterModule.ConverterName == "Nuclear Reactor") || (converterModule.ConverterName == "Reactor") || (converterModule.ConverterName == "Generator"))) { for (int j = 0; j < converterModule.outputList.Count; ++j) { var resource = converterModule.outputList[j]; if (resource.ResourceName == "ElectricCharge") { otherPower += resource.Ratio * converterModule.GetEfficiencyMultiplier(); } } } } } return(otherPower); } // So many ifs.....
public override void OnStart(PartModule.StartState state) { BioAnimate[AnimationName].layer = 2; biogen = part.Modules["ModuleGenerator"] as ModuleGenerator; base.OnStart(state); }
private void OnWindow(int windowId) { try { GUILayout.BeginVertical(); // Get all modules of the selected part: String partTitle = ""; Part part = null; KRnDModule rndModule = null; List <ModuleEngines> engineModules = null; ModuleRCS rcsModule = null; ModuleReactionWheel reactionWheelModule = null; ModuleDeployableSolarPanel solarPanelModule = null; ModuleWheelBase landingLegModule = null; PartResource electricChargeResource = null; ModuleGenerator generatorModule = null; PartModule fissionGenerator = null; List <ModuleResourceConverter> converterModules = null; ModuleParachute parachuteModule = null; List <PartResource> fuelResources = null; if (selectedPart != null) { foreach (AvailablePart aPart in PartLoader.LoadedPartsList) { if (aPart.partPrefab.name == selectedPart.name) { part = aPart.partPrefab; partTitle = aPart.title; break; } } if (part) { rndModule = KRnD.getKRnDModule(part); engineModules = KRnD.getEngineModules(part); rcsModule = KRnD.getRcsModule(part); reactionWheelModule = KRnD.getReactionWheelModule(part); solarPanelModule = KRnD.getSolarPanelModule(part); landingLegModule = KRnD.getLandingLegModule(part); electricChargeResource = KRnD.getChargeResource(part); generatorModule = KRnD.getGeneratorModule(part); fissionGenerator = KRnD.getFissionGeneratorModule(part); converterModules = KRnD.getConverterModules(part); parachuteModule = KRnD.getParachuteModule(part); fuelResources = KRnD.getFuelResources(part); } } if (!part) { // No part selected: GUILayout.BeginArea(new Rect(10, 5, windowStyle.fixedWidth, 20)); GUILayout.Label("<b>Kerbal R&D: Select a part to improve</b>", labelStyle); GUILayout.EndArea(); GUILayout.EndVertical(); GUI.DragWindow(); return; } else if (!rndModule) { // Invalid part selected: GUILayout.BeginArea(new Rect(10, 5, windowStyle.fixedWidth, 20)); GUILayout.Label("<b>Kerbal R&D: Select a different part to improve</b>", labelStyle); GUILayout.EndArea(); GUILayout.EndVertical(); GUI.DragWindow(); return; } // Get stats of the current version of the selected part: KRnDUpgrade currentUpgrade; if (!KRnD.upgrades.TryGetValue(part.name, out currentUpgrade)) { currentUpgrade = new KRnDUpgrade(); } String currentInfo = getPartInfo(part, currentUpgrade); // Create a copy of the part-stats which we can use to mock an upgrade further below: KRnDUpgrade nextUpgrade = currentUpgrade.clone(); // Title: GUILayout.BeginArea(new Rect(10, 5, windowStyle.fixedWidth, 20)); String version = rndModule.getVersion(); if (version != "") { version = " - " + version; } GUILayout.Label("<b>" + partTitle + version + "</b>", labelStyle); GUILayout.EndArea(); // List with upgrade-options: float optionsWidth = 100; float optionsHeight = windowStyle.fixedHeight - 30 - 30 - 20; GUILayout.BeginArea(new Rect(10, 30 + 20, optionsWidth, optionsHeight)); List <String> options = new List <String>(); options.Add("Dry Mass"); options.Add("Max Temp"); if (engineModules != null || rcsModule) { options.Add("ISP Vac"); options.Add("ISP Atm"); options.Add("Fuel Flow"); } if (reactionWheelModule != null) { options.Add("Torque"); } if (solarPanelModule != null) { options.Add("Charge Rate"); } if (landingLegModule != null) { options.Add("Crash Tolerance"); } if (electricChargeResource != null) { options.Add("Battery"); } if (fuelResources != null) { options.Add("Fuel Pressure"); } if (generatorModule || fissionGenerator) { options.Add("Generator"); } if (converterModules != null) { options.Add("Converter"); } if (parachuteModule) { options.Add("Parachute"); } if (this.selectedUpgradeOption >= options.Count) { this.selectedUpgradeOption = 0; } this.selectedUpgradeOption = GUILayout.SelectionGrid(this.selectedUpgradeOption, options.ToArray(), 1, buttonStyle); GUILayout.EndArea(); String selectedUpgradeOption = options.ToArray()[this.selectedUpgradeOption]; int currentUpgradeCount = 0; int nextUpgradeCount = 0; int scienceCost = 0; float currentImprovement = 0; float nextImprovement = 0; Func <Part, int> upgradeFunction = null; if (selectedUpgradeOption == "ISP Vac") { upgradeFunction = KRnDGUI.UpgradeIspVac; currentUpgradeCount = currentUpgrade.ispVac; nextUpgradeCount = ++nextUpgrade.ispVac; currentImprovement = KRnD.calculateImprovementFactor(rndModule.ispVac_improvement, rndModule.ispVac_improvementScale, currentUpgrade.ispVac); nextImprovement = KRnD.calculateImprovementFactor(rndModule.ispVac_improvement, rndModule.ispVac_improvementScale, nextUpgrade.ispVac); scienceCost = KRnD.calculateScienceCost(rndModule.ispVac_scienceCost, rndModule.ispVac_costScale, nextUpgrade.ispVac); } else if (selectedUpgradeOption == "ISP Atm") { upgradeFunction = KRnDGUI.UpgradeIspAtm; currentUpgradeCount = currentUpgrade.ispAtm; nextUpgradeCount = ++nextUpgrade.ispAtm; currentImprovement = KRnD.calculateImprovementFactor(rndModule.ispAtm_improvement, rndModule.ispAtm_improvementScale, currentUpgrade.ispAtm); nextImprovement = KRnD.calculateImprovementFactor(rndModule.ispAtm_improvement, rndModule.ispAtm_improvementScale, nextUpgrade.ispAtm); scienceCost = KRnD.calculateScienceCost(rndModule.ispAtm_scienceCost, rndModule.ispAtm_costScale, nextUpgrade.ispAtm); } else if (selectedUpgradeOption == "Fuel Flow") { upgradeFunction = KRnDGUI.UpgradeFuelFlow; currentUpgradeCount = currentUpgrade.fuelFlow; nextUpgradeCount = ++nextUpgrade.fuelFlow; currentImprovement = KRnD.calculateImprovementFactor(rndModule.fuelFlow_improvement, rndModule.fuelFlow_improvementScale, currentUpgrade.fuelFlow); nextImprovement = KRnD.calculateImprovementFactor(rndModule.fuelFlow_improvement, rndModule.fuelFlow_improvementScale, nextUpgrade.fuelFlow); scienceCost = KRnD.calculateScienceCost(rndModule.fuelFlow_scienceCost, rndModule.fuelFlow_costScale, nextUpgrade.fuelFlow); } else if (selectedUpgradeOption == "Dry Mass") { upgradeFunction = KRnDGUI.UpgradeDryMass; currentUpgradeCount = currentUpgrade.dryMass; nextUpgradeCount = ++nextUpgrade.dryMass; currentImprovement = KRnD.calculateImprovementFactor(rndModule.dryMass_improvement, rndModule.dryMass_improvementScale, currentUpgrade.dryMass); nextImprovement = KRnD.calculateImprovementFactor(rndModule.dryMass_improvement, rndModule.dryMass_improvementScale, nextUpgrade.dryMass); // Scale science cost with original mass: PartStats originalStats; if (!KRnD.originalStats.TryGetValue(part.name, out originalStats)) { throw new Exception("no original-stats for part '" + part.name + "'"); } float scaleReferenceFactor = 1; if (rndModule.dryMass_costScaleReference > 0) { scaleReferenceFactor = originalStats.mass / rndModule.dryMass_costScaleReference; } int scaledCost = (int)Math.Round(rndModule.dryMass_scienceCost * scaleReferenceFactor); if (scaledCost < 1) { scaledCost = 1; } scienceCost = KRnD.calculateScienceCost(scaledCost, rndModule.dryMass_costScale, nextUpgrade.dryMass); } else if (selectedUpgradeOption == "Torque") { upgradeFunction = KRnDGUI.UpgradeTorque; currentUpgradeCount = currentUpgrade.torque; nextUpgradeCount = ++nextUpgrade.torque; currentImprovement = KRnD.calculateImprovementFactor(rndModule.torque_improvement, rndModule.torque_improvementScale, currentUpgrade.torque); nextImprovement = KRnD.calculateImprovementFactor(rndModule.torque_improvement, rndModule.torque_improvementScale, nextUpgrade.torque); scienceCost = KRnD.calculateScienceCost(rndModule.torque_scienceCost, rndModule.torque_costScale, nextUpgrade.torque); } else if (selectedUpgradeOption == "Charge Rate") { upgradeFunction = KRnDGUI.UpgradeChargeRate; currentUpgradeCount = currentUpgrade.chargeRate; nextUpgradeCount = ++nextUpgrade.chargeRate; currentImprovement = KRnD.calculateImprovementFactor(rndModule.chargeRate_improvement, rndModule.chargeRate_improvementScale, currentUpgrade.chargeRate); nextImprovement = KRnD.calculateImprovementFactor(rndModule.chargeRate_improvement, rndModule.chargeRate_improvementScale, nextUpgrade.chargeRate); scienceCost = KRnD.calculateScienceCost(rndModule.chargeRate_scienceCost, rndModule.chargeRate_costScale, nextUpgrade.chargeRate); } else if (selectedUpgradeOption == "Crash Tolerance") { upgradeFunction = KRnDGUI.UpgradeCrashTolerance; currentUpgradeCount = currentUpgrade.crashTolerance; nextUpgradeCount = ++nextUpgrade.crashTolerance; currentImprovement = KRnD.calculateImprovementFactor(rndModule.crashTolerance_improvement, rndModule.crashTolerance_improvementScale, currentUpgrade.crashTolerance); nextImprovement = KRnD.calculateImprovementFactor(rndModule.crashTolerance_improvement, rndModule.crashTolerance_improvementScale, nextUpgrade.crashTolerance); scienceCost = KRnD.calculateScienceCost(rndModule.crashTolerance_scienceCost, rndModule.crashTolerance_costScale, nextUpgrade.crashTolerance); } else if (selectedUpgradeOption == "Battery") { upgradeFunction = KRnDGUI.UpgradeBatteryCharge; currentUpgradeCount = currentUpgrade.batteryCharge; nextUpgradeCount = ++nextUpgrade.batteryCharge; currentImprovement = KRnD.calculateImprovementFactor(rndModule.batteryCharge_improvement, rndModule.batteryCharge_improvementScale, currentUpgrade.batteryCharge); nextImprovement = KRnD.calculateImprovementFactor(rndModule.batteryCharge_improvement, rndModule.batteryCharge_improvementScale, nextUpgrade.batteryCharge); // Scale science cost with original battery charge: PartStats originalStats; if (!KRnD.originalStats.TryGetValue(part.name, out originalStats)) { throw new Exception("no origional-stats for part '" + part.name + "'"); } double scaleReferenceFactor = 1; if (rndModule.batteryCharge_costScaleReference > 0) { scaleReferenceFactor = originalStats.batteryCharge / rndModule.batteryCharge_costScaleReference; } int scaledCost = (int)Math.Round(rndModule.batteryCharge_scienceCost * scaleReferenceFactor); if (scaledCost < 1) { scaledCost = 1; } scienceCost = KRnD.calculateScienceCost(scaledCost, rndModule.batteryCharge_costScale, nextUpgrade.batteryCharge); } else if (selectedUpgradeOption == "Fuel Pressure") { upgradeFunction = KRnDGUI.UpgradeFuelCapacity; currentUpgradeCount = currentUpgrade.fuelCapacity; nextUpgradeCount = ++nextUpgrade.fuelCapacity; currentImprovement = KRnD.calculateImprovementFactor(rndModule.fuelCapacity_improvement, rndModule.fuelCapacity_improvementScale, currentUpgrade.fuelCapacity); nextImprovement = KRnD.calculateImprovementFactor(rndModule.fuelCapacity_improvement, rndModule.fuelCapacity_improvementScale, nextUpgrade.fuelCapacity); // Scale science cost with original fuel capacity: PartStats originalStats; if (!KRnD.originalStats.TryGetValue(part.name, out originalStats)) { throw new Exception("no origional-stats for part '" + part.name + "'"); } double scaleReferenceFactor = 1; if (rndModule.fuelCapacity_costScaleReference > 0) { scaleReferenceFactor = originalStats.fuelCapacitiesSum / rndModule.fuelCapacity_costScaleReference; } int scaledCost = (int)Math.Round(rndModule.fuelCapacity_scienceCost * scaleReferenceFactor); if (scaledCost < 1) { scaledCost = 1; } scienceCost = KRnD.calculateScienceCost(scaledCost, rndModule.fuelCapacity_costScale, nextUpgrade.fuelCapacity); } else if (selectedUpgradeOption == "Generator") { upgradeFunction = KRnDGUI.UpgradeGeneratorEfficiency; currentUpgradeCount = currentUpgrade.generatorEfficiency; nextUpgradeCount = ++nextUpgrade.generatorEfficiency; currentImprovement = KRnD.calculateImprovementFactor(rndModule.generatorEfficiency_improvement, rndModule.generatorEfficiency_improvementScale, currentUpgrade.generatorEfficiency); nextImprovement = KRnD.calculateImprovementFactor(rndModule.generatorEfficiency_improvement, rndModule.generatorEfficiency_improvementScale, nextUpgrade.generatorEfficiency); scienceCost = KRnD.calculateScienceCost(rndModule.generatorEfficiency_scienceCost, rndModule.generatorEfficiency_costScale, nextUpgrade.generatorEfficiency); } else if (selectedUpgradeOption == "Converter") { upgradeFunction = KRnDGUI.UpgradeConverterEfficiency; currentUpgradeCount = currentUpgrade.converterEfficiency; nextUpgradeCount = ++nextUpgrade.converterEfficiency; currentImprovement = KRnD.calculateImprovementFactor(rndModule.converterEfficiency_improvement, rndModule.converterEfficiency_improvementScale, currentUpgrade.converterEfficiency); nextImprovement = KRnD.calculateImprovementFactor(rndModule.converterEfficiency_improvement, rndModule.converterEfficiency_improvementScale, nextUpgrade.converterEfficiency); scienceCost = KRnD.calculateScienceCost(rndModule.converterEfficiency_scienceCost, rndModule.converterEfficiency_costScale, nextUpgrade.converterEfficiency); } else if (selectedUpgradeOption == "Parachute") { upgradeFunction = KRnDGUI.UpgradeParachuteStrength; currentUpgradeCount = currentUpgrade.parachuteStrength; nextUpgradeCount = ++nextUpgrade.parachuteStrength; currentImprovement = KRnD.calculateImprovementFactor(rndModule.parachuteStrength_improvement, rndModule.parachuteStrength_improvementScale, currentUpgrade.parachuteStrength); nextImprovement = KRnD.calculateImprovementFactor(rndModule.parachuteStrength_improvement, rndModule.parachuteStrength_improvementScale, nextUpgrade.parachuteStrength); scienceCost = KRnD.calculateScienceCost(rndModule.parachuteStrength_scienceCost, rndModule.parachuteStrength_costScale, nextUpgrade.parachuteStrength); } else if (selectedUpgradeOption == "Max Temp") { upgradeFunction = KRnDGUI.UpgradeMaxTemperature; currentUpgradeCount = currentUpgrade.maxTemperature; nextUpgradeCount = ++nextUpgrade.maxTemperature; currentImprovement = KRnD.calculateImprovementFactor(rndModule.maxTemperature_improvement, rndModule.maxTemperature_improvementScale, currentUpgrade.maxTemperature); nextImprovement = KRnD.calculateImprovementFactor(rndModule.maxTemperature_improvement, rndModule.maxTemperature_improvementScale, nextUpgrade.maxTemperature); scienceCost = KRnD.calculateScienceCost(rndModule.maxTemperature_scienceCost, rndModule.maxTemperature_costScale, nextUpgrade.maxTemperature); } else { throw new Exception("unexpected option '" + selectedUpgradeOption + "'"); } String newInfo = getPartInfo(part, nextUpgrade); // Calculate part-info if the selected stat was upgraded. newInfo = highlightChanges(currentInfo, newInfo); // Current stats: GUILayout.BeginArea(new Rect(10 + optionsWidth + 10, 30, windowStyle.fixedWidth, 20)); GUILayout.Label("<color=#FFFFFF><b>Current:</b> " + currentUpgradeCount.ToString() + " (" + currentImprovement.ToString("+0.##%;-0.##%;-") + ")</color>", labelStyle); GUILayout.EndArea(); float areaWidth = (windowStyle.fixedWidth - 20 - optionsWidth) / 2; float areaHeight = optionsHeight; GUILayout.BeginArea(new Rect(10 + optionsWidth, 30 + 20, areaWidth, areaHeight)); scrollPos = GUILayout.BeginScrollView(scrollPos, scrollStyle, GUILayout.Width(areaWidth), GUILayout.Height(areaHeight)); GUILayout.Label(currentInfo, labelStyleSmall); GUILayout.EndScrollView(); GUILayout.EndArea(); // Next stats: GUILayout.BeginArea(new Rect(10 + optionsWidth + areaWidth + 10, 30, windowStyle.fixedWidth, 20)); GUILayout.Label("<color=#FFFFFF><b>Next upgrade:</b> " + nextUpgradeCount.ToString() + " (" + nextImprovement.ToString("+0.##%;-0.##%;-") + ")</color>", labelStyle); GUILayout.EndArea(); GUILayout.BeginArea(new Rect(10 + optionsWidth + areaWidth, 30 + 20, areaWidth, areaHeight)); scrollPos = GUILayout.BeginScrollView(scrollPos, scrollStyle, GUILayout.Width(areaWidth), GUILayout.Height(areaHeight)); GUILayout.Label(newInfo, labelStyleSmall); GUILayout.EndScrollView(); GUILayout.EndArea(); // Bottom-line (display only if the upgrade would have an effect): if (currentImprovement != nextImprovement) { GUILayout.BeginArea(new Rect(10, windowStyle.fixedHeight - 25, windowStyle.fixedWidth, 30)); float currentScience = 0; if (ResearchAndDevelopment.Instance != null) { currentScience = ResearchAndDevelopment.Instance.Science; } String color = "FF0000"; if (currentScience >= scienceCost) { color = "00FF00"; } GUILayout.Label("<b>Science: <color=#" + color + ">" + scienceCost.ToString() + " / " + Math.Floor(currentScience).ToString() + "</color></b>", labelStyle); GUILayout.EndArea(); if (currentScience >= scienceCost && ResearchAndDevelopment.Instance != null && upgradeFunction != null) { GUILayout.BeginArea(new Rect(windowStyle.fixedWidth - 110, windowStyle.fixedHeight - 30, 100, 30)); if (GUILayout.Button("Research", buttonStyle)) { upgradeFunction(part); ResearchAndDevelopment.Instance.AddScience(-scienceCost, TransactionReasons.RnDTechResearch); } GUILayout.EndArea(); } } GUILayout.EndVertical(); GUI.DragWindow(); } catch (Exception e) { Debug.LogError("[KRnD] GenerateWindow(): " + e.ToString()); } }
private void WriteModuleGraph( ModuleGenerator completeModule, IDictionary<string, Binding> allBindings, string graphvizDirectory) { var safeModuleName = completeModule.ModuleType.FullName.Replace('/', '.'); var fileName = Path.Combine(graphvizDirectory, safeModuleName + ".dot"); using (var fs = File.Open(fileName, FileMode.Create, FileAccess.Write)) using (var dotWriter = new DotWriter(fs)) { new GraphWriter().Write(dotWriter, allBindings); } }
static void ProcessGenerator(Vessel v, ProtoPartSnapshot p, ProtoPartModuleSnapshot m, ModuleGenerator generator, vessel_resources resources, double elapsed_s) { // if active if (Lib.Proto.GetBool(m, "generatorIsActive")) { // create and commit recipe resource_recipe recipe = new resource_recipe(); foreach (ModuleResource ir in generator.resHandler.inputResources) { recipe.Input(ir.name, ir.rate * elapsed_s); } foreach (ModuleResource or in generator.resHandler.outputResources) { recipe.Output(or.name, or.rate * elapsed_s, true); } resources.Transform(recipe); } }
public ProtoGeneratorDevice(ProtoPartModuleSnapshot generator, ModuleGenerator prefab) { this.generator = generator; this.prefab = prefab; }
public GeneratorDevice(ModuleGenerator generator) { this.generator = generator; }
public override void OnStart(StartState state) { try { if (state == StartState.Editor) { return; } //InitializePartModule(); var modules = part.FindModulesImplementing <ModuleGenerator>(); moduleGenerator = modules.Count > index ? modules[index] : null; if (moduleGenerator == null) { return; } string[] resourcesToSupply = { ResourceSettings.Config.ElectricPowerInMegawatt }; this.resourcesToSupply = resourcesToSupply; base.OnStart(state); if (maintainsBuffer) { resourceBuffers = new ResourceBuffers(); } outputType = ResourceType.other; inputType = ResourceType.other; foreach (ModuleResource moduleResource in moduleGenerator.resHandler.inputResources) { if (moduleResource.name == ResourceSettings.Config.ElectricPowerInMegawatt) { inputType = ResourceType.megajoule; } else if (moduleResource.name == ResourceSettings.Config.ElectricPowerInKilowatt) { inputType = ResourceType.electricCharge; } if (inputType != ResourceType.other) { moduleInputResource = moduleResource; if (inputRate != 0) { moduleInputResource.rate = inputRate; } initialInputAmount = moduleInputResource.rate; break; } } if (offlineProcessing && moduleInputResource != null && last_active_time > 0 && powerGeneratorPowerInput > 0) { var timePassedSinceLastProcessing = Planetarium.GetUniversalTime() - last_active_time; var consumption = timePassedSinceLastProcessing * powerGeneratorPowerInput; part.RequestResource(moduleInputResource.name, consumption); var message = Localizer.Format("#LOC_KSPIE_FNGeneratorAdapter_msg", timePassedSinceLastProcessing, consumption, moduleInputResource.name);// <<1>> seconds passed durring which <<2>> <<3>> was consumed " Debug.Log("[KSPI]: " + message); } foreach (ModuleResource moduleResource in moduleGenerator.resHandler.outputResources) { // assuming only one of those two is present if (moduleResource.name == ResourceSettings.Config.ElectricPowerInMegawatt) { outputType = ResourceType.megajoule; } else if (moduleResource.name == ResourceSettings.Config.ElectricPowerInKilowatt) { outputType = ResourceType.electricCharge; } if (outputType != ResourceType.other) { if (maintainsBuffer) { var bufferResource = part.Resources[moduleResource.name]; if (bufferResource != null) { if (initialMaxBufferSize == 0) { initialMaxBufferSize = bufferResource.maxAmount; } else { bufferResource.maxAmount = initialMaxBufferSize; } } resourceBuffers.AddConfiguration(new ResourceBuffers.MaxAmountConfig(moduleResource.name, 50)); } mockInputResource = new ModuleResource(); mockInputResource.name = moduleResource.name; mockInputResource.id = moduleResource.name.GetHashCode(); moduleGenerator.resHandler.inputResources.Add(mockInputResource); moduleOutputResource = moduleResource; if (outputRate != 0) { moduleOutputResource.rate = outputRate; } initialOutputAmount = moduleOutputResource.rate; moduleGeneratorEfficienctBaseField = moduleGenerator.Fields["efficiency"]; if (moduleGeneratorEfficienctBaseField != null) { moduleGeneratorEfficienctBaseField.guiActive = false; moduleGeneratorEfficienctBaseField.guiActiveEditor = false; } break; } } if (maintainsBuffer) { resourceBuffers.Init(part); } efficiencyField = moduleGenerator.Fields["efficiency"]; displayStatusField = moduleGenerator.Fields["displayStatus"]; efficiencyField.guiActive = showEfficiency; displayStatusField.guiActive = showDisplayStatus; powerGeneratorPowerInputField = Fields["powerGeneratorPowerInput"]; powerGeneratorPowerOutputField = Fields["powerGeneratorPowerOutput"]; if (index > 0) { powerGeneratorPowerInputField.guiName = powerGeneratorPowerInputField.guiName + " " + (index + 1); powerGeneratorPowerOutputField.guiName = powerGeneratorPowerOutputField.guiName + " " + (index + 1); } } catch (Exception e) { Debug.LogError("[KSPI]: Exception in FNGeneratorAdapter.OnStart " + e.ToString()); throw; } }
private IDictionary<string, Binding> ProcessCompleteModule(ModuleGenerator moduleGenerator, bool ignoreCompletenessErrors) { var bindings = new Dictionary<string, Binding>(StringComparer.Ordinal); var overrides = new Dictionary<string, Binding>(StringComparer.Ordinal); var allModules = new Dictionary<string, ModuleGenerator>(StringComparer.Ordinal); var hasError = false; GatherIncludedModules(moduleGenerator, allModules, new Stack<string>()); var resolver = new Resolver(null, plugin, errors => { if (ignoreCompletenessErrors) { return; } hasError = true; foreach (var e in errors) { errorReporter.LogError(e); } }); foreach (var module in allModules.Values) { // Request entry-point bindings var addTo = module.IsOverride ? overrides : bindings; foreach (var entryPointType in module.EntryPoints) { var key = entryPointType.Resolve().IsInterface ? CompilerKeys.ForType(entryPointType) : CompilerKeys.GetMemberKey(entryPointType); resolver.RequestBinding(key, module.ModuleType.FullName, false, true); } foreach (var providerGenerator in module.ProviderGenerators) { var binding = new CompilerProvidesBinding(providerGenerator); if (addTo.ContainsKey(binding.ProviderKey)) { var message = "Duplicate bindings for {0} in {1}{2}."; var addendum = module.IsOverride ? "overriding module " : string.Empty; throw new ValidationException(string.Format (message, binding.ProviderKey, addendum, module.ModuleType.FullName)); } addTo.Add(binding.ProviderKey, binding); } } resolver.InstallBindings(bindings); resolver.InstallBindings(overrides); var allBindings = resolver.ResolveAllBindings(); return hasError ? null : allBindings; }
/// <summary> /// Calculate available power from generators and reactors /// </summary> /// <returns></returns> private double GetAvailablePower_Other() { double otherPower = 0; // Go through all parts and get power from generators and reactors for (int i = 0; i < vessel.parts.Count; ++i) { var part = vessel.parts[i]; // Standard RTG ModuleGenerator powerModule = part.FindModuleImplementing <ModuleGenerator>(); if (powerModule != null) { if (powerModule.generatorIsActive || powerModule.isAlwaysActive) { // Go through resources and get EC power for (int j = 0; j < powerModule.resHandler.outputResources.Count; ++j) { var resource = powerModule.resHandler.outputResources[j]; if (resource.name == "ElectricCharge") { otherPower += resource.rate * powerModule.efficiency; } } } } // Other generators PartModuleList modules = part.Modules; for (int j = 0; j < modules.Count; ++j) { var module = modules[j]; // Near future fission reactors if (module.moduleName == "FissionGenerator") { otherPower += double.Parse(module.Fields.GetValue("CurrentGeneration").ToString()); } // KSP Interstellar generators if ((module.moduleName == "ThermalElectricEffectGenerator") || (module.moduleName == "IntegratedThermalElectricPowerGenerator") || (module.moduleName == "ThermalElectricPowerGenerator") || (module.moduleName == "IntegratedChargedParticlesPowerGenerator") || (module.moduleName == "ChargedParticlesPowerGenerator") || (module.moduleName == "FNGenerator")) { if (bool.Parse(module.Fields.GetValue("IsEnabled").ToString())) { //otherPower += double.Parse(module.Fields.GetValue("maxElectricdtps").ToString()); // Doesn't work as expected string maxPowerStr = module.Fields.GetValue("MaxPowerStr").ToString(); double maxPower = 0; if (maxPowerStr.Contains("GW")) { maxPower = double.Parse(maxPowerStr.Replace(" GW", "")) * 1000000; } else if (maxPowerStr.Contains("MW")) { maxPower = double.Parse(maxPowerStr.Replace(" MW", "")) * 1000; } else { maxPower = double.Parse(maxPowerStr.Replace(" KW", "")); } otherPower += maxPower; } } } // WBI reactors, USI reactors and MKS Power Pack ModuleResourceConverter converterModule = part.FindModuleImplementing <ModuleResourceConverter>(); if (converterModule != null) { if (converterModule.ModuleIsActive() && ((converterModule.ConverterName == "Nuclear Reactor") || (converterModule.ConverterName == "Reactor") || (converterModule.ConverterName == "Generator"))) { for (int j = 0; j < converterModule.outputList.Count; ++j) { var resource = converterModule.outputList[j]; if (resource.ResourceName == "ElectricCharge") { otherPower += resource.Ratio * converterModule.GetEfficiencyMultiplier(); } } } } } return(otherPower); }
private IDictionary<string, Binding> ProcessCompleteModule( ModuleGenerator moduleGenerator, bool ignoreCompletenessErrors) { var bindings = new Dictionary<string, Binding>(StringComparer.Ordinal); var overrides = new Dictionary<string, Binding>(StringComparer.Ordinal); var allModules = new Dictionary<string, ModuleGenerator>(StringComparer.Ordinal); var hasError = false; GatherIncludedModules(moduleGenerator, allModules, new Stack<string>()); var resolver = new Resolver(null, loader, errors => { if (ignoreCompletenessErrors) { return; } hasError = true; foreach (var e in errors) { errorReporter.LogError(e); } }); foreach (var module in allModules.Values) { // Request entry-point bindings var addTo = module.IsOverride ? overrides : bindings; foreach (var injectType in module.Injects) { var key = injectType.Resolve().IsInterface ? CompilerKeys.ForType(injectType) : CompilerKeys.GetMemberKey(injectType); resolver.RequestBinding(key, module.ModuleType.FullName, false, true); } foreach (var providerGenerator in module.ProviderGenerators) { var binding = new CompilerProvidesBinding(providerGenerator); if (addTo.ContainsKey(binding.ProviderKey)) { var message = "Duplicate bindings for {0} in {1}{2}."; var addendum = module.IsOverride ? "overriding module " : string.Empty; throw new ValidationException(string.Format (message, binding.ProviderKey, addendum, module.ModuleType.FullName)); } switch (providerGenerator.ProvidesType) { case ProvidesType.Default: addTo.Add(binding.ProviderKey, binding); break; case ProvidesType.Set: var setKey = CompilerKeys.GetSetKey(binding.ProviderKey); CompilerSetBinding.Add(addTo, setKey, binding); break; default: throw new ArgumentException("Unknown ProvidesType value: " + providerGenerator.ProvidesType); } } } resolver.InstallBindings(bindings); resolver.InstallBindings(overrides); var allBindings = resolver.ResolveAllBindings(); return !hasError ? allBindings : null; }
static void ProcessGenerator(Vessel v, ProtoPartSnapshot p, ProtoPartModuleSnapshot m, ModuleGenerator generator, vessel_resources resources, double elapsed_s) { // play nice with BackgroundProcessing if (Kerbalism.detected_mods.BackgroundProcessing) { return; } // if active if (Lib.Proto.GetBool(m, "generatorIsActive")) { // get malfunction penalty double penalty = Reliability.Penalty(p, "Generator"); // create and commit recipe resource_recipe recipe = new resource_recipe(resource_recipe.converter_priority); foreach (var ir in generator.inputList) { recipe.Input(ir.name, ir.rate * elapsed_s); } foreach (var or in generator.outputList) { recipe.Output(or.name, or.rate * penalty * elapsed_s); } resources.Transform(recipe); } }
public static Func <CTestModule> GetGenerator(Type type, string methodName) { ModuleGenerator moduleGenerator = (ModuleGenerator)type.GetMethod(methodName).CreateDelegate(typeof(ModuleGenerator)); return(new Func <CTestModule>(moduleGenerator)); }