/// <summary> /// 发地主牌 /// </summary> /// <param name="self"></param> /// <param name="id"></param> public static void CardsOnTable(this GameControllerComponent self, long id) { LandlordsRoom room = self.GetParent <LandlordsRoom>(); DeskCardsCacheComponent deskCardsCache = room.GetComponent <DeskCardsCacheComponent>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); HandCardsComponent handCards = room.GetGamerFromUserID(id).GetComponent <HandCardsComponent>(); orderController.Start(id); for (int i = 0; i < 3; i++) { Card card = deskCardsCache.Deal(); handCards.AddCard(card); } //更新玩家身份 foreach (var gamer in room.gamers) { Identity gamerIdentity = gamer.UserID == id ? Identity.Landlord : Identity.Farmer; self.UpdateInIdentity(gamer, gamerIdentity); } //广播地主消息 room.Broadcast(new Actor_SetLandlord_Ntt() { UserID = id, LordCards = To.RepeatedField(deskCardsCache.LordCards) }); //广播地主先手出牌消息 room.Broadcast(new Actor_AuthorityPlayCard_Ntt() { UserID = id, IsFirst = true }); }
/// <summary> /// 游戏继续 /// </summary> /// <param name="self"></param> /// <param name="lastGamer"></param> public static void Continue(this GameControllerComponent self, Gamer lastGamer) { LandlordsRoom room = self.GetParent <LandlordsRoom>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); //是否结束,当前出牌者手牌数为0时游戏结束 bool isEnd = lastGamer.GetComponent <HandCardsComponent>().CardsCount == 0; if (isEnd) { //当前最大出牌者为赢家 Identity winnerIdentity = room.GetGamerFromUserID(orderController.Biggest).GetComponent <HandCardsComponent>().AccessIdentity; List <GamerScore> gamersScore = new List <GamerScore>(); //游戏结束所有玩家摊牌 foreach (var gamer in room.gamers) { //取消托管 gamer.RemoveComponent <TrusteeshipComponent>(); //计算玩家积分 gamersScore.Add(new GamerScore() { UserID = gamer.UserID, Score = self.GetGamerScore(gamer, winnerIdentity) }); if (gamer.UserID != lastGamer.UserID) { //剩余玩家摊牌 Card[] _gamerCards = gamer.GetComponent <HandCardsComponent>().GetAll(); room.Broadcast(new Actor_GamerPlayCard_Ntt() { UserID = gamer.UserID, Cards = To.RepeatedField(_gamerCards) }); } } self.GameOver(gamersScore, winnerIdentity); } else { //轮到下位玩家出牌 orderController.Biggest = lastGamer.UserID; orderController.Turn(); room.Broadcast(new Actor_AuthorityPlayCard_Ntt() { UserID = orderController.CurrentAuthority, IsFirst = false }); } }
/// <summary> /// 游戏结束 /// </summary> /// <param name="self"></param> public static async void GameOver(this GameControllerComponent self, List <GamerScore> gamersScore, Identity winnerIdentity) { LandlordsRoom room = self.GetParent <LandlordsRoom>(); Gamer[] gamers = room.gamers; //清理所有卡牌 self.BackToDeck(); room.GetComponent <DeskCardsCacheComponent>().Clear(); Dictionary <long, long> gamersMoney = new Dictionary <long, long>(); foreach (GamerScore gamerScore in gamersScore) { //结算玩家余额 Gamer gamer = room.GetGamerFromUserID(gamerScore.UserID); long gamerMoney = await self.StatisticalIntegral(gamer, gamerScore.Score); gamersMoney[gamer.UserID] = gamerMoney; } //广播游戏结束消息 room.Broadcast(new Actor_Gameover_Ntt() { Winner = (byte)winnerIdentity, BasePointPerMatch = self.BasePointPerMatch, Multiples = self.Multiples, GamersScore = To.RepeatedField(gamersScore) }); //清理玩家 foreach (var _gamer in gamers) { //踢出离线玩家 if (_gamer.isOffline) { ActorMessageSender actorProxy = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(_gamer.Id); //await actorProxy.Call(new Actor_PlayerExitRoom_Req()); } //踢出余额不足玩家 else if (gamersMoney[_gamer.UserID] < self.MinThreshold) { //ActorMessageSender actorProxy = _gamer.GetComponent<UnitGateComponent>().GetActorMessageSender(); //actorProxy.Send(new Actor_GamerMoneyLess_Ntt() { UserID = _gamer.UserID }); } } }