/// <summary> /// 弃一座房屋(没有则不弃) /// </summary> /// <param name="Player"></param> /// <param name="TargetPlayer"></param> /// <param name="Title"></param> public void ThrowHouse(PPlayer Player, PPlayer TargetPlayer, string Title) { if (TargetPlayer.HasHouse) { PBlock TargetBlock = null; if (Player.IsAI) { if (Player.TeamIndex == TargetPlayer.TeamIndex) { TargetBlock = PAiMapAnalyzer.MinValueHouse(this, TargetPlayer).Key; } else { TargetBlock = PAiMapAnalyzer.MaxValueHouse(this, TargetPlayer).Key; } } else { TargetBlock = PNetworkManager.NetworkServer.ChooseManager.AskToChooseBlock(Player, "[" + Title + "]选择" + TargetPlayer.Name + "的房屋", (PBlock Block) => TargetPlayer.Equals(Block.Lord) && Block.HouseNumber > 0); } if (TargetBlock != null) { PNetworkManager.NetworkServer.TellClients(new PHighlightBlockOrder(TargetBlock.Index.ToString())); LoseHouse(TargetBlock, 1); } } }
public override int AIInHandExpectation(PGame Game, PPlayer Player) { int Basic = PAiMapAnalyzer.MaxValueHouse(Game, Player).Value; Basic = Math.Max(1000, PMath.Max(Game.Enemies(Player), (PPlayer _Player) => { return(PAiMapAnalyzer.MaxValueHouse(Game, _Player).Value + Basic); }, true).Value); return(Math.Max(Basic, base.AIInHandExpectation(Game, Player))); }
private KeyValuePair <PPlayer, int> FindTarget(PGame Game, PPlayer Player) { int Basic = PAiMapAnalyzer.MaxValueHouse(Game, Player).Value; return(PMath.Max(Game.Enemies(Player).FindAll((PPlayer _Player) => _Player.Area.EquipmentCardArea.CardNumber > 0), (PPlayer _Player) => { int HouseValue = _Player.HasHouse ? PAiMapAnalyzer.MaxValueHouse(Game, _Player).Value + Basic : 30000; int EquipValue = PMath.Max(_Player.Area.EquipmentCardArea.CardList, (PCard Card ) => Card.Model.AIInEquipExpectation(Game, _Player) + Card.Model.AIInHandExpectation(Game, Player)).Value; return Math.Min(HouseValue, EquipValue); }, true)); }
public override int AIInHandExpectation(PGame Game, PPlayer Player) { int Basic = 2000; if (!Game.Map.BlockList.Exists((PBlock Block) => Player.Equals(Block.Lord))) { return(Basic); } int TargetNumber = Game.AlivePlayerNumber - 1; int Test = PMath.Sum(Game.PlayerList.FindAll((PPlayer _Player) => _Player.IsAlive && !(_Player.Defensor != null && _Player.Defensor.Model is P_YooHsi && TargetNumber > 1) && _Player.HasHouse).ConvertAll((PPlayer _Player) => { return(PAiMapAnalyzer.MaxValueHouse(Game, Player, true).Value + PAiMapAnalyzer.MinValueHouse(Game, _Player).Value *(_Player.TeamIndex == Player.TeamIndex ? -1 : 1)); })); Basic = Math.Max(Basic, Test); return(Math.Max(Basic, base.AIInHandExpectation(Game, Player))); }
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); }) }); }); } }
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 } }) }); }); } }
public P_LiTaiTaaoChiang() : base(CardName) { Point = 2; Index = 11; 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 = 80, Condition = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); return Player.Equals(InjureTag.ToPlayer) && InjureTag.FromPlayer != null && InjureTag.Injure > 0 && Player.HasHouse; }, AICondition = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); return Player.Money <= InjureTag.Injure || (InjureTag.Injure >= 1000 + PAiMapAnalyzer.MaxValueHouse(Game, Player).Value&& InjureTag.FromPlayer.TeamIndex != Player.TeamIndex); }, Effect = MakeNormalEffect(Player, Card, AIEmitTargets, AIEmitTargets, (PGame Game, PPlayer User, PPlayer Target) => { PNetworkManager.NetworkServer.TellClients(new PPushTextOrder(User.Index.ToString(), "李代桃僵:防止伤害", PPushType.Information.Name)); #region 成就:桃李不言 if (Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName).Injure >= User.Money) { PArch.Announce(Game, User, "桃李不言"); } #endregion Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName).Injure = 0; Game.ThrowHouse(Target, User, CardName); }) }); }); } }
public P_Gryu() : base("关羽") { Sex = PSex.Male; Age = PAge.Medieval; Index = 18; Cost = 20; Tips = "定位:攻辅一体\n" + "难度:简单\n" + "史实:三国时期蜀汉名将,“五虎上将”之一。曾有在万军之中斩杀上将颜良,水淹七军威震华夏等壮举。被尊为“武圣”。\n" + "攻略:\n关羽是一个较为稳定的武将,操作较为简单,【武圣】提供了一种类似诸葛连弩的输出方式,偶数牌的数量保证了技能的发动频率,因而购物中心和研究所是关羽优先选择的方向。即使没有高地价土地,关羽也可以利用废牌增加输出能力。\n" + "【怒斩】是一个稳定的输出技能,在破坏装备卡牌缺乏的环境中容易建立起持久的优势,并可在一定程度上威慑华雄【叫阵】及其他消耗装备牌技能的发动,同时给关羽一个较强的续航能力。"; PSkill WuSheng = new PSkill("武圣") { Initiative = true }; SkillList.Add(WuSheng .AddTimeTrigger( new PTime[] { PPeriod.FirstFreeTime.During, PPeriod.SecondFreeTime.During }, (PTime Time, PPlayer Player, PSkill Skill) => { return(new PTrigger(WuSheng.Name) { IsLocked = false, Player = Player, Time = Time, AIPriority = 190, CanRepeat = true, Condition = (PGame Game) => { return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) && (Player.Area.HandCardArea.CardList.Exists((PCard Card) => Card.Point % 2 == 0) || Player.Area.EquipmentCardArea.CardList.Exists((PCard Card) => Card.Point % 2 == 0)); }, AICondition = (PGame Game) => { int MaxHouseValue = PMath.Max(Game.Teammates(Player), (PPlayer _Player) => { return PAiMapAnalyzer.MaxValueHouse(Game, _Player, true).Value; }).Value; return PAiCardExpectation.FindLeastValuable(Game, Player, Player, true, true, false, true, (PCard Card) => Card.Point % 2 == 0).Value < MaxHouseValue - 500 && P_ShuShangKaaiHua.AIEmitTarget(Game, Player) != null; }, Effect = (PGame Game) => { WuSheng.AnnouceUseSkill(Player); PCard TargetCard = null; if (Player.IsAI) { TargetCard = PAiCardExpectation.FindLeastValuable(Game, Player, Player, true, true, false, true, (PCard Card) => Card.Point % 2 == 0).Key; } else { List <PCard> Waiting = Player.Area.HandCardArea.CardList.FindAll((PCard Card) => Card.Point % 2 == 0); List <PCard> WaitingEquipments = Player.Area.EquipmentCardArea.CardList.FindAll((PCard Card) => Card.Point % 2 == 0); int Result = PNetworkManager.NetworkServer.ChooseManager.Ask(Player, WuSheng.Name, Waiting.ConvertAll((PCard Card) => Card.Name).Concat(WaitingEquipments.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_ShuShangKaaiHua(); 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 Nuvj = new PSkill("怒斩") { Lock = true }; SkillList.Add(Nuvj .AddTrigger( (PPlayer Player, PSkill Skill) => { return(new PTrigger(Nuvj.Name) { IsLocked = true, Player = Player, Time = PTime.Injure.EmitInjure, AIPriority = 200, Condition = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); return InjureTag.Injure > 0 && InjureTag.ToPlayer != null && Player.Equals(InjureTag.FromPlayer) && Player.Area.EquipmentCardArea.CardNumber > InjureTag.ToPlayer.Area.EquipmentCardArea.CardNumber && InjureTag.InjureSource is PBlock; }, Effect = (PGame Game) => { Nuvj.AnnouceUseSkill(Player); Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName).Injure += 600; } }); })); }