public override bool Ingnore(Room room, Player player, int card_id)
        {
            Player lord = RoomLogic.FindPlayerBySkillName(room, Name);

            if (lord != null && player.Camp == lord.Camp && WrappedCard.IsBlack(room.GetCard(card_id).Suit))
            {
                return(true);
            }
            return(false);
        }
Example #2
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);
        }