Esempio n. 1
0
 public void Die(PPlayer Player, PPlayer Killer)
 {
     PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Player.Name + "死亡!"));
     Monitor.CallTime(PTime.DieTime, new PDyingTag(Player, Killer));
     Map.BlockList.ForEach((PBlock Block) => {
         if (Player.Equals(Block.Lord))
         {
             Block.Lord         = null;
             Block.HouseNumber  = 0;
             Block.BusinessType = PBusinessType.NoType;
             PNetworkManager.NetworkServer.TellClients(new PRefreshBlockBasicOrder(Block));
         }
     });
     CardManager.ThrowAll(Player.Area);
     Player.IsAlive = false;
     PNetworkManager.NetworkServer.TellClients(new PDieOrder(Player.Index.ToString()));
     Monitor.CallTime(PTime.AfterDieTime, new PDyingTag(Player, Killer));
     if (GameOver())
     {
         PLogger.Log("游戏结束");
         EndGame();
     }
     else if (!NowPlayer.IsAlive)
     {
         PLogger.Log("因为当前玩家死亡,回合中止");
         TagManager.PopTag <PStepCountTag>(PStepCountTag.TagName);
         TagManager.PopTag <PDiceResultTag>(PDiceResultTag.TagName);
         TagManager.PopTag <PTag>(PTag.FreeTimeOperationTag.Name);
         Monitor.EndTurnDirectly = true;
     }
 }
Esempio n. 2
0
    private void EndGame()
    {
        if (EndGameFlag)
        {
            return;
        }
        Monitor.CallTime(PTime.EndGameTime);
        EndGameFlag          = true;
        ReadyToStartGameFlag = false;
        PreparedList         = new List <bool>();
        PlayerList.ForEach((PPlayer Player) => {
            PreparedList.Add(Player.IsAI);
        });
        PThread.Async(() => {
            Logic.ShutDown();
            Monitor.RemoveAll();
            TagManager.RemoveAll();
            List <PPlayer> WinnerList = GetWinner();
            PlayerList.ForEach((PPlayer Player) => {
                PNetworkManager.NetworkServer.TellClient(Player, new PGameOverOrder(Winners(), WinnerList.Contains(Player)));
            });

            ReadyToStartGameFlag = true;
        });
    }
Esempio n. 3
0
    public void LoseMoney(PPlayer Player, int Money, bool IsInjure = false)
    {
        PLoseMoneyTag LoseMoneyTag    = Monitor.CallTime(PTime.LoseMoneyTime, new PLoseMoneyTag(Player, Money, IsInjure));
        PPlayer       LoseMoneyPlayer = LoseMoneyTag.Player;
        int           MoneyCount      = LoseMoneyTag.Money;

        if (LoseMoneyPlayer != null && LoseMoneyPlayer.IsAlive && MoneyCount > 0)
        {
            LoseMoneyPlayer.Money -= MoneyCount;
            PNetworkManager.NetworkServer.TellClients(new PPushTextOrder(LoseMoneyPlayer.Index.ToString(), "-" + MoneyCount.ToString(), LoseMoneyTag.IsInjure ? PPushType.Injure.Name : PPushType.Throw.Name));
            PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(LoseMoneyPlayer.Name + "失去金钱" + MoneyCount.ToString()));
            PNetworkManager.NetworkServer.TellClients(new PRefreshMoneyOrder(LoseMoneyPlayer));
            if (LoseMoneyPlayer.Money <= 0)
            {
                if (IsInjure)
                {
                    PInjureTag InjureTag = TagManager.FindPeekTag <PInjureTag>(PInjureTag.TagName);
                    Dying(LoseMoneyPlayer, InjureTag.FromPlayer, InjureTag.InjureSource);
                }
                else
                {
                    Dying(LoseMoneyPlayer, null, null);
                }
            }
        }
    }
Esempio n. 4
0
 public void MovePosition(PPlayer Player, PBlock Source, PBlock Destination)
 {
     if (Player == null || !Player.IsAlive)
     {
         return;
     }
     Monitor.CallTime(PTime.MovePositionTime, new PTransportTag(Player, Source, Destination));
 }
Esempio n. 5
0
 public void MoveForward(PPlayer Player, int StepCount)
 {
     while (StepCount-- > 0)
     {
         MovePosition(Player, Player.Position, Player.Position.NextBlock);
         if (StepCount > 0)
         {
             Monitor.CallTime(PTime.PassBlockTime, new PPassBlockTag(Player, Player.Position));
         }
     }
 }
