Пример #1
0
    /// <summary>
    /// 摸一张牌,返回摸到的牌
    /// </summary>
    /// <param name="Player"></param>
    /// <param name="OnlyShow">是否是展示卡牌(摸到结算区)</param>
    /// <returns></returns>
    public PCard GetCard(PPlayer Player, bool OnlyShow = false)
    {
        if (Player == null || !Player.IsAlive)
        {
            return(null);
        }
        if (CardManager.CardHeap.CardNumber == 0 && CardManager.ThrownCardHeap.CardNumber > 0)
        {
            CardManager.CardHeap.CardList.AddRange(CardManager.ThrownCardHeap.CardList);
            CardManager.ThrownCardHeap.CardList.Clear();
            CardManager.CardHeap.Wash();
        }
        PCard Got = null;

        if (CardManager.CardHeap.CardNumber > 0)
        {
            CardManager.MoveCard(Got = CardManager.CardHeap.TopCard, CardManager.CardHeap, OnlyShow ? CardManager.SettlingArea : Player.Area.HandCardArea);
        }
        if (NowPeriod != null)
        {
            if (OnlyShow)
            {
                PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Player.Name + "展示了" + Got.Name));
            }
            else
            {
                PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Player.Name + "摸了1张牌"));
            }
        }
        return(Got);
    }
Пример #2
0
    public override int AIInHandExpectation(PGame Game, PPlayer Player)
    {
        PCard Current = Player.GetEquipment(Type);
        int   Exp     = AIInEquipExpectation(Game, Player);
        int   Base    = 0;
        int   Basic   = 0;

        if (Player.General is P_HuaXiong)
        {
            Base += 1000;
        }
        if (Player.General is P_TangYin)
        {
            Base += 500;
        }
        if (Player.General is P_HuaMulan)
        {
            Base += 3500;
        }
        if (Player.General is P_LvMeng)
        {
            Base += 1000;
        }
        if (Current != null && Exp <= Current.Model.AIInEquipExpectation(Game, Player))
        {
            Basic = 500 + Base;
        }
        else
        {
            Basic = Exp + Base;
        }
        return(Math.Max(Basic, base.AIInHandExpectation(Game, Player)));
    }
Пример #3
0
    /// <summary>
    /// 获得牌行为
    /// </summary>
    /// <param name="Player">获得牌的玩家</param>
    /// <param name="TargetPlayer">被获得牌的玩家</param>
    /// <param name="Directly">是否直接转移装备</param>
    /// <returns>获得的牌</returns>
    public PCard GetCardFrom(PPlayer Player, PPlayer TargetPlayer, bool AllowHandCards = true, bool AllowEquipment = true, bool AllowJudge = false, bool Directly = false)
    {
        string Title      = "请选择获得一张" + (AllowHandCards ? "[手牌]" : string.Empty) + (AllowEquipment ? "[装备]" : string.Empty) + (AllowJudge ? "[伏兵]" : string.Empty);
        PCard  TargetCard = ChooseCard(Player, TargetPlayer, Title, AllowHandCards, AllowEquipment, AllowJudge, true);

        if (TargetCard != null)
        {
            PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Player.Name + "获得了" + TargetPlayer.Name + "的" + (TargetPlayer.Area.HandCardArea.CardList.Contains(TargetCard) ? "1张手牌" : TargetCard.Name)));
            if (TargetPlayer.Area.HandCardArea.CardList.Contains(TargetCard))
            {
                CardManager.MoveCard(TargetCard, TargetPlayer.Area.HandCardArea, Player.Area.HandCardArea);
            }
            else if (TargetPlayer.Area.EquipmentCardArea.CardList.Contains(TargetCard))
            {
                if (Directly)
                {
                    CardManager.MoveCard(TargetCard, TargetPlayer.Area.EquipmentCardArea, Player.Area.EquipmentCardArea);
                }
                else
                {
                    CardManager.MoveCard(TargetCard, TargetPlayer.Area.EquipmentCardArea, Player.Area.HandCardArea);
                }
            }
            else if (TargetPlayer.Area.AmbushCardArea.CardList.Contains(TargetCard))
            {
                CardManager.MoveCard(TargetCard, TargetPlayer.Area.AmbushCardArea, Player.Area.HandCardArea);
            }
        }
        return(TargetCard);
    }
Пример #4
0
 protected static Action <PGame> MakeNormalEffect(PPlayer Player, PCard Card, TargetChooser AITargetChooser, TargetChooser PlayerTargetChooser, EffectFunc Effect, Action <PGame, PPlayer, List <PPlayer> > StartAction = null, Action <PGame, PPlayer, List <PPlayer> > EndAction = null)
 {
     return((PGame Game) => {
         List <PPlayer> Targets = Player.IsAI ? AITargetChooser(Game, Player) : PlayerTargetChooser(Game, Player);
         Targets.RemoveAll((PPlayer _Player) => _Player == null);
         if (Targets.Count == 0)
         {
             return;
         }
         Game.Monitor.CallTime(PTime.Card.AfterEmitTargetTime, new PUseCardTag(Card, Player, Targets));
         if (Card.Point > 0)
         {
             Game.CardManager.MoveCard(Card, Player.Area.HandCardArea, Game.CardManager.SettlingArea);
         }
         Game.Monitor.CallTime(PTime.Card.AfterBecomeTargetTime, new PUseCardTag(Card, Player, Targets));
         Targets = ArrangeTargets(Game, Targets, Player);
         Game.TagManager.CreateTag(new PUseCardTag(Card, Player, Targets));
         StartAction?.Invoke(Game, Player, Targets);
         Targets.ForEach((PPlayer Target) => {
             if (Target != null && Target.IsAlive)
             {
                 Effect(Game, Player, Target);
             }
         });
         EndAction?.Invoke(Game, Player, Targets);
         Game.TagManager.PopTag <PUseCardTag>(PUseCardTag.TagName);
         if (Card.Point > 0)
         {
             Game.CardManager.MoveCard(Card, Game.CardManager.SettlingArea, Game.CardManager.ThrownCardHeap);
         }
         Game.Monitor.CallTime(PTime.Card.EndSettleTime, new PUseCardTag(Card, Player, Targets));
     });
 }
Пример #5
0
    public override void AnnouceInvokeJudge(PGame Game, PPlayer Player, PCard Card)
    {
        base.AnnouceInvokeJudge(Game, Player, Card);
        int Result = Game.Judge(Player, new Func <int>(() => {
            if (Game.Enemies(Player).Count > Game.Teammates(Player, false).Count&& !(Game.Teammates(Player, false).Exists((PPlayer _Player) => _Player.Money <= 1000)))
            {
                return(6);
            }
            return(2);
        })());

        if (Result != 2)
        {
            Game.LoseMoney(Player, 1000);
            if (Game.GetNextPlayer(Player).Area.AmbushCardArea.CardList.Exists((PCard _Card) => _Card.Model is P_WevnI))
            {
                Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.GetNextPlayer(Game.GetNextPlayer(Player)).Area.AmbushCardArea);
            }
            else
            {
                Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.GetNextPlayer(Player).Area.AmbushCardArea);
            }
        }
        else
        {
            Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.CardManager.ThrownCardHeap);
        }
    }
Пример #6
0
    public override void AnnouceInvokeJudge(PGame Game, PPlayer Player, PCard Card)
    {
        base.AnnouceInvokeJudge(Game, Player, Card);
        int Result = Game.Judge(Player, new Func <int>(() => {
            if (Player.Area.EquipmentCardArea.CardNumber > 0)
            {
                return(6);
            }
            else
            {
                return(5);
            }
        })());

        if (Result != 6)
        {
            if (Player.Area.EquipmentCardArea.CardNumber > 0)
            {
                Game.ThrowCard(Player, Player, false, true);
            }
            if (Game.GetNextPlayer(Player).Area.AmbushCardArea.CardList.Exists((PCard _Card) => _Card.Model is P_HsienChing))
            {
                Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.GetNextPlayer(Game.GetNextPlayer(Player)).Area.AmbushCardArea);
            }
            else
            {
                Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.GetNextPlayer(Player).Area.AmbushCardArea);
            }
        }
        else
        {
            Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.CardManager.ThrownCardHeap);
        }
    }
