Ejemplo n.º 1
0
        public virtual void OnCardAnnounce(Room room, CardUseStruct use, bool ignore_rule)
        {
            use.Card = RoomLogic.ParseUseCard(room, use.Card).GetUsedCard();
            room.ShowSkill(use.From, use.Card.ShowSkill, use.Card.SkillPosition);

            if (!ignore_rule)
            {
                CheckTargetModSkillShow(room, use);
            }

            WrappedCard use_card = use.Card;

            //将卡牌转化为延时锦囊就相当于改写了该牌的牌名,必须对其重写以保证此延时锦囊将来可以正确生效
            if (Engine.GetFunctionCard(use_card.Name) is DelayedTrick && use_card.IsVirtualCard() && use_card.SubCards.Count == 1)
            {
                RoomCard wrapped = room.GetCard(use_card.GetEffectiveId());
                use_card.Id = wrapped.Id;
                wrapped.TakeOver(use_card);
                use.Card = wrapped.GetUsedCard();
            }

            //record big or small for fighttogether
            if (Engine.GetFunctionCard(use_card.Name) is FightTogether && use.To.Count > 0)
            {
                List <string> big_kingdoms = RoomLogic.GetBigKingdoms(room);
                if (big_kingdoms.Count > 0)
                {
                    string target_kingdom = (use.To[0].HasShownOneGeneral() ?
                                             (use.To[0].GetRoleEnum() == PlayerRole.Careerist ? use.To[0].Name : use.To[0].Kingdom) : string.Empty);
                    bool big = big_kingdoms.Contains(target_kingdom);
                    if (big)
                    {
                        use.Pattern = "big";
                    }
                    else
                    {
                        use.Pattern = "small";
                    }
                }
                else
                {
                    use.Pattern = "unknown";
                }
            }

            OnUse(room, use);
        }
Ejemplo n.º 2
0
        public override double CardValue(TrustedAI ai, Player player, WrappedCard card, bool isUse, Player.Place place)
        {
            if (card != null && !card.IsVirtualCard() && ai.HasSkill(Name, player) && card.Name.Contains(Slash.ClassName))
            {
                double value = 2;

                if (WrappedCard.IsRed(card.Suit))
                {
                    value += 1;
                }
                if (card.Name != Slash.ClassName)
                {
                    value += 1.5;
                }
                return(value);
            }
            return(0);
        }
        public override double CardValue(TrustedAI ai, Player player, WrappedCard card, bool isUse, Player.Place place)
        {
            if (!isUse && place == Player.Place.PlaceEquip)
            {
                return(4);
            }

            if (isUse && card.IsVirtualCard())
            {
                foreach (int id in card.SubCards)
                {
                    if (ai.Room.GetCardPlace(id) == Player.Place.PlaceEquip)
                    {
                        return(-3);
                    }
                }
            }

            return(0);
        }
