protected override async Task Run(Gamer gamer, Actor_GamerPrompt_Req message, Action <Actor_GamerPrompt_Ack> reply) { Actor_GamerPrompt_Ack response = new Actor_GamerPrompt_Ack(); try { Room room = Game.Scene.GetComponent <RoomComponent>().Get(gamer.RoomID); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); DeskCardsCacheComponent deskCardsCache = room.GetComponent <DeskCardsCacheComponent>(); List <Card> handCards = new List <Card>(gamer.GetComponent <HandCardsComponent>().GetAll()); CardsHelper.SortCards(handCards); if (gamer.UserID == orderController.Biggest) { response.Cards.AddRange(handCards.Where(card => card.CardWeight == handCards[handCards.Count - 1].CardWeight).ToArray()); } else { List <IList <Card> > result = await CardsHelper.GetPrompt(handCards, deskCardsCache, deskCardsCache.Rule); if (result.Count > 0) { response.Cards.AddRange(result[RandomHelper.RandomNumber(0, result.Count)]); } } reply(response); } catch (Exception e) { ReplyError(response, e, reply); } }
protected override async Task Run(Gamer gamer, Actor_GamerPlayCard_Req message, Action <Actor_GamerPlayCard_Ack> reply) { Actor_GamerPlayCard_Ack response = new Actor_GamerPlayCard_Ack(); try { Room room = Game.Scene.GetComponent <RoomComponent>().Get(gamer.RoomID); GameControllerComponent gameController = room.GetComponent <GameControllerComponent>(); DeskCardsCacheComponent deskCardsCache = room.GetComponent <DeskCardsCacheComponent>(); OrderControllerComponent orderController = room.GetComponent <OrderControllerComponent>(); //检测是否符合出牌规则 if (CardsHelper.PopEnable(message.Cards, out CardsType type)) { //当前出牌牌型是否比牌桌上牌型的权重更大 bool isWeightGreater = CardsHelper.GetWeight(message.Cards, type) > deskCardsCache.GetTotalWeight(); //当前出牌牌型是否和牌桌上牌型的数量一样 bool isSameCardsNum = message.Cards.count == deskCardsCache.GetAll().Length; //当前出牌玩家是否是上局最大出牌者 bool isBiggest = orderController.Biggest == orderController.CurrentAuthority; //当前牌桌牌型是否是顺子 bool isStraight = deskCardsCache.Rule == CardsType.Straight || deskCardsCache.Rule == CardsType.DoubleStraight || deskCardsCache.Rule == CardsType.TripleStraight; //当前出牌牌型是否和牌桌上牌型一样 bool isSameCardsType = type == deskCardsCache.Rule; if (isBiggest || //先手出牌玩家 type == CardsType.JokerBoom || //王炸 type == CardsType.Boom && isWeightGreater || //更大的炸弹 isSameCardsType && isStraight && isSameCardsNum && isWeightGreater || //更大的顺子 isSameCardsType && isWeightGreater) //更大的同类型牌 { if (type == CardsType.JokerBoom) { //王炸翻4倍 gameController.Multiples *= 4; room.Broadcast(new Actor_SetMultiples_Ntt() { Multiples = gameController.Multiples }); } else if (type == CardsType.Boom) { //炸弹翻2倍 gameController.Multiples *= 2; room.Broadcast(new Actor_SetMultiples_Ntt() { Multiples = gameController.Multiples }); } } else { response.Error = ErrorCode.ERR_PlayCardError; reply(response); return; } } else { response.Error = ErrorCode.ERR_PlayCardError; reply(response); return; } //如果符合将牌从手牌移到出牌缓存区 deskCardsCache.Clear(); deskCardsCache.Rule = type; HandCardsComponent handCards = gamer.GetComponent <HandCardsComponent>(); foreach (var card in message.Cards) { handCards.PopCard(card); deskCardsCache.AddCard(card); } reply(response); //转发玩家出牌消息 room.Broadcast(new Actor_GamerPlayCard_Ntt() { UserID = gamer.UserID, Cards = message.Cards }); //游戏控制器继续游戏 gameController.Continue(gamer); } catch (Exception e) { ReplyError(response, e, reply); } }
/// <summary> /// 手牌排序 /// </summary> /// <param name="self"></param> public static void Sort(this HandCardsComponent self) { CardsHelper.SortCards(self.library); }
/// <summary> /// 手牌排序 /// </summary> /// <param name="self"></param> public static void Sort(this DeskCardsCacheComponent self) { CardsHelper.SortCards(self.library); }
/// <summary> /// 获取总权值 /// </summary> /// <param name="self"></param> /// <returns></returns> public static int GetTotalWeight(this DeskCardsCacheComponent self) { return(CardsHelper.GetWeight(self.library.ToArray(), self.Rule)); }