Пример #7
0
 protected static Action <PGame> MakeNormalEffect(PPlayer Player, PCard Card, TargetChooser AITargetChooser, PTrigger.PlayerCondition TargetCondition, EffectFunc Effect)
 {
     return(MakeNormalEffect(Player, Card, AITargetChooser, (PGame Game, PPlayer _Player) => {
         return new List <PPlayer> {
             PNetworkManager.NetworkServer.ChooseManager.AskForTargetPlayer(_Player, TargetCondition, Card.Name)
         };
     }, Effect));
 }
Пример #8
0
 public PChooseCardTag(PPlayer Player, PCard Card, bool AllowHandCards = true, bool AllowEquipment = true, bool AllowJudge = false) : base(TagName)
 {
     AppendField(PlayerFieldName, Player);
     AppendField(CardFieldName, Card);
     AppendField(AllowHandCardsName, AllowHandCards);
     AppendField(AllowEquipmentName, AllowEquipment);
     AppendField(AllowJudgeName, AllowJudge);
 }
Пример #9
0
 public P_YooChiinKuTsung() : base(CardName)
 {
     Point = 3;
     Index = 16;
     foreach (PTime Time in new PTime[] {
         PTime.Injure.EmitInjure
     })
     {
         MoveInHandTriggerList.Add((PPlayer Player, PCard Card) => {
             return(new PTrigger(CardName)
             {
                 IsLocked = false,
                 Player = Player,
                 Time = Time,
                 AIPriority = 10,
                 Condition = (PGame Game) => {
                     PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName);
                     return Player.Equals(InjureTag.FromPlayer) && InjureTag.Injure > 0 && InjureTag.ToPlayer != null && InjureTag.ToPlayer.Area.HandCardArea.CardNumber > 0;
                 },
                 AICondition = (PGame Game) => {
                     PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName);
                     if (Player.TeamIndex == InjureTag.ToPlayer.TeamIndex)
                     {
                         if (Player.General is P_IzayoiMiku && InjureTag.ToPlayer.General is P_Gabriel)
                         {
                             return false;
                         }
                         return InjureTag.Injure >= InjureTag.ToPlayer.Money || (InjureTag.Injure >= 6000 && InjureTag.Injure + Player.Money >= 2 * (InjureTag.ToPlayer.Money - InjureTag.Injure));
                     }
                     else
                     {
                         return InjureTag.Injure < InjureTag.ToPlayer.Money && InjureTag.Injure <= 1000 && InjureTag.ToPlayer.Area.HandCardArea.CardNumber >= 2 && PAiCardExpectation.FindMostValuableToGet(Game, Player, InjureTag.ToPlayer).Value > 3000;
                     }
                 },
                 Effect = MakeNormalEffect(Player, Card, AIEmitTargets, AIEmitTargets,
                                           (PGame Game, PPlayer User, PPlayer Target) => {
                     PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName);
                     PNetworkManager.NetworkServer.TellClients(new PPushTextOrder(User.Index.ToString(), "欲擒故纵:防止伤害", PPushType.Information.Name));
                     InjureTag.Injure = 0;
                     for (int i = 0; i < 2; ++i)
                     {
                         if (Target.Area.HandCardArea.CardNumber > 0)
                         {
                             PCard Got = Game.GetCardFrom(User, Target, true, false);
                             #region 成就:七擒七纵
                             if (Got.Model is P_NanManHsiang && User.Area.HandCardArea.CardList.Contains(Got))
                             {
                                 PArch.Announce(Game, User, "七擒七纵");
                             }
                             #endregion
                         }
                     }
                 })
             });
         });
     }
 }
Пример #10
0
 public P_HsiaoLiTsaangTao() : base(CardName)
 {
     Point = 2;
     Index = 10;
     foreach (PTime Time in new PTime[] {
         PPeriod.FirstFreeTime.During,
         PPeriod.SecondFreeTime.During
     })
     {
         MoveInHandTriggerList.Add((PPlayer Player, PCard Card) => {
             return(new PTrigger(CardName)
             {
                 IsLocked = false,
                 Player = Player,
                 Time = Time,
                 AIPriority = 145,
                 Condition = (PGame Game) => {
                     return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) && Player.Area.HandCardArea.CardList.Exists((PCard _Card) => _Card.Type.IsEquipment());
                 },
                 AICondition = (PGame Game) => {
                     if (Player.General is P_WuZhao && Player.RemainLimit(PSkillInfo.女权.Name))
                     {
                         return false;
                     }
                     return AIEmitTargets(Game, Player)[0] != null && P_PanYue.XianJuTest(Game, Player);
                 },
                 Effect = MakeNormalEffect(Player, Card, AIEmitTargets, PTrigger.Except(Player),
                                           (PGame Game, PPlayer User, PPlayer Target) => {
                     PCard TargetCard = null;
                     if (User.IsAI)
                     {
                         if (User.TeamIndex == Target.TeamIndex)
                         {
                             TargetCard = TeammateValueCard(Game, User, Target).Key;
                         }
                         else
                         {
                             TargetCard = EnemyValueCard(Game, User, Target).Key;
                         }
                     }
                     else
                     {
                         do
                         {
                             TargetCard = PNetworkManager.NetworkServer.ChooseManager.AskToChooseOwnCard(User, CardName + "[选择一张手牌中的装备牌]", true, false);
                         } while (!TargetCard.Type.IsEquipment());
                     }
                     if (TargetCard != null)
                     {
                         Game.CardManager.MoveCard(TargetCard, User.Area.HandCardArea, Target.Area.EquipmentCardArea);
                         Game.Injure(User, Target, 500 * Target.Area.EquipmentCardArea.CardNumber, Card);
                     }
                 })
             });
         });
     }
 }
Пример #11
0
 private KeyValuePair <PCard, int> TeammateValueCard(PGame Game, PPlayer Player, PPlayer _Player)
 {
     return(PMath.Max(Player.Area.HandCardArea.CardList.FindAll((PCard Card) => Card.Type.IsEquipment()), (PCard Card) => {
         int New = Card.Model.AIInEquipExpectation(Game, _Player);
         PCard CurrentEquip = _Player.GetEquipment(Card.Type);
         int Current = CurrentEquip == null ? 0 : CurrentEquip.Model.AIInEquipExpectation(Game, _Player);
         int Delta = (_Player.Area.EquipmentCardArea.CardNumber + (CurrentEquip == null ? 1 : 0)) * 500;
         return New - Current + PAiTargetChooser.InjureExpect(Game, Player, Player, _Player, Delta, Instantiate())
         + Math.Max(0, PAiCardExpectation.FindMostValuableToGet(Game, Player, _Player).Value);
     }));
 }
