Example #1
0
        public HandToFieldAnim(TableManager table, HandListItem item, FieldList field, int index)
        {
            _item          = item;
            _startPosition = item.Card.rectTransform.position;
            _timer         = new Timer()
            {
                duration = table.handToFieldCurve.keys.Last().time
            };

            field.addChild(table.ui.ServantPlaceHolder.rectTransform);
            field.defaultItem.rectTransform.SetAsFirstSibling();
            table.ui.ServantPlaceHolder.rectTransform.SetSiblingIndex(index + 1);
            table.ui.ServantPlaceHolder.display();
            _startPosition = _item.Card.rectTransform.position;
            _timer.start();
        }
Example #2
0
 public override bool update(TableManager table, Pile.MoveCardEventArg eventArg)
 {
     if (eventArg.from == null)
     {
         if (eventArg.to.name == PileName.HAND)
         {
             //发现,印卡
             if (!table.tryGetHand(eventArg.card, out var hand))
             {
                 hand = table.createHand(eventArg.card);
             }
             if (!SimpleAnimHelper.update(table, ref _anim, hand.onCreate, hand.animator))
             {
                 return(false);
             }
         }
     }
     else if (eventArg.from.name == PileName.INIT)
     {
         if (eventArg.to.name == PileName.HAND)
         {
             //初始手牌
             table.createHand(eventArg.card);
         }
     }
     else if (eventArg.from.name == PileName.DECK)
     {
         if (eventArg.to.name == PileName.HAND)
         {
             //抽牌
             if (!_timer.isStarted)
             {
                 _item = table.createHand(eventArg.card);
                 if (eventArg.from.owner == table.player)
                 {
                     _item.Card.rectTransform.position = table.ui.SelfDeck.rectTransform.position;
                     _startPosition = table.ui.SelfDeck.rectTransform.position;
                 }
                 else
                 {
                     _item.Card.rectTransform.position = table.ui.EnemyDeck.rectTransform.position;
                     _startPosition = table.ui.EnemyDeck.rectTransform.position;
                 }
                 _timer.start();
             }
             _item.Card.rectTransform.position = Vector3.Lerp(_startPosition, _item.rectTransform.position, _item.Card.drawCurve.Evaluate(_timer.progress));
             if (!_timer.isExpired())
             {
                 return(false);
             }
         }
     }
     else if (eventArg.from.name == PileName.HAND)
     {
         HandListItem hand = table.getHand(eventArg.card);
         if (eventArg.to.name == PileName.GRAVE)
         {
             //弃牌
             if (!SimpleAnimHelper.update(table, ref _anim, hand.onDiscard, hand.animator, next =>
             {
                 if (next is MoveCardAnim moveCard && moveCard.tEventArg.card != eventArg.card)
                 {
                     return(true);
                 }
                 return(false);
             }))
Example #3
0
 public override bool update(TableManager table, THHPlayer.UseEventArg eventArg)
 {
     if (eventArg.card.define is ServantCardDefine)
     {
         if (eventArg.player == table.player)
         {
             if (!table.ui.ServantPlaceHolder.Servant.isDisplaying)
             {
                 HandListItem item = table.getHand(eventArg.card);
                 if (_handToField == null)
                 {
                     _handToField = new HandToFieldAnim(table, item, table.ui.SelfFieldList, eventArg.position);
                 }
                 if (!_handToField.update(table))
                 {
                     return(false);
                 }
             }
             if (tryTargetedAnim(table, eventArg))
             {
                 return(false);
             }
             table.ui.SelfHandList.removeItem(table.getHand(eventArg.card));
             table.ui.addChild(table.ui.ServantPlaceHolder.rectTransform);
             table.ui.ServantPlaceHolder.hide();
         }
         else
         {
             var hand = table.getHand(eventArg.card);
             if (hand == null)
             {
                 throw new ActorNotFoundException(eventArg.card);
             }
             if (!table.ui.ServantPlaceHolder.Servant.isDisplaying)
             {
                 //敌方使用随从
                 if (_handToField == null)
                 {
                     _handToField = new HandToFieldAnim(table, hand, table.ui.EnemyFieldList, eventArg.position);
                 }
                 if (!_handToField.update(table))
                 {
                     return(false);
                 }
             }
             if (tryTargetedAnim(table, eventArg))
             {
                 return(false);
             }
             table.ui.EnemyHandList.removeItem(hand);
             table.ui.addChild(table.ui.ServantPlaceHolder.rectTransform);
             table.ui.ServantPlaceHolder.hide();
         }
     }
     else if (eventArg.card.define is SpellCardDefine)
     {
         if (eventArg.player == table.player)
         {
             table.ui.SelfHandList.removeItem(table.getHand(eventArg.card));
             if (tryTargetedAnim(table, eventArg))
             {
                 return(false);
             }
         }
         else
         {
             HandListItem hand = table.getHand(eventArg.card);
             table.setCard(hand.Card, eventArg.card, true);
             hand.GetComponentInChildren <PositionLerp>().setTarget(table.ui.getChild("SpellDisplay"));
             if (!SimpleAnimHelper.update(table, ref _useAnim, hand.onEnemyUse, hand.animator))
             {
                 return(false);
             }
             table.ui.EnemyHandList.removeItem(table.getHand(eventArg.card));
             if (tryTargetedAnim(table, eventArg))
             {
                 return(false);
             }
         }
     }
     else if (eventArg.card.isSkill())
     {
         if (eventArg.player == table.player)
         {
             table.setSkill(table.ui.SelfSkill, eventArg.card);
         }
         else
         {
             table.setSkill(table.ui.EnemySkill, eventArg.card);
         }
         if (tryTargetedAnim(table, eventArg))
         {
             return(false);
         }
     }
     else if (eventArg.card.isItem())
     {
         if (eventArg.player == table.player)
         {
             table.setItem(table.ui.SelfItem, eventArg.card);
             if (!SimpleAnimHelper.update(table, ref _useAnim, table.ui.SelfItem.onEquip, table.ui.SelfItem.animator))
             {
                 return(false);
             }
         }
         else
         {
             table.setItem(table.ui.EnemyItem, eventArg.card);
             if (!SimpleAnimHelper.update(table, ref _useAnim, table.ui.EnemyItem.onEquip, table.ui.EnemyItem.animator))
             {
                 return(false);
             }
         }
         if (tryTargetedAnim(table, eventArg))
         {
             return(false);
         }
     }
     return(true);
 }
Example #4
0
 /// <summary>
 /// 手牌拖拽结束
 /// </summary>
 /// <param name="hand"></param>
 /// <param name="pointer"></param>
 void onDragHandEnd(HandListItem hand, PointerEventData pointer)
 {
     if (hand.GetComponentInParent <HandList>() != ui.SelfHandList)//你不能用别人的卡
     {
         return;
     }
     if (!canControl)//不是你的回合,不生效
     {
         resetUse(true, true);
         return;
     }
     usingCard = getCard(hand);
     if (ui.SelfHandList.rectTransform.rect.Contains(ui.SelfHandList.rectTransform.InverseTransformPoint(pointer.position)))
     {
         //如果松开,取消使用
         resetUse(true, true);
     }
     else
     {
         if (!usingCard.isUsable(game, player, out string info))
         {
             //卡牌不可用
             showTip(info);
             resetUse(true, true);
         }
         else if (usingCard.define is ServantCardDefine)
         {
             //松开鼠标,确认使用随从牌
             int index = calcIndexInField(pointer.position);
             ui.ServantPlaceHolder.rectTransform.SetSiblingIndex(index + 1);
             if (usingCard.getAvaliableTargets(game) is TouhouCardEngine.Card[] targets && targets.Length > 0)
             {
                 usingPosition = index;
                 //进入选择目标状态,固定手牌到占位上,高亮可以选择的目标
                 addAnim(new HandToFieldAnim(this, hand, ui.SelfFieldList, index));
                 TouhouCardEngine.Card localUsingCard = usingCard;
                 addAnim(new CodeAnim(() =>
                 {
                     hand.Card.hide();
                     //显示占位随从
                     ui.ServantPlaceHolder.Servant.display();
                     try
                     {
                         setServant(ui.ServantPlaceHolder.Servant, localUsingCard.define);
                     }
                     catch (NullReferenceException e)
                     {
                         Debug.LogError(e);
                     }
                 }));
                 isSelectingTarget = true;
                 highlightTargets(targets);
                 ui.SelfSkill.isUsable = false;
                 ui.SelfHandList.shrink();
             }
             else
             {
                 //使用无目标随从牌
                 player.cmdUse(game, usingCard, index);
                 resetUse(false, false);
             }
         }
Example #5
0
 /// <summary>
 /// 手牌拖拽事件
 /// </summary>
 /// <param name="hand"></param>
 /// <param name="pointer"></param>
 void onDragHand(HandListItem hand, PointerEventData pointer)
 {
     if (!hand.isDragable)
     {
         return;
     }
     if (!canControl)//无法进行控制
     {
         resetUse(true, true);
         return;
     }
     TouhouCardEngine.Card card = getCard(hand);
     if (usingCard != null && usingCard != card)
     {
         resetUse(true, true);
         return;
     }
     usingCard = card;
     //拖拽卡片
     hand.Card.rectTransform.position = pointer.position;
     if (ui.SelfHandList.rectTransform.rect.Contains(ui.SelfHandList.rectTransform.InverseTransformPoint(pointer.position)))
     {
         //如果移动回手牌区域,恢复正常大小
         hand.Card.rectTransform.localScale = Vector3.one;
         //移除随从占位
         if (usingCard.isServant())
         {
             hideServantPlaceHolder();
         }
     }
     else
     {
         //移动到手牌区以外的地方视作打算使用
         if (!usingCard.isUsable(game, player, out string info))
         {
             //卡牌不可用,停止拖拽并提示
             showTip(info);
             resetUse(true, true);
         }
         else
         {
             //手牌在战场上大小和随从牌一致
             hand.Card.rectTransform.localScale = Vector3.one * .4f / ui.SelfHandList.rectTransform.localScale.y;
             if (usingCard.define is ServantCardDefine)
             {
                 //如果手牌是随从,那么在场上的时候会有一个占位符,预览这个随从放下去的位置。
                 ui.SelfFieldList.defaultItem.rectTransform.SetAsFirstSibling();
                 ui.ServantPlaceHolder.rectTransform.sizeDelta = ui.SelfFieldList.defaultItem.rectTransform.sizeDelta;
                 ui.SelfFieldList.addChild(ui.ServantPlaceHolder.rectTransform);
                 ui.ServantPlaceHolder.display();
                 ui.ServantPlaceHolder.rectTransform.SetSiblingIndex(calcIndexInField(pointer.position) + 1);
             }
             else if (usingCard.define is SpellCardDefine)
             {
                 if (usingCard.isNeedTarget(game, out var targets))
                 {
                     if (!isSelectingTarget)
                     {
                         isSelectingTarget = true;//TODO:这个地方一定要重写,怎么能这样的?isSelectingTarget就应该被usingCard取代
                         highlightTargets(targets);
                         ui.SelfHandList.shrink();
                     }
                     hand.Card.hide();
                     if (tryGetMaster(usingCard.getOwner().master, out var castMaster))
                     {
                         displayArrow(castMaster.rectTransform.position, pointer.position);
                     }
                 }
             }
         }
     }
 }