예제 #1
0
        public override void Use(TrustedAI ai, Player player, ref CardUseStruct use, WrappedCard card)
        {
            int  self_count = 0, enemies = 0;
            Room room = ai.Room;

            foreach (Player p in ai.GetFriends(player))
            {
                if (p.Chained && GDFighttogether.Instance.TargetFilter(room, new List <Player>(), p, player, card))
                {
                    self_count++;
                }
            }

            List <Player> _enemies = ai.GetEnemies(player);
            bool          vine     = false;

            foreach (Player p in room.GetAlivePlayers())
            {
                if (p.HasArmor(Vine.ClassName) && (p.Chained || _enemies.Contains(p)) && !ai.HasSkill("gangzhi", p))
                {
                    vine = true;
                    break;
                }
            }

            foreach (Player p in _enemies)
            {
                if (!p.Chained && GDFighttogether.Instance.TargetFilter(room, new List <Player>(), p, player, card))
                {
                    enemies++;
                    if (RoomLogic.PlayerHasSkill(room, p, "gangzhi"))
                    {
                        enemies++;
                    }
                }
            }

            if (enemies > 0 && vine)
            {
                enemies++;
            }

            use.Card = card;
            if (self_count < enemies && _enemies.Count > 1)
            {
                use.To.Add(ai.GetEnemies(player)[0]);
            }
            else if (self_count > 1)
            {
                use.To.Add(player);
            }

            if (use.To.Count == 0 && !GDFighttogether.Instance.CanRecast(room, player, card))
            {
                use.Card = null;
            }
        }
예제 #2
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 ai.GetEnemies(player))
            {
                if (!p.Chained && RoomLogic.CanBeChainedBy(room, p, player))
                {
                    ScoreStruct score = ai.FindCards2Discard(player, p, string.Empty, "he", HandlingMethod.MethodDiscard);
                    score.Players = new List <Player> {
                        p
                    };
                    scores.Add(score);
                }
            }

            if (scores.Count > 0)
            {
                ai.CompareByScore(ref scores);
                if (scores[0].Score > 0)
                {
                    use.Card = card;
                    use.To   = scores[0].Players;
                }
            }
        }
        public override double CardValue(TrustedAI ai, Player player, bool use, WrappedCard card, Player.Place place)
        {
            double value = ai.AjustWeaponRangeValue(player, card);

            foreach (Player p in ai.GetEnemies(player))
            {
                if (ai.HasSkill(TrustedAI.MasochismSkill, p))
                {
                    value += 1;
                }
            }

            return(value);
        }
        public override double CardValue(TrustedAI ai, Player player, bool use, WrappedCard card, Player.Place place)
        {
            double value = ai.AjustWeaponRangeValue(player, card);

            foreach (Player p in ai.GetEnemies(player))
            {
                if (RoomLogic.HasShownArmorEffect(ai.Room, p) && RoomLogic.DistanceTo(ai.Room, player, p, null, true) <= 2)
                {
                    value += 0.5;
                }
            }

            return(value);
        }
        public override void Use(TrustedAI ai, Player player, ref CardUseStruct use, WrappedCard card)
        {
            List <Player> targets = ai.GetEnemies(player);

            ai.SortByDefense(ref targets, false);
            foreach (Player p in targets)
            {
                if (!p.IsKongcheng())
                {
                    use.Card = card;
                    use.To.Add(p);
                    return;
                }
            }
        }