Пример #12
0
    private PCard ChooseCard(PPlayer Player, PPlayer TargetPlayer, string Title, bool AllowHandCards = true, bool AllowEquipment = true, bool AllowAmbush = false, bool IsGet = false)
    {
        PCard TargetCard = null;

        if (Player.IsUser)
        {
            if (Player.Equals(TargetPlayer))
            {
                TargetCard = PNetworkManager.NetworkServer.ChooseManager.AskToChooseOwnCard(Player, Title, AllowHandCards, AllowEquipment, AllowAmbush);
            }
            else
            {
                if (!AllowEquipment)
                {
                    if (AllowHandCards)
                    {
                        TargetCard = TargetPlayer.Area.HandCardArea.RandomCard();
                    }
                }
                else
                {
                    TargetCard = PNetworkManager.NetworkServer.ChooseManager.AskToChooseOthersCard(Player, TargetPlayer, Title, AllowHandCards, AllowAmbush);
                }
            }
        }
        else
        {
            if (IsGet)
            {
                if (!Player.Age.Equals(TargetPlayer.Age) && TargetPlayer.HasEquipment <P_HsiYooYangToow>() && AllowEquipment)
                {
                    TargetCard = TargetPlayer.GetEquipment(PCardType.TrafficCard);
                }
                else
                {
                    TargetCard = PAiCardExpectation.FindMostValuableToGet(this, Player, TargetPlayer, AllowHandCards, AllowEquipment, AllowAmbush, Player.Equals(TargetPlayer)).Key;
                }
            }
            else
            {
                if (Player.TeamIndex == TargetPlayer.TeamIndex)
                {
                    TargetCard = PAiCardExpectation.FindLeastValuable(this, Player, TargetPlayer, AllowHandCards, AllowEquipment, AllowAmbush, Player.Equals(TargetPlayer)).Key;
                }
                else
                {
                    TargetCard = PAiCardExpectation.FindMostValuable(this, Player, TargetPlayer, AllowHandCards, AllowEquipment, AllowAmbush).Key;
                }
            }
        }
        return(TargetCard);
    }
Пример #13
0
 public override void AnnouceInvokeJudge(PGame Game, PPlayer Player, PCard Card) {
     base.AnnouceInvokeJudge(Game, Player, Card);
     int Result = Game.Judge(Player, new Func<int>(() => {
         if (Player.HasHouse) {
             return 4;
         }
         return 6;
     })());
     if (Result != 4) {
         Game.ThrowHouse(Player, Player, CardName);
     }
     Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.CardManager.ThrownCardHeap);
 }
Пример #14
0
 /// <summary>
 /// 洗牌操作
 /// </summary>
 public void Wash()
 {
     for (int i = CardList.Count - 1; i > 0; --i)
     {
         int t1 = PMath.RandInt(0, i);
         int t2 = i;
         if (t1 != t2)
         {
             PCard Temp = CardList[t1];
             CardList[t1] = CardList[t2];
             CardList[t2] = Temp;
         }
     }
 }
Пример #15
0
    public override void AnnouceInvokeJudge(PGame Game, PPlayer Player, PCard Card)
    {
        base.AnnouceInvokeJudge(Game, Player, Card);
        int Result = Game.Judge(Player, new Func <int>(() => {
            if (AIExpect(Game, Player, Player.Position) < -1000)
            {
                return(1);
            }
            return(6);
        })());

        if (Result != 1)
        {
            PBlock Block = Player.Position;
            int[]  dx = { 1, -1, 0, 0 };
            int[]  dy = { 0, 0, 1, -1 };
            int    OriginalX = Block.X;
            int    OriginalY = Block.Y;
            int    x, y;
            Game.GetHouse(Block, 1);
            for (int i = 0; i < 4; ++i)
            {
                x = OriginalX;
                y = OriginalY;
                do
                {
                    x += dx[i];
                    y += dy[i];
                    PBlock TempBlock = Game.Map.FindBlockByCoordinate(x, y);
                    if (TempBlock != null)
                    {
                        if (TempBlock.Lord != null)
                        {
                            Game.GetHouse(TempBlock, 1);
                        }
                    }
                    else
                    {
                        break;
                    }
                } while (true);
            }
        }
        Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.CardManager.ThrownCardHeap);
    }
Пример #16
0
    public void GiveCardTo(PPlayer Player, PPlayer TargetPlayer, bool AllowHandCards = true, bool AllowEquipment = true, bool AllowJudge = false, bool Directly = false)
    {
        string Title = "请选择给出一张" + (AllowHandCards ? "[手牌]" : string.Empty) + (AllowEquipment ? "[装备]" : string.Empty) + (AllowJudge ? "[伏兵]" : string.Empty);
        PCard  Card  = null;

        if (Player.IsAI)
        {
            if (Player.TeamIndex == TargetPlayer.TeamIndex)
            {
                Card = PAiCardExpectation.FindMostValuable(this, TargetPlayer, Player, AllowHandCards, AllowEquipment, AllowJudge, true).Key;
            }
            else
            {
                Card = PAiCardExpectation.FindLeastValuable(this, TargetPlayer, Player, AllowHandCards, AllowEquipment, AllowJudge, true).Key;
            }
        }
        else
        {
            Card = PNetworkManager.NetworkServer.ChooseManager.AskToChooseOwnCard(Player, Title, AllowHandCards, AllowEquipment, AllowJudge);
        }
        if (Card != null)
        {
            PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Player.Name + "交给了" + TargetPlayer.Name + (Player.Area.HandCardArea.CardList.Contains(Card) ? "1张手牌" : Card.Name)));
            if (Player.Area.HandCardArea.CardList.Contains(Card))
            {
                CardManager.MoveCard(Card, Player.Area.HandCardArea, TargetPlayer.Area.HandCardArea);
            }
            else if (Player.Area.EquipmentCardArea.CardList.Contains(Card))
            {
                if (Directly)
                {
                    CardManager.MoveCard(Card, Player.Area.EquipmentCardArea, TargetPlayer.Area.EquipmentCardArea);
                }
                else
                {
                    CardManager.MoveCard(Card, Player.Area.EquipmentCardArea, TargetPlayer.Area.HandCardArea);
                }
            }
            else if (Player.Area.AmbushCardArea.CardList.Contains(Card))
            {
                CardManager.MoveCard(Card, Player.Area.AmbushCardArea, TargetPlayer.Area.HandCardArea);
            }
        }
    }
Пример #17
0
    /// <summary>
    /// 弃牌行为
    /// </summary>
    /// <param name="Player">发起弃牌方</param>
    /// <param name="TargetPlayer">被弃牌方</param>
    public PCard ThrowCard(PPlayer Player, PPlayer TargetPlayer, bool AllowHandCards = true, bool AllowEquipment = true, bool AllowJudge = false)
    {
        string Title      = "请选择弃置一张" + (AllowHandCards ? "[手牌]" : string.Empty) + (AllowEquipment ? "[装备]" : string.Empty) + (AllowJudge ? "[伏兵]" : string.Empty);
        PCard  TargetCard = ChooseCard(Player, TargetPlayer, Title, AllowHandCards, AllowEquipment, AllowJudge);

        if (TargetCard != null)
        {
            PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Player.Name + "弃置了" + TargetPlayer.Name + "的" + TargetCard.Name));
            if (TargetPlayer.Area.HandCardArea.CardList.Contains(TargetCard))
            {
                CardManager.MoveCard(TargetCard, TargetPlayer.Area.HandCardArea, CardManager.ThrownCardHeap);
            }
            else if (TargetPlayer.Area.EquipmentCardArea.CardList.Contains(TargetCard))
            {
                CardManager.MoveCard(TargetCard, TargetPlayer.Area.EquipmentCardArea, CardManager.ThrownCardHeap);
            }
        }
        return(TargetCard);
    }
Пример #18
0
 public P_IITaiLao() : base(CardName)
 {
     Point = 1;
     Index = 4;
     foreach (PTime Time in new PTime[] {
         PPeriod.FirstFreeTime.During,
         PPeriod.SecondFreeTime.During
     })
     {
         MoveInHandTriggerList.Add((PPlayer Player, PCard Card) => {
             return(new PTrigger(CardName)
             {
                 IsLocked = false,
                 Player = Player,
                 Time = Time,
                 AIPriority = 21,
                 Condition = (PGame Game) => {
                     return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime());
                 },
                 AICondition = (PGame Game) => {
                     if (Player.General is P_WuZhao && Player.RemainLimit(PSkillInfo.女权.Name))
                     {
                         return false;
                     }
                     return PMath.Min(Player.Area.HandCardArea.CardList.FindAll((PCard _Card) => !_Card.Equals(Card)).ConvertAll((PCard _Card) => _Card.AIInHandExpectation(Game, Player))) <= 1000;
                 },
                 Effect = MakeMultiTargetNormalEffect(Player, Card, AIEmitTargets,
                                                      PTrigger.NoCondition,
                                                      (PGame Game, PPlayer User, PPlayer Target) => {
                     PCard Got = Game.GetCard(Target);
                     #region 成就:躺尸
                     if (Got.Model is P_ChiehShihHuanHun && User.Area.HandCardArea.CardList.Contains(Got))
                     {
                         PArch.Announce(Game, User, "躺尸");
                     }
                     #endregion
                     Game.ThrowCard(Target, Target);
                 })
             });
         });
     }
 }
