/// <summary> /// 把系统回滚到上一个状态并演绎 /// </summary> public static void SteadyBackward() { lock (typeof(RollbackManager)) { // 还有得回滚且不在动画时才滚 if (RollbackManager.forwardStack.Count > 0 && Director.RunMana.GameState(Director.RunMana.CallStack) != StackMachineState.WaitAnimation) { // 如果还未回滚过就要将自己先移除 if (RollbackManager.IsRollingBack == false && RollbackManager.forwardStack.Count > 1) { var selfStep = RollbackManager.forwardStack.Last(); RollbackManager.forwardStack.RemoveLast(); RollbackManager.backwardStack.AddLast(selfStep); RollbackManager.IsRollingBack = true; } // 取上一状态 if (RollbackManager.IsRollingBack && RollbackManager.forwardStack.Count > 0) { var lastStep = RollbackManager.forwardStack.Last(); RollbackManager.forwardStack.RemoveLast(); RollbackManager.backwardStack.AddLast(lastStep); // 重演绎 RollbackManager.GotoSteadyState(lastStep); ViewManager.MaskFrameRef.Opacity = 0; NotificationManager.SystemMessageNotify("正在回滚", 800); } } } }
/// <summary> /// 系统向前进一个状态 /// 她只有在对话推进和选择项出现时才被触发 /// </summary> public static void SteadyForward(bool fromWheel, SceneAction saPtr, MusicianDescriptor mdescriptor, BacklogHolder backlogHolder) { lock (typeof(RollbackManager)) { // 回滚后返回,移栈并演绎 if (fromWheel && RollbackManager.IsRollingBack) { // 取上一状态 var recentStep = RollbackManager.backwardStack.Last(); RollbackManager.backwardStack.RemoveLast(); RollbackManager.forwardStack.AddLast(recentStep); // 重演绎 RollbackManager.GotoSteadyState(recentStep); } // 非回滚状态时才重新构造 else if (fromWheel == false) { // 处理回顾 if (saPtr.Type == SActionType.act_dialog) { backlogHolder.AddLog(saPtr.Tag); } // 构造当前状态的拷贝 var vm = Director.RunMana.CallStack.Fork() as StackMachine; vm.SetMachineName(String.Format("Yuri!Forked?{0}?{1}", DateTime.Now.Ticks, rand.Next(0, int.MaxValue))); RollbackableSnapshot ssp = new RollbackableSnapshot() { TimeStamp = DateTime.Now, IsBranchingRefer = Director.GetInstance().GetMainRender().IsBranching, MusicRef = ForkableState.DeepCopyBySerialization(mdescriptor), BacklogRef = ForkableState.DeepCopyBySerialization(backlogHolder), ReactionRef = saPtr, VMRef = vm, globalDao = SymbolTable.GetInstance().GlobalCtxDao.Fork() as GlobalContextDAO, sceneDao = SymbolTable.GetInstance().SceneCtxDao.Fork() as SceneContextDAO, ScreenStateRef = ScreenManager.GetInstance().Fork() as ScreenManager, SemaphoreDict = ForkableState.DeepCopyBySerialization(Director.RunMana.SemaphoreBindings), EnableRClickRef = Director.RunMana.EnableRClick, PerformingChapterRef = Director.RunMana.PerformingChapter }; // 如果栈中容量溢出就剔掉最早进入的那个 if (RollbackManager.forwardStack.Count >= GlobalConfigContext.MaxRollbackStep) { RollbackManager.forwardStack.RemoveFirst(); } // 入栈 RollbackManager.forwardStack.AddLast(ssp); } } }