Esempio n. 6
0
 public void ChangeFace(PPlayer Player)
 {
     PNetworkManager.NetworkServer.TellClients(new PPushTextOrder(Player.Index.ToString(), "翻面", PPushType.Information.Name));
     if (Player.BackFace)
     {
         Player.Tags.PopTag <PTag>(PTag.BackFaceTag.Name);
     }
     else
     {
         Player.Tags.CreateTag(PTag.BackFaceTag);
     }
     Monitor.CallTime(PTime.ChangeFaceTime, new PChangeFaceTag(Player));
 }
Esempio n. 7
0
 public void Dying(PPlayer Player, PPlayer Killer, PObject Source)
 {
     PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Player.Name + "进入濒死状态"));
     Monitor.CallTime(PTime.EnterDyingTime, new PDyingTag(Player, Killer, Source));
     if (Player.Money <= 0)
     {
         Die(Player, Killer);
     }
     else
     {
         Monitor.CallTime(PTime.LeaveDyingTime, new PDyingTag(Player, Killer, Source));
     }
 }
Esempio n. 8
0
    /// <summary>
    /// 进行一次判定
    /// </summary>
    /// <param name="Player"></param>
    /// <param name="AdvisedNumber">建议的结果</param>
    /// <returns></returns>
    public int Judge(PPlayer Player, int AdvisedNumber)
    {
        if (!Player.IsAlive)
        {
            return(7);
        }
        int       Result   = PMath.RandInt(1, 6);
        PJudgeTag JudgeTag = Monitor.CallTime(PTime.Judge.JudgeTime, new PJudgeTag(Player, Result, AdvisedNumber));

        PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Player.Name + "的判定结果:" + JudgeTag.Result));
        PNetworkManager.NetworkServer.TellClients(new PPushTextOrder(Player.Index.ToString(), "判定结果:" + JudgeTag.Result, PPushType.Information.Name));
        Monitor.CallTime(PTime.Judge.AfterJudgeTime, JudgeTag);
        return(JudgeTag.Result);
    }
Esempio n. 9
0
    public void GetMoney(PPlayer Player, int Money)
    {
        PGetMoneyTag GetMoneyTag    = Monitor.CallTime(PTime.GetMoneyTime, new PGetMoneyTag(Player, Money));
        PPlayer      GetMoneyPlayer = GetMoneyTag.Player;
        int          MoneyCount     = GetMoneyTag.Money;

        if (GetMoneyPlayer != null && GetMoneyPlayer.IsAlive && MoneyCount > 0)
        {
            GetMoneyPlayer.Money += MoneyCount;
            PNetworkManager.NetworkServer.TellClients(new PPushTextOrder(GetMoneyPlayer.Index.ToString(), "+" + MoneyCount.ToString(), PPushType.Heal.Name));
            PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(GetMoneyPlayer.Name + "获得金钱" + MoneyCount.ToString()));
            PNetworkManager.NetworkServer.TellClients(new PRefreshMoneyOrder(GetMoneyPlayer));
        }
    }
Esempio n. 10
0
    public void PurchaseLand(PPlayer Player, PBlock Block)
    {
        PPurchaseLandTag PurchaseLandTag = Monitor.CallTime(PTime.PurchaseLandTime, new PPurchaseLandTag(Player, Block));

        Player = PurchaseLandTag.Player;
        Block  = PurchaseLandTag.Block;
        int LandPrice = PurchaseLandTag.LandPrice;

        if (Player != null && Block != null && Player.IsAlive)
        {
            LoseMoney(Player, LandPrice);
            Block.Lord = Player;
            GetHouse(Block, 1);
            PNetworkManager.NetworkServer.TellClients(new PRefreshBlockBasicOrder(Block));
            if (Block.IsBusinessLand && Block.BusinessType.Equals(PBusinessType.NoType))
            {
                PBusinessType        ChosenType = PBusinessType.NoType;
                List <PBusinessType> Types      = new List <PBusinessType>()
                {
                    PBusinessType.ShoppingCenter, PBusinessType.Institute,
                    PBusinessType.Altar, PBusinessType.Castle, PBusinessType.Park
                };
                if (Player.IsUser)
                {
                    ChosenType = Types[PNetworkManager.NetworkServer.ChooseManager.Ask(Player, "选择商业用地的发展方向", Types.ConvertAll((PBusinessType BusinessType) => BusinessType.Name).ToArray(), Types.ConvertAll((PBusinessType BusinessType) => BusinessType.ToolTip).ToArray())];
                }
                else
                {
                    ChosenType = PAiBusinessChooser.ChooseDirection(this, Player, Block);
                }
                Block.BusinessType = ChosenType;
                if (ChosenType.Equals(PBusinessType.Park))
                {
                    GetMoney(Player, PMath.Percent(Block.Price, 50));
                }
                else if (ChosenType.Equals(PBusinessType.Castle))
                {
                    GetHouse(Block, GetBonusHouseNumberOfCastle(Player, Block));
                }
                PNetworkManager.NetworkServer.TellClients(new PRefreshBlockBasicOrder(Block));
            }
            else
            {
                Block.BusinessType = PBusinessType.NoType;
            }
            PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Player.Name + "购买了" + Block.Name));
        }
    }