Пример #19
0
 public PAmbushTriggerInstaller() : base("触发伏兵")
 {
     TriggerList.Add(new PTrigger("触发伏兵")
     {
         IsLocked  = true,
         Time      = PPeriod.AmbushStage.During,
         Condition = (PGame Game) => {
             return(Game.NowPlayer.Area.AmbushCardArea.CardNumber > 0);
         },
         Effect = (PGame Game) => {
             for (int i = Game.NowPlayer.Area.AmbushCardArea.CardNumber - 1; i >= 0; --i)
             {
                 PCard AmbushCard = Game.NowPlayer.Area.AmbushCardArea.CardList[i];
                 if (AmbushCard != null)
                 {
                     ((PAmbushCardModel)AmbushCard.Model).AnnouceInvokeJudge(Game, Game.NowPlayer, AmbushCard);
                 }
             }
         }
     });
 }
Пример #20
0
    public override void AnnouceInvokeJudge(PGame Game, PPlayer Player, PCard Card)
    {
        base.AnnouceInvokeJudge(Game, Player, Card);
        int Result = Game.Judge(Player, new Func <int>(() => {
            if (Player.Area.HandCardArea.CardNumber <= 1)
            {
                return(6);
            }
            return(3);
        })());

        if (Result != 3)
        {
            int ThrowNumber = Player.Area.HandCardArea.CardNumber / 2;
            for (int i = 0; i < ThrowNumber; ++i)
            {
                Game.ThrowCard(Player, Player, true, false);
            }
        }
        Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.CardManager.ThrownCardHeap);
    }
Пример #21
0
    public static KeyValuePair <PCard, int> EquipToThrow(PGame Game, PPlayer Player)
    {
        Dictionary <PCard, int> Dict = new Dictionary <PCard, int>();
        PCard Answer      = null;
        int   AnswerValue = -1;

        foreach (PCardType CardType in new PCardType[] {
            PCardType.WeaponCard, PCardType.DefensorCard, PCardType.TrafficCard
        })
        {
            PCard CurrentCard = Player.GetEquipment(CardType);
            if (CurrentCard != null)
            {
                List <PCard> AvailableCardList = Player.Area.HandCardArea.CardList.FindAll((PCard _Card) => _Card.Type.Equals(CardType));
                if (AvailableCardList.Count > 0)
                {
                    KeyValuePair <PCard, int> MinCard = PMath.Min(AvailableCardList, (PCard _Card) => _Card.Model.AIInEquipExpectation(Game, Player));
                    KeyValuePair <PCard, int> MaxCard = PMath.Max(AvailableCardList, (PCard _Card) => _Card.Model.AIInEquipExpectation(Game, Player));
                    int CurrentValue = CurrentCard.Model.AIInEquipExpectation(Game, Player);
                    if (CurrentValue > MinCard.Value)
                    {
                        Dict.Add(MinCard.Key, 0);
                    }
                    if (CurrentValue < MaxCard.Value)
                    {
                        Dict.Add(CurrentCard, MaxCard.Value - CurrentValue);
                    }
                }
            }
        }
        foreach (KeyValuePair <PCard, int> Record in Dict)
        {
            if (Record.Value > AnswerValue)
            {
                AnswerValue = Record.Value;
                Answer      = Record.Key;
            }
        }
        return(new KeyValuePair <PCard, int>(Answer, AnswerValue));
    }
Пример #22
0
 public P_ShunShouChiienYang() : base(CardName)
 {
     Point = 2;
     Index = 12;
     foreach (PTime Time in new PTime[] {
         PPeriod.FirstFreeTime.During,
         PPeriod.SecondFreeTime.During
     })
     {
         MoveInHandTriggerList.Add((PPlayer Player, PCard Card) => {
             return(new PTrigger(CardName)
             {
                 IsLocked = false,
                 Player = Player,
                 Time = Time,
                 AIPriority = 120,
                 Condition = (PGame Game) => {
                     return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) && Game.PlayerList.Find((PPlayer _Player) => _Player.Area.CardNumber > 0 && !_Player.Equals(Player)) != null;
                 },
                 AICondition = (PGame Game) => {
                     return AIEmitTargets(Game, Player)[0] != null;
                 },
                 Effect = MakeNormalEffect(Player, Card, AIEmitTargets, (PGame Game, PPlayer _Player) => {
                     return _Player.Area.CardNumber > 0 && !_Player.Equals(Player);
                 },
                                           (PGame Game, PPlayer User, PPlayer Target) => {
                     PCard Got = Game.GetCardFrom(User, Target, true, true, true);
                     #region 成就:名副其实
                     if (Got.Model is P_HsiYooYangToow && User.Area.HandCardArea.CardList.Contains(Got))
                     {
                         PArch.Announce(Game, User, "名副其实");
                     }
                     #endregion
                 })
             });
         });
     }
 }
Пример #23
0
    public override void AnnouceInvokeJudge(PGame Game, PPlayer Player, PCard Card)
    {
        base.AnnouceInvokeJudge(Game, Player, Card);
        int Result1 = Game.Judge(Player, 6);
        int Result2 = Game.Judge(Player, 6);

        if (Result1 + Result2 <= 5)
        {
            Game.Injure(null, Player, 6000, Card);
            Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.CardManager.ThrownCardHeap);
        }
        else
        {
            if (Game.GetNextPlayer(Player).Area.AmbushCardArea.CardList.Exists((PCard _Card) => _Card.Model is P_ShanTien))
            {
                Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.GetNextPlayer(Game.GetNextPlayer(Player)).Area.AmbushCardArea);
            }
            else
            {
                Game.CardManager.MoveCard(Card, Player.Area.AmbushCardArea, Game.GetNextPlayer(Player).Area.AmbushCardArea);
            }
        }
    }
Пример #24
0
 public P_CheevnHuoTaChieh() : base(CardName)
 {
     Point = 1;
     Index = 5;
     foreach (PTime Time in new PTime[] {
         PTime.Injure.AcceptInjure
     })
     {
         MoveInHandTriggerList.Add((PPlayer Player, PCard Card) => {
             return(new PTrigger(CardName)
             {
                 IsLocked = false,
                 Player = Player,
                 Time = Time,
                 AIPriority = 10,
                 Condition = (PGame Game) => {
                     PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName);
                     return !Player.Equals(InjureTag.ToPlayer) && InjureTag.Injure > 0 && InjureTag.ToPlayer != null && InjureTag.ToPlayer.Area.HandCardArea.CardNumber + InjureTag.ToPlayer.Area.EquipmentCardArea.CardNumber > 0;
                 },
                 AICondition = (PGame Game) => {
                     PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName);
                     return Player.TeamIndex != InjureTag.ToPlayer.TeamIndex && PAiCardExpectation.FindMostValuableToGet(Game, Player, InjureTag.ToPlayer).Value > 3000;
                 },
                 Effect = MakeNormalEffect(Player, Card, AIEmitTargets, AIEmitTargets,
                                           (PGame Game, PPlayer User, PPlayer Target) => {
                     PCard Got = Game.GetCardFrom(User, Target);
                     #region 成就:分一杯羹
                     if (Got.Model is P_MuNiuLiuMa && User.Area.HandCardArea.CardList.Contains(Got))
                     {
                         PArch.Announce(Game, User, "分一杯羹");
                     }
                     #endregion
                 })
             });
         });
     }
 }
