def next_state(self, owner): owner.machine.trigger(DealState())
def rob_dealer(player, proto): """ 经典抢地主 """ rob_score = proto.rob_code win_seat = rob_seat = -1 cancel = 0 if player.table.conf.play_type != 1: return # 当前没有轮到该玩家抢地主 if player.table.rob_seat != player.seat: return # 该玩家已经抢过了 if player.seat in player.table.rob_players: return # 每次抢地主的分数都要比上次大 if rob_score and rob_score <= player.table.rob_score: return # 玩家下的分正确再存 if rob_score: player.table.rob_score = rob_score # 用于控制抢地主结束 player.table.rob_players[player.seat] = rob_score # 重连时用作记录 if rob_score >= 0: player.rob_score = rob_score if rob_score >= 3: win_seat = player.seat else: if len(player.table.rob_players) >= player.table.chairs: dic = player.table.rob_players win_seat = sorted(dic, key=lambda x: dic[x])[-1] if player.table.rob_players[win_seat] == 0: win_seat = -1 cancel = 1 else: player.table.rob_seat = rob_seat = player.next_seat proto = game_pb2.RobLandLordReponse() proto.uuid = player.uuid proto.rob_score = rob_score proto.win_seat = win_seat proto.rob_seat = rob_seat proto.base_score = player.table.get_base_core(player) if win_seat != -1: for c2 in player.table.cards_on_desk: card = proto.cards_rest.add() card.card = c2 player.table.reset_proto(ROB_DEALER) for i in player.table.player_dict.values(): # player.machine.trigger(RobState()) # 给所有人发包括自己 # if i.uuid == player.uuid: # continue i.proto.p = copy(proto) i.proto.send() player.table.replay["procedure"].append( {"rob_dealer": [player.uuid, rob_score]}) # 确定地主 if win_seat != -1: player.table.dealer_seat = win_seat player.table.seat_dict[player.table.dealer_seat].land_lord_times += 1 for card in player.table.cards_on_desk: # 给地主加牌 player.table.seat_dict[win_seat].cards_in_hand.append(card) for i in player.table.player_dict.values(): i.machine.cur_state.execute(i, "rob_skip") player.table.replay["procedure"].append( {"rob_confirm": [player.seat, rob_score]}) if cancel: player.table.rob_all_cancel() from state.table_state.deal import DealState player.table.machine.trigger(DealState()) player.dumps()
def rob_dealer_happy(player, proto): """ 欢乐抢地主 """ rob_score = proto.rob_score win_seat = rob_seat = -1 cancel = 0 if player.table.conf.play_type != 2: return # 当前没有轮到该玩家抢地主 if player.table.rob_seat != player.seat: return # 该玩家已经抢过了 if rob_score == player.rob_score: return # 放弃的不能在抢地主 if not player.rob_score: return # 首次不能抢地主 if player.table.rob_score == 0 and rob_score == 2: return # 地主只能被叫一次 if player.table.rob_score == 1 and rob_score == 1: return # 抢地主后不能在叫 if player.table.rob_score == 2 and rob_score == 1: return player.table.rob_score = rob_score if rob_score else 0 player.table.rob_players_happy.append([player.seat, rob_score]) player.rob_score = rob_score def get_win_seat(player, max_score): lis = player.table.rob_players_happy[::-1] result = None for item in lis: if item[1] == max_score: result = item[0] break return result max_score = max([i[0] for i in player.table.rob_players_happy]) # 只有一个叫地主的 if max_score == 1 and len( player.table.rob_players_happy) == player.table.chairs: win_seat = get_win_seat(player, max_score) else: if len(player.table.rob_players) >= player.table.chairs + 1: win_seat = get_win_seat(player, max_score) else: def set_next(player): next_player = player.table.seat_dict[player.next_seat] if next_player.rob_score == 0: set_next(next_player) return if next_player.table.rob_seat == next_player.seat: return next_player.table.rob_seat = next_player.seat global rob_seat rob_seat = next_player.seat set_next(player) if player.table.rob_seat == player.seat and player.rob_score == 0: # 全都pass 重新发牌 rob_seat = -1 cancel = 1 proto = game_pb2.RobLandLordReponse() proto.seat = player.seat proto.rob_score = rob_score proto.win_seat = win_seat proto.rob_seat = rob_seat if win_seat != -1: for c2 in player.table.cards_on_desk: card = proto.cards_rest.add() card.card = c2 player.table.reset_proto(ROB_DEALER_HAPPY) for i in player.table.player_dict.values(): # player.machine.trigger(RobState()) if i.uuid == player.uuid: continue i.proto.p = copy(proto) i.proto.send() # 刷新面板分 for i in player.table.player_dict.values(): score_proto = game_pb2.PokerScoreResponse() score_proto.multiple = i.table.get_multiple(i) send(POKER_SCORE, score_proto, i.session) player.table.replay["procedure"].append( {"rob_dealer_happy": [player.uuid, rob_score]}) # 确定地主 if win_seat != -1: player.table.dealer_seat = win_seat player.table.seat_dict[player.table.dealer_seat].land_lord_times += 1 for i in player.table.player_dict.values(): i.machine.cur_state.execute(i, "rob_skip") player.table.replay["procedure"].append( {"rob_confirm": [player.seat, rob_score]}) if cancel: player.table.rob_all_cancel() from state.table_state.deal import DealState player.table.machine.trigger(DealState()) player.dumps()
def after(self, owner): if owner.conf.game_type == 5: owner.machine.trigger(DealState()) elif owner.conf.game_type == 4 or owner.conf.game_type == 7: owner.machine.trigger(DealState())