/// <summary> /// Ends the current game session and shows the titlescreen. /// </summary> /// <remarks>Only works when <see cref="GM.GameState"/> is <see cref="GameState.PUZZLE"/> or <see cref="GameState.SIM"/> and the tutorial has been completed.</remarks> /// <param name="saveGame">When <c>true</c>, save the current game session to the active save file.</param> /// <param name="revertDates">When <c>true</c> and <paramref name="saveGame"/> is also <c>true</c>, will set <see cref="GirlPlayerData.dayDated"/> to false when on a puzzle/date.</param> /// <param name="triggerValediction">When <c>true</c>, trigger a valediction dialog (goodbye) on the main girl.</param> /// <returns><c>True</c> when the session was ended, <c>false</c> when ending the session was blocked due to the game's current state.</returns> public static bool EndGameSession(bool saveGame = true, bool revertDates = true, bool triggerValediction = true) { if (!GM.System.Player.tutorialComplete || GetAvailableGirls(availableOnly: false, excludeCurrentGirl: false).Count == 0) { ShowNotification(CellNotificationType.MESSAGE, "Cannot leave the tutorial"); return(false); } //base HunieMod could just use Input.GetMouseButtonDown(0) I think if (Input.GetMouseButtonDown(0) || InputPatches.mouseDown) { ShowNotification(CellNotificationType.MESSAGE, "Cannot leave with the mouse button clicked"); return(false); } if (GM.System == null || GM.System.GameState == GameState.TITLE || GM.System.GameState == GameState.LOADING || !GM.System.Location.IsLocationSettled() || (GM.System.Location.currentLocation.type == LocationType.NORMAL && !GM.Stage.uiWindows.IsDefaultWindowActive(true))) { ShowNotification(CellNotificationType.MESSAGE, "Cannot leave unless you could use the Girl Finder"); return(false); } if (GM.Stage.cellPhone.IsOpen()) { ShowNotification(CellNotificationType.MESSAGE, "Cannot leave with the HunieBee open"); return(false); } if (GM.System.GameState == GameState.PUZZLE) { if (GM.System.Puzzle.Game.puzzleGameState != PuzzleGameState.WAITING) { ShowNotification(CellNotificationType.MESSAGE, "Can only leave when you could make a move"); return(false); } if (saveGame) { GM.System.Player.GetGirlData(GM.System.Location.currentGirl).dayDated = !revertDates; var returnTo = (LocationDefinition)AccessTools.Field(typeof(PuzzleManager), "_returnToLocation")?.GetValue(GM.System.Puzzle); if (returnTo != null) { GM.System.Player.currentLocation = returnTo; } } HidePuzzleGame(true); } else { GM.Stage.uiGirl.stats.localY = UIGirl.GIRL_STATS_HIDDEN_Y_POS; } GM.Stage.uiTop.buttonHuniebee.interactive = false; GM.Stage.SetPausable(false); if (GM.Stage.cellPhone.IsOpen()) { ShowCellPhone(false, true); } ClearActiveDialogScene(); GM.Stage.altGirl.girlPieceContainers.localX = -GameCamera.SCREEN_DEFAULT_WIDTH_HALF; GM.Stage.altGirl.ClearGirl(); GM.Stage.background.StopBackgroundMusic(); GM.Stage.background.locationBackgrounds.gameObj.transform.localScale = Vector3.one * 0.95f; GM.Stage.uiWindows.HideActiveWindow(); if (triggerValediction) { StaticCoroutine.Do(TriggerValedictionDialog()); } if (saveGame) { GM.System.SaveGame(); } //remove blinking message icon GM.System.Player.messages[0].viewed = true; GM.Stage.uiTop.RefreshMessageAlert(); //reset cell phone defaults GameManager.Stage.cellPhone.cellMemory = new Dictionary <string, int>(); GameManager.Stage.cellPhone.SetCellApp(GameManager.Stage.cellPhone.defaultCellApp); GM.System.Location.currentGirl = null; GM.System.Location.currentLocation = null; AccessTools.Field(typeof(GM), "_saveFile").SetValue(GM.System, null); AccessTools.Method(typeof(LocationManager), "Awake").Invoke(GM.System.Location, null); GM.System.GameState = GameState.TITLE; GM.Stage.uiTitle.ShowTitleScreen(); GM.Stage.uiTitle.SaveFileSelectedEvent += OnSaveFileSelected; return(true); }