예제 #6
0
        public override List <Player> OnPlayerChosen(TrustedAI ai, Player player, List <Player> targets, int min, int max)
        {
            List <Player> enemies = ai.GetEnemies(player);

            if (enemies.Count > 0)
            {
                ai.SortByDefense(ref enemies, false);
                foreach (Player p in enemies)
                {
                    if (targets.Contains(p))
                    {
                        return new List <Player> {
                                   p
                        }
                    }
                }
                ;
            }

            return(new List <Player>());
        }
        public override List <Player> OnPlayerChosen(TrustedAI ai, Player player, List <Player> targets, int min, int max)
        {
            Room room = ai.Room;

            if (room.GetTag("extra_target_skill") is CardUseStruct use)
            {
                List <Player> result = new List <Player>();
                if (use.Card.Name == ExNihilo.ClassName)
                {
                    foreach (Player p in targets)
                    {
                        if (ai.IsFriend(p) && !ai.HasSkill("zishu", p))
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                    }
                    ;
                }
                else if (use.Card.Name.Contains(Slash.ClassName))
                {
                    List <ScoreStruct> scores = ai.CaculateSlashIncome(player, new List <WrappedCard> {
                        use.Card
                    }, targets, false);
                    if (scores.Count > 0 && scores[0].Score > 0)
                    {
                        return(scores[0].Players);
                    }
                }
                else if (use.Card.Name == Snatch.ClassName)
                {
                    foreach (Player p in targets)
                    {
                        if (ai.FindCards2Discard(player, p, use.Card.Name, "hej", HandlingMethod.MethodGet).Score > 0)
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                        ;
                    }
                }
                else if (use.Card.Name == Dismantlement.ClassName)
                {
                    foreach (Player p in targets)
                    {
                        if (ai.FindCards2Discard(player, p, use.Card.Name, "hej", HandlingMethod.MethodDiscard).Score > 0)
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                        ;
                    }
                }
                else if (use.Card.Name == IronChain.ClassName)
                {
                    foreach (Player p in targets)
                    {
                        if (ai.IsFriend(p) && !ai.HasSkill("jieying", p) && p.Chained)
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                        ;
                    }
                    foreach (Player p in targets)
                    {
                        if (ai.IsEnemy(p) && !p.Chained)
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                        ;
                    }
                }
                else if (use.Card.Name == FireAttack.ClassName)
                {
                    foreach (Player p in targets)
                    {
                        if (ai.IsEnemy(p))
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                        ;
                    }
                }
                else if (use.Card.Name == Duel.ClassName)
                {
                    WrappedCard   duel    = use.Card;
                    List <Player> enemies = ai.Exclude(ai.GetEnemies(player), duel);
                    List <Player> friends = ai.Exclude(ai.FriendNoSelf, duel);
                    int           n1      = ai.GetKnownCardsNums(Slash.ClassName, "he", player);

                    if (ai.HasSkill("wushuang"))
                    {
                        n1 *= 2;
                    }
                    List <ScoreStruct> scores = new List <ScoreStruct>();
                    foreach (Player p in friends)
                    {
                        if (!targets.Contains(p))
                        {
                            continue;
                        }
                        bool fuyin = false;
                        if (ai.HasSkill("fuyin", p) && p.GetMark("fuyin") == 0)
                        {
                            int count = player.HandcardNum;
                            if (count > p.HandcardNum)
                            {
                                fuyin = true;
                            }
                        }
                        if (!fuyin)
                        {
                            ScoreStruct score = ai.GetDamageScore(new DamageStruct(duel, player, p));
                            score.Players = new List <Player> {
                                p
                            };
                            foreach (string skill in ai.GetKnownSkills(p))
                            {
                                SkillEvent skill_e = Engine.GetSkillEvent(skill);
                                if (skill_e != null)
                                {
                                    score.Score += skill_e.TargetValueAdjust(ai, duel, player, new List <Player> {
                                        p
                                    }, p);
                                }
                            }
                            scores.Add(score);
                        }
                    }
                    foreach (Player p in enemies)
                    {
                        if (!targets.Contains(p))
                        {
                            continue;
                        }
                        bool fuyin = false;
                        if (ai.HasSkill("fuyin", p) && p.GetMark("fuyin") == 0)
                        {
                            int count = player.HandcardNum;
                            foreach (int id in duel.SubCards)
                            {
                                if (room.GetCardPlace(id) == Place.PlaceHand)
                                {
                                    count--;
                                }
                            }

                            if (count > p.HandcardNum)
                            {
                                ScoreStruct score = new ScoreStruct
                                {
                                    Score   = 1,
                                    Players = new List <Player> {
                                        p
                                    }
                                };
                                scores.Add(score);
                                fuyin = true;
                            }
                        }

                        if (!fuyin)
                        {
                            bool   no_red   = p.GetMark("@qianxi_red") > 0;
                            bool   no_black = p.GetMark("@qianxi_black") > 0;
                            double n2       = ai.GetKnownCardsNums(Slash.ClassName, "he", p, player);

                            bool fuqi = false;
                            if (player.ContainsTag("wenji") && player.GetTag("wenji") is List <string> names && names.Contains(Name))
                            {
                                fuqi = true;
                            }
                            if (ai.HasSkill("fuqi", player) && RoomLogic.DistanceTo(room, player, p) == 1)
                            {
                                fuqi = true;
                            }

                            if (!fuqi && !ai.IsLackCard(p, Slash.ClassName))
                            {
                                int rate = 4;
                                if (ai.GetKnownCards(p).Count != p.HandcardNum)
                                {
                                    rate = 5;
                                    if (ai.HasSkill("longdan", p))
                                    {
                                        rate -= 2;
                                        if (no_black || no_red)
                                        {
                                            rate += 1;
                                        }
                                    }
                                    if (ai.HasSkill("wusheng", p) && !no_red)
                                    {
                                        rate -= 2;
                                    }
                                    int count = p.HandcardNum - ai.GetKnownCards(p).Count;
                                    count += p.GetHandPile(true).Count - ai.GetKnownHandPileCards(p).Count;
                                    if (no_red)
                                    {
                                        rate += 1;
                                    }
                                    if (no_black)
                                    {
                                        rate += 2;
                                    }
                                    n2 += ((double)count / rate);
                                }
                                if (ai.HasSkill("wushuang", p))
                                {
                                    n2 *= 2;
                                }
                            }
                            ScoreStruct score = new ScoreStruct
                            {
                                Players = new List <Player> {
                                    p
                                }
                            };
                            if (fuqi)
                            {
                                score.Score = ai.GetDamageScore(new DamageStruct(duel, player, p)).Score;
                            }
                            else if (n2 > n1)
                            {
                                score.Score = ai.GetDamageScore(new DamageStruct(duel, p, player)).Score;
                            }
                            else
                            {
                                score.Score = ai.GetDamageScore(new DamageStruct(duel, p, player)).Score - (n2 - 1) * 0.4;
                            }

                            foreach (string skill in ai.GetKnownSkills(p))
                            {
                                SkillEvent skill_e = Engine.GetSkillEvent(skill);
                                if (skill_e != null)
                                {
                                    score.Score += skill_e.TargetValueAdjust(ai, duel, player, new List <Player> {
                                        p
                                    }, p);
                                }
                            }
                            scores.Add(score);
                        }
                    }
                    if (scores.Count > 0)
                    {
                        scores.Sort((x, y) => { return(x.Score > y.Score ? -1 : 1); });
                        if (scores[0].Score > 1)
                        {
                            return(scores[0].Players);
                        }
                    }
                }
            }
            return(new List <Player>());
        }
        public override CardUseStruct OnResponding(TrustedAI ai, Player player, string pattern, string prompt, object data)
        {
            Room room = ai.Room;

            string[] strs = prompt.Split(':');

            CardUseStruct use    = new CardUseStruct(null, player, new List <Player>());
            Player        target = room.FindPlayer(strs[1]);

            if (target != null)
            {
                use.To.Add(target);

                List <ScoreStruct> values = ai.CaculateSlashIncome(player, null, new List <Player> {
                    target
                });
                if (values.Count > 0 && values[0].Score > 0)
                {
                    bool will_slash = false;
                    if (values[0].Score >= 10)
                    {
                        will_slash = true;
                    }
                    else if (ai.GetEnemies(player).Count == 1 && ai.GetOverflow(player) > 0)
                    {
                        foreach (int id in values[0].Card.SubCards)
                        {
                            if (room.GetCardPlace(id) == Player.Place.PlaceHand)
                            {
                                will_slash = true;
                                break;
                            }
                        }
                    }
                    else
                    {
                        foreach (Player p in values[0].Players)
                        {
                            if (ai.GetPrioEnemies().Contains(p))
                            {
                                will_slash = true;
                                break;
                            }
                        }
                    }

                    //todo: adjust ai personality
                    if (!will_slash && ai.GetOverflow(player) > 0)
                    {
                        foreach (int id in values[0].Card.SubCards)
                        {
                            if (room.GetCardPlace(id) == Player.Place.PlaceHand)
                            {
                                will_slash = true;
                                break;
                            }
                        }
                    }

                    if (will_slash)
                    {
                        use.Card = values[0].Card;
                    }
                }
            }
            return(use);
        }
