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; } }
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; }); }
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); } } } }
public void MovePosition(PPlayer Player, PBlock Source, PBlock Destination) { if (Player == null || !Player.IsAlive) { return; } Monitor.CallTime(PTime.MovePositionTime, new PTransportTag(Player, Source, Destination)); }
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)); } } }
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)); }
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)); } }
/// <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); }
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)); } }
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)); } }
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)); } }
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)); } }
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); } }
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); } } } }
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)); } }
/// <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()); } }