public int AIExpect(PGame Game, PPlayer Player, PBlock Block) { int[] dx = { 1, -1, 0, 0 }; int[] dy = { 0, 0, 1, -1 }; int OriginalX = Block.X; int OriginalY = Block.Y; int sum, x, y; sum = PAiMapAnalyzer.HouseValue(Game, Player, Block); 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) { sum += PAiMapAnalyzer.HouseValue(Game, Player, TempBlock); } } else { break; } } while (true); } return(sum); }
private KeyValuePair <KeyValuePair <PBlock, PBlock>, int> MaxLandPair(PGame Game, PPlayer Player) { int Test = int.MinValue; List <PBlock> LandList = Game.Map.BlockList.FindAll((PBlock Block) => Block.Lord != null && !Block.IsBusinessLand); PBlock Ans1 = null; PBlock Ans2 = null; foreach (PBlock Land1 in LandList) { foreach (PBlock Land2 in LandList) { if (Land1.Index < Land2.Index) { int HouseCount1 = Land1.HouseNumber; int HouseCount2 = Land2.HouseNumber; int ValueBefore = PAiMapAnalyzer.HouseValue(Game, Player, Land1) * HouseCount1 + PAiMapAnalyzer.HouseValue(Game, Player, Land2) * HouseCount2; int ValueAfter = PAiMapAnalyzer.HouseValue(Game, Player, Land1) * HouseCount2 + PAiMapAnalyzer.HouseValue(Game, Player, Land2) * HouseCount1; if (ValueAfter - ValueBefore > Test) { Test = ValueAfter - ValueBefore; Ans1 = Land1; Ans2 = Land2; } } } } return(new KeyValuePair <KeyValuePair <PBlock, PBlock>, int>(new KeyValuePair <PBlock, PBlock>(Ans1, Ans2), Test)); }
public P_BaiQi() : base("白起") { Sex = PSex.Male; Age = PAge.Classic; Index = 9; Cost = 25; Tips = "定位:爆发\n" + "难度:简单\n" + "史实:战国时期秦国名将,“战国四大名将”之一,曾在伊阙之战、长平之战中大败三晋军队,歼敌数十万,功封武安君。\n" + "攻略:\n白起是一个强制命中系武将,白起的存在使得对方无法通过【李代桃僵】、【指桑骂槐】一类的牌免除伤害,或通过【八卦阵】、【龙胆】等方式减少伤害,而必须硬吃下伤害的100%(通常这个数字比伤害值高)。随之带来的损失则是收费地的地价永久性减少,很多时候这是不值的,但在必杀一击上,白起一点都不会含糊。"; PSkill CanSha = new PSkill("残杀"); SkillList.Add(CanSha .AddTrigger( (PPlayer Player, PSkill Skill) => { return(new PTrigger(CanSha.Name) { IsLocked = false, Player = Player, Time = PTime.Injure.EmitInjure, AIPriority = 100, Condition = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); return InjureTag.Injure > 0 && InjureTag.ToPlayer != null && Player.Equals(InjureTag.FromPlayer) && InjureTag.InjureSource is PBlock && ((PBlock)InjureTag.InjureSource).Price >= 1000; }, AICondition = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); if (InjureTag.ToPlayer.TeamIndex != Player.TeamIndex) { int Benefit = PMath.Percent(InjureTag.Injure, 100); if (Benefit + InjureTag.Injure >= InjureTag.ToPlayer.Money) { // 一击必杀 return true; } if (Benefit >= 2000) { PBlock Source = (PBlock)InjureTag.InjureSource; int Cost = 1000 + PAiMapAnalyzer.HouseValue(Game, Player, Source) * Source.HouseNumber * 1000 / Source.Price; if (Cost < Benefit) { return true; } } } return false; }, Effect = (PGame Game) => { CanSha.AnnouceUseSkill(Player); PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); PBlock Source = (PBlock)InjureTag.InjureSource; Source.Price -= 1000; PNetworkManager.NetworkServer.TellClients(new PRefreshBlockBasicOrder(Source)); Game.LoseMoney(InjureTag.ToPlayer, PMath.Percent(InjureTag.Injure, 100)); } }); })); }
public override int AIInHandExpectation(PGame Game, PPlayer Player) { int Basic = 2500; int Test = PMath.Max(Game.Map.BlockList.FindAll((PBlock Block) => Block.Lord != null && Block.Lord.TeamIndex == Player.TeamIndex), (PBlock Block) => { return(PAiMapAnalyzer.HouseValue(Game, Block.Lord, Block)); }).Value; Basic = Math.Max(Basic, Test); return(Math.Max(Basic, base.AIInHandExpectation(Game, Player))); }
public static PBlock AIEmitTarget(PGame Game, PPlayer Player) { return(PMath.Max(Game.Map.BlockList.FindAll((PBlock Block) => Block.Lord != null && Block.Lord.TeamIndex == Player.TeamIndex), (PBlock Block) => { return PAiMapAnalyzer.HouseValue(Game, Block.Lord, Block); }).Key); }
public P_ShuShangKaaiHua() : base(CardName) { Point = 5; Index = 29; 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 = 100, Condition = (PGame Game) => { return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) && Game.Map.BlockList.Exists((PBlock Block) => Block.Lord != null); }, AICondition = (PGame Game) => { return PMath.Max(Game.Map.BlockList.FindAll((PBlock Block) => Block.Lord != null && Block.Lord.TeamIndex == Player.TeamIndex), (PBlock Block) => { return PAiMapAnalyzer.HouseValue(Game, Block.Lord, Block); }).Value >= 2500; }, Effect = (PGame Game) => { List <PPlayer> Targets = new List <PPlayer>(); Game.Monitor.CallTime(PTime.Card.AfterEmitTargetTime, new PUseCardTag(Card, Player, Targets)); if (Player.Area.EquipmentCardArea.CardList.Contains(Card)) { Game.CardManager.MoveCard(Card, Player.Area.EquipmentCardArea, Game.CardManager.SettlingArea); } else { Game.CardManager.MoveCard(Card, Player.Area.HandCardArea, Game.CardManager.SettlingArea); } Game.Monitor.CallTime(PTime.Card.AfterBecomeTargetTime, new PUseCardTag(Card, Player, Targets)); PBlock Target = null; if (Player.IsAI) { Target = AIEmitTarget(Game, Player); } else { Target = PNetworkManager.NetworkServer.ChooseManager.AskToChooseBlock(Player, "树上开花[选择有主土地]", (PBlock Block) => Block.Lord != null); } if (Target != null) { PNetworkManager.NetworkServer.TellClients(new PHighlightBlockOrder(Target.Index.ToString())); Game.GetHouse(Target, 1); #region 成就:花开富贵 if (Target.BusinessType.Equals(PBusinessType.Park)) { PArch.Announce(Game, Player, "花开富贵"); } #endregion } Game.CardManager.MoveCard(Card, Game.CardManager.SettlingArea, Game.CardManager.ThrownCardHeap); Game.Monitor.CallTime(PTime.Card.EndSettleTime, new PUseCardTag(Card, Player, Targets)); } }); }); } }
public P_FuTiChoouHsin() : base(CardName) { Point = 4; Index = 19; foreach (PTime Time in new PTime[] { PTime.Injure.AfterAcceptInjure }) { MoveInHandTriggerList.Add((PPlayer Player, PCard Card) => { return(new PTrigger(CardName) { IsLocked = false, Player = Player, Time = Time, AIPriority = 60, Condition = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); return Player.Equals(InjureTag.ToPlayer) && InjureTag.FromPlayer != null && InjureTag.Injure > 0 && InjureTag.InjureSource != null && (InjureTag.InjureSource is PBlock) && ((PBlock)InjureTag.InjureSource).HouseNumber > 0; }, AICondition = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); PBlock Block = (PBlock)InjureTag.InjureSource; return Block.Lord != null && Block.Lord.TeamIndex != Player.TeamIndex && (PAiMapAnalyzer.HouseValue(Game, Block.Lord, Block) >= 5400 || Player.Money <= 3000); }, Effect = (PGame Game) => { List <PPlayer> Targets = new List <PPlayer>(); Game.Monitor.CallTime(PTime.Card.AfterEmitTargetTime, new PUseCardTag(Card, Player, Targets)); Game.CardManager.MoveCard(Card, Player.Area.HandCardArea, Game.CardManager.SettlingArea); Game.Monitor.CallTime(PTime.Card.AfterBecomeTargetTime, new PUseCardTag(Card, Player, Targets)); PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); PBlock Block = (PBlock)InjureTag.InjureSource; #region 成就:破釜沉舟 if (Block.HouseNumber >= 10) { PArch.Announce(Game, Player, "破釜沉舟"); } #endregion Game.LoseHouse(Block, Block.HouseNumber); Game.CardManager.MoveCard(Card, Game.CardManager.SettlingArea, Game.CardManager.ThrownCardHeap); Game.Monitor.CallTime(PTime.Card.EndSettleTime, new PUseCardTag(Card, Player, Targets)); } }); }); } }
public P_Xdyu() : base("项羽") { Sex = PSex.Male; Age = PAge.Classic; Index = 17; Cost = 30; Tips = "定位:攻击\n" + "难度:中等\n" + "史实:秦末西楚霸王。曾在巨鹿之战中破釜沉舟,大破秦军。\n" + "攻略:\n项羽是一个十分考验玩家判断力的武将,【霸王】在小图的发挥显著强于大图,能够配合虞姬的【剑舞】,也可以增加天灾对敌人的伤害,还可以在一定程度上辅助队友的输出,范围为1限制了项羽的跨队列输出,但敌人越多就越强,颇有乌江快战之风范。\n" + "【沉舟】是一个爆发力极强的技能,相应地也要付出较大的代价。要想达到正收益,技能发动往往是在中后期,而购物中心往往是项羽的不二选择,当现金小于18000时【沉舟】已经是正收益,而对于领地来说只需花费小于正常花费即可一试。当然,在现金较低的情况下,项羽甚至可以连续【沉舟】,在高风险的同时可能获得极高的回报,或可重振西楚霸业。\n"; PSkill Bawh = new PSkill("霸王"); SkillList.Add(Bawh .AddTimeTrigger( new PTime[] { PTime.Injure.AcceptInjure }, (PTime Time, PPlayer Player, PSkill Skill) => { return(new PTrigger(Bawh.Name) { IsLocked = false, Player = Player, Time = Time, AIPriority = 200, Condition = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); return InjureTag.Injure > 0 && InjureTag.ToPlayer != null && !Player.Equals(InjureTag.ToPlayer) && InjureTag.ToPlayer.Distance(Player) <= 1; }, AICondition = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); return InjureTag.ToPlayer.TeamIndex != Player.TeamIndex; }, Effect = (PGame Game) => { Bawh.AnnouceUseSkill(Player); PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); InjureTag.Injure += 800; } }); })); PSkill Ifvb = new PSkill("沉舟") { Initiative = true }; SkillList.Add(Ifvb .AnnounceTurnOnce() .AddTimeTrigger( new PTime[] { PPeriod.FirstFreeTime.During, PPeriod.SecondFreeTime.During }, (PTime Time, PPlayer Player, PSkill Skill) => { return(new PTrigger(Ifvb.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.RemainLimit(Ifvb.Name) && Player.Position.Lord != null; }, AICondition = (PGame Game) => { if (Player.Money <= 1000) { return false; } return PMath.Percent(Player.Money, 50) + 1500 < 3 * PAiMapAnalyzer.HouseValue(Game, Player, Player.Position); }, Effect = (PGame Game) => { Ifvb.AnnouceUseSkill(Player); Game.LoseMoney(Player, PMath.Percent(Player.Money, 50)); Game.GetHouse(Player.Position, 3); Ifvb.DeclareUse(Player); } }); })); }
public P_WuZhao() : base("武瞾") { Sex = PSex.Female; Age = PAge.Renaissance; Index = 15; Cost = 30; Tips = "定位:攻击\n" + "难度:困难\n" + "史实:武周皇帝,中国历史上唯一统一王朝女皇帝。在位期间以酷吏政治闻名,晚年骄奢淫逸,致使唐朝中衰。\n" + "攻略:\n武瞾有且仅有两个限定技,对两个限定技的使用能力决定了她的存在感和强度。武瞾玩家对于局势的观察能力非常重要,因为发动时机的选择直接影响到武瞾的强度。\n如果选择的发动时机得当,武瞾的强度是很高的。【女权】在储存了大量伤害类计策的情况下,可以带来惊人的爆发伤害,因此在【女权】发动之前,【瞒天过海】、【关门捉贼】等牌并不建议使用。使用【以逸待劳】加【浑水摸鱼】的组合精准打击敌人也是优秀的策略。\n【迁都】的发动时机更依靠于玩家把握力,原则上越晚【迁都】可以赠送的房屋越多,但如果【迁都】过晚,则可能建造的城堡不够发挥输出。【迁都】和【上屋抽梯】也是很好的组合。"; PSkill NvQuan = new PSkill("女权") { Initiative = true }; SkillList.Add(NvQuan .AnnounceGameOnce() .AddTimeTrigger( new PTime[] { PPeriod.FirstFreeTime.During, PPeriod.SecondFreeTime.During }, (PTime Time, PPlayer Player, PSkill Skill) => { return(new PTrigger(NvQuan.Name) { IsLocked = false, Player = Player, Time = Time, AIPriority = 250, CanRepeat = true, Condition = (PGame Game) => { return Player.Equals(Game.NowPlayer) && (Player.IsAI || Game.Logic.WaitingForEndFreeTime()) && Player.RemainLimit(NvQuan.Name); }, AICondition = (PGame Game) => { /* * 女权的发动条件: * 【只会在第一个空闲时间点发动】 * 观察场上所有女性直到你的下回合开始的过程 * 即,对场上所有人的下一回合行动,如果领主为女性,记录相应的伤害收益 * 然后,对 * 注:在没发动女权的情况下,武瞾将不会使用以下牌: * 瞒天过海、关门捉贼、笑里藏刀、反间计、打草惊蛇、抛砖引玉、以逸待劳、浑水摸鱼 * * 当有女权状态且有浑水摸鱼的情况下,女性角色的以逸待劳将指定所有敌方角色为目标 */ if (!Game.NowPeriod.Equals(PPeriod.FirstFreeTime)) { return false; } int ExpectSum = 0; Game.AlivePlayers().FindAll((PPlayer _Player) => !_Player.Equals(Player)).ForEach((PPlayer _Player) => { List <PBlock> NextBlocks = PAiMapAnalyzer.NextBlocks(Game, _Player); int TempSum = 0; NextBlocks.ForEach((PBlock Block) => { if (Block.Lord != null && Block.Lord.TeamIndex != _Player.TeamIndex && Block.Lord.Sex.Equals(PSex.Female)) { TempSum += 4000 * (Block.Lord.TeamIndex == Player.TeamIndex ? 1 : -1); } }); TempSum /= Math.Max(1, NextBlocks.Count); ExpectSum += TempSum; }); ExpectSum += 4000 * Player.Area.HandCardArea.CardList.FindAll((PCard Card) => Card.Model is P_ManTiienKuoHai).Count; ExpectSum += Game.Enemies(Player).FindAll((PPlayer _Player) => _Player.Position.HouseNumber == 0).Count * 4000 * Player.Area.HandCardArea.CardList.FindAll((PCard Card) => Card.Model is P_KuanMevnChoTsev).Count; ExpectSum += 4000 * Math.Min(Player.Area.HandCardArea.CardList.FindAll((PCard Card) => Card.Type.IsEquipment()).Count, Player.Area.HandCardArea.CardList.FindAll((PCard Card) => Card.Model is P_HsiaoLiTsaangTao).Count); if (Player.Area.HandCardArea.CardList.Exists((PCard Card) => { return Card.Model is P_FanChienChi || Card.Model is P_TaTsaaoChingShev || Card.Model is P_PaaoChuanYinYoo || Card.Model is P_IITaiLao; })) { ExpectSum += 4000 * Game.Enemies(Player).Count * Player.Area.HandCardArea.CardList.FindAll((PCard Card) => Card.Model is P_HunShuiMoYoo).Count; } return ExpectSum > 6000; }, Effect = (PGame Game) => { NvQuan.AnnouceUseSkill(Player); Game.AlivePlayers().ForEach((PPlayer _Player) => { if (_Player.Sex.Equals(PSex.Female)) { _Player.Tags.CreateTag(NvQuanTag); } }); NvQuan.DeclareUse(Player); } }); }) .AddTrigger((PPlayer Player, PSkill Skill) => { return(new PTrigger(NvQuan.Name + "[增加伤害]") { IsLocked = true, Player = null, Time = PTime.Injure.EmitInjure, Condition = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); return (InjureTag.FromPlayer != null && InjureTag.FromPlayer.Tags.ExistTag(NvQuanTag.Name)) && (InjureTag.InjureSource is PCard || InjureTag.InjureSource is PBlock); }, Effect = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); NvQuan.AnnouceUseSkill(InjureTag.FromPlayer); InjureTag.Injure += 2000; } }); }).AddTrigger((PPlayer Player, PSkill Skill) => { return(new PTrigger(NvQuan.Name + "[效果结束]") { IsLocked = true, Player = null, Time = PPeriod.StartTurn.Start, Condition = (PGame Game) => { return Game.NowPlayer.Equals(Player); }, Effect = (PGame Game) => { Game.AlivePlayers().ForEach((PPlayer _Player) => { _Player.Tags.PopTag <PTag>(NvQuanTag.Name); }); } }); })); KeyValuePair <PBlock, int> QianDuTarget(PGame Game, PPlayer Player) { int BusinessLandCount = Game.Map.BlockList.FindAll((PBlock Block) => Player.Equals(Block.Lord) && Block.IsBusinessLand).Count; return(PMath.Max(Game.Map.BlockList.FindAll((PBlock Block) => Player.Equals(Block.Lord) && !Block.IsBusinessLand), (PBlock Block) => { int HouseNumber = Game.GetBonusHouseNumberOfCastle(Player, Block); HouseNumber += BusinessLandCount; return HouseNumber * PAiMapAnalyzer.HouseValue(Game, Player, Block); })); } PSkill QianDu = new PSkill("迁都") { Initiative = true }; SkillList.Add(QianDu .AnnounceGameOnce() .AddTimeTrigger( new PTime[] { PPeriod.FirstFreeTime.During, PPeriod.SecondFreeTime.During }, (PTime Time, PPlayer Player, PSkill Skill) => { return(new PTrigger(QianDu.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(QianDu.Name) && Game.Map.BlockList.Exists((PBlock Block) => Player.Equals(Block.Lord) && !Block.IsBusinessLand); }, AICondition = (PGame Game) => { if (!Game.NowPeriod.Equals(PPeriod.FirstFreeTime)) { return false; } return QianDuTarget(Game, Player).Value > 12000; }, Effect = (PGame Game) => { QianDu.AnnouceUseSkill(Player); PBlock TargetBlock = null; if (Player.IsAI) { TargetBlock = QianDuTarget(Game, Player).Key; } else { TargetBlock = PNetworkManager.NetworkServer.ChooseManager.AskToChooseBlock(Player, QianDu.Name, (PBlock Block) => { return Player.Equals(Block.Lord) && !Block.IsBusinessLand; }); } if (TargetBlock != null) { int BusinessLandCount = Game.Map.BlockList.FindAll((PBlock Block) => Player.Equals(Block.Lord) && Block.IsBusinessLand).Count; int HouseNumber = Game.GetBonusHouseNumberOfCastle(Player, TargetBlock) + BusinessLandCount; Game.MovePosition(Player, Player.Position, TargetBlock); PNetworkManager.NetworkServer.TellClients(new PHighlightBlockOrder(TargetBlock.Index.ToString())); TargetBlock.BusinessType = PBusinessType.Castle; Game.GetHouse(TargetBlock, HouseNumber); } QianDu.DeclareUse(Player); } }); })); }
public P_XuanWu() : base("玄武") { Sex = PSex.Male; Age = PAge.Ancient; Index = 1004; Cost = 1; Tips = string.Empty; CanBeChoose = false; //PSkill ShenShou = new PSkill("神兽") { // Lock = true //}; //SkillList.Add(ShenShou // .AddTrigger( // (PPlayer Player, PSkill Skill) => { // return new PTrigger(ShenShou.Name) { // IsLocked = true, // Player = Player, // Time = PTime.StartGameTime, // AIPriority = 100, // Effect = (PGame Game) => { // ShenShou.AnnouceUseSkill(Player); // Game.GetMoney(Player, 30000); // } // }; // }) // .AddTrigger( // (PPlayer Player, PSkill Skill) => { // return new PTrigger(ShenShou.Name) { // IsLocked = true, // Player = Player, // Time = PPeriod.StartTurn.During, // AIPriority = 100, // Condition = (PGame Game) => { // return Player.Equals(Game.NowPlayer); // }, // Effect = (PGame Game) => { // ShenShou.AnnouceUseSkill(Player); // Game.GetMoney(Player, 500); // } // }; // })); PSkill XuanWu = new PSkill("玄武") { Lock = true }; SkillList.Add(XuanWu .AddTrigger( (PPlayer Player, PSkill Skill) => { return(new PTrigger(XuanWu.Name) { IsLocked = true, Player = Player, Time = PTime.Injure.AcceptInjure, AIPriority = 250, Condition = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); return InjureTag.Injure > 0 && Player.Equals(InjureTag.ToPlayer) && InjureTag.InjureSource is PBlock && Player.LandNumber > 0; }, Effect = (PGame Game) => { PInjureTag InjureTag = Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName); XuanWu.AnnouceUseSkill(Player); int MinHouse = PMath.Min(Game.Map.FindBlock(Player), (PBlock Block) => Block.HouseNumber).Value; PBlock Target = PMath.Max(Game.Map.FindBlock(Player).FindAll((PBlock Block) => Block.HouseNumber == MinHouse), (PBlock Block) => PAiMapAnalyzer.HouseValue(Game, Player, Block)).Key; Game.GetHouse(Target, 1); } }); })); }