public void gameSceneEvent(GameScenes scene) { KCT_SpecialSurpriseInside.instance.sceneChanges++; if (!KCT_GameStates.settings.enabledForSave) { 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); } TechDisableEvent(); } 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 (scene == GameScenes.MAINMENU) { KCT_GameStates.reset(); KCT_GameStates.firstStart = true; 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 }; } if (HighLogic.LoadedSceneIsEditor) { EditorLogic.fetch.Unlock("KCTEditorMouseLock"); } }
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 FixedUpdate() { #if DEBUG if (!updateChecked && KCT_GameStates.settings.CheckForDebugUpdates && !KCT_GameStates.firstStart) { KCT_UpdateChecker.CheckForUpdate(false, false); updateChecked = true; } #endif if (!KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled) { return; } if (!KCT_GameStates.erroredDuringOnLoad.AlertFired && KCT_GameStates.erroredDuringOnLoad.HasErrored()) { KCT_GameStates.erroredDuringOnLoad.FireAlert(); } if (KCT_GameStates.LoadingSimulationSave) { KCT_Utilities.LoadSimulationSave(true); } if (KCT_GameStates.UpdateLaunchpadDestructionState) { KCT_GameStates.UpdateLaunchpadDestructionState = false; KCT_GameStates.ActiveKSC.ActiveLPInstance.SetDestructibleStateFromNode(); if (KCT_GameStates.ActiveKSC.ActiveLPInstance.upgradeRepair) { //repair everything, then update the node KCT_GameStates.ActiveKSC.ActiveLPInstance.RefreshDestructionNode(); KCT_GameStates.ActiveKSC.ActiveLPInstance.CompletelyRepairNode(); KCT_GameStates.ActiveKSC.ActiveLPInstance.SetDestructibleStateFromNode(); } } double lastUT = KCT_GameStates.UT > 0 ? KCT_GameStates.UT : Planetarium.GetUniversalTime(); KCT_GameStates.UT = Planetarium.GetUniversalTime(); try { if (HighLogic.LoadedScene == GameScenes.SPACECENTER && KCT_Utilities.CurrentGameIsCareer() && KCT_Utilities.BuildingUpgradeLevel(SpaceCenterFacility.LaunchPad) != KCT_GameStates.ActiveKSC.ActiveLPInstance.level) { failedLvlChecks++; if (failedLvlChecks > 10) { KCT_GameStates.ActiveKSC.SwitchLaunchPad(KCT_GameStates.ActiveKSC.ActiveLaunchPadID, false); KCT_GameStates.UpdateLaunchpadDestructionState = true; failedLvlChecks = 0; } } //Warp code 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; } double remaining = ikctItem != null?ikctItem.GetTimeLeft() : -1; double dT = TimeWarp.CurrentRate / (KCT_GameStates.UT - lastUT); if (dT >= 20) { dT = 0.1; } //KCTDebug.Log("dt: " + dT); int nBuffers = 1; 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 && warpRate > 0 && TimeWarp.fetch.warpRates[warpRate] * dT * nBuffers > Math.Max(remaining, 0)) { //double timeDelta = TimeWarp.CurrentRate * dT * nBuffers - ikctItem.GetTimeLeft(); // KCTDebug.Log("Current delta: " + (TimeWarp.fetch.warpRates[warpRate] * dT) + " Remaining: " + remaining); //KCTDebug.Log("dt: " + dT); 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--; } KCTDebug.Log("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 && KCT_GameStates.warpInitiated) { KCT_GameStates.canWarp = false; KCT_GameStates.warpInitiated = false; KCT_GameStates.targetedItem = null; } KCT_GameStates.lastWarpRate = warpRate; } } else if (ikctItem != null && ikctItem == KCT_GameStates.targetedItem && (KCT_GameStates.warpInitiated || KCT_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); KCT_GameStates.warpInitiated = false; KCT_GameStates.targetedItem = null; } } if (HighLogic.LoadedScene == GameScenes.FLIGHT && KCT_GameStates.flightSimulated) //Simulated flights { if (FlightGlobals.ActiveVessel.loaded && !FlightGlobals.ActiveVessel.packed && !moved) { //moved = true; int secondsForMove = KCT_GameStates.DelayMoveSeconds; if (KCT_GameStates.simulateInOrbit && loadDeferTime == DateTime.MaxValue) { loadDeferTime = DateTime.Now; } else if (KCT_GameStates.simulateInOrbit && (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) { TimeWarp.SetRate(0, true); 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 (!KCT_GUI.PrimarilyDisabled && HighLogic.LoadedScene == GameScenes.SPACECENTER) { if (VesselSpawnDialog.Instance.Visible) { POINTER_INFO ptr = new POINTER_INFO(); ptr.evt = POINTER_INFO.INPUT_EVENT.TAP; VesselSpawnDialog.Instance.ButtonClose(ref ptr); KCTDebug.Log("Attempting to close spawn dialog!"); } } /* 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 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); } }