Esempio n. 1
0
        private void GenerateOfferedCourses()
        {
            OfferedCourses.Clear();
            _partSynsHandled.Clear();

            if (!CurrentSceneAllowsCrewManagement)
            {
                return;                                       // Course UI is only available in those 2 scenes so no need to generate them for any other
            }
            //convert the saved configs to course offerings
            foreach (CourseTemplate template in CourseTemplates)
            {
                var duplicate = new CourseTemplate(template.sourceNode, true); //creates a duplicate so the initial template is preserved
                duplicate.PopulateFromSourceNode();
                if (duplicate.Available)
                {
                    OfferedCourses.Add(duplicate);
                }
            }

            foreach (AvailablePart ap in PartLoader.LoadedPartsList)
            {
                if (ap.partPrefab.CrewCapacity > 0 &&
                    ResearchAndDevelopment.PartModelPurchased(ap) &&
                    !ResearchAndDevelopment.IsExperimentalPart(ap))
                {
                    AddPartCourses(ap);
                }
            }
        }
        private void removeExperimentalParts()
        {
            AvailablePart partToAdd = PartLoader.getPartInfoByName("MerillCamera");

            if (partToAdd != null && ResearchAndDevelopment.IsExperimentalPart(partToAdd))
            {
                ResearchAndDevelopment.RemoveExperimentalPart(partToAdd);
            }
        }
Esempio n. 3
0
        /** Removes experimental part.
         *  TODO: Check if there is another active contract using this part in which case we have to keep it! */
        private void removeExperimentalParts()
        {
            AvailablePart ap = ExperimentFactory.getPartForExperiment(ExperimentFactory.KEMINI_EXPERIMENTS, experiment);

            if (ap != null && ResearchAndDevelopment.IsExperimentalPart(ap))
            {
                NE_Helper.log("Removing experimental part: " + ap.name);
                ResearchAndDevelopment.RemoveExperimentalPart(ap);
            }
        }