예제 #9
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);
        }
예제 #10
0
        public override void Use(TrustedAI ai, Player player, ref CardUseStruct use, WrappedCard card)
        {
            ai.Choice["shangyi"] = null;
            Room room = ai.Room;

            foreach (Player p in room.GetOtherPlayers(player))
            {
                if (ai.GetPlayerTendency(p) == "unknown")
                {
                    ai.Choice["shangyi"] = "hidden_general";
                    use.Card             = card;
                    use.To = new List <Player> {
                        p
                    };
                    return;
                }
            }

            List <Player> enemies = ai.GetPrioEnemies();

            ai.SortByDefense(ref enemies, false);
            foreach (Player p in enemies)
            {
                if (p.HandcardNum - ai.GetKnownCards(p).Count > 2)
                {
                    ai.Choice[Name] = "handcards";
                    use.Card        = card;
                    use.To          = new List <Player> {
                        p
                    };
                    return;
                }
            }

            enemies = ai.GetEnemies(player);
            ai.SortByDefense(ref enemies, false);
            foreach (Player p in enemies)
            {
                if (p.HandcardNum - ai.GetKnownCards(p).Count > 2)
                {
                    ai.Choice["shangyi"] = "handcards";
                    use.Card             = card;
                    use.To = new List <Player> {
                        p
                    };
                    return;
                }
            }
            foreach (Player p in enemies)
            {
                if (p.HandcardNum > ai.GetKnownCards(p).Count)
                {
                    ai.Choice["shangyi"] = "handcards";
                    use.Card             = card;
                    use.To = new List <Player> {
                        p
                    };
                    return;
                }
            }
        }