/// <summary> /// 安置乐不思蜀的过程 /// </summary> /// <param name="r">子事件的起始节点</param> /// <returns></returns> private EventRecoard LeBuSiShuProc(EventRecoard r) { //玩家不能是自己并且对方不能死亡 if (r.Target != r.Source && !GamePlayers[r.Target].Dead) { //对方不能有乐不思蜀的buff if (!GamePlayers[r.Target].HasDebuff(Card.Effect.LeBuSiShu)) { //把乐不思蜀从垃圾桶中拿出来 PickRubbish(r.Cards); //把乐不思蜀加入到对方的buff列表中 GamePlayers[r.Target].Debuff.Push(r.Cards[0]); AsynchronousCore.SendMessage( new Beaver("lbss", r.Source.ChiefName, r.Target.ChiefName, r.SkillName, Card.Cards2Beaver("cards", r.Cards)).ToString()); //new XElement("lbss", // new XElement("from", r.Source.ChiefName), // new XElement("to", r.Target.ChiefName), // new XElement("skill", r.SkillName), // Card.Cards2XML("cards", r.Cards) // ) //); } } return(r); }
private EventRecoard WeaponProc(EventRecoard r) { if (!GamePlayers[r.Source].Dead) { PickRubbish(r.Cards); DropCards(false, CardFrom.None, r.SkillName, r.Cards, r.Cards[0].CardEffect, r.Source, r.Target, null); GamePlayers[r.Source].LoadWeapon(r.Cards[0], this, gData); } return(r); }
/// <summary> /// 借刀杀人的过程 /// </summary> /// <param name="r">子事件的起始节点</param> /// <returns></returns> private EventRecoard JieDaoShaRenProc(EventRecoard r) { //玩家自己和两个目标不能死亡,目标不能没有武器 if (!GamePlayers[r.Source].Dead && !GamePlayers[r.Target].Dead && !GamePlayers[r.Target2].Dead && GamePlayers[r.Target].Weapon != null) { //无懈可击 if (WuXieProc(r.Target, Card.Effect.JieDaoShaRen)) { return(r); } string msg = new Beaver("askfor.jdsr.sha", r.Target.ChiefName, r.Target2.ChiefName, r.Source.ChiefName).ToString(); //new XElement("askfor.jdsr.sha", // new XElement("target", r.Target.ChiefName), // new XElement("target2", r.Target2.ChiefName), // new XElement("source", r.Source.ChiefName) //); //向目标问询杀 MessageCore.AskForResult res = AsynchronousCore.AskForCards(r.Target, MessageCore.AskForEnum.Sha, new AskForWrapper(msg, this), gData); ValidityResult(r.Target, ref res); if (res.Effect == Card.Effect.None) { //获得对方的武器对象 Card weapon = GamePlayers[r.Target].Weapon; Move(r.Target, r.Source, new Card[] { weapon }); //玩家得到武器牌 AsynchronousCore.SendMessage(MessageCore.MakeStealMessage(r.Target, r.Source, new Card[] { weapon })); //new XElement("steal", // new XElement("from", r.Target.ChiefName), // new XElement("to", r.Source.ChiefName), // Card.Cards2XML("cards", new Card[] { weapon }) // ) //); } else if (res.Effect == Card.Effect.Sha) { AsynchronousCore.SendMessage( new Beaver("sha", r.Target.ChiefName, ChiefBase.Chiefs2Beaver("to", new ChiefBase[] { r.Target2 }), res.SkillName, Card.Cards2Beaver("cards", res.Cards)).ToString()); //new XElement("sha", // new XElement("from", r.Target.ChiefName), // ChiefBase.Chiefs2XML("to", new ChiefBase[] { r.Target2 }), // new XElement("skill", res.SkillName), // Card.Cards2XML("cards", res.Cards) // ) // ); //再此子事件上创建杀的子事件 DropCards(true, CardFrom.Hand, string.Empty, res.Cards, Card.Effect.Sha, r.Target, r.Target2, null); //执行杀的子事件 ShaProc(lstRecoard.Last());// lstRecoard.ElementAt(lstRecoard.Count - 1) } } return(r); }
/// <summary> /// 南蛮入侵的过程 /// </summary> /// <param name="r">子事件的起始节点</param> /// <returns></returns> private EventRecoard NanManRuQinProc(EventRecoard r) { //对方不能死亡 if (!GamePlayers[r.Target].Dead) { //无懈可击的执行过程 if (WuXieProc(r.Target, Card.Effect.NanManRuQin)) { return(r); } if (GamePlayers[r.Target].Armor == null || Armor.EnableFor(GamePlayers[r.Target].Armor.CardEffect, r.Cards, Card.Effect.NanManRuQin, r.Target)) { string msg = new Beaver("askfor.nmrq.sha", r.Target.ChiefName, r.Source.ChiefName).ToString(); //new XElement("askfor.nmrq.sha", // new XElement("target", r.Target.ChiefName), // new XElement("source", r.Source.ChiefName) //); //问询杀 MessageCore.AskForResult resSha = AsynchronousCore.AskForCards(r.Target, MessageCore.AskForEnum.Sha, new AskForWrapper(msg, this), gData); ValidityResult(r.Target, ref resSha); if (resSha.Effect == Card.Effect.Sha) { //将杀放入子事件节点 if (resSha.PlayerLead) { DropCards(true, CardFrom.Hand, resSha.SkillName, resSha.Cards, Card.Effect.None, resSha.Leader, r.Source, null); foreach (ASkill s in resSha.Leader.Skills) { s.OnUseEffect(resSha.Leader, Card.Effect.Sha, gData); } AsynchronousCore.SendMessage( new Beaver("nmrq.sha", r.Target.ChiefName, r.Source.ChiefName, resSha.SkillName, Card.Cards2Beaver("cards", resSha.Cards)).ToString()); // new XElement("nmrq.sha", // new XElement("target", r.Target.ChiefName), // new XElement("source", r.Source.ChiefName), // new XElement("skill", resSha.SkillName), // Card.Cards2XML("cards", resSha.Cards) // )); } } else { //没有杀,费血 DamageHealth(r.Target, 1, r.Source, r); } } } return(r); }
/// <summary> /// 桃园结义的过程 /// </summary> /// <param name="r">子事件的起始节点</param> /// <returns></returns> private EventRecoard TaoYuanJieYi(EventRecoard r) { //玩家不能死亡,并且血没有满 if (!GamePlayers[r.Target].Dead && GamePlayers[r.Target].Health != GamePlayers[r.Target].MaxHealth) { //进入无懈可击的过程 if (WuXieProc(r.Target, Card.Effect.TaoYuanJieYi)) { return(r); } //玩家血量增加 RegainHealth(r.Target, 1); } return(r); }
/// <summary> /// 顺手牵羊的过程 /// </summary> /// <param name="r">子事件的起始节点</param> /// <returns></returns> private EventRecoard ShunShouQianYangProc(EventRecoard r) { //玩家自己和对方不能死亡,并且对方有牌 if (!GamePlayers[r.Source].Dead && !GamePlayers[r.Target].Dead && GamePlayers[r.Target].HasCardWithJudgementArea) { //无懈可击的过程 if (WuXieProc(r.Target, Card.Effect.ShunShouQianYang)) { return(r); } AsynchronousCore.SendMessage( new Beaver("askfor.ssqy.select", r.Source.ChiefName, r.Target.ChiefName).ToString()); //new XElement("askfor.ssqy.select", // new XElement("target", r.Source.ChiefName), // new XElement("target2", r.Target.ChiefName) //)); //问询玩家选择对方一张牌 MessageCore.AskForResult res = AsynchronousCore.AskForCards(r.Source, MessageCore.AskForEnum.TargetCardWithJudgementArea, r.Target); //如果没有选那就自动抽一张 if (res.Effect == Card.Effect.None || res.Cards.Count() != 1) { Card auto = AutoSelect(r.Target); if (auto == null) { res = new MessageCore.AskForResult(false, res.Leader, res.Targets, new Card[0] { }, Card.Effect.ShunShouQianYang, false, true, string.Empty); } else { res = new MessageCore.AskForResult(false, res.Leader, res.Targets, new Card[] { auto }, Card.Effect.ShunShouQianYang, false, true, string.Empty); } } if (res.Cards.Count() != 0) { Move(r.Target, r.Source, res.Cards); ////把牌给玩家 //foreach (Card c in res.Cards) //{ // AsynchronousCore.SendStealMessage(r.Target, r.Source, new Card[] { c }, GamePlayers); // GamePlayers[r.Source].Hands.Add(c.GetOriginalCard()); //} ////增加节点:顺手牵羊选择的牌 //EventNode(false, CardFrom.HandAndEquipageAndJudgement, res.SkillName, res.Cards, Card.Effect.None, r.Target, r.Source, null); } } return(r); }
/// <summary> /// 无中生有的过程 /// </summary> /// <param name="r">子事件的起始节点</param> /// <returns></returns> private EventRecoard WuZhongShengYouProc(EventRecoard r) { //玩家不能死亡 if (!GamePlayers[r.Source].Dead) { //进入无懈可击的过程 if (WuXieProc(r.Target, Card.Effect.WuZhongShengYou)) { return(r); } //从牌堆拿出来两张牌 Card[] ret = TakeingCards(r.Source, 2); //加入到子事件中 DropCards(false, CardFrom.None, r.SkillName, ret, Card.Effect.None, r.Source, r.Source, null); } return(r); }
private EventRecoard HorseProc(EventRecoard r) { if (!GamePlayers[r.Source].Dead && r.Cards.Count() == 1) { PickRubbish(r.Cards); DropCards(false, CardFrom.None, r.SkillName, r.Cards, r.Cards[0].CardEffect, r.Source, r.Source, null); switch (r.Effect) { case Card.Effect.Jia1: GamePlayers[r.Source].Jia1Ma = r.Cards[0]; break; case Card.Effect.Jian1: GamePlayers[r.Source].Jian1Ma = r.Cards[0]; break; } } return(r); }
/// <summary> /// 过河拆桥的过程 /// </summary> /// <param name="r">子事件的起始节点</param> /// <returns></returns> private EventRecoard GuoHeChaiQiaoProc(EventRecoard r) { //双方不能有任何一方,并且对方有牌可以选择死亡 if (!GamePlayers[r.Source].Dead && !GamePlayers[r.Target].Dead && GamePlayers[r.Target].HasCardWithJudgementArea) { //进入无懈可击的过程 if (WuXieProc(r.Target, Card.Effect.GuoHeChaiQiao)) { return(r); } AsynchronousCore.SendMessage( new Beaver("askfor.ghcq.select", r.Source.ChiefName, r.Target.ChiefName).ToString()); //new XElement("askfor.ghcq.select", // new XElement("target", r.Source.ChiefName), // new XElement("target2", r.Target.ChiefName) //)); //问询玩家选择对方一张牌 MessageCore.AskForResult res = AsynchronousCore.AskForCards(r.Source, MessageCore.AskForEnum.TargetCardWithJudgementArea, r.Target); //如果没有选择那就系统选择一张牌 if (res.Effect == Card.Effect.None) { Card auto = AutoSelect(r.Target); if (auto == null) { res = new MessageCore.AskForResult(false, res.Leader, res.Targets, new Card[0] { }, Card.Effect.GuoHeChaiQiao, false, true, string.Empty); } else { res = new MessageCore.AskForResult(false, res.Leader, res.Targets, new Card[] { auto }, Card.Effect.GuoHeChaiQiao, false, true, string.Empty); } } if (res.Cards.Count() != 0) { //将对方的这张牌加入到子事件节点上并弃置到垃圾桶中 DropCards(true, CardFrom.HandAndEquipageAndJudgement, res.SkillName, res.Cards, Card.Effect.None, r.Target, r.Source, null); AsynchronousCore.SendMessage(MessageCore.MakeDropMessage(r.Source, r.Target, res.Cards)); } } return(r); }
/// <summary> /// 五谷丰登的执行过程 /// </summary> /// <param name="r">起始子事件对象</param> /// <returns>起始子事件</returns> private EventRecoard WuGuFengDengProc(EventRecoard r) { //子事件的目标必须存在且目标不能死亡 if (r.Target != null && !GamePlayers[r.Target].Dead) { //开始无懈可击的处理 if (WuXieProc(r.Target, Card.Effect.WuGuFengDeng)) { return(r); } //发送问询 string msg = new Beaver("askfor.wgfd.select", r.Target.ChiefName).ToString(); //new XElement("askfor.wgfd.select", // new XElement("target", r.Target.ChiefName) // ); //获取问询结果 MessageCore.AskForResult res = AsynchronousCore.AskForCards(r.Target, MessageCore.AskForEnum.WuGuFengDeng, new AskForWrapper(msg, this), gData); //回应的牌不正确,则自动选择一张 if (res.Cards.Count() != 1 || (res.Cards.Count() == 1 && !CardsBuffer[WGFDSlotName].Cards.Contains(res.Cards[0]))) { res = new MessageCore.AskForResult(false, r.Target, new ChiefBase[] { }, new Card[] { CardsBuffer[WGFDSlotName].Cards[GetRandom(CardsBuffer[WGFDSlotName].Cards.Count)] }, Card.Effect.None, false, false, res.SkillName); } foreach (Card c in res.Cards) { CardsBuffer[WGFDSlotName].Cards.Remove(c); GamePlayers[r.Target].Hands.Add(c); } //发送消息 AsynchronousCore.SendMessage( new Beaver("wgfd.select", r.Target.ChiefName, Card.Cards2Beaver("cards", res.Cards)).ToString()); //new XElement("wgfd.select", // new XElement("target", r.Target.ChiefName), // Card.Cards2XML("cards", res.Cards) //)); } return(r); }
/// <summary> /// 安置闪电的过程 /// </summary> /// <param name="r">子事件的起始节点</param> /// <returns></returns> private EventRecoard ShanDianProc(EventRecoard r) { //玩家本人不能死亡 if (!GamePlayers[r.Source].Dead) { //本人不能有闪电buff if (!GamePlayers[r.Source].HasDebuff(Card.Effect.ShanDian)) { //把闪电从垃圾桶中拿出来 PickRubbish(r.Cards); //把闪电放置到自己的buff GamePlayers[r.Source].Debuff.Push(r.Cards[0]); AsynchronousCore.SendMessage( new Beaver("sd", r.Source.ChiefName, r.SkillName, Card.Cards2Beaver("cards", r.Cards)).ToString()); //new XElement("sd", // new XElement("from", r.Source.ChiefName), // new XElement("skill", r.SkillName), // Card.Cards2XML("cards", r.Cards) // ) //); } } return(r); }
/// <summary> /// 万箭齐发的过程 /// </summary> /// <param name="r">子事件的起始节点</param> /// <returns></returns> private EventRecoard WanJianQiFaProc(EventRecoard r) { string msg = null; //对方不能死亡 if (!GamePlayers[r.Target].Dead) { //进入无懈可击的过程 if (WuXieProc(r.Target, Card.Effect.WanJianQiFa)) { return(r); } if (GamePlayers[r.Target].Armor == null || Armor.EnableFor(GamePlayers[r.Target].Armor.CardEffect, r.Cards, Card.Effect.WanJianQiFa, r.Target)) { MessageCore.AskForResult resShan = null; msg = new Beaver("askfor.wjqf.shan", r.Target.ChiefName, r.Source.ChiefName).ToString(); //new XElement("askfor.wjqf.shan", // new XElement("target", r.Target.ChiefName), // new XElement("source", r.Source.ChiefName) //); //问询闪 resShan = AsynchronousCore.AskForCards(r.Target, MessageCore.AskForEnum.Shan, new AskForWrapper(msg, this), true, gData); ValidityResult(r.Target, ref resShan); //} if (resShan.PlayerLead) { DropCards(true, CardFrom.Hand, resShan.SkillName, resShan.Cards, resShan.Effect, resShan.Leader, r.Source, null); } else { DropCards(false, CardFrom.None, resShan.SkillName, resShan.Cards, resShan.Effect, resShan.Leader, r.Source, null); } //将问询的牌放入到子事件节点 //EventNode(true, CardFrom.Hand, resShan.SkillName , resShan.Cards, resShan.Effect, r.Target, r.Source, null); foreach (ASkill s in resShan.Leader.Skills) { s.OnUseEffect(resShan.Leader, Card.Effect.Shan, gData); } if (resShan.Effect == Card.Effect.Shan) { if (resShan.PlayerLead) { AsynchronousCore.SendMessage( new Beaver("wjqf.shan", r.Target.ChiefName, r.Source.ChiefName, resShan.SkillName, Card.Cards2Beaver("cards", resShan.Cards)).ToString()); } //new XElement("wjqf.shan", // new XElement("target", r.Target.ChiefName), // new XElement("source", r.Source.ChiefName), // new XElement("skill", resShan.SkillName), // Card.Cards2XML("cards", resShan.Cards) //)); } else { //没有出闪费血 DamageHealth(r.Target, 1, r.Source, r); } } } return(r); }
/// <summary> /// 子事件处理方法 /// </summary> private void EventProc() { if (queRecoard.Count < 1) { return; } //清除子事件处理列表 lstRecoard.Clear(); //取子事件队列的事件放置到子事件处理列表中 EventRecoard r = queRecoard.Dequeue(); lstRecoard.Add(r); //根据首事件的性质开始处理 switch (r.Effect) { //...None效果一般是说,某些技能已经处理过了,也不想让这个事件走一般过程,于是有了None来跳过子事件的处理 case Card.Effect.None: break; //杀 case Card.Effect.Sha: r = ShaProc(r); break; //决斗 case Card.Effect.JueDou: r = JueDouProc(r); break; //桃 case Card.Effect.Tao: r = TaoProc(r); break; //南蛮入侵 case Card.Effect.NanManRuQin: r = NanManRuQinProc(r); break; //万箭齐发 case Card.Effect.WanJianQiFa: r = WanJianQiFaProc(r); break; //桃园结义 case Card.Effect.TaoYuanJieYi: r = TaoYuanJieYi(r); break; //无中生有 case Card.Effect.WuZhongShengYou: r = WuZhongShengYouProc(r); break; //过河拆桥 case Card.Effect.GuoHeChaiQiao: r = GuoHeChaiQiaoProc(r); break; //顺手牵羊 case Card.Effect.ShunShouQianYang: r = ShunShouQianYangProc(r); break; //借刀杀人 case Card.Effect.JieDaoShaRen: r = JieDaoShaRenProc(r); break; //乐不思蜀 case Card.Effect.LeBuSiShu: r = LeBuSiShuProc(r); break; //闪电 case Card.Effect.ShanDian: r = ShanDianProc(r); break; //五谷丰登 case Card.Effect.WuGuFengDeng: r = WuGuFengDengProc(r); break; //防具的过程统一用一个方法 case Card.Effect.BaGuaZhen: case Card.Effect.TengJia: case Card.Effect.RenWangDun: case Card.Effect.BaiYinShiZi: r = ArmorProc(r); break; //武器的过程统一用一个方法 case Card.Effect.ZhangBaSheMao: case Card.Effect.ZhuGeLianNu: case Card.Effect.FangTianHuaJi: case Card.Effect.HanBingJian: case Card.Effect.GuDianDao: case Card.Effect.QiLinGong: case Card.Effect.GuanShiFu: case Card.Effect.QingLongYanYueDao: case Card.Effect.QingGangJian: case Card.Effect.CiXiongShuangGuJian: case Card.Effect.ZhuQueYuShan: r = WeaponProc(r); break; //各种马的过程用一个方法 case Card.Effect.Jian1: case Card.Effect.Jia1: r = HorseProc(r); break; } }
/// <summary> /// 桃的过程 /// </summary> /// <param name="r">子事件的起始节点</param> /// <returns></returns> private EventRecoard TaoProc(EventRecoard r) { //加血 RegainHealth(r.Source, 1); return(r); }
/// <summary> /// 要求武将消耗体力值 /// </summary> /// <param name="aChief">受伤害的武将</param> /// <param name="aDamage">伤害量</param> /// <param name="aSource">伤害来源,非玩家操作置null</param> /// <param name="aSourceEvent">伤害来源事件</param> internal void DamageHealth(ChiefBase aChief, sbyte aDamage, ChiefBase aSource, EventRecoard aSourceEvent) { if (GamePlayers[aChief].Health - aDamage < 1) { AsynchronousCore.SendMessage( new Beaver("health", aChief.ChiefName, GamePlayers[aChief].MaxHealth.ToString(), "0").ToString()); //new XElement("health", //new XElement("target", aChief.ChiefName), //new XElement("max", GamePlayers[aChief].MaxHealth), //new XElement("current", 0) //)); if (Cry4HelpProc(aSource, aChief, (sbyte)Math.Abs(GamePlayers[aChief].Health - aDamage - 1))) { //GamePlayers[aChief].Health = 0; GamePlayers[aChief].Dead = true; //drop all cards List <Card> lstDrop = new List <Card>(); lstDrop.AddRange(GamePlayers[aChief].Hands); lstDrop.AddRange(GamePlayers[aChief].Debuff); if (GamePlayers[aChief].Weapon != null) { lstDrop.Add(GamePlayers[aChief].Weapon); } if (GamePlayers[aChief].Armor != null) { lstDrop.Add(GamePlayers[aChief].Armor); } if (GamePlayers[aChief].Jia1Ma != null) { lstDrop.Add(GamePlayers[aChief].Jia1Ma); } if (GamePlayers[aChief].Jian1Ma != null) { lstDrop.Add(GamePlayers[aChief].Jian1Ma); } AsynchronousCore.SendMessage( new Beaver("fall", aChief.ChiefName, aChief.ChiefStatus).ToString()); //new XElement("fall", // new XElement("target", aChief.ChiefName), // new XElement("status", aChief.ChiefStatus) // ) //); AsynchronousCore.SendMessage(MessageCore.MakeDropMessage(aChief, aChief, lstDrop.ToArray())); DropCards(true, CardFrom.HandAndEquipageAndJudgement, string.Empty, lstDrop.ToArray(), Card.Effect.None, aChief, null, null); RefereeProc(); if (aChief.ChiefStatus == ChiefBase.Status.Insurgent && aSource != null && !GamePlayers[aSource].Dead) { TakeingCards(aSource, 3); } return; } } else { AsynchronousCore.SendMessage(new Beaver("health", aChief.ChiefName, GamePlayers[aChief].MaxHealth.ToString(), (GamePlayers[aChief].Health - aDamage).ToString()).ToString()); //new XElement("health", //new XElement("target", aChief.ChiefName), //new XElement("max", GamePlayers[aChief].MaxHealth), //new XElement("current", GamePlayers[aChief].Health - aDamage) //)); GamePlayers[aChief].Health -= aDamage; } foreach (ASkill s in GamePlayers[aChief].Chief.Skills) { s.OnChiefHarmed(aSourceEvent, aSource, aChief, gData, aDamage); } }
/// <summary> /// 杀的过程 /// </summary> /// <param name="r"></param> /// <returns></returns> internal EventRecoard ShaProc(EventRecoard r) { foreach (ASkill s in r.Target.Skills) { s.PreprocessingSubEvent(r.Target, ref r, gData); } //这里再检查一次玩家是否死亡是怕玩家在以前的子事件中挂掉了,如果真挂了就忽略掉这次事件 if (!GamePlayers[r.Target].Dead) { if (GamePlayers[r.Source].Weapon != null) { Weapon.Lead(GamePlayers[r.Source].Weapon.CardEffect, r.Effect, r.Cards, gData, r.Source, r.Target); } if (GamePlayers[r.Target].Armor == null || (GamePlayers[r.Source].Weapon != null && Weapon.EnableTargetArmorWithMessage(GamePlayers[r.Source].Weapon.CardEffect, r.Source, r.Target, gData) && Armor.EnableFor(GamePlayers[r.Target].Armor.CardEffect, r.Cards, Card.Effect.Sha, r.Target)) || !(GamePlayers[r.Source].Weapon != null && Weapon.EnableTargetArmor(GamePlayers[r.Source].Weapon.CardEffect, r.Source, r.Target))) { MessageCore.AskForResult res = null; bool EnableDamage = false; int times = 1; foreach (ASkill s in r.Source.Skills) { times = s.CalcAskforTimes(r.Source, r.Target, Card.Effect.Sha, times, gData); } for (int i = 0; i < times; i++) { res = null; EnableDamage = false; string msg = new Beaver("askfor.sha.shan", r.Target.ChiefName, r.Source.ChiefName).ToString(); //new XElement("askfor.sha.shan", // new XElement("target", r.Target.ChiefName), // new XElement("source", r.Source.ChiefName) // ); if (GamePlayers[r.Target].Armor != null && (GamePlayers[r.Source].Weapon == null || Weapon.EnableTargetArmor(GamePlayers[r.Source].Weapon.CardEffect, r.Source, r.Target))) { //问询 闪 res = AsynchronousCore.AskForCards(r.Target, MessageCore.AskForEnum.Shan, new AskForWrapper(msg, this), gData); } else { //问询 闪 res = AsynchronousCore.AskForCards(r.Target, MessageCore.AskForEnum.Shan, new AskForWrapper(msg, this), false, gData); } //检验出牌合法性 ValidityResult(r.Target, ref res); //问询结果放入子事件处理列表 if (res.PlayerLead) { DropCards(true, CardFrom.Hand, res.SkillName, res.Cards, res.Effect, res.Leader, r.Source, null); } else { DropCards(false, CardFrom.None, res.SkillName, res.Cards, res.Effect, res.Leader, r.Source, null); } if (res.Effect == Card.Effect.Shan) { if (res.PlayerLead) { AsynchronousCore.LeadingValid(r.Target); AsynchronousCore.SendMessage( new Beaver("sha.shan", r.Target.ChiefName, r.Source.ChiefName, res.SkillName, Card.Cards2Beaver("cards", res.Cards)).ToString()); //new XElement("sha.shan", // new XElement("from", r.Target.ChiefName), // new XElement("to", r.Source.ChiefName), // new XElement("skill", res.SkillName), // Card.Cards2XML("cards", res.Cards) // ) //); } foreach (ASkill s in res.Leader.Skills) { s.OnUseEffect(res.Leader, Card.Effect.Shan, gData); } if (GamePlayers[r.Source].Weapon != null) { EnableDamage = Weapon.TargetShan(GamePlayers[r.Source].Weapon.CardEffect, r.Source, r.Target, gData, r); } } if (res.Effect == Card.Effect.None || EnableDamage) { break; } } if (res == null || res.Effect == Card.Effect.None || EnableDamage) { sbyte cost = 1; if (GamePlayers[r.Source].Weapon != null) { cost = Weapon.CalcDamage(GamePlayers[r.Source].Weapon.CardEffect, r.Source, r.Target, Card.Effect.Sha, cost, gData); } foreach (ASkill s in r.Source.Skills) { cost = s.CalcDamage(r.Source, r.Effect, cost, gData); } if (GamePlayers[r.Target].Armor != null && GamePlayers[r.Source].Weapon != null && Weapon.EnableTargetArmor(GamePlayers[r.Source].Weapon.CardEffect, r.Source, r.Target)) { cost = Armor.CalcDamage(1, r.Cards, GamePlayers[r.Target].Armor.CardEffect); } DamageHealth(r.Target, cost, r.Source, r); } } } return(r); }
/// <summary> /// 决斗的执行过程 /// </summary> /// <param name="r">子事件起始节点</param> /// <returns></returns> internal EventRecoard JueDouProc(EventRecoard r) { string msg = null; if (r.Target2 != null) { r.Source = r.Target; r.Target = r.Target2; } //玩家双方都不能死亡 if (!GamePlayers[r.Target].Dead && !GamePlayers[r.Source].Dead) { if (r.Target2 == null) { //无懈可击的过程 if (WuXieProc(r.Target, Card.Effect.JueDou)) { return(r); } } while (true) { int times = 1; foreach (ASkill s in r.Source.Skills) { times = s.CalcAskforTimes(r.Source, r.Target, Card.Effect.JueDou, times, gData); } for (int i = 0; i < times; i++) { //先询问对方要出杀 MessageCore.AskForResult res = null; msg = new Beaver("askfor.jd.sha", r.Target.ChiefName, r.Source.ChiefName).ToString(); //new XElement("askfor.jd.sha", //new XElement("target", r.Target.ChiefName), //new XElement("opponent", r.Source.ChiefName) //); res = AsynchronousCore.AskForCards(r.Target, MessageCore.AskForEnum.Sha, new AskForWrapper(msg, this), gData); ValidityResult(r.Target, ref res); if (res.Effect != Card.Effect.Sha) { //不出杀费血 sbyte cost = 1; foreach (ASkill s in r.Source.Skills) { cost = s.CalcDamage(r.Source, Card.Effect.JueDou, cost, gData); } if (GamePlayers[r.Target].Armor != null) { cost = Armor.CalcDamage(cost, r.Cards, GamePlayers[r.Target].Armor.CardEffect); } DamageHealth(r.Target, cost, r.Source, r); return(r); } else { //出杀加入子事件节点 if (res.PlayerLead) { DropCards(true, CardFrom.Hand, res.SkillName, res.Cards, Card.Effect.Sha, res.Leader, r.Source, null); } foreach (ASkill s in res.Leader.Skills) { s.OnUseEffect(res.Leader, Card.Effect.Sha, gData); } AsynchronousCore.SendMessage( new Beaver("jd.sha", r.Target.ChiefName, r.Source.ChiefName, Card.Cards2Beaver("cards", res.Cards)).ToString()); //new XElement("jd.sha", // new XElement("target", r.Target.ChiefName), // new XElement("opponent", r.Source.ChiefName), // Card.Cards2XML("cards", res.Cards) //)); } } times = 1; foreach (ASkill s in r.Target.Skills) { times = s.CalcAskforTimes(r.Target, r.Source, Card.Effect.JueDou, times, gData); } for (int i = 0; i < times; i++) { msg = new Beaver("askfor.jd.sha", r.Source.ChiefName, r.Target.ChiefName).ToString(); //new XElement("askfor.jd.sha", //new XElement("target", r.Source.ChiefName), //new XElement("opponent", r.Target.ChiefName) //); //问询自己出杀 MessageCore.AskForResult res2 = AsynchronousCore.AskForCards(r.Source, MessageCore.AskForEnum.Sha, new AskForWrapper(msg, this), gData); ValidityResult(r.Source, ref res2); if (res2.Effect != Card.Effect.Sha) { //不出杀费血 sbyte cost = 1; foreach (ASkill s in r.Target.Skills) { cost = s.CalcDamage(r.Target, r.Effect, cost, gData); } if (GamePlayers[r.Source].Armor != null) { cost = Armor.CalcDamage(cost, r.Cards, GamePlayers[r.Source].Armor.CardEffect); } DamageHealth(r.Source, cost, r.Target, r); return(r); } else { //出杀加入子事件节点 if (res2.PlayerLead) { DropCards(true, CardFrom.Hand, res2.SkillName, res2.Cards, Card.Effect.Sha, res2.Leader, r.Target, null); } foreach (ASkill s in res2.Leader.Skills) { s.OnUseEffect(res2.Leader, Card.Effect.Sha, gData); } AsynchronousCore.SendMessage( new Beaver("jd.sha", r.Source.ChiefName, r.Target.ChiefName, Card.Cards2Beaver("cards", res2.Cards)).ToString()); //new XElement("jd.sha", // new XElement("target", r.Source.ChiefName), // new XElement("opponent", r.Target.ChiefName), // Card.Cards2XML("cards", res2.Cards) //)); } } } } return(r); }