Exemplo n.º 1
0
 /// <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;
 }
Exemplo n.º 2
0
 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);
 }
Exemplo n.º 3
0
 public void AskForCards(GameBase aGame, Player aPlayer, SGS.ServerCore.Contest.Global.MessageCore.AskForEnum aAskFor)
 {
     AskForCards(aGame, aPlayer, aAskFor, null, null, 0);
 }
Exemplo n.º 4
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();
            }
        }
Exemplo n.º 5
0
 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);
 }