Ejemplo n.º 1
0
        public void update(TouhouCardEngine.Card card, CardSkinData skin)
        {
            this.card = card;

            CostPropNumber.asText.text = card.getCost(null).ToString();
            if (card.define.type == CardDefineType.SERVANT)
            {
                type = CardCategory.SERVANT;
                // TypeController = Type.Servant;
                //onTypeControllerServant?.Invoke();
                AttackPropNumber.asText.text = card.getAttack(null).ToString();
                LifePropNumber.asText.text   = card.getLife(null).ToString();
            }
            else if (card.define.type == CardDefineType.SPELL)
            {
                // TypeController = Type.Spell;
                type = CardCategory.SPELL;
            }

            if (skin != null)
            {
                Image.sprite  = skin.image;
                NameText.text = skin.name;
                //{card:damage}
                DescText.text = skin.desc;
                // IsFaceupController = IsFaceup.True;
                isFaceup = true;
            }
            else
            {
                // IsFaceupController = IsFaceup.False;
                isFaceup = false;
            }
        }
Ejemplo n.º 2
0
        public void update(TouhouCardEngine.Card card, CardSkinData skin)
        {
            this.card = card;

            CostPropNumber.asText.text = card.getCost().ToString();
            if (card.define.type == CardDefineType.SERVANT)
            {
                TypeController = Type.Servant;
                AttackPropNumber.asText.text = card.getAttack().ToString();
                LifePropNumber.asText.text   = card.getLife().ToString();
            }
            else
            {
                TypeController = Type.Spell;
            }

            if (skin != null)
            {
                Image.sprite       = skin.image;
                NameText.text      = skin.name;
                DescText.text      = skin.desc;
                IsFaceupController = IsFaceup.True;
            }
            else
            {
                IsFaceupController = IsFaceup.False;
            }
        }
Ejemplo n.º 3
0
        public void update(THHPlayer player, TouhouCardEngine.Card card, CardSkinData skin)
        {
            this.card = card;

            Table table = GetComponentInParent <Table>();

            if (skin != null)
            {
                Image.sprite = skin.image;
            }
            AttackText.text = card.getAttack().ToString();
            HpText.text     = card.getCurrentLife().ToString();

            if (table.selectableTargets != null && table.selectableTargets.Contains(this))
            {
                HighlightController = Highlight.Yellow;
            }
            else if (table.player == player && table.game.currentPlayer == player && card.canAttack(table.game))
            {
                HighlightController = Highlight.Green;
            }
            else
            {
                HighlightController = Highlight.None;
            }
            getChild("Root").getChild("Taunt").gameObject.SetActive(card.isTaunt());
            getChild("Root").getChild("Shield").gameObject.SetActive(card.isShield());
        }
