Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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"));
         }
     }
 }
Ejemplo n.º 5
0
        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.....
Ejemplo n.º 6
0
        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.....
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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;
            }
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
                }
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
		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);
		}
Ejemplo n.º 13
0
        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");
                    }
                }
        }
Ejemplo n.º 14
0
        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();
            }
        }
Ejemplo n.º 15
0
        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);
                         }
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 17
0
 /// <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]);
                         }
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 18
0
        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);
        }
Ejemplo n.º 19
0
 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);
             }
         }
     }
 }
Ejemplo n.º 20
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"));
         }
     }
 }
Ejemplo n.º 22
0
        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();
            }
        }
Ejemplo n.º 23
0
 public override void OnStart(PartModule.StartState state)
 {
     BioAnimate[AnimationName].layer = 2;
     biogen = part.Modules["ModuleGenerator"] as ModuleGenerator;
         base.OnStart(state);
 }
Ejemplo n.º 24
0
        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.....
Ejemplo n.º 25
0
 public override void OnStart(PartModule.StartState state)
 {
     BioAnimate[AnimationName].layer = 2;
     biogen = part.Modules["ModuleGenerator"] as ModuleGenerator;
     base.OnStart(state);
 }
Ejemplo n.º 26
0
        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());
            }
        }
Ejemplo n.º 27
0
 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);
     }
 }
Ejemplo n.º 28
0
 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);
     }
 }
Ejemplo n.º 29
0
 public ProtoGeneratorDevice(ProtoPartModuleSnapshot generator, ModuleGenerator prefab)
 {
   this.generator = generator;
   this.prefab = prefab;
 }
Ejemplo n.º 30
0
 public GeneratorDevice(ModuleGenerator generator)
 {
   this.generator = generator;
 }
Ejemplo n.º 31
0
        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;
            }
        }
Ejemplo n.º 32
0
        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;
        }
Ejemplo n.º 33
0
        /// <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);
        }
Ejemplo n.º 34
0
        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;
        }
Ejemplo n.º 35
0
        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);
            }
        }
Ejemplo n.º 36
0
        public static Func <CTestModule> GetGenerator(Type type, string methodName)
        {
            ModuleGenerator moduleGenerator = (ModuleGenerator)type.GetMethod(methodName).CreateDelegate(typeof(ModuleGenerator));

            return(new Func <CTestModule>(moduleGenerator));
        }