Пример #25
0
 public PClickOnCardOrder() : base("click_on_card",
                                   (string[] args, string IPAddress) => {
     int CardIndex = Convert.ToInt32(args[1]);
     PGame Game    = PNetworkManager.Game;
     PChooseCardTag ChooseCardTag = Game.TagManager.FindPeekTag <PChooseCardTag>(PChooseCardTag.TagName);
     if (ChooseCardTag != null && ChooseCardTag.Player.IPAddress.Equals(IPAddress))
     {
         ChooseCardTag.Card = ChooseCardTag.Player.Area.GetCard(CardIndex, ChooseCardTag.AllowHandCards, ChooseCardTag.AllowEquipment, ChooseCardTag.AllowJudge);
     }
     else if (Game.Logic.WaitingForEndFreeTime() && Game.NowPlayer.IPAddress.Equals(IPAddress) && Game.TagManager.ExistTag(PTag.FreeTimeOperationTag.Name) && Game.NowPlayer.IsAlive)
     {
         PCard Card = Game.NowPlayer.Area.GetCard(CardIndex);
         if (Card != null)
         {
             PTrigger Trigger = null;
             if (Game.NowPlayer.Area.HandCardArea.CardList.Contains(Card))
             {
                 Trigger = Card.FindTrigger(Game.NowPeriod.During);
             }
             else if (Game.NowPlayer.Area.EquipmentCardArea.CardList.Contains(Card))
             {
                 Trigger = Card.FindEquipmentTrigger(Game.NowPeriod.During);
             }
             if (Trigger != null)
             {
                 if (Trigger.Condition(Game))
                 {
                     PThread.Async(() => {
                         Game.Logic.StartSettle(new PSettle("主动触发" + Trigger.Name, Trigger.Effect));
                     });
                 }
             }
         }
     }
 },
                                   null) {
 }
Пример #26
0
    public P_TangYin() : base("唐寅")
    {
        Sex   = PSex.Male;
        Age   = PAge.Industrial;
        Index = 20;
        Cost  = 25;
        Tips  = "定位:攻击\n" +
                "难度:简单\n" +
                "史实:明代画家、书法家、诗人,“明四家”和“吴中四才子”之一。以风流之名传于世,后代有“唐伯虎点秋香”等传说。\n" +
                "攻略:\n唐寅是一个上手简单的攻击型武将,并且具有一定的防御能力。【风流】作为主要输出技能,能够保持前期的经济压制和后期的装备压制,并可通过伤害类计策触发,因此【浑水摸鱼】【关门捉贼】等牌都是关键牌。【浪子】作为防御技能,能够在后期积累了一定装备的基础上避开关键区域,防止崩盘,因此唐寅对装备牌的需求也较大。唐寅可通过对队友造成伤害以获得装备;反之,【风流】的输出也会受到装备的限制,对手可以通过给唐寅没用的装备,替换唐寅原本的装备,降低【风流】的收益甚至令其变为负收益。";

        PSkill LangZi = new PSkill("浪子");

        SkillList.Add(LangZi
                      .AddTimeTrigger(
                          new PTime[] {
            PPeriod.DiceStage.Start
        },
                          (PTime Time, PPlayer Player, PSkill Skill) => {
            return(new PTrigger(LangZi.Name)
            {
                IsLocked = false,
                Player = Player,
                Time = Time,
                AIPriority = 10,
                Condition = (PGame Game) => {
                    return Player.Equals(Game.NowPlayer) &&
                    Player.HasEquipInArea();
                },
                AICondition = (PGame Game) => {
                    KeyValuePair <PCard, int> CardValue = PAiCardExpectation.EquipToThrow(Game, Player);
                    KeyValuePair <int, int> SkillValue = LangZiBannedNumber(Game, Player);
                    return CardValue.Key != null && SkillValue.Key > 0 && SkillValue.Value >= 100 && SkillValue.Value + CardValue.Value >= 300;
                },
                Effect = (PGame Game) => {
                    LangZi.AnnouceUseSkill(Player);
                    PCard TargetCard = null;
                    if (Player.IsAI)
                    {
                        TargetCard = PAiCardExpectation.EquipToThrow(Game, Player).Key;
                    }
                    else
                    {
                        do
                        {
                            TargetCard = PNetworkManager.NetworkServer.ChooseManager.AskToChooseOwnCard(Player, LangZi.Name + "[选择一张装备牌]", true, true);
                        } while (!TargetCard.Type.IsEquipment());
                    }
                    if (TargetCard != null)
                    {
                        int BannedNumber = 0;
                        if (Player.IsAI)
                        {
                            BannedNumber = LangZiBannedNumber(Game, Player).Key;
                        }
                        else
                        {
                            BannedNumber = PNetworkManager.NetworkServer.ChooseManager.Ask1To6(Player, LangZi.Name + "[选择不会被掷出的数字]");
                        }
                        if (BannedNumber > 0)
                        {
                            Game.CardManager.MoveCard(TargetCard, Player.Area.HandCardArea.CardList.Contains(TargetCard) ? Player.Area.HandCardArea : Player.Area.EquipmentCardArea, Game.CardManager.ThrownCardHeap);
                            Player.Tags.CreateTag(new PNumberedTag(LangZi.Name, BannedNumber));
                        }
                    }
                }
            });
        })
                      .AddTrigger((PPlayer Player, PSkill Skill) => {
            return(new PTrigger(LangZi.Name + "[掷骰无效触发]")
            {
                IsLocked = true,
                Player = Player,
                Time = PPeriod.DiceStage.During,
                Condition = (PGame Game) => {
                    return Player.Equals(Game.NowPlayer) && Player.Tags.ExistTag(LangZi.Name);
                },
                Effect = (PGame Game) => {
                    int BannedNumber = Player.Tags.PopTag <PNumberedTag>(LangZi.Name).Value;
                    PDiceResultTag DiceResult = Game.TagManager.FindPeekTag <PDiceResultTag>(PDiceResultTag.TagName);
                    if (BannedNumber == DiceResult.DiceResult)
                    {
                        LangZi.AnnouceUseSkill(Player);
                        int NewNumber = BannedNumber;
                        while (NewNumber == BannedNumber)
                        {
                            NewNumber = PMath.RandInt(1, 6);
                        }
                        PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder("掷骰结果更改为" + NewNumber.ToString()));
                        DiceResult.DiceResult = NewNumber;
                    }
                }
            });
        })
                      );
        PSkill    FengLiu       = new PSkill("风流");
        const int FengLiuInjure = 600;

        SkillList.Add(FengLiu
                      .AddTimeTrigger(
                          new PTime[] {
            PTime.Injure.EmitInjure
        },
                          (PTime Time, PPlayer Player, PSkill Skill) => {
            return(new PTrigger(FengLiu.Name)
            {
                IsLocked = false,
                Player = Player,
                Time = Time,
                AIPriority = 150,
                Condition = (PGame Game) => {
                    PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName);
                    return InjureTag.Injure > 0 && Player.Equals(InjureTag.FromPlayer) && InjureTag.ToPlayer != null && !Player.Equals(InjureTag.ToPlayer);
                },
                AICondition = (PGame Game) => {
                    PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName);
                    PPlayer ToPlayer = InjureTag.ToPlayer;
                    if (ToPlayer.TeamIndex == Player.TeamIndex)
                    {
                        if (ToPlayer.Money > FengLiuInjure + InjureTag.Injure && ToPlayer.Money > Player.Money)
                        {
                            return true;
                        }
                        else if (ToPlayer.Money <= InjureTag.Injure)
                        {
                            return true;
                        }
                        else if (ToPlayer.Area.EquipmentCardArea.CardNumber == 0)
                        {
                            return false;
                        }
                    }
                    foreach (PCardType CardType in new PCardType[] {
                        PCardType.WeaponCard, PCardType.DefensorCard, PCardType.TrafficCard
                    })
                    {
                        PCard CurrentCard = Player.GetEquipment(CardType);
                        PCard TestCard = ToPlayer.GetEquipment(CardType);
                        if (ToPlayer.TeamIndex == Player.TeamIndex)
                        {
                            if (CurrentCard == null && TestCard != null && TestCard.Model.AIInEquipExpectation(Game, Player) > TestCard.Model.AIInEquipExpectation(Game, ToPlayer))
                            {
                                return true;
                            }
                        }
                        else if (CurrentCard != null && TestCard != null && CurrentCard.Model.AIInEquipExpectation(Game, Player) >= TestCard.Model.AIInEquipExpectation(Game, Player) + TestCard.Model.AIInEquipExpectation(Game, ToPlayer))
                        {
                            return false;
                        }
                    }
                    return ToPlayer.TeamIndex != Player.TeamIndex;
                },
                Effect = (PGame Game) => {
                    FengLiu.AnnouceUseSkill(Player);
                    PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName);
                    PPlayer ToPlayer = InjureTag.ToPlayer;
                    int Answer = 0;
                    PCard TargetCard = null;
                    if (ToPlayer.Area.EquipmentCardArea.CardNumber == 0)
                    {
                        Answer = 1;
                    }
                    else
                    {
                        if (ToPlayer.IsAI)
                        {
                            if (ToPlayer.TeamIndex == Player.TeamIndex)
                            {
                                if (ToPlayer.Money <= InjureTag.Injure)
                                {
                                    Answer = 1;
                                }
                                else if (PAiCardExpectation.FindMostValuable(Game, Player, ToPlayer, false, true, false, true).Value > 0)
                                {
                                    Answer = 1;
                                }
                            }
                            else
                            {
                                int Value = FengLiuInjure * 2;
                                if (ToPlayer.Money <= InjureTag.Injure)
                                {
                                    Value -= FengLiuInjure;
                                }
                                else if (ToPlayer.Money <= InjureTag.Injure + FengLiuInjure)
                                {
                                    Value += 30000;
                                }

                                foreach (PCard TestCard in ToPlayer.Area.EquipmentCardArea.CardList)
                                {
                                    int NowValue = TestCard.Model.AIInEquipExpectation(Game, ToPlayer);
                                    int GiveValue = TestCard.Model.AIInEquipExpectation(Game, Player);
                                    int OverrideValue = 0;
                                    if (Player.GetEquipment(TestCard.Type) != null)
                                    {
                                        OverrideValue = Player.GetEquipment(TestCard.Type).Model.AIInEquipExpectation(Game, Player);
                                    }
                                    int ExtraValue = ToPlayer.General is P_HuaMulan ? 3500 : 0;
                                    if (Value > NowValue + GiveValue - OverrideValue - ExtraValue)
                                    {
                                        Value = NowValue + GiveValue - OverrideValue - ExtraValue;
                                        TargetCard = TestCard;
                                    }
                                }
                                if (TargetCard == null)
                                {
                                    Answer = 1;
                                }
                            }
                        }
                        else
                        {
                            Answer = PNetworkManager.NetworkServer.ChooseManager.Ask(ToPlayer, FengLiu.Name, new string[] { "交给" + Player.Name + "一件装备", "受到的伤害+" + FengLiuInjure.ToString() });
                        }
                    }
                    if (Answer == 0)
                    {
                        Game.GiveCardTo(ToPlayer, Player, false, true, false, true);
                    }
                    else
                    {
                        InjureTag.Injure += FengLiuInjure;
                    }
                }
            });
        })
                      );
    }