Ejemplo n.º 4
0
        // '|' means 'and', '#' means 'or'.
        // the expression splited by '|' has 3 parts,
        // 1st part means the card name, and ',' means more than one options.
        // 2nd patt means the card suit, and ',' means more than one options.
        // 3rd part means the card number, and ',' means more than one options,
        // the number uses '~' to make a scale for valid expressions
        #endregion

        private bool MatchOne(Player player, Room room, WrappedCard card, string exp)
        {
            if (card == null && exp != ".")
            {
                return(false);
            }
            string[] factors = exp.Split('|');

            bool checkpoint = false;

            string[] card_types = factors[0].Split(',');
            foreach (string or_name in card_types)
            {
                checkpoint = false;
                foreach (string _name in or_name.Split('+'))
                {
                    string name = _name;
                    if (name == ".")
                    {
                        checkpoint = true;
                    }
                    else
                    {
                        bool positive = true;
                        if (name.StartsWith("^"))
                        {
                            positive = false;
                            name     = name.Substring(1);
                        }
                        //国战鏖战模式对桃特殊判断

                        bool name_match = false;
                        if (room.BloodBattle && card.Name == Peach.ClassName && !card.IsVirtualCard())
                        {
                            if (positive && (name == Slash.ClassName || name == "%Slash" || name == Jink.ClassName || name == "%Jink"))
                            {
                                name_match = true;
                            }
                            else if (positive && (name == Peach.ClassName || name == "%Peach"))
                            {
                                name_match = false;
                            }
                            else
                            {
                                name_match = Engine.GetFunctionCard(card.Name)?.IsKindOf(name) == true || ("%" + card.Name == name);
                            }
                        }
                        else
                        {
                            name_match = Engine.GetFunctionCard(card.Name)?.IsKindOf(name) == true || ("%" + card.Name == name);
                        }

                        if (name_match || (int.TryParse(name, out int id) && card.GetEffectiveId() == id))
                        {
                            checkpoint = positive;
                        }
                        else
                        {
                            checkpoint = !positive;
                        }
                    }
                    if (!checkpoint)
                    {
                        break;
                    }
                }
                if (checkpoint)
                {
                    break;
                }
            }
            if (!checkpoint)
            {
                return(false);
            }
            if (factors.Length < 2)
            {
                return(true);
            }

            checkpoint = false;
            string[] card_suits = factors[1].Split(',');
            foreach (string _suit in card_suits)
            {
                string suit = _suit;
                if (suit == ".")
                {
                    checkpoint = true;
                    break;
                }
                bool positive = true;
                if (suit.StartsWith("^"))
                {
                    positive = false;
                    suit     = suit.Substring(1);
                }
                checkpoint = WrappedCard.GetSuitString(RoomLogic.GetCardSuit(room, card)) == suit ||
                             (WrappedCard.IsBlack(RoomLogic.GetCardSuit(room, card)) && suit == "black") ||
                             (WrappedCard.IsRed(RoomLogic.GetCardSuit(room, card)) && suit == "red")
                    ? positive
                    : !positive;
                if (checkpoint)
                {
                    break;
                }
            }
            if (!checkpoint)
            {
                return(false);
            }
            if (factors.Length < 3)
            {
                return(true);
            }

            checkpoint = false;
            string[] card_numbers = factors[2].Split(',');
            int      cdn          = RoomLogic.GetCardNumber(room, card);

            foreach (string number in card_numbers)
            {
                if (number == ".")
                {
                    checkpoint = true;
                    break;
                }

                if (number.Contains('~'))
                {
                    string[] num_params = number.Split('~');
                    int      from, to;
                    if (num_params[0].Length == 0)
                    {
                        from = 1;
                    }
                    else
                    {
                        from = int.Parse(num_params[0]);
                    }
                    if (num_params.Length == 1 && num_params[1].Length == 0)
                    {
                        to = 13;
                    }
                    else
                    {
                        to = int.Parse(num_params[1]);
                    }

                    if (from <= cdn && cdn <= to)
                    {
                        checkpoint = true;
                    }
                }
                else if (int.TryParse(number, out int id) && id == cdn)
                {
                    checkpoint = true;
                }
                else if ((number == "A" && cdn == 1) ||
                         (number == "J" && cdn == 11) ||
                         (number == "Q" && cdn == 12) ||
                         (number == "K" && cdn == 13))
                {
                    checkpoint = true;
                }
                if (checkpoint)
                {
                    break;
                }
            }
            if (!checkpoint)
            {
                return(false);
            }
            if (factors.Length < 4)
            {
                return(true);
            }

            checkpoint = false;
            string place = factors[3];

            if (player == null || place == ".")
            {
                checkpoint = true;
            }
            if (!checkpoint)
            {
                List <int> ids = new List <int>(card.SubCards);
                if (ids.Count > 0)
                {
                    foreach (int id in ids)
                    {
                        checkpoint = false;
                        WrappedCard sub_card = room.GetCard(id);
                        foreach (string _p in place.Split(','))
                        {
                            string p = _p;
                            if (p == "equipped" && player.HasEquip(sub_card.Name))
                            {
                                checkpoint = true;
                            }
                            else if (p == "hand" && sub_card.Id >= 0)
                            {
                                foreach (int h_id in player.GetCards("h"))
                                {
                                    if (h_id == id)
                                    {
                                        checkpoint = true;
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                if (p.Contains('$'))
                                {
                                    p = p.Replace('$', '#');
                                }
                                if (p.StartsWith("%"))
                                {
                                    p = p.Substring(1);
                                    foreach (Player pl in room.GetAlivePlayers())
                                    {
                                        if (pl.GetPile(p).Count > 0 && pl.GetPile(p).Contains(id))
                                        {
                                            checkpoint = true;
                                            break;
                                        }
                                    }
                                }
                                else if (player.GetPile(p).Count > 0 && player.GetPile(p).Contains(id))
                                {
                                    checkpoint = true;
                                }
                            }
                            if (checkpoint)
                            {
                                break;
                            }
                        }
                        if (!checkpoint)
                        {
                            break;
                        }
                    }
                }
            }
            return(checkpoint);
        }