Esempio n. 4
0
        public void TechUnlockEvent(GameEvents.HostTargetAction <RDTech, RDTech.OperationResult> ev)
        {
            const string logBlockName = nameof(KCTEvents) + "." + nameof(TechUnlockEvent);

            using (EntryExitLogger.EntryExitLog(logBlockName, EntryExitLoggerOptions.All))
            {
                //TODO: Check if any of the parts are experimental, if so, do the normal KCT stuff and then set them experimental again
                if (!KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled)
                {
                    return;
                }
                if (ev.target == RDTech.OperationResult.Successful)
                {
                    KCT_TechItem tech = new KCT_TechItem();
                    if (ev.host != null)
                    {
                        tech = new KCT_TechItem(ev.host);
                    }

                    foreach (AvailablePart expt in ev.host.partsPurchased)
                    {
                        if (ResearchAndDevelopment.IsExperimentalPart(expt))
                        {
                            GameStates.ExperimentalParts.Add(expt);
                        }
                    }

                    //if (!KCT_GameStates.settings.InstantTechUnlock && !KCT_GameStates.settings.DisableBuildTime) tech.DisableTech();
                    if (!tech.isInList())
                    {
                        if (KCT_PresetManager.Instance.ActivePreset.generalSettings.TechUpgrades)
                        {
                            ScreenMessages.PostScreenMessage("[KCT] Upgrade Point Added!", 4.0f, ScreenMessageStyle.UPPER_LEFT);
                        }

                        if (KCT_PresetManager.Instance.ActivePreset.generalSettings.TechUnlockTimes && KCT_PresetManager.Instance.ActivePreset.generalSettings.BuildTimes)
                        {
                            GameStates.TechList.Add(tech);
                            foreach (KCT_TechItem techItem in GameStates.TechList)
                            {
                                techItem.UpdateBuildRate(GameStates.TechList.IndexOf(techItem));
                            }
                            double timeLeft = tech.BuildRate > 0 ? tech.TimeLeft : tech.EstimatedTimeLeft;
                            ScreenMessages.PostScreenMessage("[KCT] Node will unlock in " + MagiCore.Utilities.GetFormattedTime(timeLeft), 4.0f, ScreenMessageStyle.UPPER_LEFT);
                        }
                    }
                    else
                    {
                        ResearchAndDevelopment.Instance.AddScience(tech.scienceCost, TransactionReasons.RnDTechResearch);
                        ScreenMessages.PostScreenMessage("[KCT] This node is already being researched!", 4.0f, ScreenMessageStyle.UPPER_LEFT);
                        ScreenMessages.PostScreenMessage("[KCT] It will unlock in " + MagiCore.Utilities.GetFormattedTime((GameStates.TechList.First(t => t.techID == ev.host.techID)).TimeLeft), 4.0f, ScreenMessageStyle.UPPER_LEFT);
                    }
                }
            }
        }
        private void wip(Func <string, EventVoid> doWithApart)
        {
            foreach (AvailablePart aPart in PartLoader.Instance.parts)
            {
                if (aPart.partPrefab != null && aPart.partPrefab.Modules != null)
                {
                    foreach (PartModule pm in aPart.partPrefab.Modules)
                    {
                        if (pm.moduleName.Equals("MerillMissionStub"))
                        {
                            if (((MerillMissionStub)pm).missionName.Equals(this.GetType().Name))
                            {
                                if (ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired) == RDTech.State.Available)
                                {
                                    MerillData.log(" RD purchased, is experimental? "
                                                   + ResearchAndDevelopment.IsExperimentalPart(
                                                       PartLoader.getPartInfoByName(((MerillMissionStub)pm).partUnlock)));
                                    //check if already experimental
                                    if (ResearchAndDevelopment.IsExperimentalPart(PartLoader.getPartInfoByName(((MerillMissionStub)pm).partUnlock)))
                                    {
                                        doWithApart(((MerillMissionStub)pm).partUnlock);
                                    }
                                }
                                else if (aPart.TechRequired != "specializedControl")
                                {
                                    try
                                    {
                                        //try to remove the stub to a research node
                                        MerillData.log(" RD find a part with r&d node " + pm.name);

                                        RDTech tech = AssetBase.RnDTechTree.FindTech(
                                            ((MerillMissionStub)pm).techRequired);
                                        if (tech != null)
                                        {
                                            MerillData.log(" RD find good tech " + tech.name);
                                            aPart.TechRequired = "specializedControl";
                                            tech.partsAssigned.Remove(aPart);
                                            MerillData.log(" RD find tech assigned ");
                                            if (ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired) == RDTech.State.Available)
                                            {
                                                doWithApart(((MerillMissionStub)pm).partUnlock);
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        MerillData.log(" RD Exeption:  " + e);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Esempio n. 6
0
        public void TechUnlockEvent(GameEvents.HostTargetAction <RDTech, RDTech.OperationResult> ev)
        {
            if (!PresetManager.Instance.ActivePreset.GeneralSettings.Enabled)
            {
                return;
            }
            if (ev.target == RDTech.OperationResult.Successful)
            {
                var tech = new TechItem();
                if (ev.host != null)
                {
                    tech = new TechItem(ev.host);
                }

                if (!tech.IsInList())
                {
                    if (PresetManager.Instance.ActivePreset.GeneralSettings.TechUpgrades)
                    {
                        ScreenMessages.PostScreenMessage("[KCT] Upgrade Point Added!", 4f, ScreenMessageStyle.UPPER_LEFT);
                    }

                    if (PresetManager.Instance.ActivePreset.GeneralSettings.TechUnlockTimes && PresetManager.Instance.ActivePreset.GeneralSettings.BuildTimes)
                    {
                        KCTGameStates.TechList.Add(tech);
                        foreach (TechItem techItem in KCTGameStates.TechList)
                        {
                            techItem.UpdateBuildRate(KCTGameStates.TechList.IndexOf(techItem));
                        }
                        double timeLeft = tech.BuildRate > 0 ? tech.TimeLeft : tech.EstimatedTimeLeft;
                        ScreenMessages.PostScreenMessage($"[KCT] Node will unlock in {MagiCore.Utilities.GetFormattedTime(timeLeft)}", 4f, ScreenMessageStyle.UPPER_LEFT);

                        foreach (AvailablePart ap in ev.host.partsAssigned)
                        {
                            if (Utilities.AddExperimentalPart(ap))
                            {
                                KCTDebug.Log($"{ap.name} added to ExpParts: {ResearchAndDevelopment.IsExperimentalPart(ap)}");
                            }
                        }

                        OnTechQueued.Fire(ev.host);
                    }
                }
                else
                {
                    ResearchAndDevelopment.Instance.AddScience(tech.ScienceCost, TransactionReasons.RnDTechResearch);
                    ScreenMessages.PostScreenMessage("[KCT] This node is already being researched!", 4f, ScreenMessageStyle.UPPER_LEFT);
                    ScreenMessages.PostScreenMessage($"[KCT] It will unlock in {MagiCore.Utilities.GetFormattedTime((KCTGameStates.TechList.First(t => t.TechID == ev.host.techID)).TimeLeft)}", 4f, ScreenMessageStyle.UPPER_LEFT);
                }
            }
        }
        private void removeExperimentalPart(string sExperimentalPartName)
        {
            MerillData.log("plantmunflag: DECLINED contract with experimental part: " + sExperimentalPartName);

            if (sExperimentalPartName != null)
            {
                AvailablePart experimentalPart = PartLoader.getPartInfoByName(sExperimentalPartName);

                if (experimentalPart != null && ResearchAndDevelopment.IsExperimentalPart(experimentalPart))
                {
                    MerillData.log("plantmunflag: Locking part: " + sExperimentalPartName);

                    ResearchAndDevelopment.RemoveExperimentalPart(experimentalPart);
                }
            }
        }
        private void addExperimentalPart(string sExperimentalPartName)
        {
            MerillData.log("accepted contract with experimental part: " + sExperimentalPartName);

            if (sExperimentalPartName != null)
            {
                AvailablePart experimentalPart = PartLoader.getPartInfoByName(sExperimentalPartName);

                MerillData.log("experimental part: " + experimentalPart + ", " + (experimentalPart == null ? "" : "" + ResearchAndDevelopment.IsExperimentalPart(experimentalPart)));
                if (experimentalPart != null && !ResearchAndDevelopment.IsExperimentalPart(experimentalPart))
                {
                    MerillData.log(": Unlocking part: " + sExperimentalPartName);

                    ResearchAndDevelopment.AddExperimentalPart(experimentalPart);
                    //expPartToRemove.Add(experimentalPart.name);
                }
                else
                {
                    MerillData.log(": Part unvailable / already research: " + sExperimentalPartName);
                }
            }
        }
Esempio n. 9
0
        private void GenerateOfferedCourses()
        {
            //convert the saved configs to course offerings
            foreach (CourseTemplate template in CourseTemplates)
            {
                var duplicate = new CourseTemplate(template.sourceNode, true); //creates a duplicate so the initial template is preserved
                duplicate.PopulateFromSourceNode();
                if (duplicate.Available)
                {
                    OfferedCourses.Add(duplicate);
                }
            }

            foreach (AvailablePart ap in PartLoader.LoadedPartsList)
            {
                if (ap.partPrefab.CrewCapacity > 0 &&
                    ResearchAndDevelopment.PartModelPurchased(ap) &&
                    !ResearchAndDevelopment.IsExperimentalPart(ap))
                {
                    AddPartCourses(ap);
                }
            }
        }
Esempio n. 10
0
        public void AddPartCourses(AvailablePart ap)
        {
            string name = TrainingDatabase.SynonymReplace(ap.name);

            if (!_partSynsHandled.Contains(name))
            {
                _partSynsHandled.Add(name);
                bool isPartUnlocked = ResearchAndDevelopment.PartModelPurchased(ap) && !ResearchAndDevelopment.IsExperimentalPart(ap);

                GenerateCourseProf(ap, !isPartUnlocked);
                if (isPartUnlocked && IsMissionTrainingEnabled)
                {
                    GenerateCourseMission(ap);
                }
            }
        }
        // Add stub part into research node
        // Add exp part if in a researched node (from stub part)
        private void addExperimentalParts()
        {
            if (base.dateAccepted == 0)
            {
                MerillData.log("mun mission: can't add exp part: date accepted=" + dateAccepted);
            }
            try
            {
                //add mandatory parts
                addExperimentalPart("MerillnlineCockpitLander");

                //add part from stubs
                foreach (AvailablePart aPart in PartLoader.Instance.parts)
                {
                    if (aPart.partPrefab != null && aPart.partPrefab.Modules != null)
                    {
                        //MerillData.log("part " + aPart.name);
                        foreach (PartModule pm in aPart.partPrefab.Modules)
                        {
                            if (pm.moduleName.Equals("MerillMissionStub"))
                            {
                                if (((MerillMissionStub)pm).missionName.Equals(this.GetType().Name))
                                {
                                    MerillData.log(" RD find a part " + pm.name);
                                    MerillData.log(" RD purchased? " + ResearchAndDevelopment.PartModelPurchased(aPart));
                                    MerillData.log(" RD available? " + ResearchAndDevelopment.PartTechAvailable(aPart));
                                    MerillData.log(" RD mi " + aPart.moduleInfo);
                                    MerillData.log(" RD tech required: " + aPart.TechRequired);
                                    MerillData.log(" RD tech Really required: " + ((MerillMissionStub)pm).techRequired);
                                    MerillData.log(" RD tech Really required purchased? : "
                                                   + ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired));
                                    //already set, and already researched?
                                    if (ResearchAndDevelopment.GetTechnologyState(
                                            ((MerillMissionStub)pm).techRequired) == RDTech.State.Available &&
                                        aPart.TechRequired == ((MerillMissionStub)pm).techRequired)
                                    {
                                        MerillData.log(" RD find a part with r&d node " + pm.name);
                                        //check if already experimental
                                        if (!ResearchAndDevelopment.IsExperimentalPart(
                                                PartLoader.getPartInfoByName(((MerillMissionStub)pm).partUnlock)))
                                        {
                                            addExperimentalPart(((MerillMissionStub)pm).partUnlock);
                                        }
                                    }
                                    // not set
                                    else if (aPart.TechRequired == "specializedControl")
                                    {
                                        try {
                                            //try to attach the stub to a research node
                                            MerillData.log(" RD find a part without r&d node " + pm.name);

                                            RDTech tech = AssetBase.RnDTechTree.FindTech(
                                                ((MerillMissionStub)pm).techRequired);
                                            if (tech != null)
                                            {
                                                //Set it
                                                MerillData.log(" RD find good tech " + tech.name);
                                                aPart.TechRequired = ((MerillMissionStub)pm).techRequired;
                                                tech.partsAssigned.Add(aPart);
                                                MerillData.log(" RD find tech assigned ");

                                                MerillData.log(" RD good tech purchased? " + tech.state
                                                               + " , " + tech.enabled + ", ");
                                                //already researched?
                                                if (ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired) == RDTech.State.Available)
                                                {
                                                    addExperimentalPart(((MerillMissionStub)pm).partUnlock);
                                                }
                                            }
                                        }
                                        catch (Exception e)
                                        {
                                            MerillData.log(" RD Exeption:  " + e);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                //TODO: made this auto + add stub in tree
                //if (ResearchAndDevelopment.PartModelPurchased(PartLoader.getPartInfoByName("MerillCheapFuelTank1-2Stub")))
                //	addExperimentalPart("MerillCheapFuelTank1-2");


                //if (ResearchAndDevelopment.PartModelPurchased(PartLoader.getPartInfoByName("MerillCheapFuelTank3-2Stub")))
                //	addExperimentalPart("MerillCheapFuelTank3-2");

                //if (ResearchAndDevelopment.PartModelPurchased(PartLoader.getPartInfoByName("MerillLinearRcsExperimental")))
                //	addExperimentalPart("MerillLinearRcsExperimental");
            }
            catch (Exception e)
            {
                MerillData.log(" exception at contract OnAccepted:" + e);
            }
        }
        protected void removeExperimentalParts()
        {
            try
            {
                //remove mandatory parts
                removeExperimentalPart("MerillnlineCockpitLander");

                foreach (AvailablePart aPart in PartLoader.Instance.parts)
                {
                    if (aPart.partPrefab != null && aPart.partPrefab.Modules != null)
                    {
                        foreach (PartModule pm in aPart.partPrefab.Modules)
                        {
                            if (pm.moduleName.Equals("MerillMissionStub"))
                            {
                                if (((MerillMissionStub)pm).missionName.Equals(this.GetType().Name))
                                {
                                    MerillData.log(" RD find a part " + pm.name);
                                    MerillData.log(" RD purchased? " + ResearchAndDevelopment.PartModelPurchased(aPart));
                                    MerillData.log(" RD available? " + ResearchAndDevelopment.PartTechAvailable(aPart));
                                    MerillData.log(" RD mi '" + aPart.moduleInfo + "'");
                                    MerillData.log(" RD tech required: " + aPart.TechRequired);
                                    MerillData.log(" RD tech Really required: " + ((MerillMissionStub)pm).techRequired);
                                    //research and set
                                    if (ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired) == RDTech.State.Available &&
                                        aPart.TechRequired == ((MerillMissionStub)pm).techRequired)
                                    {
                                        MerillData.log(" RD purchased, is experimental? "
                                                       + ResearchAndDevelopment.IsExperimentalPart(
                                                           PartLoader.getPartInfoByName(((MerillMissionStub)pm).partUnlock)));
                                        //check if experimental
                                        if (ResearchAndDevelopment.IsExperimentalPart(
                                                PartLoader.getPartInfoByName(((MerillMissionStub)pm).partUnlock)))
                                        {
                                            removeExperimentalPart(((MerillMissionStub)pm).partUnlock);
                                        }
                                        //remove from tech
                                        RDTech tech = AssetBase.RnDTechTree.FindTech(aPart.TechRequired);
                                        if (tech != null)
                                        {
                                            MerillData.log(" RD find good tech " + tech.name);
                                            aPart.TechRequired = "specializedControl";
                                            tech.partsAssigned.Remove(aPart);
                                        }
                                    }
                                    //set? ==((MerillMissionStub)pm).techRequired
                                    else if (aPart.TechRequired != "specializedControl")
                                    {
                                        try {
                                            //try to remove the stub to a research node
                                            MerillData.log(" RD find a part with r&d node " + pm.name);

                                            RDTech tech = AssetBase.RnDTechTree.FindTech(aPart.TechRequired);
                                            if (tech != null)
                                            {
                                                MerillData.log(" RD find good tech " + tech.name);
                                                aPart.TechRequired = "specializedControl";
                                                tech.partsAssigned.Remove(aPart);
                                                MerillData.log(" RD find tech assigned ");
                                                if (ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired) == RDTech.State.Available)
                                                {
                                                    removeExperimentalPart(((MerillMissionStub)pm).partUnlock);
                                                }
                                            }
                                        }
                                        catch (Exception e)
                                        {
                                            MerillData.log(" RD Exeption:  " + e);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                MerillData.log(" exception at contract OnAccepted:" + e);
            }
        }
Esempio n. 13
0
        public void AddPartCourses(AvailablePart ap)
        {
            if (ap.partPrefab.isVesselEVA || ap.partPrefab.Modules.Contains <KerbalSeat>() ||
                ap.partPrefab.Modules.Contains <LaunchClamp>() || ap.partPrefab.HasTag("PadInfrastructure"))
            {
                return;
            }

            TrainingDatabase.SynonymReplace(ap.name, out string name);
            if (!_partSynsHandled.Contains(name))
            {
                _partSynsHandled.Add(name);
                bool isPartUnlocked = ResearchAndDevelopment.PartModelPurchased(ap) && !ResearchAndDevelopment.IsExperimentalPart(ap);

                GenerateCourseProf(ap, !isPartUnlocked);
                if (isPartUnlocked && IsMissionTrainingEnabled)
                {
                    GenerateCourseMission(ap);
                }
            }
        }
Esempio n. 14
0
        protected AvailablePart[] getLockedParts()
        {
            List <AvailablePart> lockedParts = new List <AvailablePart>();

            AvailablePart[] loadedParts = PartLoader.LoadedPartsList.ToArray();
            AvailablePart   availablePart;

            for (int index = 0; index < loadedParts.Length; index++)
            {
                availablePart = loadedParts[index];
                if (!ResearchAndDevelopment.PartModelPurchased(availablePart) &&
                    !ResearchAndDevelopment.IsExperimentalPart(availablePart) &&
                    !blacklistNodes.Contains(availablePart.TechRequired))
                {
                    //Check for excluded folders
                    if (!string.IsNullOrEmpty(excludeFolders))
                    {
                        string[] bannedFolders = excludeFolders.Split(new char[] { ';' });
                        bool     partIsBanned  = false;
                        for (int folderIndex = 0; folderIndex < excludeFolders.Length; folderIndex++)
                        {
                            if (availablePart.partUrl.Contains(excludeFolders[folderIndex]))
                            {
                                partIsBanned = true;
                                break;
                            }
                        }

                        if (partIsBanned)
                        {
                            continue;
                        }
                    }

                    //If we aren't unlocking parts exclusive to mod folders then just add the part.
                    if (string.IsNullOrEmpty(modFolders))
                    {
                        lockedParts.Add(availablePart);
                    }

                    //See if the part belongs to the mod whitelist.
                    else
                    {
                        string[] allowedFolders = modFolders.Split(new char[] { ';' });
                        for (int folderIndex = 0; folderIndex < allowedFolders.Length; folderIndex++)
                        {
                            if (availablePart.partUrl.Contains(allowedFolders[folderIndex]))
                            {
                                lockedParts.Add(availablePart);
                                break;
                            }
                        }
                    }
                }
            }

            if (lockedParts.Count > 0)
            {
                return(lockedParts.ToArray());
            }
            else
            {
                return(null);
            }
        }