public void TechUnlockEvent(GameEvents.HostTargetAction <RDTech, RDTech.OperationResult> ev) { //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)) { KCT_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) { KCT_GameStates.TechList.Add(tech); foreach (KCT_TechItem techItem in KCT_GameStates.TechList) { techItem.UpdateBuildRate(KCT_GameStates.TechList.IndexOf(techItem)); } double timeLeft = tech.BuildRate > 0 ? tech.TimeLeft : tech.EstimatedTimeLeft; ScreenMessages.PostScreenMessage("[KCT] Node will unlock in " + KCT_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 " + KCT_Utilities.GetFormattedTime((KCT_GameStates.TechList.First(t => t.techID == ev.host.techID)).TimeLeft), 4.0f, ScreenMessageStyle.UPPER_LEFT); } } }
private static Dictionary <string, string> GetIntegrationRolloutVariables(KCT_BuildListVessel vessel, List <KCT_BuildListVessel> mergedVessels = null) { double loadedMass, emptyMass, loadedCost, emptyCost; loadedCost = vessel.cost; emptyCost = vessel.emptyCost; loadedMass = vessel.GetTotalMass(); emptyMass = vessel.emptyMass; if (mergedVessels != null) { foreach (KCT_BuildListVessel v in mergedVessels) { loadedCost += v.cost; emptyCost += v.emptyCost; loadedMass += v.GetTotalMass(); emptyMass += v.emptyMass; } } int EditorLevel = 0, LaunchSiteLvl = 0, EditorMax = 0, LaunchSiteMax = 0; int isVABVessel = 0; if (vessel.type == KCT_BuildListVessel.ListType.None) { vessel.FindTypeFromLists(); } if (vessel.type == KCT_BuildListVessel.ListType.VAB) { EditorLevel = KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.VehicleAssemblyBuilding); LaunchSiteLvl = KCT_GameStates.ActiveKSC.ActiveLPInstance.level;//KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.LaunchPad); EditorMax = KCT_Utilities.BuildingUpgradeMaxLevel(SpaceCenterFacility.VehicleAssemblyBuilding); LaunchSiteMax = KCT_Utilities.BuildingUpgradeMaxLevel(SpaceCenterFacility.LaunchPad); isVABVessel = 1; } else if (vessel.type == KCT_BuildListVessel.ListType.SPH) { EditorLevel = KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.SpaceplaneHangar); LaunchSiteLvl = KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.Runway); EditorMax = KCT_Utilities.BuildingUpgradeMaxLevel(SpaceCenterFacility.SpaceplaneHangar); LaunchSiteMax = KCT_Utilities.BuildingUpgradeMaxLevel(SpaceCenterFacility.Runway); } double BP = vessel.buildPoints; double OverallMult = KCT_PresetManager.Instance.ActivePreset.timeSettings.OverallMultiplier; Dictionary <string, string> variables = new Dictionary <string, string>(); variables.Add("M", loadedMass.ToString()); variables.Add("m", emptyMass.ToString()); variables.Add("C", loadedCost.ToString()); variables.Add("c", emptyCost.ToString()); variables.Add("VAB", isVABVessel.ToString()); variables.Add("E", vessel.effectiveCost.ToString()); variables.Add("BP", BP.ToString()); variables.Add("L", LaunchSiteLvl.ToString()); variables.Add("LM", LaunchSiteMax.ToString()); variables.Add("EL", EditorLevel.ToString()); variables.Add("ELM", EditorMax.ToString()); variables.Add("O", OverallMult.ToString()); variables.Add("SN", vessel.numStages.ToString()); variables.Add("SP", vessel.numStageParts.ToString()); variables.Add("SC", vessel.stagePartCost.ToString()); AddCrewVariables(variables); return(variables); }
public static double ParseReconditioningFormula(BuildListVessel vessel, bool isReconditioning) { // new Dictionary<string, string>() {{"M", vessel.GetTotalMass().ToString()}, {"O", KCT_PresetManager.Instance.ActivePreset.timeSettings.OverallMultiplier.ToString()}, // {"E", KCT_PresetManager.Instance.ActivePreset.timeSettings.ReconditioningEffect.ToString()}, {"X", KCT_PresetManager.Instance.ActivePreset.timeSettings.MaxReconditioning.ToString()}}); Dictionary <string, string> variables = new Dictionary <string, string>(); double loadedMass, emptyMass, loadedCost, emptyCost; loadedCost = vessel.GetTotalCost(); emptyCost = vessel.emptyCost; loadedMass = vessel.GetTotalMass(); emptyMass = vessel.emptyMass; int EditorLevel = 0, LaunchSiteLvl = 0, EditorMax = 0, LaunchSiteMax = 0; int isVABVessel = 0; if (vessel.type == BuildListVessel.ListType.VAB) { EditorLevel = KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.VehicleAssemblyBuilding); LaunchSiteLvl = GameStates.ActiveKSC.ActiveLPInstance.level;//KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.LaunchPad); EditorMax = KCT_Utilities.BuildingUpgradeMaxLevel(SpaceCenterFacility.VehicleAssemblyBuilding); LaunchSiteMax = KCT_Utilities.BuildingUpgradeMaxLevel(SpaceCenterFacility.LaunchPad); isVABVessel = 1; } else { EditorLevel = KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.SpaceplaneHangar); LaunchSiteLvl = KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.Runway); EditorMax = KCT_Utilities.BuildingUpgradeMaxLevel(SpaceCenterFacility.SpaceplaneHangar); LaunchSiteMax = KCT_Utilities.BuildingUpgradeMaxLevel(SpaceCenterFacility.Runway); } double BP = vessel.buildPoints; double OverallMult = KCT_PresetManager.Instance.ActivePreset.timeSettings.OverallMultiplier; double ReconEffect = KCT_PresetManager.Instance.ActivePreset.timeSettings.ReconditioningEffect; double MaxRecon = KCT_PresetManager.Instance.ActivePreset.timeSettings.MaxReconditioning; variables.Add("M", loadedMass.ToString()); variables.Add("m", emptyMass.ToString()); variables.Add("C", loadedCost.ToString()); variables.Add("c", emptyCost.ToString()); variables.Add("VAB", isVABVessel.ToString()); variables.Add("BP", BP.ToString()); variables.Add("L", LaunchSiteLvl.ToString()); variables.Add("LM", LaunchSiteMax.ToString()); variables.Add("EL", EditorLevel.ToString()); variables.Add("ELM", EditorMax.ToString()); variables.Add("O", OverallMult.ToString()); variables.Add("E", ReconEffect.ToString()); variables.Add("X", MaxRecon.ToString()); int isRecon = isReconditioning ? 1 : 0; variables.Add("RE", isRecon.ToString()); variables.Add("S", KCT_PresetManager.Instance.ActivePreset.timeSettings.RolloutReconSplit.ToString()); variables.Add("SN", vessel.numStages.ToString()); variables.Add("SP", vessel.numStageParts.ToString()); variables.Add("SC", vessel.stagePartCost.ToString()); AddCrewVariables(variables); return(GetStandardFormulaValue("Reconditioning", variables)); }
public static int GetKCTUpgradeCounts(SpaceCenterFacility facility) { return(KCT_Utilities.SpentUpgradesFor(facility)); }
internal void ProcessUpgrade() { int oldLevel = getMember <int>("level"); KCTDebug.Log($"Upgrading from level {oldLevel}"); string facilityID = GetFacilityID(); SpaceCenterFacility?facilityType = GetFacilityType(); string gate = GetTechGate(facilityID, oldLevel + 1); KCTDebug.Log("[KCTT] Gate for " + facilityID + "? " + gate); if (!string.IsNullOrEmpty(gate)) { if (ResearchAndDevelopment.GetTechnologyState(gate) != RDTech.State.Available) { PopupDialog.SpawnPopupDialog(new MultiOptionDialog("kctUpgradePadConfirm", "Can't upgrade this facility. Requires " + KerbalConstructionTimeData.techNameToTitle[gate] + ".", "Lack Tech to Upgrade", HighLogic.UISkin, new DialogGUIButton("Ok", stub)), false, HighLogic.UISkin); return; } } KCT_UpgradingBuilding upgrading = new KCT_UpgradingBuilding(facilityType, facilityID, oldLevel + 1, oldLevel, facilityID.Split('/').Last()); upgrading.isLaunchpad = facilityID.ToLower().Contains("launchpad"); if (upgrading.isLaunchpad) { upgrading.launchpadID = KCT_GameStates.ActiveKSC.ActiveLaunchPadID; if (upgrading.launchpadID > 0) { upgrading.commonName += KCT_GameStates.ActiveKSC.ActiveLPInstance.name; } } if (!upgrading.AlreadyInProgress()) { float cost = getMember <float>("upgradeCost"); if (Funding.CanAfford(cost)) { KCT_Utilities.SpendFunds(cost, TransactionReasons.Structures); KCT_GameStates.ActiveKSC.KSCTech.Add(upgrading); upgrading.SetBP(cost); upgrading.cost = cost; try { KCT_Events.onFacilityUpgradeQueued?.Fire(upgrading); } catch (Exception ex) { Debug.LogException(ex); } ScreenMessages.PostScreenMessage("Facility upgrade requested!", 4.0f, ScreenMessageStyle.UPPER_CENTER); KCTDebug.Log($"Facility {facilityID} upgrade requested to lvl {oldLevel + 1} for {cost} funds, resulting in a BP of {upgrading.BP}"); } else { KCTDebug.Log("Couldn't afford to upgrade."); ScreenMessages.PostScreenMessage("Not enough funds to upgrade facility!", 4.0f, ScreenMessageStyle.UPPER_CENTER); } } else if (oldLevel + 1 != upgrading.currentLevel) { ScreenMessages.PostScreenMessage("Facility is already being upgraded!", 4.0f, ScreenMessageStyle.UPPER_CENTER); KCTDebug.Log($"Facility {facilityID} tried to upgrade to lvl {oldLevel + 1} but already in list!"); } }
private static void DrawBuildPlansWindow(int id) { int butW = 20; GUILayout.BeginVertical(); if (HighLogic.LoadedSceneIsEditor) { if (EditorLogic.fetch.ship != null && EditorLogic.fetch.ship.Parts != null && EditorLogic.fetch.ship.Parts.Count > 0) { if (EditorLogic.fetch.ship.shipName == "Untitled Space Craft" || EditorLogic.fetch.ship.shipName == "") { if (GUILayout.Button("Cannot Add a Plan Without a Valid Name", GUILayout.Height(2 * 22))) { if (EditorLogic.fetch.ship.shipName == "Untitled Space Craft") { var message = new ScreenMessage("[KCT] Vessel must have a name other than 'Untitled Space Craft'.", 4.0f, ScreenMessageStyle.UPPER_CENTER); ScreenMessages.PostScreenMessage(message); } else { var message = new ScreenMessage("[KCT] Vessel must have a name", 4.0f, ScreenMessageStyle.UPPER_CENTER); ScreenMessages.PostScreenMessage(message); } } } else { GUILayout.BeginHorizontal(); if (GUILayout.Button("Add To Building Plans", GUILayout.Height(2 * 22))) { AddVesselToPlansList(); } GUILayout.EndHorizontal(); //if (!KCT_GameStates.settings.OverrideLaunchButton) { GUILayout.BeginHorizontal(); if (GUILayout.Button("Build", GUILayout.Height(2 * 22))) { KCT_Utilities.AddVesselToBuildList(); //SwitchCurrentPartCategory(); KCT_Utilities.RecalculateEditorBuildTime(EditorLogic.fetch.ship); } GUILayout.EndHorizontal(); } } } else { GUILayout.Button("No vessel available", GUILayout.Height(2 * 22)); } } GUILayout.Space(10); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); GUILayout.Label("Available Building Plans"); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); bool VABSelectedNew = GUILayout.Toggle(VABSelected, "VAB", GUI.skin.button); bool SPHSelectedNew = GUILayout.Toggle(SPHSelected, "SPH", GUI.skin.button); if (VABSelectedNew != VABSelected) { SelectList("VAB"); } else if (SPHSelectedNew != SPHSelected) { SelectList("SPH"); } GUILayout.EndHorizontal(); { switch (listWindow) { case 0: plansList = KCT_GameStates.ActiveKSC.VABPlans; break; case 1: plansList = KCT_GameStates.ActiveKSC.SPHPlans; break; } if (listWindow >= 0 && plansList != null) { GUILayout.BeginHorizontal(); // GUILayout.Space((butW + 4) * 3); GUILayout.Label("Name:"); GUILayout.EndHorizontal(); buildPlanScrollPos = GUILayout.BeginScrollView(buildPlanScrollPos, GUILayout.Height(250)); if (plansList.Count == 0) { GUILayout.Label("No vessels in plans."); } for (int i = 0; i < plansList.Count; i++) { KCT_BuildListVessel b = plansList.Values[i]; if (!b.allPartsValid) { continue; } GUILayout.BeginHorizontal(); { if (GUILayout.Button("X", redButton, GUILayout.Width(butW))) { planToDelete = i; InputLockManager.SetControlLock(ControlTypes.EDITOR_SOFT_LOCK, "KCTPopupLock"); IDSelected = b.id; DialogGUIBase[] options = new DialogGUIBase[2]; options[0] = new DialogGUIButton("Yes", RemoveVesselFromPlans); options[1] = new DialogGUIButton("No", DummyVoid); MultiOptionDialog diag = new MultiOptionDialog("scrapVesselPopup", "Are you sure you want to remove this vessel from the plans?", "Delete plan", null, options: options); PopupDialog.SpawnPopupDialog(new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), diag, false, HighLogic.UISkin); } if (GUILayout.Button(b.shipName)) { KCT_Utilities.AddVesselToBuildList(b.NewCopy(true)); } } GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); } GUILayout.FlexibleSpace(); if (GUILayout.Button("Close")) { showBuildPlansWindow = false; } } GUILayout.EndVertical(); GUI.DragWindow(); }
public static void PopUpVesselError(List <KCT_BuildListVessel> errored) { DialogGUIBase[] options = new DialogGUIBase[2]; options[0] = new DialogGUIButton("Understood", () => { }); // new DialogGUIBase("Understood", () => { }); //do nothing and close the window options[1] = new DialogGUIButton("Delete Vessels", () => { foreach (KCT_BuildListVessel blv in errored) { blv.RemoveFromBuildList(); KCT_Utilities.AddFunds(blv.GetTotalCost(), TransactionReasons.VesselRollout); //remove any associated recon_rollout } }); string txt = "The following KCT vessels contain missing or invalid parts and have been quarantined. Either add the missing parts back into your game or delete the vessels. A file containing the ship names and missing parts has been added to your save folder.\n"; string txtToWrite = ""; foreach (KCT_BuildListVessel blv in errored) { txt += blv.shipName + "\n"; txtToWrite += blv.shipName + "\n"; txtToWrite += String.Join("\n", blv.MissingParts().ToArray()); txtToWrite += "\n\n"; } //HighLogic.SaveFolder //make new file for missing ships string filename = KSPUtil.ApplicationRootPath + "/saves/" + HighLogic.SaveFolder + "/missingParts.txt"; System.IO.File.WriteAllText(filename, txtToWrite); //remove all rollout and recon items since they're invalid without the ships foreach (KCT_BuildListVessel blv in errored) { //remove any associated recon_rollout foreach (KCT_KSC ksc in KCT_GameStates.KSCs) { for (int i = 0; i < ksc.Recon_Rollout.Count; i++) { KCT_Recon_Rollout rr = ksc.Recon_Rollout[i]; if (rr.associatedID == blv.id.ToString()) { ksc.Recon_Rollout.Remove(rr); i--; } } for (int i = 0; i < ksc.AirlaunchPrep.Count; i++) { KCT_AirlaunchPrep ap = ksc.AirlaunchPrep[i]; if (ap.associatedID == blv.id.ToString()) { ksc.AirlaunchPrep.Remove(ap); i--; } } } } MultiOptionDialog diag = new MultiOptionDialog("missingPartsPopup", txt, "Vessels Contain Missing Parts", null, options); PopupDialog.SpawnPopupDialog(new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), diag, false, HighLogic.UISkin); //PopupDialog.SpawnPopupDialog(new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), "Vessel Contains Missing Parts", "The KCT vessel " + errored.shipName + " contains missing or invalid parts. You will not be able to do anything with the vessel until the parts are available again.", "Understood", false, HighLogic.UISkin); }
public static T GetPublicStaticValue <T>(this Type type, string name) where T : class { return((T)KCT_Utilities.GetMemberInfoValue(type.GetMember(name, BindingFlags.Public | BindingFlags.Static).FirstOrDefault(), null)); }
public override void OnLoad(ConfigNode node) { base.OnLoad(node); LoadTree(); if (KCT_Utilities.CurrentGameIsMission()) { return; } KCTDebug.Log("Reading from persistence."); KCT_GameStates.KSCs.Clear(); KCT_GameStates.ActiveKSC = null; //KCT_Utilities.SetActiveKSC("Stock"); KCT_GameStates.InitAndClearTechList(); KCT_GameStates.TechUpgradesTotal = 0; KCT_GameStates.SciPointsTotal = -1; KCT_DataStorage kctVS = new KCT_DataStorage(); ConfigNode CN = node.GetNode(kctVS.GetType().Name); if (CN != null) { ConfigNode.LoadObjectFromConfig(kctVS, CN); } foreach (ConfigNode ksc in node.GetNodes("KSC")) { string name = ksc.GetValue("KSCName"); KCT_KSC loaded_KSC = new KCT_KSC(name); loaded_KSC.FromConfigNode(ksc); if (loaded_KSC != null && loaded_KSC.KSCName != null && loaded_KSC.KSCName.Length > 0) { loaded_KSC.RDUpgrades[1] = KCT_GameStates.TechUpgradesTotal; if (KCT_GameStates.KSCs.Find(k => k.KSCName == loaded_KSC.KSCName) == null) { KCT_GameStates.KSCs.Add(loaded_KSC); } } } KCT_Utilities.SetActiveKSCToRSS(); ConfigNode tmp = node.GetNode("TechList"); if (tmp != null) { foreach (ConfigNode techNode in tmp.GetNodes("Tech")) { KCT_TechStorageItem techStorageItem = new KCT_TechStorageItem(); ConfigNode.LoadObjectFromConfig(techStorageItem, techNode); KCT_TechItem techItem = techStorageItem.ToTechItem(); techItem.protoNode = new ProtoTechNode(techNode.GetNode("ProtoNode")); KCT_GameStates.TechList.Add(techItem); } } //KCT_GUI.CheckToolbar(); KCT_GameStates.erroredDuringOnLoad.OnLoadFinish(); //KerbalConstructionTime.DelayedStart(); }
public void Start() { if (KCT_Utilities.CurrentGameIsMission()) { return; } KCTDebug.Log("Start called"); // Subscribe to events from KSP and other mods if (!KCT_Events.instance.subscribedToEvents) { KCT_Events.instance.SubscribeToEvents(); } KCT_GameStates.settings.Save(); //Save the settings file, with defaults if it doesn't exist KCT_PresetManager.Instance.SaveActiveToSaveData(); // Ghetto event queue if (HighLogic.LoadedScene == GameScenes.EDITOR) { InvokeRepeating("EditorRecalculation", 1, 1); KCT_GUI.buildRateForDisplay = null; if (!KCT_GUI.PrimarilyDisabled) { KCT_Utilities.RecalculateEditorBuildTime(EditorLogic.fetch.ship); } } if (KCT_GUI.PrimarilyDisabled) { if (InputLockManager.GetControlLock("KCTLaunchLock") == ControlTypes.EDITOR_LAUNCH) { InputLockManager.RemoveControlLock("KCTLaunchLock"); } } KACWrapper.InitKACWrapper(); if (!KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled) { if (InputLockManager.GetControlLock("KCTKSCLock") == ControlTypes.KSC_FACILITIES) { InputLockManager.RemoveControlLock("KCTKSCLock"); } return; } //Begin primary mod functions KCT_GameStates.UT = Planetarium.GetUniversalTime(); KCT_GUI.guiDataSaver.Load(); switch (HighLogic.LoadedScene) { case GameScenes.EDITOR: //if (HighLogic.LoadedSceneIsEditor) { KCT_GUI.hideAll(); if (!KCT_GUI.PrimarilyDisabled) { KCT_GUI.showEditorGUI = KCT_GameStates.showWindows[1]; if (KCT_GUI.showEditorGUI) { KCT_GUI.ClickOn(); } else { KCT_GUI.ClickOff(); } } } break; case GameScenes.SPACECENTER: //else if (HighLogic.LoadedScene == GameScenes.SPACECENTER) { bool shouldStart = KCT_GUI.showFirstRun; KCT_GUI.hideAll(); if (!shouldStart) { KCT_GUI.showBuildList = KCT_GameStates.showWindows[0]; if (KCT_GUI.showBuildList) { KCT_GUI.ClickOn(); } else { KCT_GUI.ClickOff(); } } KCT_GUI.showFirstRun = shouldStart; } break; case GameScenes.FLIGHT: if (/*HighLogic.LoadedSceneIsFlight && */ FlightGlobals.ActiveVessel.situation == Vessel.Situations.PRELAUNCH && FlightGlobals.ActiveVessel.GetCrewCount() == 0 && KCT_GameStates.launchedCrew.Count > 0) { KerbalRoster roster = HighLogic.CurrentGame.CrewRoster; for (int i = 0; i < FlightGlobals.ActiveVessel.parts.Count; i++) { Part p = FlightGlobals.ActiveVessel.parts[i]; //KCTDebug.Log("craft: " + p.craftID); KCTDebug.LogError("Part being tested: " + p.partInfo.title); { CrewedPart cP = KCT_GameStates.launchedCrew.Find(part => part.partID == p.craftID); if (cP == null) { continue; } List <ProtoCrewMember> crewList = cP.crewList; KCTDebug.LogError("cP.crewList.Count: " + cP.crewList.Count); foreach (ProtoCrewMember crewMember in crewList) { if (crewMember != null) { ProtoCrewMember finalCrewMember = crewMember; if (crewMember.type == ProtoCrewMember.KerbalType.Crew) { finalCrewMember = roster.Crew.FirstOrDefault(c => c.name == crewMember.name); } else if (crewMember.type == ProtoCrewMember.KerbalType.Tourist) { finalCrewMember = roster.Tourist.FirstOrDefault(c => c.name == crewMember.name); } if (finalCrewMember == null) { KCTDebug.LogError("Error when assigning " + crewMember.name + " to " + p.partInfo.name + ". Cannot find Kerbal in list."); continue; } try { KCTDebug.Log("Assigning " + finalCrewMember.name + " to " + p.partInfo.name); if (p.AddCrewmember(finalCrewMember)) //p.AddCrewmemberAt(finalCrewMember, crewList.IndexOf(crewMember))) { finalCrewMember.rosterStatus = ProtoCrewMember.RosterStatus.Assigned; if (finalCrewMember.seat != null) { finalCrewMember.seat.SpawnCrew(); } } else { KCTDebug.LogError("Error when assigning " + crewMember.name + " to " + p.partInfo.name); finalCrewMember.rosterStatus = ProtoCrewMember.RosterStatus.Available; continue; } } catch { KCTDebug.LogError("Error when assigning " + crewMember.name + " to " + p.partInfo.name); finalCrewMember.rosterStatus = ProtoCrewMember.RosterStatus.Available; continue; } } } } } KCT_GameStates.launchedCrew.Clear(); } //if (HighLogic.LoadedSceneIsFlight) { KCT_GUI.hideAll(); if (KCT_GameStates.launchedVessel != null && FlightGlobals.ActiveVessel != null && FlightGlobals.ActiveVessel.situation == Vessel.Situations.PRELAUNCH) { KCT_GameStates.launchedVessel.KSC = null; //it's invalid now KCTDebug.Log("Attempting to remove launched vessel from build list"); bool removed = KCT_GameStates.launchedVessel.RemoveFromBuildList(); if (removed) //Only do these when the vessel is first removed from the list { //Add the cost of the ship to the funds so it can be removed again by KSP KCT_Utilities.AddFunds(KCT_GameStates.launchedVessel.cost, TransactionReasons.VesselRollout); FlightGlobals.ActiveVessel.vesselName = KCT_GameStates.launchedVessel.shipName; } KCT_Recon_Rollout rollout = KCT_GameStates.ActiveKSC.Recon_Rollout.FirstOrDefault(r => r.associatedID == KCT_GameStates.launchedVessel.id.ToString()); if (rollout != null) { KCT_GameStates.ActiveKSC.Recon_Rollout.Remove(rollout); } KCT_AirlaunchPrep alPrep = KCT_GameStates.ActiveKSC.AirlaunchPrep.FirstOrDefault(r => r.associatedID == KCT_GameStates.launchedVessel.id.ToString()); if (alPrep != null) { KCT_GameStates.ActiveKSC.AirlaunchPrep.Remove(alPrep); } AirlaunchParams alParams = KCT_GameStates.AirlaunchParams; if (alParams != null && alParams.KCTVesselId == KCT_GameStates.launchedVessel.id && (!alParams.KSPVesselId.HasValue || alParams.KSPVesselId == FlightGlobals.ActiveVessel.id)) { if (!alParams.KSPVesselId.HasValue) { alParams.KSPVesselId = FlightGlobals.ActiveVessel.id; } StartCoroutine(AirlaunchRoutine(alParams, FlightGlobals.ActiveVessel.id)); } } } break; } ratesUpdated = false; KCTDebug.Log("Start finished"); wfsOne = new WaitForSeconds(1f); wfsTwo = new WaitForSeconds(2f); wfsHalf = new WaitForSeconds(0.5f); DelayedStart(); UpdateTechlistIconColor(); StartCoroutine(HandleEditorButton_Coroutine()); }
public KCT_BuildListVessel(Vessel vessel, KCT_BuildListVessel.ListType listType = ListType.None) //For recovered vessels { id = Guid.NewGuid(); shipName = vessel.vesselName; shipNode = FromInFlightVessel(vessel, listType); if (listType != ListType.None) { this.type = listType; } cost = KCT_Utilities.GetTotalVesselCost(shipNode); emptyCost = KCT_Utilities.GetTotalVesselCost(shipNode, false); TotalMass = 0; emptyMass = 0; HashSet <int> stages = new HashSet <int>(); //for (int i = vessel.protoVessel.protoPartSnapshots.Count - 1; i >= 0; i--) //{ // ProtoPartSnapshot p = vessel.protoVessel.protoPartSnapshots[i]; foreach (ProtoPartSnapshot p in vessel.protoVessel.protoPartSnapshots) { stages.Add(p.inverseStageIndex); if (p.partPrefab != null && p.partPrefab.Modules.Contains <LaunchClamp>()) { continue; } TotalMass += p.mass; emptyMass += p.mass; //for (int i1 = p.resources.Count - 1; i1 >= 0; i1--) //{ // ProtoPartResourceSnapshot rsc = p.resources[i1]; foreach (ProtoPartResourceSnapshot rsc in p.resources) { PartResourceDefinition def = PartResourceLibrary.Instance.GetDefinition(rsc.resourceName); if (def != null) { TotalMass += def.density * (float)rsc.amount; } } } cannotEarnScience = true; numStages = stages.Count; // FIXME ignore stageable part count and cost - it'll be fixed when we put this back in the editor. effectiveCost = KCT_Utilities.GetEffectiveCost(shipNode.GetNodes("PART").ToList()); buildPoints = KCT_Utilities.GetBuildTime(effectiveCost); flag = HighLogic.CurrentGame.flagURL; DistanceFromKSC = (float)SpaceCenter.Instance.GreatCircleDistance(SpaceCenter.Instance.cb.GetRelSurfaceNVector(vessel.latitude, vessel.longitude)); rushBuildClicks = 0; integrationPoints = KCT_MathParsing.ParseIntegrationTimeFormula(this); integrationCost = (float)KCT_MathParsing.ParseIntegrationCostFormula(this); progress = buildPoints + integrationPoints; }
public KCT_BuildListVessel(ShipConstruct s, String ls, double effCost, double bP, String flagURL) { ship = s; shipNode = s.SaveShip(); shipName = s.shipName; //Get total ship cost float fuel; cost = s.GetShipCosts(out emptyCost, out fuel); TotalMass = s.GetShipMass(true, out emptyMass, out fuel); HashSet <int> stages = new HashSet <int>(); numStageParts = 0; stagePartCost = 0d; //for (int i = s.Parts.Count - 1; i >= 0; i--) //{ // Part p = s.Parts[i]; foreach (Part p in s.Parts) { if (p.stagingOn) { stages.Add(p.inverseStage); ++numStageParts; stagePartCost += p.GetModuleCosts(p.partInfo.cost, ModifierStagingSituation.CURRENT) + p.partInfo.cost; } } numStages = stages.Count; launchSite = ls; effectiveCost = effCost; buildPoints = bP; progress = 0; flag = flagURL; if (s.shipFacility == EditorFacility.VAB) { type = ListType.VAB; } else if (s.shipFacility == EditorFacility.SPH) { type = ListType.SPH; } else { type = ListType.None; } id = Guid.NewGuid(); cannotEarnScience = false; //get the crew from the editorlogic DesiredManifest = new List <string>(); if (CrewAssignmentDialog.Instance?.GetManifest()?.CrewCount > 0) { //var pcm = CrewAssignmentDialog.Instance.GetManifest().GetAllCrew(true) ?? new List<ProtoCrewMember>(); //for (int i = pcm.Count - 1; i >= 0; i--) //{ // ProtoCrewMember crew = pcm[i]; foreach (ProtoCrewMember crew in CrewAssignmentDialog.Instance.GetManifest().GetAllCrew(true) ?? new List <ProtoCrewMember>()) { DesiredManifest.Add(crew?.name ?? string.Empty); } } if (effectiveCost == default(double)) { // Can only happen in older saves that didn't have Effective cost persisted as a separate field // This code should be safe to remove after a while. effectiveCost = KCT_Utilities.GetEffectiveCost(shipNode.GetNodes("PART").ToList()); } integrationPoints = KCT_MathParsing.ParseIntegrationTimeFormula(this); integrationCost = (float)KCT_MathParsing.ParseIntegrationCostFormula(this); }
public static KCT_BuildListVessel AddVesselToPlansList(string launchSite) { if (string.IsNullOrEmpty(launchSite)) { launchSite = EditorLogic.fetch.launchSiteName; } KCT_BuildListVessel blv = new KCT_BuildListVessel(EditorLogic.fetch.ship, launchSite, KCT_Utilities.GetBuildTime(EditorLogic.fetch.ship.Parts), EditorLogic.FlagURL); blv.shipName = EditorLogic.fetch.shipNameField.text; return(AddVesselToPlansList(blv)); }
public void FixedUpdate() { if (KCT_Utilities.CurrentGameIsMission()) { return; } double lastUT = GameStates.UT > 0 ? GameStates.UT : Planetarium.GetUniversalTime(); GameStates.UT = Planetarium.GetUniversalTime(); try { if (KCTEvents.instance != null && KCTEvents.instance.KCTButtonStock != null) { if (KCT_GUI.clicked) { KCTEvents.instance.KCTButtonStock.SetTrue(false); } else { KCTEvents.instance.KCTButtonStock.SetFalse(false); } } if (!KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled) { return; } if (!GameStates.erroredDuringOnLoad.AlertFired && GameStates.erroredDuringOnLoad.HasErrored()) { GameStates.erroredDuringOnLoad.FireAlert(); } if (GameStates.UpdateLaunchpadDestructionState) { Log.Trace("Updating launchpad destruction state."); GameStates.UpdateLaunchpadDestructionState = false; GameStates.ActiveKSC.ActiveLPInstance.SetDestructibleStateFromNode(); if (GameStates.ActiveKSC.ActiveLPInstance.upgradeRepair) { //repair everything, then update the node GameStates.ActiveKSC.ActiveLPInstance.RefreshDestructionNode(); GameStates.ActiveKSC.ActiveLPInstance.CompletelyRepairNode(); GameStates.ActiveKSC.ActiveLPInstance.SetDestructibleStateFromNode(); } } if (!ratesUpdated) { if (HighLogic.LoadedScene == GameScenes.SPACECENTER) { if (ScenarioUpgradeableFacilities.GetFacilityLevelCount(SpaceCenterFacility.VehicleAssemblyBuilding) >= 0) { ratesUpdated = true; Log.Trace("Updating build rates"); foreach (SpaceCenterConstruction KSC in GameStates.KSCs) { KSC?.RecalculateBuildRates(); KSC?.RecalculateUpgradedBuildRates(); } Log.Trace("Rates updated"); foreach (SpaceCenterFacility facility in Enum.GetValues(typeof(SpaceCenterFacility))) { GameStates.BuildingMaxLevelCache[facility.ToString()] = ScenarioUpgradeableFacilities.GetFacilityLevelCount(facility); Log.Trace("Cached " + facility.ToString() + " max at " + GameStates.BuildingMaxLevelCache[facility.ToString()]); } } } else { ratesUpdated = true; } } if (GameStates.ActiveKSC?.ActiveLPInstance != null && HighLogic.LoadedScene == GameScenes.SPACECENTER && KCT_Utilities.CurrentGameIsCareer()) { if (lvlCheckTimer++ > 30) { lvlCheckTimer = 0; if (KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.LaunchPad) != GameStates.ActiveKSC.ActiveLPInstance.level) { GameStates.ActiveKSC.SwitchLaunchPad(GameStates.ActiveKSC.ActiveLaunchPadID, false); GameStates.UpdateLaunchpadDestructionState = true; } } } //Warp code if (!KCT_GUI.PrimarilyDisabled && (HighLogic.LoadedScene == GameScenes.FLIGHT || HighLogic.LoadedScene == GameScenes.SPACECENTER || HighLogic.LoadedScene == GameScenes.TRACKSTATION)) { IKCTBuildItem ikctItem = KCT_Utilities.NextThingToFinish(); if (GameStates.targetedItem == null && ikctItem != null) { GameStates.targetedItem = ikctItem; } double remaining = ikctItem != null?ikctItem.GetTimeLeft() : -1; double dT = TimeWarp.CurrentRate / (GameStates.UT - lastUT); if (dT >= 20) { dT = 0.1; } //Log.Trace("dt: " + dT); int nBuffers = 1; if (GameStates.canWarp && ikctItem != null && !ikctItem.IsComplete()) { int warpRate = TimeWarp.CurrentRateIndex; if (warpRate < GameStates.lastWarpRate) //if something else changes the warp rate then release control to them, such as Kerbal Alarm Clock { GameStates.canWarp = false; GameStates.lastWarpRate = 0; } else { if (ikctItem == GameStates.targetedItem && warpRate > 0 && TimeWarp.fetch.warpRates[warpRate] * dT * nBuffers > Math.Max(remaining, 0)) { int newRate = warpRate; //find the first rate that is lower than the current rate while (newRate > 0) { if (TimeWarp.fetch.warpRates[newRate] * dT * nBuffers < remaining) { break; } newRate--; } Log.Trace("Warping down to " + newRate + " (delta: " + (TimeWarp.fetch.warpRates[newRate] * dT) + ")"); TimeWarp.SetRate(newRate, true); //hopefully a faster warp down than before warpRate = newRate; } else if (warpRate == 0 && GameStates.warpInitiated) { GameStates.canWarp = false; GameStates.warpInitiated = false; GameStates.targetedItem = null; } GameStates.lastWarpRate = warpRate; } } else if (ikctItem != null && ikctItem == GameStates.targetedItem && (GameStates.warpInitiated || GameStates.settings.ForceStopWarp) && TimeWarp.CurrentRateIndex > 0 && (remaining < 1) && (!ikctItem.IsComplete())) //Still warp down even if we don't control the clock { TimeWarp.SetRate(0, true); GameStates.warpInitiated = false; GameStates.targetedItem = null; } } if (HighLogic.LoadedScene == GameScenes.TRACKSTATION) { KCT_Utilities.SetActiveKSCToRSS(); } if (!KCT_GUI.PrimarilyDisabled && HighLogic.LoadedScene == GameScenes.SPACECENTER) { if (KSP.UI.Screens.VesselSpawnDialog.Instance != null && KSP.UI.Screens.VesselSpawnDialog.Instance.Visible) { KSP.UI.Screens.VesselSpawnDialog.Instance.ButtonClose(); Log.Trace("Attempting to close spawn dialog!"); } } if (!KCT_GUI.PrimarilyDisabled) { KCT_Utilities.ProgressBuildTime(); } } catch (Exception e) { Debug.LogException(e); } }
public void FixedUpdate() { if (!KCT_GameStates.settings.enabledForSave) { return; } if (!KCT_GameStates.erroredDuringOnLoad.AlertFired && KCT_GameStates.erroredDuringOnLoad.HasErrored()) { KCT_GameStates.erroredDuringOnLoad.FireAlert(); } if (KCT_GameStates.LoadingSimulationSave) { KCT_Utilities.LoadSimulationSave(true); } if (KCT_SpecialSurpriseInside.instance.activated) { if (HighLogic.LoadedSceneIsFlight) { KCT_SpecialSurpriseInside.instance.CheckShipForChallengeComplete(); } if (!KCT_SpecialSurpriseInside.instance.disableBlocks && UnityEngine.Random.Range(0, 1000) == 0) { KCT_SpecialSurpriseInside.instance.showAd = true; } } KCT_GameStates.UT = Planetarium.GetUniversalTime(); try { if (!KCT_GUI.PrimarilyDisabled && (HighLogic.LoadedScene == GameScenes.FLIGHT || HighLogic.LoadedScene == GameScenes.SPACECENTER || HighLogic.LoadedScene == GameScenes.TRACKSTATION && !KCT_GameStates.flightSimulated)) { IKCTBuildItem ikctItem = KCT_Utilities.NextThingToFinish(); if (KCT_GameStates.targetedItem == null && ikctItem != null) { KCT_GameStates.targetedItem = ikctItem; } if (KCT_GameStates.canWarp && ikctItem != null && !ikctItem.IsComplete()) { int warpRate = TimeWarp.CurrentRateIndex; if (SOIAlert()) { TimeWarp.SetRate(0, true); KCT_GameStates.canWarp = false; KCT_GameStates.warpInitiated = false; } else if (warpRate < KCT_GameStates.lastWarpRate) //if something else changes the warp rate then release control to them, such as Kerbal Alarm Clock { KCT_GameStates.canWarp = false; KCT_GameStates.lastWarpRate = 0; } else { if (ikctItem == KCT_GameStates.targetedItem && (10 * TimeWarp.deltaTime) > Math.Max((ikctItem.GetTimeLeft()), 0) && TimeWarp.CurrentRate > 1.0f) { TimeWarp.SetRate(--warpRate, true); } else if (warpRate == 0 && KCT_GameStates.warpInitiated) { KCT_GameStates.canWarp = false; KCT_GameStates.warpInitiated = false; } KCT_GameStates.lastWarpRate = warpRate; } } else if (ikctItem != null && ikctItem == KCT_GameStates.targetedItem && (KCT_GameStates.warpInitiated || KCT_GameStates.settings.ForceStopWarp) && TimeWarp.CurrentRate != 0 && (ikctItem.GetTimeLeft()) < (TimeWarp.deltaTime * 2) && (!ikctItem.IsComplete())) //Still warp down even if we don't control the clock { TimeWarp.SetRate(0, false); KCT_GameStates.warpInitiated = false; } else if (ikctItem != null && (KCT_GameStates.settings.ForceStopWarp) && TimeWarp.CurrentRate != 0 && (!ikctItem.IsComplete())) { if ((10 * TimeWarp.deltaTime) > Math.Max((ikctItem.GetTimeLeft()), 0) && TimeWarp.CurrentRate > 1.0f) { TimeWarp.SetRate(TimeWarp.CurrentRateIndex - 1, true); } } } if (HighLogic.LoadedScene == GameScenes.FLIGHT && KCT_GameStates.flightSimulated) //Simulated flights { if (FlightGlobals.ActiveVessel.loaded && !FlightGlobals.ActiveVessel.packed && !moved) { //moved = true; int secondsForMove = 3; if (KCT_GameStates.simulateInOrbit && loadDeferTime == DateTime.MaxValue) { loadDeferTime = DateTime.Now; } else if (KCT_GameStates.simulateInOrbit && (!KCT_GameStates.delayMove || DateTime.Now.CompareTo(loadDeferTime.AddSeconds(secondsForMove)) > 0)) { KCTDebug.Log("Moving vessel to orbit. " + KCT_GameStates.simulationBody.bodyName + ":" + KCT_GameStates.simOrbitAltitude + ":" + KCT_GameStates.simInclination); KCT_OrbitAdjuster.PutInOrbitAround(KCT_GameStates.simulationBody, KCT_GameStates.simOrbitAltitude, KCT_GameStates.simInclination); moved = true; loadDeferTime = DateTime.MaxValue; } else if (!KCT_GameStates.simulateInOrbit) { moved = true; } if (KCT_GameStates.simulateInOrbit && loadDeferTime != DateTime.MaxValue && lastSeconds != (loadDeferTime.AddSeconds(secondsForMove) - DateTime.Now).Seconds) { double remaining = (loadDeferTime.AddSeconds(secondsForMove) - DateTime.Now).TotalSeconds; ScreenMessages.PostScreenMessage("[KCT] Moving vessel in " + Math.Round(remaining) + " seconds", (float)(remaining - Math.Floor(remaining)), ScreenMessageStyle.UPPER_CENTER); lastSeconds = (int)remaining; } } if (KCT_GameStates.simulationEndTime > 0 && KCT_GameStates.UT >= KCT_GameStates.simulationEndTime) { FlightDriver.SetPause(true); KCT_GUI.showSimulationCompleteFlight = true; } if (FlightGlobals.ActiveVessel.situation != Vessel.Situations.PRELAUNCH && KCT_GameStates.simulationEndTime == 0 && KCT_GameStates.simulationTimeLimit > 0) { KCT_GameStates.simulationEndTime = Planetarium.GetUniversalTime() + KCT_GameStates.simulationTimeLimit; //Just in case the event doesn't fire } } if (HighLogic.LoadedScene == GameScenes.TRACKSTATION) { KCT_Utilities.SetActiveKSCToRSS(); } /* if (!HighLogic.LoadedSceneIsFlight && KCT_GameStates.recoveredVessel != null) * { * InputLockManager.SetControlLock(ControlTypes.All, "KCTPopupLock"); * DialogOption[] options = new DialogOption[3]; * options[0] = new DialogOption("VAB Storage", RecoverToVAB); * options[1] = new DialogOption("SPH Storage", RecoverToSPH); * options[2] = new DialogOption("The Scrapyard", RecoverToScrapyard); * MultiOptionDialog diag = new MultiOptionDialog("Send recovered vessel to", windowTitle: "Vessel Recovery", options: options); * PopupDialog.SpawnPopupDialog(diag, false, HighLogic.Skin); * }*/ if (!KCT_GUI.PrimarilyDisabled) { KCT_Utilities.ProgressBuildTime(); } } catch (IndexOutOfRangeException e) { print(e.Message); print(e.StackTrace); } }
public static void DelayedStart() { const string logBlockName = nameof(KerbalConstructionTime) + "." + nameof(DelayedStart); using (EntryExitLogger.EntryExitLog(logBlockName, EntryExitLoggerOptions.All)) { if (KCT_Utilities.CurrentGameIsMission()) { return; } Log.Trace("DelayedStart start"); if (KCT_PresetManager.Instance?.ActivePreset == null || !KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled) { return; } if (KCT_GUI.PrimarilyDisabled) { return; } //The following should only be executed when fully enabled for the save if (GameStates.ActiveKSC == null) { KCT_Utilities.SetActiveKSCToRSS(); } CheckVesselsForMissingParts(); if (HighLogic.LoadedSceneIsEditor) { if (GameStates.EditorShipEditingMode) { Log.Trace("Editing " + GameStates.editedVessel.shipName); EditorLogic.fetch.shipNameField.text = GameStates.editedVessel.shipName; } } if (HighLogic.LoadedScene == GameScenes.SPACECENTER) { Log.Trace("SP Start"); if (!KCT_GUI.PrimarilyDisabled) { if (ToolbarManager.ToolbarAvailable && GameStates.settings.PreferBlizzyToolbar) { if (GameStates.showWindows[0]) { KCT_GUI.ClickOn(); } else { if (KCTEvents.instance != null && KCTEvents.instance.KCTButtonStock != null) { if (GameStates.showWindows[0]) { KCT_GUI.ClickOn(); } } } } KCT_GUI.ResetBLWindow(); } else { KCT_GUI.showBuildList = false; GameStates.showWindows[0] = false; } Log.Trace("SP UI done"); if (GameStates.firstStart) { Log.Trace("Showing first start."); GameStates.firstStart = false; KCT_GUI.showFirstRun = true; //initialize the proper launchpad GameStates.ActiveKSC.ActiveLPInstance.level = KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.LaunchPad); } Log.Trace("SP switch starting"); GameStates.ActiveKSC.SwitchLaunchPad(GameStates.ActiveKSC.ActiveLaunchPadID); Log.Trace("SP switch done"); foreach (SpaceCenterConstruction ksc in GameStates.KSCs) { //foreach (KCT_Recon_Rollout rr in ksc.Recon_Rollout) for (int i = 0; i < ksc.Recon_Rollout.Count; i++) { Recon_Rollout rr = ksc.Recon_Rollout[i]; if (rr.RRType != Recon_Rollout.RolloutReconType.Reconditioning && KCT_Utilities.FindBLVesselByID(new Guid(rr.associatedID)) == null) { Log.Trace("Invalid Recon_Rollout at " + ksc.KSCName + ". ID " + rr.associatedID + " not found."); ksc.Recon_Rollout.Remove(rr); i--; } } } Log.Trace("SP done"); } } }
public static void DelayedStart() { // KCTDebug.Log(ScenarioUpgradeableFacilities.protoUpgradeables.Keys); // KCTDebug.Log(ScenarioUpgradeableFacilities.protoUpgradeables.Values.ElementAt(0).facilityRefs[0].name); if (!updateChecked) { if (KCT_GameStates.settings.CheckForUpdates && !KCT_GameStates.firstStart) //Check for updates { KCT_UpdateChecker.CheckForUpdate(false, KCT_GameStates.settings.VersionSpecific); } updateChecked = true; } if (!KCT_GameStates.settings.enabledForSave) { return; } List <GameScenes> validScenes = new List <GameScenes> { GameScenes.SPACECENTER }; if (validScenes.Contains(HighLogic.LoadedScene)) { //Check for simulation save and load it. string backupFile = KSPUtil.ApplicationRootPath + "saves/" + HighLogic.SaveFolder + "/KCT_simulation_backup.sfs"; if (System.IO.File.Exists(backupFile)) { KCT_GameStates.LoadingSimulationSave = true; /* if (!KCT_GameStates.LoadingSimulationSave) * KCT_Utilities.LoadSimulationSave(); * else * System.IO.File.Delete(backupFile);*/ } } if (HighLogic.LoadedSceneIsFlight && KCT_GameStates.flightSimulated) { KCTDebug.Log("Simulation started"); KCT_GUI.hideAll(); KCT_GUI.showSimulationWindow = !KCT_GameStates.settings.NoSimGUI; KCT_GUI.showTimeRemaining = true; Planetarium.SetUniversalTime(KCT_GameStates.simulationUT); } if (!HighLogic.LoadedSceneIsFlight && KCT_GameStates.FundsToChargeAtSimEnd != 0) { KCT_Utilities.SpendFunds(KCT_GameStates.FundsToChargeAtSimEnd, TransactionReasons.None); KCT_GameStates.FundsToChargeAtSimEnd = 0; } if (!HighLogic.LoadedSceneIsFlight && KCT_GameStates.FundsGivenForVessel != 0) { KCT_Utilities.SpendFunds(KCT_GameStates.FundsGivenForVessel, TransactionReasons.VesselRollout); KCT_GameStates.FundsGivenForVessel = 0; } if (HighLogic.LoadedSceneIsFlight && !KCT_GameStates.flightSimulated) { List <VesselType> invalidTypes = new List <VesselType> { VesselType.Debris, VesselType.SpaceObject, VesselType.Unknown }; if (!invalidTypes.Contains(FlightGlobals.ActiveVessel.vesselType) && !KCT_GameStates.BodiesVisited.Contains(FlightGlobals.ActiveVessel.mainBody.bodyName)) { KCT_GameStates.BodiesVisited.Add(FlightGlobals.ActiveVessel.mainBody.bodyName); var message = new ScreenMessage("[KCT] New simulation body unlocked: " + FlightGlobals.ActiveVessel.mainBody.bodyName, 4.0f, ScreenMessageStyle.UPPER_LEFT); ScreenMessages.PostScreenMessage(message, true); KCTDebug.Log("Unlocked sim body: " + FlightGlobals.ActiveVessel.mainBody.bodyName); } } if (KCT_GUI.PrimarilyDisabled) { return; } //The following should only be executed when fully enabled for the save foreach (KCT_KSC KSC in KCT_GameStates.KSCs) { KSC.RecalculateBuildRates(); KSC.RecalculateUpgradedBuildRates(); } if (!HighLogic.LoadedSceneIsFlight && KCT_GameStates.buildSimulatedVessel) { KCT_GameStates.buildSimulatedVessel = false; KCT_BuildListVessel toBuild = KCT_GameStates.launchedVessel.NewCopy(false); toBuild.buildPoints = KCT_Utilities.GetBuildTime(toBuild.ExtractedPartNodes, true, KCT_GUI.useInventory); KCT_Utilities.AddVesselToBuildList(toBuild, KCT_GUI.useInventory); } if (HighLogic.LoadedSceneIsFlight && !KCT_GameStates.flightSimulated) { KCT_GUI.hideAll(); if (FlightGlobals.ActiveVessel.situation == Vessel.Situations.PRELAUNCH && KCT_GameStates.launchedVessel != null) { bool removed = KCT_GameStates.launchedVessel.RemoveFromBuildList(); if (removed) //Only do these when the vessel is first removed from the list { //Add the cost of the ship to the funds so it can be removed again by KSP //KCT_Utilities.AddFunds(KCT_Utilities.GetTotalVesselCost(FlightGlobals.ActiveVessel.protoVessel), TransactionReasons.VesselRollout); KCT_Utilities.AddFunds(KCT_GameStates.launchedVessel.cost, TransactionReasons.VesselRollout); FlightGlobals.ActiveVessel.vesselName = KCT_GameStates.launchedVessel.shipName; } KCT_Recon_Rollout rollout = KCT_GameStates.ActiveKSC.Recon_Rollout.FirstOrDefault(r => r.associatedID == KCT_GameStates.launchedVessel.id.ToString()); if (rollout != null) { KCT_GameStates.ActiveKSC.Recon_Rollout.Remove(rollout); } } } if (HighLogic.LoadedSceneIsEditor) { if (KCT_GameStates.EditorShipEditingMode) { KCTDebug.Log("Editing " + KCT_GameStates.editedVessel.shipName); EditorLogic.fetch.shipNameField.Text = KCT_GameStates.editedVessel.shipName; } if (!KCT_GUI.PrimarilyDisabled) { if (KCT_GameStates.settings.OverrideLaunchButton) { KCTDebug.Log("Taking control of launch button"); EditorLogic.fetch.launchBtn.methodToInvoke = "ShowLaunchAlert"; EditorLogic.fetch.launchBtn.scriptWithMethodToInvoke = KerbalConstructionTime.instance; } else { InputLockManager.SetControlLock(ControlTypes.EDITOR_LAUNCH, "KCTLaunchLock"); } KCT_Utilities.RecalculateEditorBuildTime(EditorLogic.fetch.ship); } } if (HighLogic.LoadedScene == GameScenes.SPACECENTER) { if (KCT_Utilities.CurrentGameHasScience() && KCT_GameStates.TotalUpgradePoints == 0) { ConfigNode CN = new ConfigNode(); ResearchAndDevelopment.Instance.snapshot.Save(CN); ConfigNode[] techNodes = CN.GetNodes("Tech"); KCTDebug.Log("technodes length: " + techNodes.Length); KCT_GameStates.TotalUpgradePoints = techNodes.Length + 14; } if (!KCT_GUI.PrimarilyDisabled) { KCT_GUI.showBuildList = KCT_GameStates.showWindows[0]; KCT_GUI.ResetBLWindow(); } else { KCT_GUI.showBuildList = false; KCT_GameStates.showWindows[0] = false; } if (KCT_GameStates.firstStart) { KCTDebug.Log("Showing first start."); KCT_GUI.showFirstRun = true; } KCT_GameStates.firstStart = false; if (KCT_GameStates.LaunchFromTS) { KCT_GameStates.launchedVessel.Launch(); } } }
public static T GetPublicValue <T>(this Type type, string name, object instance) where T : class { return((T)KCT_Utilities.GetMemberInfoValue(type.GetMember(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy).FirstOrDefault(), instance)); }
public static void DelayedStart() { #if KSP1_4 // 1.4 Addition if (KCT_Utilities.CurrentGameIsMission()) { return; } #endif KCTDebug.Log("DelayedStart start"); if (KCT_PresetManager.Instance?.ActivePreset == null || !KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled) { return; } if (KCT_GUI.PrimarilyDisabled) { return; } //The following should only be executed when fully enabled for the save if (KCT_GameStates.ActiveKSC == null) { KCT_Utilities.SetActiveKSCToRSS(); } KCTDebug.Log("Checking vessels for missing parts."); //check that all parts are valid in all ships. If not, warn the user and disable that vessel (once that code is written) if (!KCT_GameStates.vesselErrorAlerted) { List <KCT_BuildListVessel> erroredVessels = new List <KCT_BuildListVessel>(); foreach (KCT_KSC KSC in KCT_GameStates.KSCs) //this is faster on subsequent scene changes { foreach (KCT_BuildListVessel blv in KSC.VABList) { if (!blv.allPartsValid) { //error! KCTDebug.Log(blv.shipName + " contains invalid parts!"); erroredVessels.Add(blv); } } foreach (KCT_BuildListVessel blv in KSC.VABWarehouse) { if (!blv.allPartsValid) { //error! KCTDebug.Log(blv.shipName + " contains invalid parts!"); erroredVessels.Add(blv); } } foreach (KCT_BuildListVessel blv in KSC.SPHList) { if (!blv.allPartsValid) { //error! KCTDebug.Log(blv.shipName + " contains invalid parts!"); erroredVessels.Add(blv); } } foreach (KCT_BuildListVessel blv in KSC.SPHWarehouse) { if (!blv.allPartsValid) { //error! KCTDebug.Log(blv.shipName + " contains invalid parts!"); erroredVessels.Add(blv); } } } if (erroredVessels.Count > 0) { PopUpVesselError(erroredVessels); } KCT_GameStates.vesselErrorAlerted = true; } if (HighLogic.LoadedSceneIsEditor) { if (KCT_GameStates.EditorShipEditingMode) { KCTDebug.Log("Editing " + KCT_GameStates.editedVessel.shipName); EditorLogic.fetch.shipNameField.text = KCT_GameStates.editedVessel.shipName; } } if (HighLogic.LoadedScene == GameScenes.SPACECENTER) { KCTDebug.Log("SP Start"); if (!KCT_GUI.PrimarilyDisabled) { if (ToolbarManager.ToolbarAvailable && KCT_GameStates.settings.PreferBlizzyToolbar) { if (KCT_GameStates.showWindows[0]) { KCT_GUI.ClickOn(); } else { if (KCT_Events.instance != null && KCT_Events.instance.KCTButtonStock != null) { if (KCT_GameStates.showWindows[0]) { KCT_GUI.ClickOn(); } } } } KCT_GUI.ResetBLWindow(); } else { KCT_GUI.showBuildList = false; KCT_GameStates.showWindows[0] = false; } KCTDebug.Log("SP UI done"); if (KCT_GameStates.firstStart) { KCTDebug.Log("Showing first start."); KCT_GameStates.firstStart = false; KCT_GUI.showFirstRun = true; //initialize the proper launchpad KCT_GameStates.ActiveKSC.ActiveLPInstance.level = KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.LaunchPad); } KCTDebug.Log("SP switch starting"); KCT_GameStates.ActiveKSC.SwitchLaunchPad(KCT_GameStates.ActiveKSC.ActiveLaunchPadID); KCTDebug.Log("SP switch done"); foreach (KCT_KSC ksc in KCT_GameStates.KSCs) { //foreach (KCT_Recon_Rollout rr in ksc.Recon_Rollout) for (int i = 0; i < ksc.Recon_Rollout.Count; i++) { KCT_Recon_Rollout rr = ksc.Recon_Rollout[i]; if (rr.RRType != KCT_Recon_Rollout.RolloutReconType.Reconditioning && KCT_Utilities.FindBLVesselByID(new Guid(rr.associatedID)) == null) { KCTDebug.Log("Invalid Recon_Rollout at " + ksc.KSCName + ". ID " + rr.associatedID + " not found."); ksc.Recon_Rollout.Remove(rr); i--; } } } KCTDebug.Log("SP done"); } KCTDebug.Log("DelayedStart finished"); }
//NOTE: This is an approximation. This won't properly take into account for resources and tweakscale! DO NOT USE IF YOU CARE 100% ABOUT THE MASS public double GetTotalMass() { if (TotalMass != 0) { return(TotalMass); } double mass = 0; foreach (ConfigNode p in this.ExtractedPartNodes) { float n1, n2; mass += ShipConstruction.GetPartTotalMass(p, KCT_Utilities.GetAvailablePartByName(KCT_Utilities.PartNameFromNode(p)), out n1, out n2); } return(mass); }
public void CheckShipForChallengeComplete() { Vessel active = FlightGlobals.ActiveVessel; double targetLat = -0.092222, targetLon = 285.4475, targetAlt = 102.0; if (active != null && !challengeCompleted) { if (active.Landed && KCT_Utilities.ApproximatelyEqual(targetLat, active.latitude, 0.006) && KCT_Utilities.ApproximatelyEqual(targetLon, active.longitude, 0.006) && KCT_Utilities.ApproximatelyEqual(targetAlt, active.altitude, 5)) { bool hasChutes = false; bool hasSRB = false; foreach (Part p in active.parts) { if (p.Modules != null && (p.Modules.Contains("ModuleParachute") || p.Modules.Contains("RealChuteModule"))) { hasChutes = true; } if (p.partInfo.title.ToLower().Contains("rt-10")) { if (p.Modules.Contains("ModuleEngines")) { ModuleEngines engine = (ModuleEngines)p.Modules["ModuleEngines"]; if (engine.EngineIgnited) { hasSRB = true; } } } } if (!hasChutes && hasSRB) { challengeCompleted = true; string popupString = "Congratulations! You completed the Daily Challenge! Take some pictures to show your worth and post them on the forum thread!\n\n" + "(Ok, seriously? You seriously completed the Daily Challenge? Screw it, you get over 9000 Jeb Coins (a $45,000 value). Please, for the love of all things Kerbal, post your result on the KCT forum thread. I HAVE to see this.)"; PopupDialog.SpawnPopupDialog("Challenge Complete!", popupString, "Collect Reward!", false, HighLogic.Skin); TotalJebCoins += 9001; } } } }
public void NewRecoveryFunctionTrackingStation() { Debug.Log("NewRecoveryFunctionTrackingStation"); selectedVessel = null; SpaceTracking trackingStation = (SpaceTracking)FindObjectOfType(typeof(SpaceTracking)); if (trackingStation == null) { Debug.Log("trackingStation is null"); } selectedVessel = trackingStation.SelectedVessel; if (selectedVessel == null) { Debug.Log("[KCT] Error! No Vessel selected."); return; } bool sph = (selectedVessel.IsRecoverable && selectedVessel.IsClearToSave() == ClearToSaveStatus.CLEAR); string reqTech = KCT_PresetManager.Instance.ActivePreset.generalSettings.VABRecoveryTech; bool vab = selectedVessel.IsRecoverable && selectedVessel.IsClearToSave() == ClearToSaveStatus.CLEAR && (selectedVessel.situation == Vessel.Situations.PRELAUNCH || string.IsNullOrEmpty(reqTech) || ResearchAndDevelopment.GetTechnologyState(reqTech) == RDTech.State.Available); int cnt = 2; bool kerbInExtSeat = KCT_Utilities.KerbalInExternalSeat(selectedVessel, true); if (!selectedVessel.isEVA && !kerbInExtSeat) { if (sph) { cnt++; } if (vab) { cnt++; } } DialogGUIBase[] options = new DialogGUIBase[cnt]; cnt = 0; string msg = "Do you want KCT to do the recovery?"; if (!selectedVessel.isEVA && !kerbInExtSeat) { if (sph) { options[cnt++] = new DialogGUIButton("Recover to SPH", RecoverToSPH); } if (vab) { options[cnt++] = new DialogGUIButton("Recover to VAB", RecoverToVAB); } options[cnt++] = new DialogGUIButton("Normal recovery", DoNormalRecovery); } else { msg = "KCT cannot recover if any kerbals are in external seats"; options[cnt++] = new DialogGUIButton("Recover", DoNormalRecovery); } options[cnt] = new DialogGUIButton("Cancel", Cancel); MultiOptionDialog diag = new MultiOptionDialog("scrapVesselPopup", msg, "Recover Vessel", null, options: options); PopupDialog.SpawnPopupDialog(new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), diag, false, HighLogic.UISkin); }
public void vesselRecoverEvent(ProtoVessel v, bool unknownAsOfNow) { KCTDebug.Log("VesselRecoverEvent"); if (!KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled) { return; } if (!v.vesselRef.isEVA) { // if (KCT_GameStates.settings.Debug && HighLogic.LoadedScene != GameScenes.TRACKSTATION && (v.wasControllable || v.protoPartSnapshots.Find(p => p.modules.Find(m => m.moduleName.ToLower() == "modulecommand") != null) != null)) if (KCT_GameStates.recoveredVessel != null && v.vesselName == KCT_GameStates.recoveredVessel.shipName) { //KCT_GameStates.recoveredVessel = new KCT_BuildListVessel(v); //rebuy the ship if ScrapYard isn't overriding funds if (!ScrapYardWrapper.OverrideFunds) { KCT_Utilities.SpendFunds(KCT_GameStates.recoveredVessel.cost, TransactionReasons.VesselRollout); //pay for the ship again } //pull all of the parts out of the inventory //This is a bit funky since we grab the part id from our part, grab the inventory part out, then try to reapply that ontop of our part if (ScrapYardWrapper.Available) { foreach (ConfigNode partNode in KCT_GameStates.recoveredVessel.ExtractedPartNodes) { string id = ScrapYardWrapper.GetPartID(partNode); ConfigNode inventoryVersion = ScrapYardWrapper.FindInventoryPart(id); if (inventoryVersion != null) { //apply it to our copy of the part ConfigNode ourTracker = partNode.GetNodes("MODULE").FirstOrDefault(n => string.Equals(n.GetValue("name"), "ModuleSYPartTracker", StringComparison.Ordinal)); if (ourTracker != null) { ourTracker.SetValue("TimesRecovered", inventoryVersion.GetValue("_timesRecovered")); ourTracker.SetValue("Inventoried", inventoryVersion.GetValue("_inventoried")); } } } //process the vessel in ScrapYard ScrapYardWrapper.ProcessVessel(KCT_GameStates.recoveredVessel.ExtractedPartNodes); //reset the BP KCT_GameStates.recoveredVessel.buildPoints = KCT_Utilities.GetBuildTime(KCT_GameStates.recoveredVessel.ExtractedPartNodes); KCT_GameStates.recoveredVessel.integrationPoints = KCT_MathParsing.ParseIntegrationTimeFormula(KCT_GameStates.recoveredVessel); } if (KCT_GameStates.recoveredVessel.type == KCT_BuildListVessel.ListType.VAB) { KCT_GameStates.ActiveKSC.VABWarehouse.Add(KCT_GameStates.recoveredVessel); } else { KCT_GameStates.ActiveKSC.SPHWarehouse.Add(KCT_GameStates.recoveredVessel); } KCT_GameStates.ActiveKSC.Recon_Rollout.Add(new KCT_Recon_Rollout(KCT_GameStates.recoveredVessel, KCT_Recon_Rollout.RolloutReconType.Recovery, KCT_GameStates.recoveredVessel.id.ToString())); KCT_GameStates.recoveredVessel = null; } } }
public List <string> MeetsFacilityRequirements(bool highestFacility = true) { List <string> failedReasons = new List <string>(); if (!KCT_Utilities.CurrentGameIsCareer()) { return(failedReasons); } ShipTemplate template = new ShipTemplate(); template.LoadShip(shipNode); if (this.type == ListType.VAB) { KCT_LaunchPad selectedPad = highestFacility ? KCT_GameStates.ActiveKSC.GetHighestLevelLaunchPad() : KCT_GameStates.ActiveKSC.ActiveLPInstance; float launchpadNormalizedLevel = 1.0f * selectedPad.level / KCT_GameStates.BuildingMaxLevelCache["LaunchPad"]; double totalMass = GetTotalMass(); if (totalMass > GameVariables.Instance.GetCraftMassLimit(launchpadNormalizedLevel, true)) { failedReasons.Add($"Mass limit exceeded, currently at {totalMass:N} tons"); } if (this.ExtractedPartNodes.Count > GameVariables.Instance.GetPartCountLimit(ScenarioUpgradeableFacilities.GetFacilityLevel(SpaceCenterFacility.VehicleAssemblyBuilding), true)) { failedReasons.Add("Part Count limit exceeded"); } CraftWithinSizeLimits sizeCheck = new CraftWithinSizeLimits(template, SpaceCenterFacility.LaunchPad, GameVariables.Instance.GetCraftSizeLimit(launchpadNormalizedLevel, true)); if (!sizeCheck.Test()) { failedReasons.Add("Size limits exceeded"); } } else if (this.type == ListType.SPH) { double totalMass = GetTotalMass(); if (totalMass > GameVariables.Instance.GetCraftMassLimit(ScenarioUpgradeableFacilities.GetFacilityLevel(SpaceCenterFacility.Runway), false)) { failedReasons.Add($"Mass limit exceeded, currently at {totalMass:N} tons"); } if (this.ExtractedPartNodes.Count > GameVariables.Instance.GetPartCountLimit(ScenarioUpgradeableFacilities.GetFacilityLevel(SpaceCenterFacility.SpaceplaneHangar), false)) { failedReasons.Add("Part Count limit exceeded"); } CraftWithinSizeLimits sizeCheck = new CraftWithinSizeLimits(template, SpaceCenterFacility.Runway, GameVariables.Instance.GetCraftSizeLimit(ScenarioUpgradeableFacilities.GetFacilityLevel(SpaceCenterFacility.Runway), false)); if (!sizeCheck.Test()) { failedReasons.Add("Size limits exceeded"); } } Dictionary <AvailablePart, int> lockedParts = GetLockedParts(); if (lockedParts?.Count > 0) { var msg = KCT_Utilities.ConstructLockedPartsWarning(lockedParts); failedReasons.Add(msg); } return(failedReasons); }
// The following was changed to a function because the Mono compiler available on Linux was causing errors with this call void OnEditorStarted() { KCT_Utilities.HandleEditorButton(); }
public static void DrawPresetWindow(int windowID) { GUIStyle yellowText = new GUIStyle(GUI.skin.label); yellowText.normal.textColor = Color.yellow; if (WorkingPreset == null) { SetNewWorkingPreset(new KCT_Preset(KCT_PresetManager.Instance.ActivePreset), false); //might need to copy instead of assign here presetIndex = KCT_PresetManager.Instance.GetIndex(WorkingPreset); } GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); //preset selector GUILayout.BeginVertical(); GUILayout.Label("Presets", yellowText, GUILayout.ExpandHeight(false)); //preset toolbar in a scrollview presetScrollView = GUILayout.BeginScrollView(presetScrollView, GUILayout.Width(presetPosition.width / 6.0f)); //TODO: update HighLogic.Skin.textArea string[] presetShortNames = KCT_PresetManager.Instance.PresetShortNames(true); if (presetIndex == -1) { SetNewWorkingPreset(null, true); } if (changed && presetIndex < presetShortNames.Length - 1 && !KCT_Utilities.ConfigNodesAreEquivalent(WorkingPreset.AsConfigNode(), KCT_PresetManager.Instance.Presets[presetIndex].AsConfigNode())) //!KCT_PresetManager.Instance.PresetsEqual(WorkingPreset, KCT_PresetManager.Instance.Presets[presetIndex], true) { SetNewWorkingPreset(null, true); } int prev = presetIndex; presetIndex = GUILayout.SelectionGrid(presetIndex, presetShortNames, 1); if (prev != presetIndex) //If a new preset was selected { if (presetIndex != presetShortNames.Length - 1) { SetNewWorkingPreset(new KCT_Preset(KCT_PresetManager.Instance.Presets[presetIndex]), false); } else { SetNewWorkingPreset(null, true); } } //presetIndex = GUILayout.Toolbar(presetIndex, presetNames); GUILayout.EndScrollView(); if (GUILayout.Button("Save as\nNew Preset", GUILayout.ExpandHeight(false))) { //create new preset SaveAsNewPreset(WorkingPreset); } if (WorkingPreset.AllowDeletion && presetIndex != presetShortNames.Length - 1 && GUILayout.Button("Delete Preset")) //allowed to be deleted and isn't Custom { DialogGUIBase[] options = new DialogGUIBase[2]; options[0] = new DialogGUIButton("Delete File", DeleteActivePreset); options[1] = new DialogGUIButton("Cancel", DummyVoid); MultiOptionDialog dialog = new MultiOptionDialog("deletePresetPopup", "Are you sure you want to delete the selected Preset, file and all? This cannot be undone!", "Confirm Deletion", null, options); PopupDialog.SpawnPopupDialog(new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), dialog, false, HighLogic.UISkin); } GUILayout.EndVertical(); //Main sections GUILayout.BeginVertical(); presetMainScroll = GUILayout.BeginScrollView(presetMainScroll); //Preset info section) GUILayout.BeginVertical(HighLogic.Skin.textArea); GUILayout.Label("Preset Name: " + WorkingPreset.name); GUILayout.Label("Description: " + WorkingPreset.description); GUILayout.Label("Author(s): " + WorkingPreset.author); GUILayout.EndVertical(); GUILayout.BeginHorizontal(); //Features section GUILayout.BeginVertical(); GUILayout.Label("Features", yellowText); GUILayout.BeginVertical(HighLogic.Skin.textArea); WorkingPreset.generalSettings.Enabled = GUILayout.Toggle(WorkingPreset.generalSettings.Enabled, "Mod Enabled", HighLogic.Skin.button); WorkingPreset.generalSettings.BuildTimes = GUILayout.Toggle(WorkingPreset.generalSettings.BuildTimes, "Build Times", HighLogic.Skin.button); WorkingPreset.generalSettings.ReconditioningTimes = GUILayout.Toggle(WorkingPreset.generalSettings.ReconditioningTimes, "Launchpad Reconditioning", HighLogic.Skin.button); WorkingPreset.generalSettings.ReconditioningBlocksPad = GUILayout.Toggle(WorkingPreset.generalSettings.ReconditioningBlocksPad, "Reconditioning Blocks Pad", HighLogic.Skin.button); WorkingPreset.generalSettings.TechUnlockTimes = GUILayout.Toggle(WorkingPreset.generalSettings.TechUnlockTimes, "Tech Unlock Times", HighLogic.Skin.button); WorkingPreset.generalSettings.KSCUpgradeTimes = GUILayout.Toggle(WorkingPreset.generalSettings.KSCUpgradeTimes, "KSC Upgrade Times", HighLogic.Skin.button); WorkingPreset.generalSettings.TechUpgrades = GUILayout.Toggle(WorkingPreset.generalSettings.TechUpgrades, "Upgrades From Tech Tree", HighLogic.Skin.button); WorkingPreset.generalSettings.SharedUpgradePool = GUILayout.Toggle(WorkingPreset.generalSettings.SharedUpgradePool, "Shared Upgrade Pool (KSCSwitcher)", HighLogic.Skin.button); GUILayout.BeginHorizontal(); GUILayout.Label("Starting Upgrades:"); WorkingPreset.generalSettings.StartingPoints = GUILayout.TextField(WorkingPreset.generalSettings.StartingPoints, GUILayout.Width(100)); GUILayout.EndHorizontal(); GUILayout.EndVertical(); GUILayout.EndVertical(); //end Features GUILayout.BeginVertical(); //Begin time settings GUILayout.Label("Time Settings", yellowText); GUILayout.BeginVertical(HighLogic.Skin.textArea); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); GUILayout.Label("Overall Multiplier: "); double.TryParse(OMultTmp = GUILayout.TextField(OMultTmp, 10, GUILayout.Width(80)), out WorkingPreset.timeSettings.OverallMultiplier); GUILayout.Label("Merging Time Percent: "); double.TryParse(MTimePTmp = GUILayout.TextField(MTimePTmp, 10, GUILayout.Width(80)), out WorkingPreset.timeSettings.MergingTimePercent); GUILayout.EndVertical(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Build Effect: "); double.TryParse(BEffTmp = GUILayout.TextField(BEffTmp, 10, GUILayout.Width(80)), out WorkingPreset.timeSettings.BuildEffect); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Inventory Effect: "); double.TryParse(IEffTmp = GUILayout.TextField(IEffTmp, 10, GUILayout.Width(80)), out WorkingPreset.timeSettings.InventoryEffect); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Reconditioning Effect: "); double.TryParse(ReEffTmp = GUILayout.TextField(ReEffTmp, 10, GUILayout.Width(80)), out WorkingPreset.timeSettings.ReconditioningEffect); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Max Reconditioning: "); double.TryParse(MaxReTmp = GUILayout.TextField(MaxReTmp, 10, GUILayout.Width(80)), out WorkingPreset.timeSettings.MaxReconditioning); GUILayout.EndHorizontal(); GUILayout.Label("Rollout-Reconditioning Split:"); GUILayout.BeginHorizontal(); //GUILayout.Label("Rollout", GUILayout.ExpandWidth(false)); WorkingPreset.timeSettings.RolloutReconSplit = GUILayout.HorizontalSlider((float)Math.Floor(WorkingPreset.timeSettings.RolloutReconSplit * 100f), 0, 100) / 100.0; //GUILayout.Label("Recon.", GUILayout.ExpandWidth(false)); GUILayout.EndHorizontal(); GUILayout.Label((Math.Floor(WorkingPreset.timeSettings.RolloutReconSplit * 100)) + "% Rollout, " + (100 - Math.Floor(WorkingPreset.timeSettings.RolloutReconSplit * 100)) + "% Reconditioning"); GUILayout.EndVertical(); //end time settings GUILayout.EndVertical(); GUILayout.EndHorizontal(); //end feature/time setting split //begin formula settings GUILayout.BeginVertical(); GUILayout.Label("Formula Settings (Advanced)", yellowText); GUILayout.BeginVertical(HighLogic.Skin.textArea); GUILayout.BeginHorizontal(); if (GUILayout.Button("Show/Hide Formulas")) { showFormula = !showFormula; } if (GUILayout.Button("View Wiki in Browser")) { Application.OpenURL("https://github.com/linuxgurugamer/KCT/wiki"); } GUILayout.EndHorizontal(); if (showFormula) { //show half here, half on other side? Or all in one big list int textWidth = 350; GUILayout.BeginHorizontal(); GUILayout.Label("NodeFormula: "); WorkingPreset.formulaSettings.NodeFormula = GUILayout.TextField(WorkingPreset.formulaSettings.NodeFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("UpgradeFunds: "); WorkingPreset.formulaSettings.UpgradeFundsFormula = GUILayout.TextField(WorkingPreset.formulaSettings.UpgradeFundsFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("UpgradeScience: "); WorkingPreset.formulaSettings.UpgradeScienceFormula = GUILayout.TextField(WorkingPreset.formulaSettings.UpgradeScienceFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("UpgradesForScience: "); WorkingPreset.formulaSettings.UpgradesForScience = GUILayout.TextField(WorkingPreset.formulaSettings.UpgradesForScience, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("ResearchFormula: "); WorkingPreset.formulaSettings.ResearchFormula = GUILayout.TextField(WorkingPreset.formulaSettings.ResearchFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("EffectivePart: "); WorkingPreset.formulaSettings.EffectivePartFormula = GUILayout.TextField(WorkingPreset.formulaSettings.EffectivePartFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("ProceduralPart: "); WorkingPreset.formulaSettings.ProceduralPartFormula = GUILayout.TextField(WorkingPreset.formulaSettings.ProceduralPartFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("BPFormula: "); WorkingPreset.formulaSettings.BPFormula = GUILayout.TextField(WorkingPreset.formulaSettings.BPFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("KSCUpgrade: "); WorkingPreset.formulaSettings.KSCUpgradeFormula = GUILayout.TextField(WorkingPreset.formulaSettings.KSCUpgradeFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Reconditioning: "); WorkingPreset.formulaSettings.ReconditioningFormula = GUILayout.TextField(WorkingPreset.formulaSettings.ReconditioningFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("BuildRate: "); WorkingPreset.formulaSettings.BuildRateFormula = GUILayout.TextField(WorkingPreset.formulaSettings.BuildRateFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("UpgradeReset: "); WorkingPreset.formulaSettings.UpgradeResetFormula = GUILayout.TextField(WorkingPreset.formulaSettings.UpgradeResetFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("InventorySale: "); WorkingPreset.formulaSettings.InventorySaleFormula = GUILayout.TextField(WorkingPreset.formulaSettings.InventorySaleFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("RolloutCosts: "); WorkingPreset.formulaSettings.RolloutCostFormula = GUILayout.TextField(WorkingPreset.formulaSettings.RolloutCostFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("IntegrationCosts: "); WorkingPreset.formulaSettings.IntegrationCostFormula = GUILayout.TextField(WorkingPreset.formulaSettings.IntegrationCostFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("IntegrationTime: "); WorkingPreset.formulaSettings.IntegrationTimeFormula = GUILayout.TextField(WorkingPreset.formulaSettings.IntegrationTimeFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("NewLaunchPadCost: "); WorkingPreset.formulaSettings.NewLaunchPadCostFormula = GUILayout.TextField(WorkingPreset.formulaSettings.NewLaunchPadCostFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("RushCost: "); WorkingPreset.formulaSettings.RushCostFormula = GUILayout.TextField(WorkingPreset.formulaSettings.RushCostFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("AirlaunchCost: "); WorkingPreset.formulaSettings.AirlaunchCostFormula = GUILayout.TextField(WorkingPreset.formulaSettings.AirlaunchCostFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("AirlaunchTime: "); WorkingPreset.formulaSettings.AirlaunchTimeFormula = GUILayout.TextField(WorkingPreset.formulaSettings.AirlaunchTimeFormula, GUILayout.Width(textWidth)); GUILayout.EndHorizontal(); } GUILayout.EndVertical(); GUILayout.EndVertical(); //end formula settings GUILayout.EndScrollView(); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Save", GUILayout.ExpandWidth(false))) { KCT_PresetManager.Instance.ActivePreset = WorkingPreset; KCT_PresetManager.Instance.SaveActiveToSaveData(); WorkingPreset = null; if (!KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled) { KCT_Utilities.DisableModFunctionality(); } //KCT_GameStates.settings.enabledForSave = KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled; KCT_GameStates.settings.MaxTimeWarp = newTimewarp; KCT_GameStates.settings.ForceStopWarp = forceStopWarp; KCT_GameStates.settings.DisableAllMessages = disableAllMsgs; KCT_GameStates.settings.OverrideLaunchButton = overrideLaunchBtn; KCT_GameStates.settings.Debug = debug; KCT_GameStates.settings.AutoKACAlarms = autoAlarms; KCT_GameStates.settings.AutoStockAlarms = autoStockAlarms; KCT_GameStates.settings.CheckForDebugUpdates = debugUpdateChecking; KCT_GameStates.settings.Save(); showSettings = false; if (!PrimarilyDisabled && !showFirstRun) { ResetBLWindow(); //if (KCT_Events.instance.KCTButtonStock != null) // KCT_Events.instance.KCTButtonStock.SetTrue(); if (KCT_GameStates.toolbarControl != null) { KCT_GameStates.toolbarControl.SetTrue(); } else { showBuildList = true; } } if (!KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled) { InputLockManager.RemoveControlLock("KCTKSCLock"); } for (int j = 0; j < KCT_GameStates.TechList.Count; j++) { KCT_GameStates.TechList[j].UpdateBuildRate(j); } foreach (KCT_KSC ksc in KCT_GameStates.KSCs) { ksc.RecalculateBuildRates(); ksc.RecalculateUpgradedBuildRates(); } KCT_GUI.ResetFormulaRateHolders(); } if (GUILayout.Button("Cancel", GUILayout.ExpandWidth(false))) { WorkingPreset = null; showSettings = false; if (!PrimarilyDisabled && !showFirstRun) { ResetBLWindow(); //if (KCT_Events.instance.KCTButtonStock != null) // KCT_Events.instance.KCTButtonStock.SetTrue(); if (KCT_GameStates.toolbarControl != null) { KCT_GameStates.toolbarControl.SetTrue(); } else { showBuildList = true; } } for (int j = 0; j < KCT_GameStates.TechList.Count; j++) { KCT_GameStates.TechList[j].UpdateBuildRate(j); } } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); GUILayout.EndVertical(); //end column 2 GUILayout.BeginVertical(GUILayout.Width(100)); //Start general settings GUILayout.Label("General Settings", yellowText); GUILayout.Label("NOTE: Affects all saves!", yellowText); GUILayout.BeginVertical(HighLogic.Skin.textArea); GUILayout.Label("Max Timewarp"); GUILayout.BeginHorizontal(); if (GUILayout.Button("-", GUILayout.ExpandWidth(false))) { newTimewarp = Math.Max(newTimewarp - 1, 0); } //current warp setting GUILayout.Label(TimeWarp.fetch.warpRates[newTimewarp] + "x"); if (GUILayout.Button("+", GUILayout.ExpandWidth(false))) { newTimewarp = Math.Min(newTimewarp + 1, TimeWarp.fetch.warpRates.Length - 1); } GUILayout.EndHorizontal(); forceStopWarp = GUILayout.Toggle(forceStopWarp, "Auto Stop TimeWarp", HighLogic.Skin.button); autoAlarms = GUILayout.Toggle(autoAlarms, "Auto KAC Alarms", HighLogic.Skin.button); autoStockAlarms = GUILayout.Toggle(autoStockAlarms, "Auto Stock Alarms", HighLogic.Skin.button); overrideLaunchBtn = GUILayout.Toggle(overrideLaunchBtn, "Override Launch Button", HighLogic.Skin.button); disableAllMsgs = !GUILayout.Toggle(!disableAllMsgs, "Use Message System", HighLogic.Skin.button); debug = GUILayout.Toggle(debug, "Debug Logging", HighLogic.Skin.button); #if DEBUG debugUpdateChecking = GUILayout.Toggle(debugUpdateChecking, "Check for Dev Updates", HighLogic.Skin.button); #endif GUILayout.EndVertical(); GUILayout.EndVertical(); GUILayout.EndHorizontal(); //end main split GUILayout.EndVertical(); //end window changed = GUI.changed; if (!Input.GetMouseButtonDown(1) && !Input.GetMouseButtonDown(2)) { GUI.DragWindow(); } }
public void Start() { const string logBlockName = nameof(KerbalConstructionTime) + "." + nameof(Start); using (EntryExitLogger.EntryExitLog(logBlockName, EntryExitLoggerOptions.All)) { if (KCT_Utilities.CurrentGameIsMission()) { return; } Log.Trace("Start called"); //add the events if (!KCTEvents.instance.eventAdded) { KCTEvents.instance.addEvents(); } GameStates.settings.Save(); //Save the settings file, with defaults if it doesn't exist KCT_PresetManager.Instance.SaveActiveToSaveData(); // Ghetto event queue if (HighLogic.LoadedScene == GameScenes.EDITOR) { InvokeRepeating("EditorRecalculation", 1, 1); KCT_GUI.buildRateForDisplay = null; if (!KCT_GUI.PrimarilyDisabled) { KCT_Utilities.RecalculateEditorBuildTime(EditorLogic.fetch.ship); } } if (KCT_GUI.PrimarilyDisabled) { if (InputLockManager.GetControlLock("KCTLaunchLock") == ControlTypes.EDITOR_LAUNCH) { InputLockManager.RemoveControlLock("KCTLaunchLock"); } } KACWrapper.InitKACWrapper(); if (!KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled) { if (InputLockManager.GetControlLock("KCTKSCLock") == ControlTypes.KSC_FACILITIES) { InputLockManager.RemoveControlLock("KCTKSCLock"); } return; } //Begin primary mod functions GameStates.UT = Planetarium.GetUniversalTime(); KCT_GUI.guiDataSaver.Load(); if (HighLogic.LoadedSceneIsEditor) { KCT_GUI.hideAll(); if (!KCT_GUI.PrimarilyDisabled) { KCT_GUI.showEditorGUI = GameStates.showWindows[1]; if (KCT_GUI.showEditorGUI) { KCT_GUI.ClickOn(); } else { KCT_GUI.ClickOff(); } } } else if (HighLogic.LoadedScene == GameScenes.SPACECENTER) { bool shouldStart = KCT_GUI.showFirstRun; KCT_GUI.hideAll(); if (!shouldStart) { KCT_GUI.showBuildList = GameStates.showWindows[0]; if (KCT_GUI.showBuildList) { KCT_GUI.ClickOn(); } else { KCT_GUI.ClickOff(); } } KCT_GUI.showFirstRun = shouldStart; } if (HighLogic.LoadedSceneIsFlight && FlightGlobals.ActiveVessel.situation == Vessel.Situations.PRELAUNCH) { if (FlightGlobals.ActiveVessel.GetCrewCount() == 0 && GameStates.launchedCrew.Count > 0) { KerbalRoster roster = HighLogic.CurrentGame.CrewRoster; for (int i = 0; i < FlightGlobals.ActiveVessel.parts.Count; i++) { Part p = FlightGlobals.ActiveVessel.parts[i]; //Log.Trace("craft: " + p.craftID); { CrewedPart cP = GameStates.launchedCrew.Find(part => part.partID == p.craftID); if (cP == null) { continue; } List <ProtoCrewMember> crewList = cP.crewList; foreach (ProtoCrewMember crewMember in crewList) { if (crewMember != null) { ProtoCrewMember finalCrewMember = crewMember; if (crewMember.type == ProtoCrewMember.KerbalType.Crew) { finalCrewMember = roster.Crew.FirstOrDefault(c => c.name == crewMember.name); } else if (crewMember.type == ProtoCrewMember.KerbalType.Tourist) { finalCrewMember = roster.Tourist.FirstOrDefault(c => c.name == crewMember.name); } if (finalCrewMember == null) { Debug.LogError("Error when assigning " + crewMember.name + " to " + p.partInfo.name + ". Cannot find Kerbal in list."); continue; } try { Log.Trace("Assigning " + finalCrewMember.name + " to " + p.partInfo.name); if (p.AddCrewmember(finalCrewMember)) //p.AddCrewmemberAt(finalCrewMember, crewList.IndexOf(crewMember))) { finalCrewMember.rosterStatus = ProtoCrewMember.RosterStatus.Assigned; if (finalCrewMember.seat != null) { finalCrewMember.seat.SpawnCrew(); } } else { Debug.LogError("Error when assigning " + crewMember.name + " to " + p.partInfo.name); finalCrewMember.rosterStatus = ProtoCrewMember.RosterStatus.Available; continue; } } catch { Debug.LogError("Error when assigning " + crewMember.name + " to " + p.partInfo.name); finalCrewMember.rosterStatus = ProtoCrewMember.RosterStatus.Available; continue; } } } } } GameStates.launchedCrew.Clear(); } } if (HighLogic.LoadedSceneIsFlight) { KCT_GUI.hideAll(); if (GameStates.launchedVessel != null && FlightGlobals.ActiveVessel != null && FlightGlobals.ActiveVessel.situation == Vessel.Situations.PRELAUNCH) { GameStates.launchedVessel.KSC = null; //it's invalid now Log.Trace("Attempting to remove launched vessel from build list"); bool removed = GameStates.launchedVessel.RemoveFromBuildList(); if (removed) //Only do these when the vessel is first removed from the list { //Add the cost of the ship to the funds so it can be removed again by KSP KCT_Utilities.AddFunds(GameStates.launchedVessel.cost, TransactionReasons.VesselRollout); FlightGlobals.ActiveVessel.vesselName = GameStates.launchedVessel.shipName; } Recon_Rollout rollout = GameStates.ActiveKSC.Recon_Rollout.FirstOrDefault(r => r.associatedID == GameStates.launchedVessel.id.ToString()); if (rollout != null) { GameStates.ActiveKSC.Recon_Rollout.Remove(rollout); } } } ratesUpdated = false; DelayedStart(); } }
public void gameSceneEvent(GameScenes scene) { if (scene == GameScenes.MAINMENU) { KCT_GameStates.reset(); KCT_GameStates.firstStart = false; KCT_Utilities.disableSimulationLocks(); InputLockManager.RemoveControlLock("KCTLaunchLock"); KCT_GameStates.activeKSCName = "Stock"; KCT_GameStates.ActiveKSC = new KCT_KSC("Stock"); KCT_GameStates.KSCs = new List <KCT_KSC>() { KCT_GameStates.ActiveKSC }; KCT_GameStates.EditorSimulationCount = 0; KCT_GameStates.LastKnownTechCount = 0; KCT_GameStates.PermanentModAddedUpgradesButReallyWaitForTheAPI = 0; KCT_GameStates.TemporaryModAddedUpgradesButReallyWaitForTheAPI = 0; if (KCT_PresetManager.Instance != null) { KCT_PresetManager.Instance.ClearPresets(); KCT_PresetManager.Instance = null; } return; } KCT_GameStates.MiscellaneousTempUpgrades = 0; /*if (HighLogic.LoadedScene == GameScenes.MAINMENU) * { * if (scene == GameScenes.SPACECENTER) * { * KCT_PresetManager.Instance.FindPresetFiles(); * KCT_PresetManager.Instance.LoadPresets(); * } * }*/ if (KCT_PresetManager.PresetLoaded() && !KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled) { return; } List <GameScenes> validScenes = new List <GameScenes> { GameScenes.SPACECENTER, GameScenes.TRACKSTATION, GameScenes.EDITOR }; if (validScenes.Contains(scene)) { //Check for simulation save and load it. if (System.IO.File.Exists(KSPUtil.ApplicationRootPath + "saves/" + HighLogic.SaveFolder + "/KCT_simulation_backup.sfs")) { KCT_Utilities.LoadSimulationSave(false); } TechDisableEventFinal(); } /*if (!HighLogic.LoadedSceneIsFlight && scene == GameScenes.FLIGHT && KCT_GameStates.flightSimulated) //Backup save at simulation start * { * KCT_Utilities.MakeSimulationSave(); * }*/ if (HighLogic.LoadedScene == scene && scene == GameScenes.EDITOR) //Fix for null reference when using new or load buttons in editor { GamePersistence.SaveGame("persistent", HighLogic.SaveFolder, SaveMode.OVERWRITE); } if (HighLogic.LoadedSceneIsEditor) { EditorLogic.fetch.Unlock("KCTEditorMouseLock"); } if (!HighLogic.LoadedSceneIsEditor && !HighLogic.LoadedSceneIsFlight) { KCT_GameStates.EditorSimulationCount = 0; } }
public void SubscribeToEvents() { GameEvents.onGUILaunchScreenSpawn.Add(launchScreenOpenEvent); GameEvents.onVesselRecovered.Add(vesselRecoverEvent); //GameEvents.onLaunch.Add(vesselSituationChange); GameEvents.onVesselSituationChange.Add(vesselSituationChange); GameEvents.onGameSceneLoadRequested.Add(gameSceneEvent); GameEvents.OnTechnologyResearched.Add(TechUnlockEvent); //if (!ToolbarManager.ToolbarAvailable || !KCT_GameStates.settings.PreferBlizzyToolbar) GameEvents.onGUIApplicationLauncherReady.Add(OnGUIAppLauncherReady); GameEvents.onEditorShipModified.Add(ShipModifiedEvent); GameEvents.OnPartPurchased.Add(PartPurchasedEvent); //GameEvents.OnVesselRecoveryRequested.Add(RecoveryRequested); GameEvents.onGUIRnDComplexSpawn.Add(TechEnableEvent); GameEvents.onGUIRnDComplexDespawn.Add(TechDisableEvent); GameEvents.OnKSCFacilityUpgraded.Add(FacilityUpgradedEvent); GameEvents.onGameStateLoad.Add(PersistenceLoadEvent); GameEvents.OnKSCStructureRepaired.Add(FaciliyRepaired); GameEvents.OnKSCStructureCollapsed.Add(FacilityDestroyed); GameEvents.Modifiers.OnCurrencyModified.Add(OnCurrenciesModified); GameEvents.StageManager.OnGUIStageAdded.Add(StageCountChangedEvent); GameEvents.StageManager.OnGUIStageRemoved.Add(StageCountChangedEvent); GameEvents.StageManager.OnGUIStageSequenceModified.Add(StagingOrderChangedEvent); GameEvents.StageManager.OnPartUpdateStageability.Add(PartStageabilityChangedEvent); GameEvents.FindEvent <EventVoid>("OnSYInventoryAppliedToVessel")?.Add(SYInventoryApplied); GameEvents.FindEvent <EventVoid>("OnSYReady")?.Add(SYReady); GameEvents.FindEvent <EventData <Part> >("OnSYInventoryAppliedToPart")?.Add((p) => { KerbalConstructionTime.instance.editorRecalcuationRequired = true; }); // GameEvents.OnKSCStructureRepairing.Add(FacilityRepairingEvent); // GameEvents.onLevelWasLoaded.Add(LevelLoadedEvent); /* GameEvents.OnCrewmemberHired.Add((ProtoCrewMember m, int i) => * { * foreach (KCT_KSC ksc in KCT_GameStates.KSCs) * { * ksc.RecalculateBuildRates(); * ksc.RecalculateUpgradedBuildRates(); * } * }); * GameEvents.OnCrewmemberSacked.Add((ProtoCrewMember m, int i) => * { * foreach (KCT_KSC ksc in KCT_GameStates.KSCs) * { * ksc.RecalculateBuildRates(); * ksc.RecalculateUpgradedBuildRates(); * } * });*/ GameEvents.onGUIAdministrationFacilitySpawn.Add(HideAllGUIs); GameEvents.onGUIAstronautComplexSpawn.Add(HideAllGUIs); GameEvents.onGUIMissionControlSpawn.Add(HideAllGUIs); GameEvents.onGUIRnDComplexSpawn.Add(HideAllGUIs); GameEvents.onGUIKSPediaSpawn.Add(HideAllGUIs); GameEvents.onEditorStarted.Add(() => { KCT_Utilities.HandleEditorButton(); }); GameEvents.onFacilityContextMenuSpawn.Add(FacilityContextMenuSpawn); subscribedToEvents = true; }