Пример #27
0
 public P_PaaoChuanYinYoo() : base(CardName)
 {
     Point = 3;
     Index = 17;
     foreach (PTime Time in new PTime[] {
         PPeriod.FirstFreeTime.During,
         PPeriod.SecondFreeTime.During
     })
     {
         MoveInHandTriggerList.Add((PPlayer Player, PCard Card) => {
             return(new PTrigger(CardName)
             {
                 IsLocked = false,
                 Player = Player,
                 Time = Time,
                 AIPriority = 140,
                 Condition = (PGame Game) => {
                     return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) && Game.Map.BlockList.Exists((PBlock Block) => Player.Equals(Block.Lord)) && (Player.Area.EquipmentCardArea.CardNumber > 0 || Player.Area.HandCardArea.CardList.Exists((PCard _Card) => Card.Type.IsEquipment())) && AIEmitTargets(Game, Player).Count > 0;
                 },
                 AICondition = (PGame Game) => {
                     if (Player.General is P_WuZhao && Player.RemainLimit(PSkillInfo.女权.Name))
                     {
                         return false;
                     }
                     return Player.Area.HandCardArea.CardList.Exists((PCard _Card) => Card.Type.IsEquipment()) && AIInHandExpectation(Game, Player) > 2000;
                 },
                 Effect = MakeNormalEffect(Player, Card, AIEmitTargets, AIEmitTargets,
                                           (PGame Game, PPlayer User, PPlayer Target) => {
                     if (Target.HasHouse)
                     {
                         PBlock TargetBlock = null;
                         if (Target.IsAI)
                         {
                             TargetBlock = PAiMapAnalyzer.MinValueHouse(Game, Target).Key;
                         }
                         else
                         {
                             TargetBlock = PNetworkManager.NetworkServer.ChooseManager.AskToChooseBlock(Target, "选择一座房屋以交给" + User.Name, (PBlock Block) => Target.Equals(Block.Lord) && Block.HouseNumber > 0);
                         }
                         if (TargetBlock != null)
                         {
                             Game.LoseHouse(TargetBlock, 1);
                             TargetBlock = null;
                             if (User.IsAI)
                             {
                                 TargetBlock = PAiMapAnalyzer.MaxValueHouse(Game, User, true).Key;
                             }
                             else
                             {
                                 TargetBlock = PNetworkManager.NetworkServer.ChooseManager.AskToChooseBlock(User, "选择一处你的土地放置房屋", (PBlock Block) => User.Equals(Block.Lord));
                             }
                             if (TargetBlock != null)
                             {
                                 Game.GetHouse(TargetBlock, 1);
                             }
                         }
                     }
                 }, (PGame Game, PPlayer User, List <PPlayer> Targets) => {
                     PCard TargetCard = null;
                     if (User.IsAI)
                     {
                         TargetCard = PMath.Min(User.Area.HandCardArea.CardList.FindAll((PCard _Card) => _Card.Type.IsEquipment()), (PCard _Card) => _Card.Model.AIInHandExpectation(Game, User)).Key;
                     }
                     else
                     {
                         do
                         {
                             TargetCard = PNetworkManager.NetworkServer.ChooseManager.AskToChooseOwnCard(User, CardName + "[选择一张装备牌]", true, true);
                         } while (!TargetCard.Type.IsEquipment());
                     }
                     Game.CardManager.MoveCard(TargetCard, User.Area.HandCardArea.CardList.Contains(TargetCard) ? User.Area.HandCardArea : User.Area.EquipmentCardArea, Game.CardManager.ThrownCardHeap);
                 })
             });
         });
     }
 }
