/// <summary> /// 回退步骤,指定回退步数 /// </summary> /// <param name="stepNum">Step number.</param> public void PlayBackStep(int stepNum = 2) { if (!_canPlayBack) { return; } AudioManager.Instance.PlaySE(DataModel.Sound.Sound_UNDO); while (stepNum > 0) { if (_cardMoveHistory.Count > 0) { CardsEvent cardsEvent = _cardMoveHistory.Dequeue(); for (int i = 0; i < cardsEvent.originIndexCardsList.Count; i++) { BaseCard baseCard = cardsEvent.targetsCardsList[i]; int oriIndex = cardsEvent.originIndexCardsList[i]; int oriLayer = cardsEvent.originLayerList[i]; baseCard.boxColider.enabled = true; MoveCardsLogicalTo(baseCard, oriIndex, oriLayer); EffectMoveTo(baseCard); } } stepNum--; } EndCombo(); DataModel.Instance.ClearCards(); //UpdateUseableStatus( true ); }
/// <summary> /// 逻辑:场上移动麻将到指定层位置 /// </summary> /// <param name="index">Index.-1视为可撤销位置</param> /// <param name="layer">Layer.-1视为可撤销位置</param> private void MoveCardsLogicalTo(BaseCard baseCards, int index, int layer, bool needRemoveDict = true) { //目前只记录到可撤销位置时的移动记录 if (index < 0 || layer < 0) { CardsEvent cardsEvent = new CardsEvent(); cardsEvent.targetsCardsList.Add(baseCards); cardsEvent.originLayerList.Add(baseCards.Layer); cardsEvent.originIndexCardsList.Add(baseCards.Index); _cardMoveHistory.Enqueue(cardsEvent); Debug.Log("记录撤销位置" + _cardMoveHistory.Count); } //当洗牌时,不需要移动前清楚原位置记录,因可能清掉新的已经移动到原位置上的牌组 //update bound index recording for (int w = 0; w < baseCards.leftIndexs.Length; w++) { RemoveOccupyIndex(baseCards.leftIndexs[w], baseCards.Layer); RemoveOccupyIndex(baseCards.rightIndexs[w], baseCards.Layer); } RemoveOccupyIndex(baseCards.Index, baseCards.Layer); RemoveOccupyIndex(baseCards.leftIndexs[0] + 1, baseCards.Layer); RemoveOccupyIndex(baseCards.leftIndexs[2] + 1, baseCards.Layer); if (needRemoveDict) { RemoveFromDict(baseCards.Layer, baseCards, false); } //定义:大于0的位置为棋盘位置,否则视为可撤销位置 if (index > -1) { //init all params baseCards.Layer = layer; baseCards.Index = index; baseCards.UpdateBounds(_colPointsNum, _rowPointsNum); baseCards.cardObj.transform.name = string.Format("{0}_{1}", baseCards.Layer.ToString(), baseCards.Index.ToString()); //update bound index recording for (int w = 0; w < baseCards.leftIndexs.Length; w++) { AddOccupyIndex(baseCards.leftIndexs[w], baseCards.Layer); AddOccupyIndex(baseCards.rightIndexs[w], baseCards.Layer); } AddOccupyIndex(baseCards.Index, baseCards.Layer); AddOccupyIndex(baseCards.leftIndexs[0] + 1, baseCards.Layer); AddOccupyIndex(baseCards.leftIndexs[2] + 1, baseCards.Layer); AddToDict(layer, baseCards); } }
IEnumerator StartAction() { GameControl.CurrentAction = this; if (GameActionInfo != null) { yield return(AllComponents.PhasesUI.ShowInfo(GameActionInfo)); } yield return(Animation()); ChooseCardOptionalAction = new ChooseCardAction(new List <CardEffect>(), isOptionalChoice: true, isLoop: true, withPreview: false); CardsEvent.ForEach(c => c.CardLogic.BeginGameActionEvents(this)); if (ChooseCardOptionalAction.ChosenCardEffects.Count > 0) { ChooseCardOptionalAction.AddActionTo(); } if (flow.Count > 0) { yield return(flow.Dequeue().StartAction()); } if (!IsActionCanceled) { yield return(ActionLogic()); ChooseCardOptionalAction = new ChooseCardAction(new List <CardEffect>(), isOptionalChoice: true, isLoop: true); CardsEvent.ForEach(c => c.CardLogic.EndGameActionEvents(this)); if (ChooseCardOptionalAction.ChosenCardEffects.Count > 0) { ChooseCardOptionalAction.AddActionTo(); } if (flow.Count > 0) { yield return(flow.Dequeue().StartAction()); } } GameControl.CurrentAction = ActionParent; if (ActionParent.flow.Count > 0 && !isRunNow) { yield return(ActionParent.flow.Dequeue().StartAction()); } }