public override int AIInHandExpectation(PGame Game, PPlayer Player) { int Basic = 1000; int Sum = 0; List <PPlayer> Targets = AIEmitTargets(Game, Player); Targets.ForEach((PPlayer _Player) => { if (!(_Player.Defensor != null && _Player.Defensor.Model is P_YooHsi && Targets.Count > 1)) { int Cof = (_Player.TeamIndex == Player.TeamIndex ? 1 : -1); if (_Player.General is P_LiuJi) { Sum += 1200 * 6 / 5 * Cof; } else { int Choose1 = PAiMapAnalyzer.ChangeFaceExpect(Game, _Player); int Choose2 = _Player.Money <= 1000 ? -30000 : -1000; int Chosen = Math.Max(Choose1, Choose2); Sum += Chosen * Cof; } } }); Sum = Sum * 5 / 6; Basic = Math.Max(Basic, Sum); return(Math.Max(Basic, base.AIInHandExpectation(Game, Player))); }
static public List <PPlayer> AIEmitTargets(PGame Game, PPlayer Player, int BaseValue) { int MaxMoney = PMath.Max(Game.PlayerList, (PPlayer _Player) => _Player.Money).Value; PPlayer Target = PMath.Max(Game.PlayerList.FindAll((PPlayer _Player) => _Player.Money == MaxMoney), (PPlayer _Player) => { if (Player.TeamIndex == _Player.TeamIndex) { return(PAiMapAnalyzer.ChangeFaceExpect(Game, _Player) - BaseValue); } else { return(-PAiMapAnalyzer.ChangeFaceExpect(Game, _Player) - BaseValue); } }, true).Key; return(new List <PPlayer>() { Target }); }
public override int AIInHandExpectation(PGame Game, PPlayer Player) { int Basic = 3000; int MinValue = int.MaxValue; int MaxValue = int.MinValue; PBlock Target = null; PBlock Block = Player.Position.NextBlock; for (int i = 0; i < 6; ++i, Block = Block.NextBlock) { int Value = PAiMapAnalyzer.Expect(Game, Player, Block); MinValue = Math.Min(Value, MinValue); if (Value > MaxValue) { Target = Block; } MaxValue = Math.Max(Value, MaxValue); } Basic = Math.Max(Basic, (MaxValue - MinValue) / 2 + PAiMapAnalyzer.ChangeFaceExpect(Game, Player, Target)); return(Math.Max(Basic, base.AIInHandExpectation(Game, Player))); }
/// <summary> /// 伤害预测收益,无修正情形为基本伤害的2倍or0 /// </summary> /// <param name="Game"></param> /// <param name="Player">视点玩家</param> /// <param name="FromPlayer">造成伤害的玩家</param> /// <param name="Target"></param> /// <param name="BaseInjure">基本伤害量</param> /// <param name="Source">伤害方式</param> /// <returns></returns> public static int InjureExpect(PGame Game, PPlayer Player, PPlayer FromPlayer, PPlayer Target, int BaseInjure, PObject Source) { #region 防止伤害的情况 if (Player.OutOfGame || !Target.CanBeInjured || (FromPlayer == null && Target.HasEquipment <P_YinYangChing>()) || (BaseInjure <= 1000 && Target.HasEquipment <P_NanManHsiang>())) { return(0); } #endregion int FromCof = FromPlayer == null ? 0 : (Player.TeamIndex == FromPlayer.TeamIndex ? 1 : -1); int ToCof = (Player.TeamIndex != Target.TeamIndex ? 1 : -1); int Sum = 0; #region 成伤害时发动的技能:古锭刀,龙胆,太极,苍狼,趁火打劫,女权,怒斩 if (FromPlayer != null) { if (FromPlayer.Tags.ExistTag(P_WuZhao.NvQuanTag.Name) && (Source is PBlock || Source is PCard)) { BaseInjure += 2000; } if (FromPlayer.General is P_Gryu && Source is PBlock && FromPlayer.Area.EquipmentCardArea.CardNumber > Target.Area.EquipmentCardArea.CardNumber) { BaseInjure += 600; } if ((Target.Area.HandCardArea.CardNumber == 0 || (FromPlayer.General is P_IzayoiMiku && FromPlayer.TeamIndex != Target.TeamIndex)) && FromPlayer.HasEquipment <P_KuTingTao>() && Source is PBlock) { BaseInjure *= 2; } if (FromPlayer.General is P_ZhaoYun && FromPlayer.Tags.ExistTag(P_ZhaoYun.PDanTag.TagName)) { if (P_ZhaoYun.LongDanICondition(Game, FromPlayer, Target, BaseInjure)) { BaseInjure = PMath.Percent(BaseInjure, 150); } } if (FromPlayer.General is P_ZhangSanFeng && Player.Tags.ExistTag(P_ZhangSanFeng.PYinTag.Name)) { BaseInjure += PMath.Percent(BaseInjure, 20); } } if (Target.Area.OwnerCardNumber > 0) { if (FromPlayer != null && FromPlayer.HasEquipment <P_TsaangLang>() && Source != null && Source is PCard Card && Card.Model is PSchemeCardModel) { Sum += 2000 * FromCof + 2000 * ToCof; } if (Player.HasInHand <P_CheevnHuoTaChieh>()) { Sum += 2000 + 2000 * ToCof; } } #endregion #region 受到伤害时发动的技能:八卦阵,百花裙,龙胆,太极,霸王,白衣,镇魂曲 if (Target.HasEquipment <P_PaKuaChevn>()) { // 美九改版,八卦阵有效 if (Target.General is P_LiuJi) { Sum -= 1000 * ToCof; BaseInjure = PMath.Percent(BaseInjure, 50); } else { BaseInjure = (BaseInjure + PMath.Percent(BaseInjure, 50)) / 2; } } if (Target.HasEquipment <P_PaiHuaChooon>() && FromPlayer != null && !Target.Sex.Equals(FromPlayer.Sex)) { BaseInjure = PMath.Percent(BaseInjure, 50); } if (Target.General is P_ZhaoYun && Target.Tags.ExistTag(P_ZhaoYun.PDanTag.TagName)) { if (P_ZhaoYun.LongDanIICondition(Game, Target, FromPlayer, BaseInjure)) { BaseInjure = PMath.Percent(BaseInjure, 50); } } if (Target.General is P_ZhangSanFeng && Target.Tags.ExistTag(P_ZhangSanFeng.PYangTag.Name)) { BaseInjure -= PMath.Percent(BaseInjure, 20); } if (Game.AlivePlayers().Exists((PPlayer _Player) => { return(!_Player.Equals(Target) && _Player.TeamIndex != Target.TeamIndex && _Player.Distance(Target) <= 1 && _Player.General is P_Xdyu); })) { BaseInjure += 800; } if (Target.General is P_LvMeng && Target.Area.EquipmentCardArea.CardNumber > 0 && !(FromPlayer.General is P_IzayoiMiku && FromPlayer.TeamIndex != Target.TeamIndex)) { BaseInjure = Math.Min(PMath.Percent(BaseInjure, 50) + 2000, BaseInjure); } if (Target.General is P_IzayoiMiku && Game.AlivePlayersExist <P_Gabriel>()) { BaseInjure -= PMath.Percent(BaseInjure, 20); } #endregion int ExpectTargetMoney = Target.Money - BaseInjure; #region 濒死时发动的技能:蓄谋,精灵加护,圣女 if (ExpectTargetMoney <= 0) { bool flag = true; if (!(FromPlayer.General is P_LvZhi)) { if (Target.General is P_Gabriel) { flag = false; // 破军歌姬的复活 if (FromPlayer.Equals(Target)) { // 对自己伤害,不触发复活 } else if (FromPlayer.TeamIndex == Target.TeamIndex) { // 美九自己的伤害,触发复活大利好 Sum += 15000; } else { // 对方的伤害 if (Game.AlivePlayersExist <P_IzayoiMiku>()) { // 美九未死,大不利 Sum -= 15000; } else { flag = true; } } } else if (Game.AlivePlayersExist <P_JeanneDarc>() && Source is PBlock) { PPlayer Jeanne = Game.AlivePlayers().Find((PPlayer _Player) => _Player.General is P_JeanneDarc); if (Jeanne.TeamIndex == Target.TeamIndex && Jeanne.Area.OwnerCardNumber > 0 && Jeanne.Money > 5000 && ExpectTargetMoney > -10000) { flag = false; Sum += (5000 + (Target.Equals(Jeanne) ? 0 : 2000) - 2000 * Jeanne.Area.OwnerCardNumber) * (Target.TeamIndex == Player.TeamIndex ? 1 : -1); } } } if (flag) { Sum += 30000 * ToCof; } } #endregion Sum += BaseInjure * ToCof; Sum += BaseInjure * FromCof; #region 受到伤害后:离骚 if (Target.General is P_QuYuan) { // Sum -= 900 * ToCof; // 因为离骚总是会发动,其他伤害也会触发,天灾也会触发 // 所以不应该将离骚计入伤害计算 } #endregion #region 伤害结束后:风云 if (FromPlayer != null && FromPlayer.General is P_ChenYuanYuan) { Sum += 200 * FromCof; } if (Target.General is P_ChenYuanYuan) { Sum -= 200 * ToCof; } #endregion #region 队友间平衡:自身和目标的合理阈值为50%-200% if (FromPlayer.TeamIndex == Target.TeamIndex) { if (FromPlayer.General is P_IzayoiMiku && Target.General is P_Gabriel) { // 美九对破军歌姬的伤害,积极性 Sum += 2000; } else if (FromPlayer.General is P_Gabriel && Target.General is P_IzayoiMiku) { // 破军歌姬对美九的伤害,消极性 Sum -= 20000; } else { if (FromPlayer.Money > ExpectTargetMoney * 2) { Sum -= 2000; } else if (FromPlayer.Money >= Target.Money) { Sum -= 100; } else if (FromPlayer.Money < Target.Money * 2) { Sum += 1000; } } } #endregion #region 美九歌厅的翻面效果 if (Source is PBlock Block && Block.BusinessType.Equals(PBusinessType.Club)) { Sum += PAiMapAnalyzer.ChangeFaceExpect(Game, Target) * (-ToCof); } #endregion #region 贞德设为高嘲讽 if (Game.AlivePlayersExist <P_JeanneDarc>()) { PPlayer Jeanne = Game.AlivePlayers().Find((PPlayer _Player) => _Player.General is P_JeanneDarc); if (Jeanne.TeamIndex != Player.TeamIndex) { if (Target.Equals(Jeanne) && Sum > 0) { Sum += PMath.Percent(Sum, 20); } } } #endregion return(Sum); }
public P_FanChienChi() : base(CardName) { Point = 6; Index = 33; 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 = 65, Condition = PTrigger.Initiative(Player), AICondition = (PGame Game) => { if (Player.General is P_WuZhao && Player.RemainLimit(PSkillInfo.女权.Name)) { return false; } return AIInHandExpectation(Game, Player) > 1000 && P_PanYue.XianJuTest(Game, Player); }, Effect = MakeNormalEffect(Player, Card, AIEmitTargets, AIEmitTargets, (PGame Game, PPlayer User, PPlayer Target) => { int ChosenNumber = 1; if (Target.IsAI) { if (Target.General is P_LiuJi) { ChosenNumber = 6; } else { ChosenNumber = PMath.RandInt(1, 6); } } else { ChosenNumber = PNetworkManager.NetworkServer.ChooseManager .Ask1To6(Target, "反间计[选择1个数字]"); } PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Target.Name + "选择了" + ChosenNumber)); int JudgeResult = Game.Judge(Target, 6); if (JudgeResult != ChosenNumber) { // 故弄玄虚失效 User.Tags.PopTag <PTag>(Gunxx); int Test = 0; if (Target.IsAI) { int Choose1 = PAiMapAnalyzer.ChangeFaceExpect(Game, Target); int Choose2 = Target.Money <= 1000 ? -30000 : -1000; Test = (Choose1 > Choose2 ? 0 : 1); } else { Test = PNetworkManager.NetworkServer.ChooseManager .Ask(Target, "反间计[选择一项]", new string[] { "翻面", "弃1000" }); } if (Test == 0) { PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Target.Name + "选择了翻面")); Game.ChangeFace(Target); } else { PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Target.Name + "选择了弃1000")); Game.LoseMoney(Target, 1000); } } }, (PGame Game, PPlayer User, List <PPlayer> Targets) => { // 为了故弄玄虚成就做的初始化 if (Targets.Count > 0) { User.Tags.CreateTag(new PTag(Gunxx) { Visible = false }); } }, (PGame Game, PPlayer User, List <PPlayer> Targets) => { // 判定故弄玄虚 if (User.Tags.PopTag <PTag>(Gunxx) != null) { PArch.Announce(Game, User, Gunxx); } }) }); }); } }
public P_ShevngTungChiHsi() : base(CardName) { Point = 1; Index = 6; foreach (PTime Time in new PTime[] { PTime.Card.AfterEmitTargetTime }) { MoveInHandTriggerList.Add((PPlayer Player, PCard Card) => { return(new PTrigger(CardName) { IsLocked = false, Player = Player, Time = Time, AIPriority = 100, Condition = (PGame Game) => { PUseCardTag UseCardTag = Game.TagManager.FindPeekTag <PUseCardTag>(PUseCardTag.TagName); return UseCardTag.TargetList.Count == 1 && UseCardTag.Card.Type.Equals(PCardType.SchemeCard) && !UseCardTag.Card.Name.Equals(P_ChinChaanToowChiiao.CardName); }, AICondition = (PGame Game) => { PUseCardTag UseCardTag = Game.TagManager.FindPeekTag <PUseCardTag>(PUseCardTag.TagName); if (UseCardTag.Card.Model.Name.Equals(P_ManTiienKuoHai.CardName) || UseCardTag.Card.Model.Name.Equals(P_WeiWeiChiuChao.CardName) || UseCardTag.Card.Model.Name.Equals(P_CheevnHuoTaChieh.CardName) || UseCardTag.Card.Model.Name.Equals(P_LiTaiTaaoChiang.CardName) || UseCardTag.Card.Model.Name.Equals(P_ShunShouChiienYang.CardName) || UseCardTag.Card.Model.Name.Equals(P_TaTsaaoChingShev.CardName) || UseCardTag.Card.Model.Name.Equals(P_KuanMevnChoTsev.CardName) || UseCardTag.Card.Model.Name.Equals(P_ChihSangMaHuai.CardName) || UseCardTag.Card.Model.Name.Equals(P_FanChienChi.CardName) || UseCardTag.Card.Model.Name.Equals(P_ChiehTaoShaJevn.CardName) || UseCardTag.Card.Model.Name.Equals(P_PaaoChuanYinYoo.CardName) || UseCardTag.Card.Model.Name.Equals(P_ChiaTaoFaKuo.CardName)) { return UseCardTag.TargetList[0].TeamIndex == Player.TeamIndex && UseCardTag.User.TeamIndex != Player.TeamIndex; } else if (UseCardTag.Card.Name.Equals(P_WuChungShevngYou.CardName) || UseCardTag.Card.Model.Name.Equals(P_AnTuCheevnTsaang.CardName) || UseCardTag.Card.Model.Name.Equals(P_ChiehShihHuanHun.CardName) || UseCardTag.Card.Model.Name.Equals(P_YooenChiaoChinKung.CardName) || UseCardTag.Card.Model.Name.Equals(P_TsouWeiShangChi.CardName)) { return UseCardTag.TargetList[0].TeamIndex != Player.TeamIndex; } else if (UseCardTag.Card.Model.Name.Equals(P_YooChiinKuTsung.CardName)) { return UseCardTag.TargetList[0].TeamIndex == Player.TeamIndex && Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName).Injure <= 3000; } else if (UseCardTag.Card.Model.Name.Equals(P_ChiinTsevChiinWang.CardName)) { return UseCardTag.User.TeamIndex != Player.TeamIndex && PMath.Max(Game.PlayerList, (PPlayer _Player) => { if (Player.TeamIndex == _Player.TeamIndex) { return PAiMapAnalyzer.ChangeFaceExpect(Game, _Player); } else { return -PAiMapAnalyzer.ChangeFaceExpect(Game, _Player); } }).Value - PAiMapAnalyzer.ChangeFaceExpect(Game, UseCardTag.TargetList[0]) * (UseCardTag.TargetList[0].TeamIndex == Player.TeamIndex ? 1 : -1) >= 3000; } else if (UseCardTag.Card.Model.Name.Equals(P_ShangWuChoouTii.CardName)) { int NowValue = PAiMapAnalyzer.Expect(Game, UseCardTag.TargetList[0], UseCardTag.TargetList[0].Position) * (UseCardTag.TargetList[0].TeamIndex == Player.TeamIndex ? 1 : -1); int MaxValue = PMath.Max(Game.PlayerList, (PPlayer _Player) => { if (_Player.TeamIndex == Player.TeamIndex) { return PAiMapAnalyzer.Expect(Game, _Player, _Player.Position); } else { return -PAiMapAnalyzer.Expect(Game, _Player, _Player.Position); } }, true).Value; return MaxValue - NowValue >= 3000; } else if (UseCardTag.Card.Model.Name.Equals(P_KuungCheevngChi.CardName)) { KeyValuePair <PPlayer, int> Target = PMath.Max(Game.Enemies(Player), (PPlayer _Player) => _Player.Area.HandCardArea.CardNumber); return Target.Value >= 3 && !UseCardTag.TargetList[0].Equals(Target.Key); } else if (UseCardTag.Card.Model.Name.Equals(P_HsiaoLiTsaangTao.CardName)) { return UseCardTag.User.TeamIndex != Player.TeamIndex && (UseCardTag.TargetList[0].TeamIndex != Player.TeamIndex || UseCardTag.TargetList[0].Area.EquipmentCardArea.CardNumber > 0 || UseCardTag.TargetList[0].Money <= 500); } return false; }, 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)); PUseCardTag UseCardTag = Game.TagManager.FindPeekTag <PUseCardTag>(PUseCardTag.TagName); PPlayer Target = null; if (Player.IsUser) { List <PPlayer> TargetList = new List <PPlayer>() { null }; TargetList.AddRange(Game.PlayerList.FindAll((PPlayer _Player) => !_Player.Equals(UseCardTag.TargetList[0]) && _Player.IsAlive)); List <string> TargetNameList = TargetList.ConvertAll((PPlayer _Player) => { if (_Player == null) { return "令该计策牌无效"; } else { return "转移给:" + _Player.Name; } }); Target = TargetList[PNetworkManager.NetworkServer.ChooseManager.Ask(Player, "选择一项", TargetNameList.ToArray())]; } else { if (UseCardTag.Card.Model.Name.Equals(P_ManTiienKuoHai.CardName)) { Target = PAiTargetChooser.InjureTarget(Game, UseCardTag.User, Player, PTrigger.Except(UseCardTag.TargetList[0]), 700, UseCardTag.Card, true); } else if (UseCardTag.Card.Model.Name.Equals(P_KuanMevnChoTsev.CardName) || UseCardTag.Card.Model.Name.Equals(P_ChiaTaoFaKuo.CardName)) { Target = PAiTargetChooser.InjureTarget(Game, UseCardTag.User, Player, PTrigger.Except(UseCardTag.TargetList[0]), 1000, UseCardTag.Card, true); } else if (UseCardTag.Card.Model.Name.Equals(P_ChihSangMaHuai.CardName)) { Target = PAiTargetChooser.InjureTarget(Game, Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName).FromPlayer, Player, null, Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName).Injure, Game.TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName).InjureSource, true); } else if (UseCardTag.Card.Model.Name.Equals(P_ChiinTsevChiinWang.CardName)) { Target = PMath.Max(Game.PlayerList, (PPlayer _Player) => { if (Player.TeamIndex == _Player.TeamIndex) { return PAiMapAnalyzer.ChangeFaceExpect(Game, _Player); } else { return -PAiMapAnalyzer.ChangeFaceExpect(Game, _Player); } }).Key; } else if (UseCardTag.Card.Model.Name.Equals(P_TaTsaaoChingShev.CardName)) { List <PPlayer> PossibleEnemies = Game.Enemies(Player).FindAll((PPlayer _Player) => Player.HasHouse); if (PossibleEnemies.Count > 0) { Target = PossibleEnemies[PMath.RandInt(0, PossibleEnemies.Count - 1)]; } } else if (UseCardTag.Card.Model.Name.Equals(P_ChiehShihHuanHun.CardName)) { int MaxMoney = PMath.Max(Game.PlayerList, (PPlayer _Player) => { return _Player.Money; }).Value; Target = PMath.Max(Game.PlayerList, (PPlayer _Player) => { int Delta = Math.Min(10000, MaxMoney - _Player.Money) - 2000 * _Player.Area.HandCardArea.CardNumber - (int)PMath.Sum(_Player.Area.EquipmentCardArea.CardList.ConvertAll((PCard _Card) => (double)_Card.Model.AIInEquipExpectation(Game, _Player))); if (_Player.TeamIndex == Player.TeamIndex) { return Delta; } else { return -Delta; } }).Key; } else if (UseCardTag.Card.Model.Name.Equals(P_WuChungShevngYou.CardName) || UseCardTag.Card.Name.Equals(P_AnTuCheevnTsaang.CardName)) { Target = PAiCardExpectation.MostValuableCardUser(Game, Game.Teammates(Player)); } else if (UseCardTag.Card.Model.Name.Equals(P_ShangWuChoouTii.CardName)) { Target = PMath.Max(Game.AlivePlayers(), (PPlayer _Player) => { if (_Player.TeamIndex == Player.TeamIndex) { return PAiMapAnalyzer.Expect(Game, _Player, _Player.Position); } else { return -PAiMapAnalyzer.Expect(Game, _Player, _Player.Position); } }, true).Key; } else if (UseCardTag.Card.Model.Name.Equals(P_KuungCheevngChi.CardName)) { Target = PMath.Max(Game.Enemies(Player), (PPlayer _Player) => _Player.Area.HandCardArea.CardNumber).Key; } else if (UseCardTag.Card.Model.Name.Equals(P_TsouWeiShangChi.CardName)) { Target = PMath.Max(Game.Teammates(Player), (PPlayer _Player) => PAiMapAnalyzer.OutOfGameExpect(Game, Player)).Key; } } if (Target == null || Target == UseCardTag.TargetList[0]) { PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder("声东击西:无效")); #region 成就:地府的公正 if (UseCardTag.Card.Model is P_ChiehShihHuanHun) { PArch.Announce(Game, Player, "地府的公正"); } #endregion UseCardTag.TargetList.Clear(); } else { PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder("声东击西:转移给" + Target.Name)); UseCardTag.TargetList[0] = Target; } Game.CardManager.MoveCard(Card, Game.CardManager.SettlingArea, Game.CardManager.ThrownCardHeap); Game.Monitor.CallTime(PTime.Card.EndSettleTime, new PUseCardTag(Card, Player, Targets)); } }); }); } }