Ejemplo n.º 4
0
        public void update(Table table, THHPlayer self, THHPlayer player, TouhouCardEngine.Card card, CardSkinData skin)
        {
            this.card = card;

            Image.sprite = skin.image;
            CostPropNumber.asText.text = card.getCost(null).ToString();
            if (card.isUsed(null))
            {
                // IsUsedController = IsUsed.True;
                isUsed = true;
            }
            else
            {
                // IsUsedController = IsUsed.False;
                isUsed = false;
            }
            if (player == self &&
                card.isUsable(table.game, player, out _) &&//技能是可用的
                table.selectableTargets == null &&//没有在选择目标
                table.canControl   //是自己的回合
                )
            {
                // IsUsableController = IsUsable.True;
                isUsable = true;
                asButton.interactable = true;
            }
            else
            {
                // IsUsableController = IsUsable.False;
                isUsable = false;
                asButton.interactable = false;
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 设置Skill的UI
        /// </summary>
        /// <param name="skill"></param>
        /// <param name="card"></param>
        public void setSkill(Skill skill, TouhouCardEngine.Card card)
        {
            CardSkinData skin = getSkin(card);

            skill.Image.sprite = skin.image;
            skill.CostPropNumber.asText.text = card.getCost(game).ToString();
            if (card.isUsed(game))
            {
                // skill.IsUsedController = Skill.IsUsed.True;
                skill.isUsed = true;
            }
            else
            {
                // skill.IsUsedController = Skill.IsUsed.False;
                skill.isUsed = false;
            }
            if (card.isUsable(game, player, out _) && //技能是可用的
                !isSelectingTarget &&                 //没有在选择目标
                canControl                            //是自己的回合
                )
            {
                // skill.IsUsableController = Skill.IsUsable.True;
                skill.isUsable = true;
                skill.asButton.interactable = true;
            }
            else
            {
                // skill.IsUsableController = Skill.IsUsable.False;
                skill.isUsable = false;
                skill.asButton.interactable = false;
            }
        }
Ejemplo n.º 6
0
        public void setItem(Item item, TouhouCardEngine.Card card)
        {
            CardSkinData skin = getSkin(card);

            item.Image.sprite = skin.image;

            item.AttackPropNumber.asText.text     = card.getAttack(game).ToString();
            item.DurabilityPropNumber.asText.text = card.getCurrentLife(game).ToString();
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 设置Master的UI
        /// </summary>
        /// <param name="master"></param>
        /// <param name="card"></param>
        /// <param name="isSelectable"></param>
        public void setMaster(Master master, TouhouCardEngine.Card card, bool isSelectable = false)
        {
            CardSkinData skin = getSkin(card);

            master.Image.sprite = skin.image;
            master.LifePropNumber.asText.text = card.getCurrentLife(game).ToString();
            //if (card.getCurrentLife() == card.getLife())
            //    HpText.color = Color.white;
            //else
            //    HpText.color = Color.red;
            if (card.getAttack(game) > 0)
            {
                master.AttackPropNumber.asText.text = card.getAttack(game).ToString();
                master.AttackPropNumber.asText.display();
                master.AttackPropNumber.asText.display();
            }
            else
            {
                master.AttackPropNumber.asText.hide();
                master.AtkImage.hide();
            }
            if (card.getArmor(game) > 0)
            {
                master.ArmorPropNumber.asText.text = card.getArmor(game).ToString();
                master.ArmorPropNumber.display();
                master.ArmorImage.display();
            }
            else
            {
                master.ArmorPropNumber.asText.hide();
                master.ArmorImage.hide();
            }

            if (isSelectable)
            {
                // master.HighlightController = Master.Highlight.Yellow;
                master.onSelectableTrue.beforeAnim.Invoke();
                master.onSelectableTrue.afterAnim.Invoke();
            }
            else
            {
                master.onSelectableFalse.beforeAnim.Invoke();
                master.onSelectableFalse.afterAnim.Invoke();
            }
            if (card.getOwner() == player && game.currentPlayer == player && card.canAttack(game))
            {
                // master.HighlightController = Master.Highlight.Green;
                master.onCanAttackTrue.beforeAnim.Invoke();
                master.onCanAttackTrue.afterAnim.Invoke();
            }
            else
            {
                // master.HighlightController = Master.Highlight.None;
                master.onCanAttackFalse.beforeAnim.Invoke();
                master.onCanAttackFalse.afterAnim.Invoke();
            }
        }
Ejemplo n.º 8
0
        public UIObject getCharacter(TouhouCardEngine.Card card)
        {
            Master master = getMaster(card);

            if (master == null)
            {
                return(getServant(card));
            }
            return(master);
        }
Ejemplo n.º 9
0
 public bool tryGetItem(Card card, out Item item)
 {
     if (player.item == card)
     {
         item = ui.SelfItem;
         return(true);
     }
     else if (game.getOpponent(player).item == card)
     {
         item = ui.EnemyItem;
         return(true);
     }
     item = null;
     return(false);
 }
Ejemplo n.º 10
0
        public void setItem(Item item, Card card)
        {
            if (card == null)
            {
                item.hide();
                return;
            }
            item.display();
            CardSkinData skin = getSkin(card);

            item.Image.sprite = skin.image;

            item.AttackPropNumber.asText.text     = card.getAttack(game).ToString();
            item.DurabilityPropNumber.asText.text = card.getCurrentLife(game).ToString();
        }
Ejemplo n.º 11
0
 public Master getMaster(TouhouCardEngine.Card card)
 {
     if (SelfMaster.card == card)
     {
         return(SelfMaster);
     }
     else if (EnemyMaster.card == card)
     {
         return(EnemyMaster);
     }
     else
     {
         return(null);
     }
 }
Ejemplo n.º 12
0
        public static string replace(string desc, THHGame game, THHPlayer player, TouhouCardEngine.Card card)
        {
            string result = Regex.Replace(desc, @"{(?<obj>\w+):(?<name>.+)}", m =>
            {
                string obj  = m.Groups["obj"].Value;
                string name = m.Groups["name"].Value;
                if (obj == "card")
                {
                    return(card.getProp(game, name).ToString());
                }
                else
                {
                    return("???");
                }
            });

            return(result);
        }
Ejemplo n.º 13
0
 public Servant getServant(TouhouCardEngine.Card card)
 {
     foreach (var item in SelfFieldList)
     {
         if (item.card == card)
         {
             return(item);
         }
     }
     foreach (var item in EnemyFieldList)
     {
         if (item.card == card)
         {
             return(item);
         }
     }
     return(null);
 }
Ejemplo n.º 14
0
 /// <summary>
 /// 尝试获取一张卡对应的Master
 /// </summary>
 /// <param name="card"></param>
 /// <param name="master"></param>
 /// <returns></returns>
 public bool tryGetMaster(Card card, out Master master)
 {
     if (player.master == card)
     {
         master = ui.SelfMaster;
         return(true);
     }
     else if (game.getOpponent(player).master == card)
     {
         master = ui.EnemyMaster;
         return(true);
     }
     else
     {
         master = null;
         return(false);
     }
 }
Ejemplo n.º 15
0
        public void update(TouhouCardEngine.Card card, CardSkinData skin)
        {
            this.card = card;

            CostText.text   = card.getCost().ToString();
            AttackText.text = card.getAttack().ToString();
            LifeText.text   = card.getLife().ToString();

            if (skin != null)
            {
                Image.sprite       = skin.image;
                NameText.text      = skin.name;
                DescText.text      = skin.desc;
                IsFaceupController = IsFaceup.True;
            }
            else
            {
                IsFaceupController = IsFaceup.False;
            }
        }
Ejemplo n.º 16
0
        /// <summary>
        /// 创建一张手牌
        /// </summary>
        /// <param name="card"></param>
        /// <param name="position">默认为-1也就是最右手</param>
        /// <returns></returns>
        public HandListItem createHand(TouhouCardEngine.Card card, int position = -1)
        {
            if (cardHandDic.ContainsKey(card))
            {
                UberDebug.LogErrorChannel("UI", "手牌中已经存在" + card + "对应UI" + cardHandDic[card]);
                return(cardHandDic[card]);
            }
            UberDebug.LogChannel("UI", "创建手牌UI:" + card);
            HandListItem item;

            if (card.getOwner() == player)
            {
                item = ui.SelfHandList.addItem();
                if (position >= 0)
                {
                    ui.SelfHandList.defaultItem.rectTransform.SetAsFirstSibling();
                    item.rectTransform.SetSiblingIndex(position + 1);
                }
                item.isDragable = true;
                setCard(item.Card, card, true);
            }
            else
            {
                item = ui.EnemyHandList.addItem();
                if (position >= 0)
                {
                    ui.EnemyHandList.defaultItem.rectTransform.SetAsFirstSibling();
                    item.rectTransform.SetSiblingIndex(position + 1);
                }
                item.isDragable = false;
                setCard(item.Card, card, false);
            }
            item.gameObject.name = card.ToString();
            item.onDrag.set(onDragHand);
            item.onEndDrag.set(onDragHandEnd);
            cardHandDic.Add(card, item);
            return(item);
        }
Ejemplo n.º 17
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);
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 18
0
 public CardSkinData getSkin(TouhouCardEngine.Card card)
 {
     return(getSkin(card.define));
 }
Ejemplo n.º 19
0
 public void onReleaseHand(HandListItem item, PointerEventData pointer)
 {
     if (item.GetComponentInParent <HandList>() != SelfHandList)//你不能用别人的卡
     {
         return;
     }
     if (!canControl)//不是你的回合,不生效
     {
         resetUse(true, true);
         return;
     }
     usingHand = item;
     if (SelfHandList.rectTransform.rect.Contains(SelfHandList.rectTransform.InverseTransformPoint(pointer.position)))
     {
         //如果松开,取消使用
         resetUse(true, true);
     }
     else
     {
         if (!item.Card.card.isUsable(game, player, out string info))
         {
             //卡牌不可用
             showTip(info);
             resetUse(true, true);
         }
         else if (item.Card.card.define is ServantCardDefine)
         {
             //松开鼠标,确认使用随从牌
             var servants = SelfFieldList.getItems();
             int index    = 0;
             if (servants.Length > 0)
             {
                 //需要选择空位,计算空位
                 for (int i = 0; i < servants.Length; i++)
                 {
                     if (servants[i].rectTransform.position.x < pointer.position.x)
                     {
                         index = i + 1;
                     }
                 }
                 ServantPlaceHolder.rectTransform.SetSiblingIndex(index + 1);
             }
             if (item.Card.card.getAvaliableTargets(game) is TouhouCardEngine.Card[] targets && targets.Length > 0)
             {
                 _usingCard     = item.Card.card;
                 _usingPosition = index;
                 //进入选择目标状态,固定手牌到占位上,高亮可以选择的目标
                 item.Card.hide();
                 //显示占位随从
                 ServantPlaceHolder.Servant.display();
                 ServantPlaceHolder.Servant.update(item.Card.card.define, getSkin(item.Card.card));
                 isSelectingTarget = true;
                 selectableTargets = targets.Select(target =>
                 {
                     if (getMaster(target) is Master master)
                     {
                         return(master as UIObject);
                     }
                     else if (getServant(target) is Servant servant)
                     {
                         return(servant as UIObject);
                     }
                     throw new ActorNotFoundException(target);
                 }).ToArray();
                 SelfHandList.shrink();
             }
             else
             {
                 //使用无目标随从牌
                 player.cmdUse(game, item.Card.card, index);
                 resetUse(false, false);
             }
         }
Ejemplo n.º 20
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);
             }
         }