Esempio n. 11
0
    public void GetHouse(PBlock Block, int HouseCount)
    {
        if (HouseCount <= 0)
        {
            return;
        }
        PGetHouseTag GetHouseTag   = Monitor.CallTime(PTime.GetHouseTime, new PGetHouseTag(Block, HouseCount));
        PBlock       GetHouseBlock = GetHouseTag.Block;
        int          GetHouseCount = GetHouseTag.House;

        if (GetHouseBlock != null && GetHouseCount > 0)
        {
            GetHouseBlock.HouseNumber += GetHouseCount;
            PNetworkManager.NetworkServer.TellClients(new PRefreshBlockBasicOrder(GetHouseBlock));
        }
    }
Esempio n. 12
0
    public void LoseHouse(PBlock Block, int HouseCount)
    {
        if (HouseCount <= 0)
        {
            return;
        }
        PLoseHouseTag LoseHouseTag   = Monitor.CallTime(PTime.LoseHouseTime, new PLoseHouseTag(Block, HouseCount));
        PBlock        LoseHouseBlock = LoseHouseTag.Block;
        int           LoseHouseCount = LoseHouseTag.House;

        if (LoseHouseBlock != null && LoseHouseCount > 0)
        {
            LoseHouseBlock.HouseNumber -= LoseHouseCount;
            LoseHouseBlock.HouseNumber  = Math.Max(0, LoseHouseBlock.HouseNumber);
            PNetworkManager.NetworkServer.TellClients(new PRefreshBlockBasicOrder(LoseHouseBlock));
        }
    }
Esempio n. 13
0
    public void Injure(PPlayer FromPlayer, PPlayer ToPlayer, int Count, PObject InjureSource)
    {
        PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder((FromPlayer == null ? "null" : FromPlayer.Name) + "对" + ToPlayer.Name + "造成" + Count + "点伤害"));
        PInjureTag InjureTag = Monitor.CallTime(PTime.Injure.StartSettle, new PInjureTag(FromPlayer, ToPlayer, Count, InjureSource));

        foreach (PTime InjureTime in new PTime[] {
            PTime.Injure.BeforeEmitInjure,
            PTime.Injure.BeforeAcceptInjure,
            PTime.Injure.EmitInjure,
            PTime.Injure.AcceptInjure,
            PTime.Injure.AfterEmitInjure,
            PTime.Injure.AfterAcceptInjure
        })
        {
            if (InjureTag.ToPlayer != null && InjureTag.Injure > 0)
            {
                if (InjureTime.Equals(PTime.Injure.AfterEmitInjure))
                {
                    if (InjureTag.FromPlayer != null && InjureTag.FromPlayer.IsAlive)
                    {
                        TagManager.CreateTag(InjureTag);
                        GetMoney(InjureTag.FromPlayer, InjureTag.Injure);
                        InjureTag = TagManager.PopTag <PInjureTag>(PInjureTag.TagName);
                    }
                }
                else if (InjureTime.Equals(PTime.Injure.AfterAcceptInjure))
                {
                    if (InjureTag.ToPlayer.IsAlive)
                    {
                        TagManager.CreateTag(InjureTag);
                        LoseMoney(InjureTag.ToPlayer, InjureTag.Injure, true);
                        InjureTag = TagManager.PopTag <PInjureTag>(PInjureTag.TagName);
                    }
                }
                InjureTag = Monitor.CallTime(InjureTime, InjureTag);
            }
            else
            {
                break;
            }
        }
        if (InjureTag.ToPlayer != null && InjureTag.Injure > 0)
        {
            Monitor.CallTime(PTime.Injure.EndSettle, InjureTag);
        }
    }
