public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            room.SendCompulsoryTriggerLog(player, Name, true);
            room.BroadcastSkillInvoke(Name, player, info.SkillPosition);
            List <Player> targets = room.GetOtherPlayers(player);

            room.SortByActionOrder(ref targets);
            foreach (Player p in targets)
            {
                if (p.Alive && player.Alive && !p.IsAllNude() && RoomLogic.CanGetCard(room, player, p, "hej"))
                {
                    room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, player.Name, p.Name);
                    int        id  = room.AskForCardChosen(player, p, "hej", Name, false, HandlingMethod.MethodGet);
                    List <int> ids = new List <int> {
                        id
                    };
                    room.ObtainCard(player, ref ids, new CardMoveReason(MoveReason.S_REASON_EXTRACTION, player.Name, p.Name, Name, string.Empty), false);
                }
            }

            if (player.Alive)
            {
                room.LoseHp(player);
            }

            return(false);
        }
Beispiel #2
0
        public override TriggerStruct Triggerable(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who)
        {
            if (triggerEvent == TriggerEvent.TargetChosen && data is CardUseStruct use)
            {
                FunctionCard fcard = use.Card != null?Engine.GetFunctionCard(use.Card.Name) : null;

                if (base.Triggerable(player, room) && use.Card != null && fcard is Slash)
                {
                    List <Player> targets = new List <Player>();
                    foreach (Player to in use.To)
                    {
                        if (RoomLogic.CanDiscard(room, to, to, "he"))
                        {
                            targets.Add(to);
                        }
                    }
                    if (targets.Count > 0)
                    {
                        return(new TriggerStruct(Name, player, targets));
                    }
                }
            }
            else if (triggerEvent == TriggerEvent.Dying && data is DyingStruct dying && dying.Damage.Card != null && dying.Damage.Card.Name.Contains(Slash.ClassName) &&
                     !dying.Damage.Transfer && !dying.Damage.Chain &&
                     dying.Damage.From != null && dying.Damage.From.Alive && base.Triggerable(dying.Damage.From, room) && !player.IsKongcheng())
            {
                if (RoomLogic.CanGetCard(room, dying.Damage.From, player, "h"))
                {
                    return(new TriggerStruct(Name, dying.Damage.From));
                }
            }

            return(new TriggerStruct());
        }
Beispiel #3
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);
        }
Beispiel #4
0
        public override void Use(Room room, CardUseStruct card_use)
        {
            Player player = card_use.From;
            Player target = card_use.To[0];

            if (target.Alive && !target.IsKongcheng() && RoomLogic.CanGetCard(room, player, target, "h"))
            {
                target.SetFlags("daoshu_target");
                string suit = room.AskForChoice(player, "daoshu", string.Join("+", suits));
                target.SetFlags("-daoshu_target");

                int id = room.AskForCardChosen(player, target, "h", "daoshu", false, HandlingMethod.MethodGet);
                room.ObtainCard(player, id);

                if (WrappedCard.GetSuitString(room.GetCard(id).Suit) == suit)
                {
                    room.Damage(new DamageStruct("daoshu", player, target));
                }
                else
                {
                    suit = WrappedCard.GetSuitString(room.GetCard(id).Suit);
                    player.SetFlags("daoshu");
                    List <int>     ids    = new List <int>();
                    CardMoveReason reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_GIVE, player.Name, target.Name, "daoshu", string.Empty);
                    foreach (int card_id in player.GetCards("h"))
                    {
                        if (WrappedCard.GetSuitString(room.GetCard(card_id).Suit) != suit)
                        {
                            ids.Add(card_id);
                        }
                    }

                    if (ids.Count == 0)
                    {
                        room.ShowAllCards(player, null, "daoshu");
                    }
                    else if (ids.Count == 1)
                    {
                        room.ObtainCard(target, ref ids, reason, true);
                    }
                    else
                    {
                        List <int> to_give = room.AskForExchange(player, "daoshu", 1, 1, "@daoshu-give:" + target.Name, string.Empty, string.Format(".|^{0}|.|hand", suit), card_use.Card.SkillPosition);
                        if (to_give.Count == 1)
                        {
                            room.ObtainCard(target, ref to_give, reason, true);
                        }
                        else
                        {
                            List <int> give = new List <int> {
                                ids[0]
                            };
                            room.ObtainCard(target, ref give, reason, true);
                        }
                    }
                }
            }
        }
 public override TriggerStruct Triggerable(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who)
 {
     if (base.Triggerable(player, room) && data is DamageStruct damage && damage.To.Alive && damage.To != player && !damage.To.IsAllNude() &&
         RoomLogic.CanGetCard(room, player, damage.To, "hej"))
     {
         return(new TriggerStruct(Name, player));
     }
     return(new TriggerStruct());
 }
