Esempio n. 1
0
        public override List <WrappedCard> GetViewAsCards(TrustedAI ai, string pattern, Player player)
        {
            Room               room    = ai.Room;
            Player             jiaozhu = ai.FindPlayerBySkill("hongfa");
            List <WrappedCard> result  = new List <WrappedCard>();

            if (jiaozhu != null && RoomLogic.WillBeFriendWith(room, player, jiaozhu) && pattern == Slash.ClassName)
            {
                foreach (int id in jiaozhu.GetPile("heavenly_army"))
                {
                    WrappedCard hongfa = new WrappedCard("HongfaCard")
                    {
                        Skill = "hongfa"
                    };
                    hongfa.AddSubCard(id);

                    WrappedCard slash = new WrappedCard(Slash.ClassName)
                    {
                        Skill = "hongfa"
                    };
                    slash.AddSubCard(id);
                    slash            = RoomLogic.ParseUseCard(room, slash);
                    slash.UserString = RoomLogic.CardToString(room, hongfa);
                    result.Add(slash);
                }
            }

            return(result);
        }
Esempio n. 2
0
        public override bool OnSkillInvoke(TrustedAI ai, Player player, object data)
        {
            Room room = ai.Room;

            if (ai.WillSkipPlayPhase(player))
            {
                int count = 0;
                foreach (Player p in room.GetOtherPlayers(player))
                {
                    if (!p.IsAllNude() && RoomLogic.CanGetCard(room, player, p, "hej"))
                    {
                        count++;
                    }
                }

                Player erzhang = ai.FindPlayerBySkill("guzheng");
                if (erzhang != null && !ai.IsFriend(erzhang) && player.HandcardNum + count > player.MaxHp + 2)
                {
                    return(false);
                }
            }

            double value = 0;

            foreach (Player p in room.GetOtherPlayers(player))
            {
                if (!p.IsAllNude() && RoomLogic.CanGetCard(room, player, p, "hej"))
                {
                    value += ai.FindCards2Discard(player, p, string.Empty, "he", HandlingMethod.MethodGet).Score;
                }
            }

            return(value > 4);
        }
Esempio n. 3
0
        public override double CardValue(TrustedAI ai, Player player, WrappedCard card, bool isUse, Player.Place place)
        {
            if (ai.HasSkill(Name) && ai.IsSituationClear())
            {
                FunctionCard fcard = Engine.GetFunctionCard(card.Name);
                if (fcard is DefensiveHorse || fcard is SpecialEquip)
                {
                    return(-2);
                }
            }

            if (!isUse && ai.IsCard(card.GetEffectiveId(), Slash.ClassName, player))
            {
                Player jiangwei = ai.FindPlayerBySkill(Name);
                if (jiangwei != null && !ai.IsFriend(jiangwei, player) && RoomLogic.CanSlash(ai.Room, player, jiangwei))
                {
                    return(2);
                }
            }

            return(0);
        }
