Beispiel #1
0
 /// <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);
             }
         }
     }
 }
Beispiel #2
0
 /// <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);
         }
     }
 }