Пример #28
0
 public P_ChiehTaoShaJevn() : base(CardName)
 {
     Point = 1;
     Index = 3;
     foreach (PTime Time in new PTime[] {
         PPeriod.FirstFreeTime.During,
         PPeriod.SecondFreeTime.During
     })
     {
         MoveInHandTriggerList.Add((PPlayer Player, PCard Card) => {
             return(new PTrigger(CardName)
             {
                 IsLocked = false,
                 Player = Player,
                 Time = Time,
                 AIPriority = 110,
                 Condition = (PGame Game) => {
                     return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) && Game.PlayerList.Exists((PPlayer _Player ) => !_Player.Equals(Player) && _Player.Area.EquipmentCardArea.CardNumber > 0);
                 },
                 AICondition = (PGame Game) => {
                     return AIEmitTargets(Game, Player)[0] != null;
                 },
                 Effect = MakeNormalEffect(Player, Card, AIEmitTargets, (PGame Game, PPlayer _Player) => {
                     return !_Player.Equals(Player) && _Player.Area.EquipmentCardArea.CardNumber > 0;
                 },
                                           (PGame Game, PPlayer User, PPlayer Target) => {
                     int ChosenResult = -1;
                     if (!Target.HasHouse || User.LandNumber == 0)
                     {
                         if (Target.Area.EquipmentCardArea.CardNumber > 0)
                         {
                             ChosenResult = 1;
                         }
                     }
                     else if (Target.Area.EquipmentCardArea.CardNumber == 0)
                     {
                         ChosenResult = 0;
                     }
                     else
                     {
                         if (Target.IsAI)
                         {
                             ChosenResult = PAiMapAnalyzer.MaxValueHouse(Game, Target).Value > PAiCardExpectation.FindMostValuable(Game, Target, Target, false).Value ? 1 : 0;
                         }
                         else
                         {
                             ChosenResult = PNetworkManager.NetworkServer.ChooseManager.Ask(Target, CardName + "-选择一项", new string[] {
                                 "令" + User.Name + "获得你1座房屋",
                                 "令" + User.Name + "获得你1张装备"
                             });
                         }
                     }
                     if (ChosenResult == 0)
                     {
                         PBlock TargetBlock = null;
                         if (User.IsAI)
                         {
                             TargetBlock = PAiMapAnalyzer.MaxValueHouse(Game, Target).Key;
                         }
                         else
                         {
                             TargetBlock = PNetworkManager.NetworkServer.ChooseManager.AskToChooseBlock(User, "选择一座" + Target.Name + "的房屋", (PBlock Block) => Target.Equals(Block.Lord) && Block.HouseNumber > 0);
                         }
                         if (TargetBlock != null)
                         {
                             Game.LoseHouse(TargetBlock, 1);
                             if (User.IsAI)
                             {
                                 TargetBlock = PAiMapAnalyzer.MaxValueHouse(Game, User, true).Key;
                             }
                             else
                             {
                                 TargetBlock = PNetworkManager.NetworkServer.ChooseManager.AskToChooseBlock(User, "选择一处你的土地放置房屋", (PBlock Block) => User.Equals(Block.Lord));
                             }
                             if (TargetBlock != null)
                             {
                                 Game.GetHouse(TargetBlock, 1);
                             }
                         }
                     }
                     else if (ChosenResult == 1)
                     {
                         PCard Got = Game.GetCardFrom(User, Target, false);
                         #region 成就:老司机
                         if (Got.Model is P_ToouShihChi && User.Area.HandCardArea.CardList.Contains(Got))
                         {
                             PArch.Announce(Game, User, "老司机");
                         }
                         #endregion
                     }
                 })
             });
         });
     }
 }
Пример #29
0
    public P_WangXu() : base("王诩")
    {
        Sex   = PSex.Male;
        Age   = PAge.Classic;
        Index = 5;
        Tips  = "定位:全能\n" +
                "难度:困难\n" +
                "史实:战国时期思想家、纵横家,号“鬼谷子”。\n" +
                "攻略:\n王诩具有两个技能,在免费武将里是一个较为难用的武将,建议对游戏有一定了解之后使用。\n【纵横】可以将牌转化成【远交近攻】,但3和6两个点数里有不少高价值的牌,如【借尸还魂】、【欲擒故纵】、【抛砖引玉】、【走为上计】等,是否将这些牌转化成显性1000收益、隐性收益视队友状况而定的【远交近攻】,需要结合场上形势进行把握。\n【隐居】提高了王诩的生存能力,但【隐居】本身是负收益技能,移出游戏的王诩失去了收取过路费的能力,还会亏一座房屋,如果每回合都使用,必定只能苟延残喘片刻。所以,【隐居】的目的地需要给自己留出几个回合较为安全的空间,让自己在【隐居】的间隙可以造成输出。\n对于新手而言,也可以选择无脑【纵横】给大神队友补牌,后期保持【隐居】牵制敌人的打法。";

        PSkill ZongHeng = new PSkill("纵横")
        {
            Initiative = true
        };

        SkillList.Add(ZongHeng
                      .AddTimeTrigger(
                          new PTime[] {
            PPeriod.FirstFreeTime.During,
            PPeriod.SecondFreeTime.During
        },
                          (PTime Time, PPlayer Player, PSkill Skill) => {
            return(new PTrigger(ZongHeng.Name)
            {
                IsLocked = false,
                Player = Player,
                Time = Time,
                AIPriority = 200,
                CanRepeat = true,
                Condition = (PGame Game) => {
                    return Player.Equals(Game.NowPlayer) &&
                    (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) &&
                    Player.Area.HandCardArea.CardList.Exists((PCard Card) => Card.Point % 3 == 0);
                },
                AICondition = (PGame Game) => {
                    return Player.Area.HandCardArea.CardList.Exists((PCard Card) => {
                        return Card.Point % 3 == 0 && Card.Model.AIInHandExpectation(Game, Player) < 3000;
                    }) && P_YooenChiaoChinKung.AIEmitTargets(Game, Player)[0] != null;
                },
                Effect = (PGame Game) => {
                    ZongHeng.AnnouceUseSkill(Player);
                    PCard TargetCard = null;
                    if (Player.IsAI)
                    {
                        TargetCard = PAiCardExpectation.FindLeastValuable(Game, Player, Player, true, false, false, true, (PCard Card) => Card.Point % 3 == 0).Key;
                    }
                    else
                    {
                        List <PCard> Waiting = Player.Area.HandCardArea.CardList.FindAll((PCard Card) => Card.Point % 3 == 0);
                        int Result = PNetworkManager.NetworkServer.ChooseManager.Ask(Player, ZongHeng.Name, Waiting.ConvertAll((PCard Card) => Card.Name).Concat(new List <string> {
                            "取消"
                        }).ToArray());
                        if (Result >= 0 && Result < Waiting.Count)
                        {
                            TargetCard = Waiting[Result];
                        }
                    }
                    if (TargetCard != null)
                    {
                        TargetCard.Model = new P_YooenChiaoChinKung();
                        PTrigger Trigger = TargetCard.Model.MoveInHandTriggerList.Find((Func <PPlayer, PCard, PTrigger> TriggerGenerator) => TriggerGenerator(Player, TargetCard).Time.Equals(PPeriod.FirstFreeTime.During))?.Invoke(Player, TargetCard);
                        if (Trigger != null)
                        {
                            Game.Logic.StartSettle(new PSettle("纵横[远交近攻]", Trigger.Effect));
                        }
                    }
                }
            });
        }));
        PSkill YinJu = new PSkill("隐居")
        {
            Initiative = true
        };

        SkillList.Add(YinJu
                      .AnnounceTurnOnce()
                      .AddTimeTrigger(
                          new PTime[] {
            PPeriod.FirstFreeTime.During,
            PPeriod.SecondFreeTime.During
        },
                          (PTime Time, PPlayer Player, PSkill Skill) => {
            return(new PTrigger(YinJu.Name)
            {
                IsLocked = false,
                Player = Player,
                Time = Time,
                AIPriority = 10,
                CanRepeat = true,
                Condition = (PGame Game) => {
                    return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) && Player.RemainLimit(YinJu.Name) && Player.HasHouse;
                },
                AICondition = (PGame Game) => {
                    if (!Player.CanBeInjured)
                    {
                        return false;
                    }
                    if (Game.NowPeriod.Equals(PPeriod.FirstFreeTime))
                    {
                        bool CanGo = false;
                        PAiMapAnalyzer.NextBlocks(Game, Player).ForEach((PBlock Block) => {
                            if (Block.Lord != null && Block.Lord.TeamIndex != Player.TeamIndex && Block.Toll >= Player.Money)
                            {
                                CanGo = true;
                            }
                            if (Block.GetMoneyStopSolid < 0 && -Block.GetMoneyStopSolid >= Player.Money)
                            {
                                CanGo = true;
                            }
                            if (Block.GetMoneyStopPercent < 0 && PMath.Percent(Player.Money, -Block.GetMoneyStopPercent) >= Player.Money)
                            {
                                CanGo = true;
                            }
                        });
                        return CanGo || PAiMapAnalyzer.OutOfGameExpect(Game, Player, true) - PAiMapAnalyzer.MinValueHouse(Game, Player).Value > 0;
                    }
                    else
                    {
                        return false;
                    }
                },
                Effect = (PGame Game) => {
                    YinJu.AnnouceUseSkill(Player);
                    PBlock Block = null;
                    if (Player.IsAI)
                    {
                        Block = PAiMapAnalyzer.MinValueHouse(Game, Player).Key;
                    }
                    else
                    {
                        Block = PNetworkManager.NetworkServer.ChooseManager.AskToChooseBlock(Player, YinJu.Name, (PBlock _Block) => {
                            return Player.Equals(_Block.Lord) && _Block.HouseNumber > 0;
                        });
                    }
                    if (Block != null)
                    {
                        Game.MovePosition(Player, Player.Position, Block);
                        PNetworkManager.NetworkServer.TellClients(new PHighlightBlockOrder(Block.Index.ToString()));
                        Game.LoseHouse(Block, 1);
                        Player.Tags.CreateTag(PTag.OutOfGameTag);
                        YinJu.DeclareUse(Player);
                    }
                }
            });
        }));
    }