Esempio n. 14
0
    public void Toll(PPlayer FromPlayer, PPlayer ToPlayer, PBlock Block)
    {
        PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(FromPlayer.Name + "向" + ToPlayer.Name + "收取过路费"));
        PTollTag TollTag = Monitor.CallTime(PTime.Toll.AfterEmitTarget, new PTollTag(FromPlayer, ToPlayer, Block.Toll, Block));

        if (TollTag.ToPlayer != null && TollTag.ToPlayer.IsAlive && TollTag.Toll > 0)
        {
            TollTag = Monitor.CallTime(PTime.Toll.AfterAcceptTarget, TollTag);
            if (TollTag.ToPlayer != null && TollTag.ToPlayer.IsAlive && TollTag.Toll > 0)
            {
                Injure(TollTag.FromPlayer, TollTag.ToPlayer, TollTag.Toll, TollTag.Block);
                if (Block.BusinessType.Equals(PBusinessType.Club))
                {
                    ChangeFace(ToPlayer);
                }
            }
        }
    }
Esempio n. 15
0
    public void PurchaseHouse(PPlayer Player, PBlock Block)
    {
        PPurchaseHouseTag PurchaseHouseTag = Monitor.CallTime(PTime.PurchaseHouseTime, new PPurchaseHouseTag(Player, Block));

        Player = PurchaseHouseTag.Player;
        Block  = PurchaseHouseTag.Block;
        int HousePrice = PurchaseHouseTag.HousePrice;

        if (Player != null && Block != null && Player.IsAlive)
        {
            PNetworkManager.NetworkServer.TellClients(new PShowInformationOrder(Player.Name + "购买了1座房屋"));
            PNetworkManager.NetworkServer.TellClients(new PHighlightBlockOrder(Block.Index.ToString()));
            if (Block.HousePrice > 0)
            {
                LoseMoney(Player, HousePrice);
            }
            GetHouse(Block, 1);
            PNetworkManager.NetworkServer.TellClients(new PRefreshBlockBasicOrder(Block));
        }
    }
Esempio n. 16
0
 /// <summary>
 /// 开始游戏
 /// </summary>
 /// 和客户端上的开始游戏不同,初始化玩家列表的时候
 /// 从Room而非客户端用于同步的CurrentRoom获得数据
 public new void StartGame(List <PGeneral> DefaultGenerals = null)
 {
     if (Room.IsFull())
     {
         #region 初始化玩家列表
         PlayerList = new List <PPlayer>();
         for (int i = 0; i < PlayerNumber; ++i)
         {
             PPlayer Player = new PPlayer()
             {
                 Index     = i,
                 Name      = Room.PlayerList[i].PlayerType.Equals(PPlayerType.Player) ? Room.PlayerList[i].Nickname : "P" + (i + 1).ToString(),
                 IsAlive   = true,
                 Money     = PPlayer.Config.DefaultMoney,
                 TeamIndex = GameMode.Seats[i].Party - 1
             };
             if (DefaultGenerals != null && i < DefaultGenerals.Count)
             {
                 Player.General = DefaultGenerals[i];
             }
             Player.Tags = new PTagManager(Player);
             PlayerList.Add(Player);
             PBlock Position = Map.BlockList.Find((PBlock Block) => Block.StartPointIndex == i % Map.StartPointNumber);
             if (Position != null)
             {
                 PlayerList[i].Position = Position;
             }
             else
             {
                 PlayerList[i].Position = Map.BlockList[0];
             }
         }
         #endregion
         NowPlayer            = null;
         NowPeriod            = null;
         StartGameFlag        = true;
         EndGameFlag          = false;
         ReadyToStartGameFlag = false;
         CardManager.InitializeCardHeap();
         PLogger.Log("开始进行规则装载");
         PObject.ListSubTypeInstances <PSystemTriggerInstaller>().ForEach((PSystemTriggerInstaller Installer) => {
             Installer.Install(Monitor);
         });
         PNetworkManager.NetworkServer.Game.PlayerList.ForEach((PPlayer Player) => {
             PNetworkManager.NetworkServer.TellClient(Player, new PStartGameOrder(Map.Name, Player.Index.ToString()));
         });
         if (PSystem.AllAi)
         {
             Room.PlayerList.ForEach((PRoom.PlayerInRoom Player) => {
                 Player.PlayerType = PPlayerType.AI;
             });
         }
         NowPlayer = PlayerList[0];
         Monitor.CallTime(PTime.InstallModeTime);
         if (DefaultGenerals == null)
         {
             Monitor.CallTime(PTime.ChooseGeneralTime);
         }
         Monitor.CallTime(PTime.StartGameTime);
         NowPeriod = PPeriod.StartTurn;
         PNetworkManager.NetworkServer.TellClients(new PStartTurnOrder(NowPlayerIndex.ToString()));
         Logic.StartLogic(PPeriod.StartTurn.Execute());
     }
 }