Beispiel #6
0
        public override ScoreStruct GetDamageScore(TrustedAI ai, DamageStruct damage)
        {
            ScoreStruct score = new ScoreStruct
            {
                Score = 0
            };

            if (ai.HasSkill(Name, damage.To) && damage.Damage <= damage.To.Hp)
            {
                double value = 0;
                if (!damage.To.FaceUp && damage.Damage == 1)
                {
                    value += 4;
                }
                Room room = ai.Room;
                foreach (Player p in room.GetOtherPlayers(damage.To))
                {
                    if (RoomLogic.CanGetCard(room, damage.To, p, "hej"))
                    {
                        value += 0.3;
                        if (ai.IsEnemy(damage.To, p))
                        {
                            if (!p.IsNude())
                            {
                                value += 0.5;
                            }
                            else
                            {
                                value -= 1;
                            }
                        }
                    }
                }
                if (damage.Damage > 1)
                {
                    value *= (0.6 * (damage.Damage - 1)) + 1;
                }
                if (value > 0 && damage.Damage >= damage.To.Hp)
                {
                    value /= 2;
                }

                if (!ai.IsFriend(damage.To))
                {
                    value = -value;
                }

                score.Score = value;
            }

            return(score);
        }
Beispiel #7
0
        public override TriggerStruct Triggerable(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who)
        {
            if (triggerEvent == TriggerEvent.Damage && data is DamageStruct damage && damage.To.Alive && !damage.To.IsNude() && base.Triggerable(player, room) &&
                player.ContainsTag(Name) && player.GetTag(Name) is List <int> ids && RoomLogic.CanGetCard(room, player, damage.To, "he") && damage.Card.SubCards.Count == 1 &&
                ids.Contains(damage.Card.SubCards[0]))
            {
                FunctionCard fcard = Engine.GetFunctionCard(damage.Card.Name);
                if (!(fcard is SkillCard))
                {
                    return(new TriggerStruct(Name, player));
                }
            }

            return(new TriggerStruct());
        }
Beispiel #8
0
        public override TriggerStruct Cost(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            bool invoke = false;

            if (triggerEvent == TriggerEvent.TargetChosen && room.AskForSkillInvoke(ask_who, Name, player))
            {
                invoke = true;
            }
            else if (triggerEvent == TriggerEvent.Dying && data is DyingStruct dying && dying.Damage.From != null &&
                     dying.Damage.From.Alive && !player.IsKongcheng() && RoomLogic.CanGetCard(room, ask_who, player, "h"))
            {
                invoke = true;
            }

            if (invoke)
            {
                room.SetEmotion(ask_who, "dragonphoenix");
                return(info);
            }

            return(new TriggerStruct());
        }
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            if (data is DamageStruct damage)
            {
                room.DoAnimate(AnimateType.S_ANIMATE_INDICATE, player.Name, damage.To.Name);
                room.SendCompulsoryTriggerLog(player, name, true);
                room.BroadcastSkillInvoke(Name, player, info.SkillPosition);

                Player        target = damage.To;
                List <string> handle = new List <string>();
                if (!target.IsKongcheng() && RoomLogic.CanGetCard(room, player, target, "h"))
                {
                    handle.Add("h^false^get");
                }
                if (target.HasEquip() && RoomLogic.CanGetCard(room, player, target, "e"))
                {
                    handle.Add("e^false^get");
                }
                if (target.JudgingArea.Count > 0 && RoomLogic.CanGetCard(room, player, target, "j"))
                {
                    handle.Add("j^false^get");
                }

                List <int> ids = room.AskForCardsChosen(player, damage.To, handle, Name);
                if (ids.Count > 0)
                {
                    room.ObtainCard(player, ref ids, new CardMoveReason(MoveReason.S_REASON_EXTRACTION, player.Name, damage.To.Name, Name, string.Empty), false);
                }

                if (player.Alive)
                {
                    room.LoseHp(player);
                }
            }

            return(false);
        }
Beispiel #10
0
        public override bool Effect(TriggerEvent triggerEvent, Room room, Player player, ref object data, Player ask_who, TriggerStruct info)
        {
            if (triggerEvent == TriggerEvent.TargetChosen)
            {
                room.AskForDiscard(player, Name, 1, 1, false, true, "@dragonphoenix-discard");
            }
            else if (data is DyingStruct dying && dying.Damage.From != null && dying.Damage.From.Alive && !player.IsKongcheng() && RoomLogic.CanGetCard(room, ask_who, player, "h"))
            {
                room.SendCompulsoryTriggerLog(ask_who, Name, false);
                int            id     = room.AskForCardChosen(ask_who, player, "h", Name, false, FunctionCard.HandlingMethod.MethodGet);
                CardMoveReason reason = new CardMoveReason(CardMoveReason.MoveReason.S_REASON_EXTRACTION, ask_who.Name, Name, Name);
                room.ObtainCard(ask_who, room.GetCard(id), reason, false);
            }

            return(false);
        }
Beispiel #11
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);
        }
Beispiel #12
0
 public override bool TargetFilter(Room room, List <Player> targets, Player to_select, Player Self, WrappedCard card)
 {
     return(Self != to_select && targets.Count == 0 && !to_select.IsKongcheng() && RoomLogic.CanGetCard(room, Self, to_select, "h"));
 }