Esempio n. 4
0
        public static List <Player> FindTuxiTargets(TrustedAI ai, Player player, int max)
        {
            List <Player> result  = new List <Player>();
            List <Player> enemies = ai.GetEnemies(player);

            ai.SortByHandcards(ref enemies, false);
            Room   room       = ai.Room;
            Player zhugeliang = ai.FindPlayerBySkill("kongcheng");

            if (zhugeliang != null && ai.IsFriend(zhugeliang) && zhugeliang.HandcardNum == 1 && ai.GetEnemisBySeat(zhugeliang) > 0 && zhugeliang != player)
            {
                if (ai.IsWeak(zhugeliang))
                {
                    result.Add(zhugeliang);
                }
                else
                {
                    List <int> ids = ai.GetKnownCards(zhugeliang);
                    if (ids.Count == 1)
                    {
                        int id = ids[0];
                        if (!ai.IsCard(id, Jink.ClassName, zhugeliang) && !!ai.IsCard(id, Peach.ClassName, zhugeliang) && !ai.IsCard(id, Analeptic.ClassName, zhugeliang))
                        {
                            result.Add(zhugeliang);
                        }
                    }
                }
            }

            foreach (Player p in enemies)
            {
                if (result.Contains(p) || !RoomLogic.CanGetCard(room, player, p, "h"))
                {
                    continue;
                }
                List <int> ids = ai.GetKnownCards(p);
                foreach (int id in ids)
                {
                    WrappedCard card = room.GetCard(id);
                    if (card.Name == Peach.ClassName || card.Name == Nullification.ClassName || card.Name.Contains(Nullification.ClassName))
                    {
                        result.Add(p);
                        break;
                    }
                }
                if (result.Count >= max)
                {
                    break;
                }
            }

            if (result.Count < max)
            {
                foreach (Player p in enemies)
                {
                    if (result.Contains(p) || !RoomLogic.CanGetCard(room, player, p, "h"))
                    {
                        continue;
                    }
                    if (ai.HasSkill("jijiu|qingnang|leiji|jieyin|beige|kanpo|liuli|qiaobian|zhiheng|guidao|tianxiang|lijian", p))
                    {
                        result.Add(p);
                    }

                    if (result.Count >= max)
                    {
                        break;
                    }
                }
            }
            if (result.Count < max)
            {
                foreach (Player p in enemies)
                {
                    if (result.Contains(p) || !RoomLogic.CanGetCard(room, player, p, "h"))
                    {
                        continue;
                    }
                    int  x    = p.HandcardNum;
                    bool good = true;
                    if (x == 1 && ai.NeedKongcheng(p))
                    {
                        good = false;
                    }
                    if (x >= 2 && ai.HasSkill("tuntian", p))
                    {
                        good = false;
                    }

                    if (good)
                    {
                        result.Add(p);
                    }

                    if (result.Count >= max)
                    {
                        break;
                    }
                }
            }

            return(result);
        }
Esempio n. 5
0
        public override CardUseStruct OnResponding(TrustedAI ai, Player player, string pattern, string prompt, object data)
        {
            CardUseStruct result = new CardUseStruct
            {
                From = player,
                To   = new List <Player>()
            };
            Room room = ai.Room;
            int  sub  = -1;

            foreach (int id in player.GetPile("sorcery"))
            {
                WrappedCard card = room.GetCard(id);
                if (card.Suit == WrappedCard.CardSuit.Club || card.Suit == WrappedCard.CardSuit.Spade)
                {
                    sub = id;
                    break;
                }
            }
            if (sub == -1)
            {
                sub = player.GetPile("sorcery")[0];
            }
            WrappedCard qianhuan = new WrappedCard("QianhuanCard")
            {
                Mute  = true,
                Skill = Name
            };

            qianhuan.AddSubCard(sub);

            if (room.ContainsTag("qianhuan_data") && room.GetTag("qianhuan_data") is CardUseStruct use)
            {
                if (ai.IsCancelTarget(use.Card, use.To[0], use.From) || !ai.IsCardEffect(use.Card, use.To[0], use.From))
                {
                    return(result);
                }

                if (use.Card.Name == SupplyShortage.ClassName || use.Card.Name == Indulgence.ClassName || use.Card.Name == Snatch.ClassName)
                {
                    if (use.From != null && ai.IsEnemy(use.From))
                    {
                        result.Card = qianhuan;
                        return(result);
                    }
                }
                else if (use.Card.Name == BurningCamps.ClassName)
                {
                    DamageStruct damage = new DamageStruct(use.Card, use.From, use.To[0], 1, DamageStruct.DamageNature.Fire);
                    if (player.GetPile("sorcery").Count >= 3 && ai.GetDamageScore(damage).Score < 0 || ai.GetDamageScore(damage).Score < -5)
                    {
                        result.Card = qianhuan;
                        return(result);
                    }
                }
                else if (use.Card.Name.Contains(Slash.ClassName))
                {
                    DamageStruct damage = new DamageStruct(use.Card, use.From, use.To[0], 1 + use.Drank);
                    if (use.Card.Name == FireSlash.ClassName)
                    {
                        damage.Nature = DamageStruct.DamageNature.Fire;
                    }
                    else if (use.Card.Name == ThunderSlash.ClassName)
                    {
                        damage.Nature = DamageStruct.DamageNature.Thunder;
                    }
                    double value = ai.GetDamageScore(damage).Score;
                    if (value < -5 || (ai.IsWeak(use.To[0]) && value < 0) || (value < 0 && player.GetPile("sorcery").Count >= 3))
                    {
                        result.Card = qianhuan;
                        return(result);
                    }
                }
                else if (use.Card.Name == ArcheryAttack.ClassName)
                {
                    DamageStruct damage = new DamageStruct(use.Card, use.From, use.To[0]);
                    double       value  = ai.GetDamageScore(damage).Score;
                    if ((value < -5 || (ai.IsWeak(use.To[0]) && value < 0)) && player != use.To[0] ? ai.IsLackCard(use.To[0], Jink.ClassName) : ai.GetKnownCardsNums(Jink.ClassName, "he", use.To[0]) == 0)
                    {
                        result.Card = qianhuan;
                        return(result);
                    }
                }
                else if (use.Card.Name == SavageAssault.ClassName)
                {
                    Player       menghuo = ai.FindPlayerBySkill("huoshou");
                    DamageStruct damage  = new DamageStruct(use.Card, menghuo ?? use.From, use.To[0]);
                    double       value   = ai.GetDamageScore(damage).Score;
                    if ((value < -5 || (ai.IsWeak(use.To[0]) && value < 0)) && (player != use.To[0] ? ai.IsLackCard(use.To[0], Slash.ClassName)
                        : ai.GetKnownCardsNums(Slash.ClassName, "he", use.To[0]) == 0 || RoomLogic.IsHandCardLimited(room, use.To[0], HandlingMethod.MethodResponse)))
                    {
                        result.Card = qianhuan;
                        return(result);
                    }
                }
                else if (use.Card.Name == Duel.ClassName)
                {
                    DamageStruct damage = new DamageStruct(use.Card, use.From, use.To[0]);
                    double       value  = ai.GetDamageScore(damage).Score;
                    if (value < -5 || ((ai.IsWeak(use.To[0]) || player.GetPile("sorcery").Count >= 3) && value < 0))
                    {
                        result.Card = qianhuan;
                        return(result);
                    }
                }
            }

            return(result);
        }
