public IEnumerator <YieldInstruction> OnExitSegment(GameProgress.ResultType result, bool rescuing) { string assetName = "zone_" + ZoneManager.Instance.CurrentZoneID; //Do script event yield return(CoroutineManager.Instance.StartCoroutine(RunScriptEvent(LuaEngine.EZoneCallbacks.ExitSegment, this, result, rescuing, CurrentMapID.Segment, CurrentMapID.ID))); //Notify script engine LuaEngine.Instance.OnZoneSegmentEnd(/*assetName, this*/); }
public Coroutine _EndDungeonRun(GameProgress.ResultType result, int destzoneid, int structureid, int mapid, int entryid, bool display, bool fanfare) { return(new Coroutine(DataManager.Instance.Save.EndGame(result, new ZoneLoc(destzoneid, new SegLoc(structureid, mapid), entryid), display, fanfare))); }
public IEnumerator <YieldInstruction> EndSegment(GameProgress.ResultType result) { if ((result == GameProgress.ResultType.Failed || result == GameProgress.ResultType.Downed || result == GameProgress.ResultType.TimedOut) && DataManager.Instance.CurrentReplay == null) { SE("Menu/Skip"); yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(new MsgLogMenu()))); } BGM("", true); yield return(CoroutineManager.Instance.StartCoroutine(FadeOut(false))); yield return(new WaitForFrames(40)); if (DataManager.Instance.CurrentReplay != null) { //try to get the game state. if we can't get any states, then we must have quicksaved here if (DataManager.Instance.CurrentReplay.CurrentState < DataManager.Instance.CurrentReplay.States.Count) { GameState state = DataManager.Instance.CurrentReplay.ReadState(); DataManager.Instance.SetProgress(state.Save); LuaEngine.Instance.LoadSavedData(DataManager.Instance.Save); //notify script engine ZoneManager.LoadFromState(state.Zone); SceneOutcome = MoveToZone(DataManager.Instance.Save.NextDest); } else { //check for a rescue input GameAction rescued = null; if (DataManager.Instance.CurrentReplay.CurrentAction < DataManager.Instance.CurrentReplay.Actions.Count) { GameAction nextAction = DataManager.Instance.CurrentReplay.ReadCommand(); if (nextAction.Type == GameAction.ActionType.Rescue) { rescued = nextAction; } else//we shouldn't be hitting this point! give an error notification! { yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.SetDialogue(Text.FormatKey("DLG_REPLAY_DESYNC")))); } } if (rescued != null) //run the action { yield return(CoroutineManager.Instance.StartCoroutine(DungeonScene.Instance.ProcessRescue(rescued, null))); } else if (DataManager.Instance.Save.Rescue != null && !DataManager.Instance.Save.Rescue.Rescuing) { //resuming a game that was just rescued DataManager.Instance.ResumePlay(DataManager.Instance.CurrentReplay.RecordDir, DataManager.Instance.CurrentReplay.QuicksavePos); DataManager.Instance.CurrentReplay = null; DataManager.Instance.Loading = DataManager.LoadMode.None; SOSMail mail = DataManager.Instance.Save.Rescue.SOS; //and then run the action rescued = new GameAction(GameAction.ActionType.Rescue, Dir8.None); rescued.AddArg(mail.OfferedItem.IsMoney ? 1 : 0); rescued.AddArg(mail.OfferedItem.Value); rescued.AddArg(mail.OfferedItem.HiddenValue); rescued.AddArg(mail.RescuedBy.Length); for (int ii = 0; ii < mail.RescuedBy.Length; ii++) { rescued.AddArg(mail.RescuedBy[ii]); } DataManager.Instance.LogPlay(rescued); yield return(CoroutineManager.Instance.StartCoroutine(DungeonScene.Instance.ProcessRescue(rescued, mail))); } else { if (DataManager.Instance.Loading == DataManager.LoadMode.Rescuing) { if (result == GameProgress.ResultType.Rescue) { //mark as verified RescueMenu menu = (RescueMenu)TitleScene.TitleMenuSaveState[TitleScene.TitleMenuSaveState.Count - 1]; menu.Verified = true; } //default is failure to verify yield return(CoroutineManager.Instance.StartCoroutine(EndReplay())); } else if (DataManager.Instance.Loading == DataManager.LoadMode.Loading) { //the game accepts loading into a file that has been downed, or passed its section with nothing else DataManager.Instance.ResumePlay(DataManager.Instance.CurrentReplay.RecordDir, DataManager.Instance.CurrentReplay.QuicksavePos); DataManager.Instance.CurrentReplay = null; SetFade(true, false); DataManager.Instance.Loading = DataManager.LoadMode.None; bool rescuing = DataManager.Instance.Save.Rescue != null && DataManager.Instance.Save.Rescue.Rescuing; //if failed, just show the death plaque //if succeeded, run the script that follows. SceneOutcome = ZoneManager.Instance.CurrentZone.OnExitSegment(result, rescuing); } else //we've reached the end of the replay { yield return(CoroutineManager.Instance.StartCoroutine(EndReplay())); } } } } else { string dateDefeated = String.Format("{0:yyyy-MM-dd}", DateTime.Now); bool rescue = false; if (result == GameProgress.ResultType.Downed && DataManager.Instance.Save.RescuesLeft > 0) { yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.ProcessMenuCoroutine(MenuManager.Instance.CreateQuestion(Text.FormatKey("DLG_RESCUE_ASK"), () => { rescue = true; }, () => { })))); } //trigger the end-segment script if (rescue) { DataManager.Instance.SuspendPlay(); GameState state = DataManager.Instance.LoadMainGameState(); SOSMail awaiting = new SOSMail(DataManager.Instance.Save, new ZoneLoc(ZoneManager.Instance.CurrentZoneID, ZoneManager.Instance.CurrentMapID), ZoneManager.Instance.CurrentMap.Name, dateDefeated, Versioning.GetVersion()); state.Save.Rescue = new RescueState(awaiting, false); DataManager.Instance.SaveGameState(state); DataManager.SaveRescueMail(DataManager.RESCUE_OUT_PATH + DataManager.SOS_PATH, state.Save.Rescue.SOS, true); yield return(CoroutineManager.Instance.StartCoroutine(MenuManager.Instance.SetDialogue(Text.FormatKey("DLG_RESCUE_INFO_1")))); yield return(new WaitForFrames(1)); MenuBase.Transparent = false; SceneOutcome = RestartToTitle(); yield return(CoroutineManager.Instance.StartCoroutine(DungeonScene.Instance.SuspendGame())); } else { bool rescuing = DataManager.Instance.Save.Rescue != null && DataManager.Instance.Save.Rescue.Rescuing; SceneOutcome = ZoneManager.Instance.CurrentZone.OnExitSegment(result, rescuing); } } }