/// <summary> /// 线程数据的构造函数 /// </summary> /// <param name="aGame">游戏的基类</param> public ThreadData(GameBase aGame) { Game = aGame; Enable = false; SynchronizationMutex = new Mutex(); SynchronizationReady = false; Achievelock = new object(); AskFor = MessageCore.AskForEnum.Sha; ToEvery = false; AskTo = null; timeout = 100; WaittingThread = null; Target = null; Abstention = null; CardsCount = 1; }
public override MessageCore.AskForResult AskFor(SGS.ServerCore.Contest.Data.ChiefBase aChief, SGS.ServerCore.Contest.Global.MessageCore.AskForEnum aAskFor, SGS.ServerCore.Contest.Data.GlobalData aData) { if (aData.Game.Response.SkillName == SkillName && SkillStatus == SkillEnabled.Enable) { SwitchSkillStatus(aChief, SkillEnabled.Disable, aData); aData.Game.AsynchronousCore.SendMessage(MessageCore.MakeTriggerSkillMesssage(aChief, this, new ChiefBase[] { }, aData.Game.Response.Cards)); return(new MessageCore.AskForResult(aData.Game.Response.IsTimeout, aChief, Player.Players2Chiefs(aData.Game.Response.Targets), aData.Game.Response.Cards, Card.Effect.Sha, aData.Game.Response.Answer, true, SkillName)); } return(null); }
public void AskForCards(GameBase aGame, Player aPlayer, SGS.ServerCore.Contest.Global.MessageCore.AskForEnum aAskFor) { AskForCards(aGame, aPlayer, aAskFor, null, null, 0); }
/// <summary> /// 开始异步问询通信 /// </summary> /// <param name="aGame">游戏基类</param> /// <param name="aPlayer">问询的玩家对象</param> /// <param name="aAskFor">问询类型</param> /// <param name="aTarget">问询目标</param> /// <param name="aCount">问询的牌数量</param> /// <param name="aAbstentionTable">表决字典</param> public void AskForCards(GameBase aGame, Player aPlayer, SGS.ServerCore.Contest.Global.MessageCore.AskForEnum aAskFor, Player aTarget, Dictionary <Player, bool> aAbstentionTable, int aCount) { if (aGame.GamePlayers.All.Where(c => !c.IsEscaped && !c.IsOffline).Count() < 2) { aGame.gData.Game.RefereeProc(); } else if (aPlayer != null && (aPlayer.IsOffline || aPlayer.IsEscaped)) { Thread.Sleep(1200); aGame.WaittingData.timeout = 0; aGame.Response.IsTimeout = true; aGame.Response.HasResponse = false; aGame.Response.Effect = Card.Effect.None; aGame.Response.Source = aPlayer; aGame.Response.Targets = new Player[0] { }; aGame.Response.Cards = new Card[0] { }; aGame.Response.SkillName = string.Empty; return; } if (aPlayer != null) { if (aPlayer.IsEscaped || aPlayer.IsOffline) { Thread.Sleep(1500); aGame.Response.Answer = false; aGame.Response.Cards = new Card[] { }; aGame.Response.SkillName = string.Empty; aGame.Response.Targets = new Player[] { }; aGame.Response.IsTimeout = false; aGame.Response.HasResponse = true; return; } } else if (aAbstentionTable.Where(c => c.Value == false).Count() == 0) { //Thread.Sleep(1500); aGame.Response.Answer = false; aGame.Response.Cards = new Card[] { }; aGame.Response.SkillName = string.Empty; aGame.Response.Targets = new Player[] { }; aGame.Response.IsTimeout = false; aGame.Response.HasResponse = true; return; } //创建等待进程 Thread waitting = new Thread(WaittingProc); //访问临界锁 lock (aGame.WaittingData.Achievelock) { //重置回应数据区 aGame.Response.Reset(); aGame.Response.Cards = new Card[0]; aGame.Response.Effect = Card.Effect.None; //如果问询不是弃牌,那么倒数计时重置(因为弃牌可以多次,但时间总和必须在规定超时内) if (aAskFor != MessageCore.AskForEnum.AbandonmentNext) { aGame.WaittingData.timeout = aGame.WaittingData.Latency; } else if (aGame.WaittingData.timeout == 0) { aGame.WaittingData.timeout = aGame.WaittingData.Latency; } //如果剩余时间太小,就视作超时跳出方法 else if (aGame.WaittingData.timeout < 10) { aGame.WaittingData.timeout = 0; aGame.Response.IsTimeout = true; aGame.Response.HasResponse = false; aGame.Response.Effect = Card.Effect.None; aGame.Response.Source = aPlayer; aGame.Response.SkillName = string.Empty; return; } //弃牌问询如果剩余时间为0,重置剩余时间 //将线程信息设置到专门的数据区中 if (aAskFor == MessageCore.AskForEnum.AbandonmentNext) { aGame.WaittingData.AskFor = MessageCore.AskForEnum.Abandonment; } else { aGame.WaittingData.AskFor = aAskFor; } aGame.WaittingData.AskTo = aPlayer; aGame.WaittingData.ToEvery = aPlayer == null ? true : false; aGame.WaittingData.Enable = false; aGame.WaittingData.Target = aTarget; aGame.WaittingData.SynchronizationReady = false; aGame.WaittingData.WaittingThread = waitting; aGame.WaittingData.Abstention = aAbstentionTable; aGame.WaittingData.CardsCount = aCount; }//释放临界锁 //开启线程 waitting.Start(aGame.WaittingData); DateTime synStart = DateTime.Now; //等待响应 while (true) { //抢临界锁 lock (aGame.WaittingData.Achievelock) { //如果线程回应了同步信号(等待线程进入了互斥信号),本线程继续运行后面的代码 if (aGame.WaittingData.SynchronizationReady) { break; } }//释放临界锁 Thread.Sleep(80); if ((DateTime.Now - synStart).TotalSeconds > 5) { return; //throw new Exception("无法同步"); } } aGame.WaittingData.Enable = true; //主线程抢占互斥信号,被阻塞 aGame.WaittingData.SynchronizationMutex.WaitOne(); try { //尝试释放临界锁 aGame.WaittingData.SynchronizationMutex.ReleaseMutex(); aGame.WaittingData.SynchronizationMutex.Dispose(); aGame.WaittingData.SynchronizationMutex = null; } catch { } //抢临界锁 lock (aGame.WaittingData.Achievelock) { //置线程不可用 aGame.WaittingData.Enable = false; }//释放临界锁 if (aGame.GamePlayers.All.Where(c => !c.IsEscaped && !c.IsOffline).Count() < 2) { aGame.gData.Game.RefereeProc(); } }
public override SGS.ServerCore.Contest.Global.MessageCore.AskForResult AskFor(SGS.ServerCore.Contest.Data.ChiefBase aChief, SGS.ServerCore.Contest.Global.MessageCore.AskForEnum aAskFor, SGS.ServerCore.Contest.Data.GlobalData aData) { if (aData.Game.Response.SkillName == SkillName) { if (SkillStatus == SkillEnabled.Enable) { SwitchSkillStatus(aChief, SkillEnabled.Disable, aData); aData.Game.AsynchronousCore.SendMessage(MessageCore.MakeTriggerSkillMesssage(aChief, this, new ChiefBase[] { aData.Game.Response.Targets[0].Chief }, aData.Game.Response.Cards)); aData.Game.DropCards(true, GlobalEvent.CardFrom.Hand, SkillName, aData.Game.Response.Cards, Card.Effect.Skill, aChief, null, null); aData.Game.RegainHealth(aData.Game.Response.Targets[0].Chief, 1); aData.Game.RegainHealth(aChief, 1); } } return(null); }