Esempio n. 6
0
        public override void Use(TrustedAI ai, Player player, ref CardUseStruct use, WrappedCard card)
        {
            Room room = ai.Room;
            List <ScoreStruct> scores = new List <ScoreStruct>();

            foreach (Player p in room.GetOtherPlayers(player))
            {
                if (!RoomLogic.InMyAttackRange(room, p, player) || p.IsNude())
                {
                    continue;
                }
                ScoreStruct score = ai.FindCards2Discard(player, p, "he", HandlingMethod.MethodDiscard);
                score.Players = new List <Player> {
                    p
                };
                if (ai.IsEnemy(p))
                {
                    if (p.HandcardNum + p.GetPile("wooden_ox").Count < 3 || ai.IsLackCard(p, Slash.ClassName))
                    {
                        score.Score += 3;
                    }
                    else
                    {
                        bool armor_ignore = false;
                        if (p.HasWeapon(QinggangSword.ClassName) || ai.HasSkill("jianchu", p))
                        {
                            armor_ignore = true;
                        }
                        else if (ai.HasSkill("paoxiao|paoxiao_fz", p))
                        {
                            Player lord = ai.FindPlayerBySkill("shouyue");
                            if (lord != null && RoomLogic.PlayerHasShownSkill(room, lord, "shouyue") && RoomLogic.WillBeFriendWith(room, p, lord))
                            {
                                armor_ignore = true;
                            }
                        }

                        if (!armor_ignore && ai.HasArmorEffect(player, RenwangShield.ClassName))
                        {
                            score.Score += 0.5;
                        }
                        if (!armor_ignore && ai.HasArmorEffect(player, EightDiagram.ClassName))
                        {
                            score.Score += 0.5;
                        }
                        if (ai.HasSkill("wushang", p))
                        {
                            score.Score -= 0.5;
                        }
                        if (p.HasWeapon(DragonPhoenix.ClassName))
                        {
                            score.Score -= 0.5;
                        }
                        if (ai.HasSkill("jianchu", p))
                        {
                            score.Score = -0.5;
                        }
                        if (ai.HasSkill("tieqi|tieqi_fz", p))
                        {
                            score.Score = 1;
                        }
                        if (ai.GetKnownCardsNums(Jink.ClassName, "he", player) == 0)
                        {
                            score.Score -= 2;
                        }
                    }
                }
                scores.Add(score);
            }

            if (scores.Count > 0)
            {
                ai.CompareByScore(ref scores);
                if (scores[0].Score > 2)
                {
                    use.Card = card;
                    use.To   = new List <Player>(scores[0].Players);
                }
            }
        }