Пример #30
0
    public P_HuaMulan() : base("花木兰")
    {
        Sex   = PSex.Female;
        Age   = PAge.Renaissance;
        Index = 23;
        Cost  = 20;
        Tips  = "定位:爆发\n" +
                "难度:简单\n" +
                "史实:出自经典诗歌《木兰辞》。中国古代替父从军的女英雄。\n" +
                "攻略:\n花木兰是一名拥有不俗爆发能力的武将。【枭姬】的存在使得花木兰极度依赖装备牌,因此能够与唐寅、时迁等武将配合,同时也能够对这些武将形成强大的威慑力。【枭姬】往往能够提供绝地反杀的能力,或能使花木兰东山再起,因此在针对花木兰时必须注意其队伍的研究所或给牌武将,同时慎用【落凤弓】、【借刀杀人】等牌,从一定程度上来说提供了花木兰一定的防御力。【易装】是一个强大的爆发技能,不仅能与队友交换装备达成爆发,还能抢夺敌方的大量装备,形成局势逆转,因此可在一定程度上克制关羽。【易装】还可用来转换性别,从而使敌方的【百花裙】等装备失效。针对花木兰必须阻止其装备成形,因此吕蒙是一个不错的选择。";

        PSkill XiaoJi = new PSkill("枭姬")
        {
            SoftLockOpen = true
        };

        SkillList.Add(XiaoJi
                      .AddTrigger((PPlayer Player, PSkill Skill) => {
            return(new PTrigger(XiaoJi.Name)
            {
                IsLocked = false,
                Player = Player,
                Time = PTime.Card.LeaveAreaTime,
                AIPriority = 200,
                Condition = (PGame Game) => {
                    PMoveCardTag MoveCardTag = Game.TagManager.FindPeekTag <PMoveCardTag>(PMoveCardTag.TagName);
                    return Player.Area.EquipmentCardArea.Equals(MoveCardTag.Source) && !Player.Equals(MoveCardTag.Destination.Owner);
                },
                Effect = (PGame Game) => {
                    XiaoJi.AnnouceUseSkill(Player);
                    Game.GetCard(Player);
                    Game.GetMoney(Player, 1500);
                }
            });
        }));

        PPlayer YiZhuangTarget(PGame Game, PPlayer Player)
        {
            return(PMath.Max(Game.AlivePlayers(Player), (PPlayer TargetPlayer) => {
                int Profit = 0;
                PSex OriginalSex = Player.Sex;
                Player.Sex = PSex.Male;
                foreach (PCardType CardType in new PCardType[] {
                    PCardType.WeaponCard, PCardType.DefensorCard, PCardType.TrafficCard
                })
                {
                    PCard Card = Player.GetEquipment(CardType);
                    PCard TargetCard = TargetPlayer.GetEquipment(CardType);
                    if (Card != null)
                    {
                        Profit += 2000;
                        Profit -= Card.Model.AIInEquipExpectation(Game, Player);
                        Profit += Card.Model.AIInEquipExpectation(Game, TargetPlayer) * (Player.TeamIndex == TargetPlayer.TeamIndex ? 1 : -1);
                    }
                    if (TargetCard != null)
                    {
                        Profit += TargetCard.Model.AIInEquipExpectation(Game, Player);
                        Profit -= TargetCard.Model.AIInEquipExpectation(Game, TargetPlayer) * (Player.TeamIndex == TargetPlayer.TeamIndex ? 1 : -1);
                    }
                }
                Player.Sex = OriginalSex;
                return Profit - 7500;
            }, true).Key);
        }

        PSkill YiZhuang = new PSkill("易装")
        {
            Initiative = true
        };

        SkillList.Add(YiZhuang
                      .AnnounceGameOnce()
                      .AddTimeTrigger(
                          new PTime[] {
            PPeriod.FirstFreeTime.During,
            PPeriod.SecondFreeTime.During
        },
                          (PTime Time, PPlayer Player, PSkill Skill) => {
            return(new PTrigger(YiZhuang.Name)
            {
                IsLocked = false,
                Player = Player,
                Time = Time,
                AIPriority = 280,
                CanRepeat = true,
                Condition = (PGame Game) => {
                    return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) && Player.RemainLimit(YiZhuang.Name);
                },
                AICondition = (PGame Game) => {
                    if (Game.Teammates(Player).Exists((PPlayer _Player) => _Player.General is P_WuZhao))
                    {
                        PPlayer _Player = Game.PlayerList.Find((PPlayer __Player) => __Player.General is P_WuZhao);
                        if (_Player.RemainLimit("女权"))
                        {
                            return false;
                        }
                        else if (Player.Tags.ExistTag(P_WuZhao.NvQuanTag.Name))
                        {
                            return false;
                        }
                    }
                    return YiZhuangTarget(Game, Player) != null;
                },
                Effect = (PGame Game) => {
                    YiZhuang.AnnouceUseSkill(Player);
                    PPlayer Target = null;
                    if (Player.IsAI)
                    {
                        Target = YiZhuangTarget(Game, Player);
                    }
                    else
                    {
                        Target = PNetworkManager.NetworkServer.ChooseManager.AskForTargetPlayer(Player, PTrigger.Except(Player), YiZhuang.Name);
                    }
                    if (Target != null)
                    {
                        List <PCard> MulanEquipments = new List <PCard>();
                        foreach (PCard Card in Player.Area.EquipmentCardArea.CardList)
                        {
                            MulanEquipments.Add(Card);
                        }
                        List <PCard> TargetEquipements = new List <PCard>();
                        foreach (PCard Card in Target.Area.EquipmentCardArea.CardList)
                        {
                            TargetEquipements.Add(Card);
                        }
                        foreach (PCard Card in MulanEquipments)
                        {
                            Game.CardManager.MoveCard(Card, Player.Area.EquipmentCardArea, Game.CardManager.SettlingArea);
                        }
                        foreach (PCard Card in TargetEquipements)
                        {
                            Game.CardManager.MoveCard(Card, Target.Area.EquipmentCardArea, Game.CardManager.SettlingArea);
                        }
                        foreach (PCard Card in MulanEquipments)
                        {
                            Game.CardManager.MoveCard(Card, Game.CardManager.SettlingArea, Target.Area.EquipmentCardArea);
                        }
                        foreach (PCard Card in TargetEquipements)
                        {
                            Game.CardManager.MoveCard(Card, Game.CardManager.SettlingArea, Player.Area.EquipmentCardArea);
                        }
                        Player.Sex = PSex.Male;
                        Player.Tags.CreateTag(new PTag(YiZhuang.Name));
                        YiZhuang.DeclareUse(Player);
                    }
                }
            });
        }));
    }