예제 #1
0
def kg(player):
    dice_1 = random.randint(1, 6)
    dice_2 = random.randint(1, 6)
    proto = game_pb2.KGResponse()
    proto.player = player.uuid
    proto.dice.dice1 = dice_1
    proto.dice.dice2 = dice_2

    log = {
        "dice_1": dice_1,
        "dice_2": dice_2,
        "player": player.seat,
        "card": [],
    }

    i = 0
    while i < 2:
        i += 1
        try:
            card = player.table.cards_on_desk.pop()
            if not player.table.cards_on_desk:
                player.table.haidi_card = card
        except IndexError:
            card = player.table.haidi_card
        body = proto.cards.add()
        body.card = card
        log["card"].append(card)
    for i in player.table.player_dict.values():
        send(KG, proto, i.session)
    player.table.logger.info(log)
    player.table.cards_kg = log["card"]
    player.cards_discard.extend(log["card"])
예제 #2
0
    def enter(self, owner):
        super(DealerChooseState, self).enter(owner)
        # 初始化阵营
        owner.init_camp()
        if owner.dealer_seat == owner.spy_chair:
            proto = game_pb2.PokerDealerChooseInitResponse()
            proto.dealer_seat = owner.dealer_seat
            for e_player in owner.player_dict.values():
                proto.flag = -1
                if e_player.seat == owner.dealer_seat:
                    # 只给地主返回是否拿了狗腿8,其他玩家返回-1
                    # proto.flag = 1 if owner.dealer_seat == owner.spy_chair else -1
                    proto.flag = 1
                send(POKER_DEALER_CHOOSE_INIT, proto, e_player.session)
        else:
            from rules.player_rules.manager import PlayerRulesManager
            for player in owner.player_dict.values():
                PlayerRulesManager().condition(player, PLAYER_RULE_CHOOSE)
        # 计时器控制时间,中间的所有请求都可以接收,这个时间是控制死必须延迟这个时间
        # 2018.5.17取消计时器
        # owner.choose_begin_time = time.time()
        # owner.temp_timer = IOLoop().instance().add_timeout(owner.choose_begin_time + choose_delay, self.after_delay,
        #                                                    owner)

        owner.dumps()
예제 #3
0
 def enter(self, owner):
     super(HaiDiState, self).enter(owner)
     # TableRulesManager().condition(owner, TABLE_RULE_END)
     owner.haidi_pre_seat = owner.active_seat
     owner.reset_proto(HAIDI)
     # 按顺序发牌
     for i in range(owner.chairs):
         active_player = owner.seat_dict[owner.active_seat]
         owner.active_seat = active_player.next_seat
         player = owner.seat_dict[owner.active_seat]
         proto = game_pb2.QH_HaiDiResponse()
         proto.cards_rest_num = 0
         card = owner.cards_on_desk.pop()
         player.draw_card = card
         player.cards_ready_hand = is_ready_hand(player)
         player.cards_in_hand.append(card)
         # player.proto.p = copy(proto)
         proto.card.card = card
         send(HAIDI, proto, player.session)
         player.dumps()
         cards_rest_num = len(owner.cards_on_desk)
         owner.replay["procedure"].append(
             {"draw": [player.seat, card, cards_rest_num]})
     for player in owner.player_dict.values():
         from rules.player_rules.manager import PlayerRulesManager
         PlayerRulesManager().condition(player, PLAYER_RULE_MOON)
     if not owner.player_prompts:
         # 没有提示
         owner.machine.trigger(EndState())
예제 #4
0
    def show_step2(self, owner):
        if owner.temp_timer:
            IOLoop().instance().remove_timeout(owner.temp_timer)
            owner.temp_timer = None
        last_show_player = owner.seat_dict[owner.show_card_seat]
        # 超时未进行选择默认不明牌,取消计时器之后这段代码怕是不会走了
        if not last_show_player.has_chosen_ming:
            proto_req = game_pb2.PokerShowCardRequest()
            proto_req.flag = 2
            from logic.player_action import show_card
            show_card(last_show_player, proto_req)

        # 发给前端明牌结果
        proto_show_res = game_pb2.PokerShowCardResponse()
        proto_show_res.seat = owner.show_card_seat
        if last_show_player.show_card == 1:
            # 明牌发现狗腿直接暴露
            if owner.spy_card in last_show_player.cards_in_hand and last_show_player.seat != owner.dealer_seat:
                owner.notify_goutui()
        for card in last_show_player.cards_in_hand:
            show_card = proto_show_res.show_cards.add()
            # 如果明牌就返回真实牌型,否则返回空字符串
            show_card.card = card if last_show_player.show_card == 1 else ""
        for e_player in owner.player_dict.values():
            send(POKER_SHOW_CARDS_RESULT, proto_show_res, e_player.session)

        # 接下来就是各种骚操作看好了!
        from rules.player_rules.manager import PlayerRulesManager
        from rules.define import PLAYER_RULE_SHOWCARD
        PlayerRulesManager().condition(last_show_player, PLAYER_RULE_SHOWCARD)
예제 #5
0
파일: discard.py 프로젝트: jinguoyang/biji
 def enter(self, owner):
     super(DiscardState, self).enter(owner)
     # 防止前端未发 pass
     proto = game_pb2.CockDiscardNotifyResponse()
     proto.player = owner.uuid
     send(NOTIFY_DISCARD, proto, owner.session)
     owner.dumps()
예제 #6
0
 def enter(self, room_id, player_id, info, session):
     #print "player {0} enter room {1}, session {2}".format(player_id, room_id, session.uuid)
     table = self.room_dict.get(room_id)
     #if not table:
         #self.create(room_id,'asdfasdfsaf', player_id,
                     #'{"game_type":163,"max_rounds":6,"play_type":100,"has_zhong":0,"app_id":47,"has_niao":0,"chips":null,"options":604005382,"ren_shu":4,"qiang_gang":0,"bao_gang":0,"hu_pai":1,"create_type":2,"aa":0}')
         #table = self.room_dict.get(room_id)
     if not table:
         # 给前端返回房间不存在的错误
         proto = game_pb2.EnterRoomResponse()
         proto.code = 5001
         send(ENTER_ROOM, proto, session)
         print("room {0} not exist, player {1} enter failed".format(room_id, player_id))
         return
     if table.room_id != room_id:
         self.room_dict[table.room_id] = table
         del self.room_dict[room_id]
         proto = game_pb2.EnterRoomResponse()
         proto.code = 5001
         send(ENTER_ROOM, proto, session)
         table.logger.fatal("room id map error: proto {0} actually {1}".format(room_id, table.room_id))
         return
     player = table.player_dict.get(player_id)
     if player:
         # 服务重启后player没有session
         if player.session:
             player.table.logger.info("player {0} cancel old session {1}".format(player_id, player.session.uuid))
             # SessionMgr().cancel(player.session)
             player.session.close()
         SessionMgr().register(player, session)
         player.table.logger.info("player {0} register new session {1}".format(player_id, player.session.uuid))
         player.reconnect()
         player.online_status(True)
     else:
         table.enter_room(player_id, info, session)
예제 #7
0
    def exit_room(self):
        if self.table.state == 'InitState':
            if self.table.conf.is_aa():
                #if self.table.cur_round <= 1:
                if self.table.total_round <= 1:
                    if self.uuid == self.table.owner:
                        self.dismiss_room()
                    else:
                        self.table.request.aa_refund(self.uuid, 0)
            self.table.request.exit_room(self.uuid)

            proto = game_pb2.ExitRoomResponse()
            proto.player = self.uuid
            proto.code = 1
            for player in self.table.player_dict.values():
                send(EXIT_ROOM, proto, player.session)

            self.table.logger.info("player {0} exit room".format(self.uuid))

            self.delete()
            try:
                self.session.close()
            except Exception:
                pass
            del self.table.seat_dict[self.seat]
            del self.table.player_dict[self.uuid]
            self.table.dumps()
            self.table = None
        else:
            self.table.logger.info("player {0} exit room failed".format(
                self.uuid))
예제 #8
0
def show_card_dealer(player, proto):
    """ 地主二次明牌
    """
    step = proto.step
    s1, s2 = divmod(step, 10)
    if s1 and s1 != 3:
        return

    for k, v in player.table.player_dict.iteritems():
        if k == player.uuid:
            continue
        proto = game_pb2.ShowCardResponse()
        proto.code = 0
        proto.player = k
        proto.step = step
        if step != 0:
            for c in player.cards_in_hand:
                card = proto.cards.add()
                card.card = c
        send(SHOWCARD, proto, v.session)

    player.show_card = step
    multiple = player.table.conf.show_card_config['double'].get(step, 1)
    if multiple > player.table.max_show_multiple:
        player.table.max_show_multiple = multiple
    # 刷新面板分
    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({"show_card": [player.seat]})
    from rules.player_rules.manager import PlayerRulesManager
    PlayerRulesManager().condition(player, PLAYER_RULE_SHOWCARD_DEALER)
    player.dumps()
예제 #9
0
 def ready_hand(self, isTing=False):
     if self.isTing:
         return
     if not isTing:
         return
     cards = is_ready_hand(self)
     # cards,键:牌,值:(分,[类型])
     self.cards_ready_hand = cards
     if not cards:
         return
     # 删除win_card_group不胡的牌
     for temp_keys in self.win_card_group.keys():
         if temp_keys not in self.cards_ready_hand.keys():
             self.win_card_group.pop(temp_keys)
     proto = game_pb2.ReadyHandResponse()
     for i in cards:
         flag = True
         if flag:
             c = proto.card.add()
             c.card = i
     if isTing:
         proto.ting_tag = 1
     send(READY_HAND, proto, self.session)
     self.table.logger.info("player {0} ready hand cards {1}".format(
         self.seat, cards))
예제 #10
0
    def calculate_reward_points(self):
        # 配置文件不带喜
        if not self.conf.reward_type:
            return
        # 得分出问题
        points = self.get_reward_points(self.active_card,
                                        self.active_card_type)
        if points <= 0:
            return
        plus_player = self.seat_dict[self.active_seat]
        plus_player.reward_counts += points / self.conf.base_score
        for player in self.player_dict.values():
            if player.seat == self.active_seat:
                continue
            player.reward_points -= points
            plus_player.reward_points += points

        for e_player in self.player_dict.values():
            reward_proto = game_pb2.PokerRewardPointsResponse()
            reward_proto.plus_points = 4 * points
            reward_proto.reduce_points = points
            reward_proto.seat = self.active_seat
            send(POKER_REWARD, reward_proto, e_player.session)
        if self.active_seat not in self.reward_info.keys():
            self.reward_info[self.active_seat] = []
        self.reward_info[self.active_seat].append([self.active_card, points])
        self.replay["procedure"].append(
            {"reward": [plus_player.uuid, 4 * points]})
예제 #11
0
파일: player.py 프로젝트: jinguoyang/biji
    def vote(self, proto):
        if self.vote_timer:
            IOLoop().instance().remove_timeout(self.vote_timer)
        self.dumps()
        self.vote_state = proto.flag
        self.table.logger.info("player {0} vote {1}".format(self.uuid, self.vote_state))

        self.vote_timer = None
        proto_back = game_pb2.PlayerVoteResponse()
        proto_back.player = self.uuid
        proto_back.flag = proto.flag
        for k, v in self.table.player_dict.items():
            send(VOTE, proto_back, v.session)

        if proto.flag:
            for player in self.table.player_dict.values():
                if not player.vote_state:
                    return          # 给除了提出投票的人发
            self.table.dismiss_room()
        else:
            # 只要有一人拒绝则不能解散房间1
            self.table.dismiss_state = False
            self.table.dismiss_sponsor = None
            self.table.dismiss_time = 0
            for player in self.table.player_dict.values():
                player.vote_state = None
                if player.vote_timer:
                    IOLoop.instance().remove_timeout(player.vote_timer)
                    player.vote_timer = None
예제 #12
0
    def enter(self, owner):
        super(DrawConcealedKongState, self).enter(owner)
        #print "cards_kong_concealed", owner.action_ref_cards, owner.cards_in_hand
        for card in owner.action_ref_cards:
            owner.cards_in_hand.remove(card)
        owner.cards_kong_concealed.extend(owner.action_ref_cards)
        owner.cards_group.extend(owner.action_ref_cards)
        owner.table.active_seat = owner.seat

        proto = game_pb2.ActionResponse()
        for card in owner.action_ref_cards:
            cards = proto.card.add()
            cards.card = card
        proto.active_type = PLAYER_ACTION_TYPE_KONG_CONCEALED
        proto.player = owner.uuid
        proto.trigger_seat = owner.seat
        proto.active_card.card = 0
        for player in owner.table.player_dict.values():
            send(ACTION, proto, player.session)
        owner.table.logger.info("player {0} kong {1}".format(owner.seat, owner.action_ref_cards))
        # 修改杠上开花
        owner.last_gang_card = owner.table.active_card
        owner.add_gang_num(0, 0, 1, 0)
        owner.table.discard_seat = -1
        # owner.table.check_bao_change()
        from rules.player_rules.manager import PlayerRulesManager
        from rules.define import PLAYER_RULE_TING_KONG
        owner.table.reset_proto(PROMPT)
        PlayerRulesManager().condition(owner,PLAYER_RULE_TING_KONG)
예제 #13
0
    def enter(self, owner):
        super(DiscardExposedKongKGState, self).enter(owner)

        for card in owner.action_ref_cards:
            owner.cards_in_hand.remove(card)

        active_card = owner.action_op_card
        action_cards = [active_card] * 4
        owner.cards_kong_exposed.extend(action_cards)
        owner.cards_group.extend(action_cards)
        owner.add_gang_num(1, 0, 0, 0)
        trigger_seat = owner.table.active_seat
        trigger_player = owner.table.seat_dict[trigger_seat]
        calculate_final_score(trigger_player, owner,
                              owner.get_fang_gang_score())
        trigger_player.add_gang_num(0, 0, 0, 1)
        trigger_player.cards_discard.remove(active_card)
        trigger_player.machine.trigger(WaitState())
        owner.table.active_seat = owner.seat

        proto = game_pb2.ActionCSResponse()
        for card in owner.action_ref_cards:
            cards = proto.ref_card.add()
            cards.card = card
        proto.active_card.card = active_card
        proto.trigger_seat = trigger_seat
        proto.active_type = PLAYER_ACTION_TYPE_KONG_EXPOSED_KG
        proto.player = owner.uuid
        for player in owner.table.player_dict.values():
            send(ACTION_CS, proto, player.session)
        owner.table.logger.info("player {0} kong {1}".format(
            owner.seat, active_card))
        owner.table.discard_seat = -1
예제 #14
0
 def enter(self, owner):
     super(DrawConcealedKongKGState, self).enter(owner)
     #print self.name, owner.action_ref_cards, owner.cards_in_hand
     for card in owner.action_ref_cards:
         owner.cards_in_hand.remove(card)
     owner.cards_kong_concealed.extend(owner.action_ref_cards)
     owner.cards_group.extend(owner.action_ref_cards)
     owner.table.active_seat = owner.seat
     owner.add_gang_num(0, 0, 1, 0)
     proto = game_pb2.ActionCSResponse()
     for card in owner.action_ref_cards:
         cards = proto.ref_card.add()
         cards.card = card
     proto.active_type = PLAYER_ACTION_TYPE_KONG_CONCEALED_KG
     proto.player = owner.uuid
     proto.trigger_seat = owner.seat
     proto.active_card.card = 0
     for player in owner.table.player_dict.values():
         send(ACTION_CS, proto, player.session)
         if player == owner:
             continue
         else:
             calculate_final_score(player, owner, SCORE_AN_GANG)
     owner.table.logger.info("player {0} kong {1}".format(
         owner.seat, owner.action_ref_cards))
     owner.table.discard_seat = -1
예제 #15
0
 def notify_goutui(self):
     self.baolu = True
     proto = game_pb2.PokerExposeResponse()
     proto.seat = self.spy_chair
     self.replay["procedure"].append({"notify_goutui": self.spy_chair})
     for player in self.player_dict.values():
         send(POKER_EXPOSE, proto, player.session)
예제 #16
0
 def enter(self, owner):
     super(SettleForRoomState, self).enter(owner)
     # 广播大结算数据并解散房间
     owner.et = time.time()
     proto = game_pb2.SettleForRoomResponse()
     proto.end_time = time.strftime('%Y-%m-%d %X', time.localtime())
     proto.room_id = owner.room_id
     dismiss_flag = 0 if owner.dismiss_state else 1
     if owner.dismiss_flag == 2:
         dismiss_flag = 2
     proto.flag = dismiss_flag
     log = {
         "flag": proto.flag,
         "uuid": owner.room_uuid,
         "owner": owner.owner,
         "max_rounds": owner.conf.max_rounds,
         "st": owner.st,
         "et": owner.et,
         "room_id": owner.room_id,
         "player_data": []
     }
     scores = []
     for p in owner.player_dict.values():
         scores.append(p.total)
     top_score = max(scores)
     for p in owner.player_dict.values():
         i = proto.player_data.add()
         i.player = p.uuid
         i.seat = p.seat
         i.total_score = p.total
         i.top_score = top_score
         i.win_total_cnt = p.win_total_cnt
         i.win_draw_cnt = p.win_draw_cnt
         i.win_discard_cnt = p.win_discard_cnt
         i.pao_cnt = p.pao_cnt
         i.is_owner = 1 if p.uuid == owner.owner else 0
         i.kong_total_cnt = p.kong_total
         i.total_chong_bao = p.total_chong_bao
         log["player_data"].append({
             "player": p.uuid,
             "seat": p.seat,
             "total": p.total,
             "top_score": top_score,
             "win_total_cnt": p.win_total_cnt,
             "win_draw_cnt": p.win_draw_cnt,
             "win_discard_cnt": p.win_discard_cnt,
             "pao_cnt": p.pao_cnt,
             "is_owner": i.is_owner,
             "kong_total_cnt": i.kong_total_cnt,
             "total_chong_bao": i.total_chong_bao,
         })
     owner.logger.info(log)
     owner.dumps()
     for p in owner.player_dict.values():
         send(SETTLEMENT_FOR_ROOM, proto, p.session)
     owner.request.settle_for_room(log)
     # owner.bao_card = 0
     # owner.bao_card_idx = 0
     owner.dismiss_flag = 1
예제 #17
0
 def is_show_card_state(self, session):
     if self.state != 'ShowCardState':
         proto = game_pb2.ShowCardResponse()
         proto.code = 2
         proto.player = self.uuid
         send(SHOWCARD, proto, session)
         return False
     return True
예제 #18
0
파일: table.py 프로젝트: jinguoyang/biji
    def broadcast_all(self, message):
        """ 系统广播
        """
        proto = game_pb2.CommonNotify()
        proto.messageId = 4
        proto.sdata = message

        for player in self.player_dict.values():
            send(NOTIFY_MSG, proto, player.session)
예제 #19
0
    def dismiss_room(self, vote=True):

        # 如果是投票解散房间则进入大结算,否则直接推送房主解散命令

        def _dismiss():
            # 弹出大结算
            from state.table_state.settle_for_room import SettleForRoomState
            self.machine.trigger(SettleForRoomState())
            self.request.load_minus()

        if vote and self.state != "InitState":
            # 房间内游戏中投票解散
            _dismiss()

        else:
            # 0-没开始解散 1-投票 2-外部解散或者游戏进行中房主解散
            vote_flag = 2
            if vote:
                # 房间内投票
                vote_flag = 1
            else:
                if self.state == "InitState":
                    # 房主在游戏未开始时解散
                    vote_flag = 0
            if vote_flag == 2:
                # 到这说明游戏在进行中房主解散
                # 在游戏内部已经做了限制不会走到这里
                # 在游戏外部如果游戏进行中不让解散
                # 这里直接返回吧
                # self.dismiss_flag = 2
                # _dismiss()
                return
            else:

                # 游戏未开始时和游戏外房主解散直接返回0,2。
                # 0代表外开始时解散,2代表外部解散或者游戏进行中房主解散
                # 直接返回一个flag就完事了
                proto = game_pb2.DismissRoomResponse()
                proto.code = 1
                proto.flag = vote_flag
                for k, v in self.player_dict.items():
                    send(DISMISS_ROOM, proto, v.session)
                # 这个位置没-1导致房间数量一直上升
                if vote_flag == 1:
                    self.request.load_minus()
        self.logger.info("room {0} dismiss".format(self.room_id))
        from logic.table_manager import TableMgr
        self.request.dismiss_room(self)
        TableMgr().dismiss(self.room_id)
        for player in self.player_dict.values():
            try:
                player.session.close()
            except Exception:
                pass
            player.delete()

        self.delete()
예제 #20
0
 def execute(self, owner, event, proto=None):
     super(DiscardState, self).execute(owner, event, proto)
     if event == "discard":
         discard(owner, proto)
     else:
         owner.table.logger.warn("player {0} event {1} not register".format(
             owner.seat, event))
         proto_re = game_pb2.CommonNotify()
         proto_re.messageId = PLAYER_MSG_RECONNECT
         send(NOTIFY_MSG, proto_re, owner.session)
예제 #21
0
파일: ready.py 프로젝트: jinguoyang/biji
 def enter(self, owner):
     super(ReadyState, self).enter(owner)
     # 广播其他玩家
     for k, v in owner.table.player_dict.items():
         proto = game_pb2.ReadyResponse()
         proto.player = owner.uuid
         proto.cur_round = owner.table.cur_round
         send(READY, proto, v.session)
     owner.table.is_all_ready()
     owner.dumps()
예제 #22
0
파일: player.py 프로젝트: jinguoyang/biji
 def online_status(self, status):
     self.is_online = status
     proto = game_pb2.OnlineStatusResponse()
     proto.player = self.uuid
     proto.status = self.is_online
     self.table.logger.info("player {0} toggle online status {1}".format(self.seat, status))
     for i in self.table.player_dict.values():
         if i.uuid == self.uuid:
             continue
         send(ONLINE_STATUS, proto, i.session)
예제 #23
0
파일: rob.py 프로젝트: jinguoyang/pokerrrr
 def send_rob_init(self, owner):
     if owner.temp_timer:
         IOLoop().instance().remove_timeout(owner.temp_timer)
         owner.temp_timer = None
     for k, v in owner.player_dict.items():
         proto = game_pb2.RobLandLordInitResponse()
         proto.uuid = owner.seat_dict[owner.rob_seat].uuid
         proto.play_type = owner.conf.play_type
         send(ROB_DEALER_INIT, proto, v.session)
     owner.dumps()
예제 #24
0
    def enter(self, owner):
        super(DoubleState, self).enter(owner)
        proto = game_pb2.PokerDoubleInitResponse()
        for k, v in owner.seat_dict.iteritems():
            if k != owner.dealer_seat:
                proto.double_list.append(k)

        for k, v in owner.seat_dict.iteritems():
            send(POKER_DOUBLE_INIT, proto, v.session)
        owner.dumps()
예제 #25
0
def speaker(string, session):
    player = SessionMgr().player(session)

    proto = game_pb2.SpeakerRequest()
    proto.ParseFromString(string)
    proto_back = game_pb2.SpeakerResponse()
    proto_back.player = player.uuid
    proto_back.content = proto.content

    for i in player.table.player_dict.values():
        send(SPEAKER, proto_back, i.session)
예제 #26
0
 def execute(self, owner, event, proto=None):
     super(PromptDrawState, self).execute(owner, event, proto)
     from logic.player_action import action, discard
     if event == "action":
         action(owner, proto)
     elif event == "discard" and owner.table.state != 'HaiDiState':
         discard(owner, proto)
     else:
         owner.table.logger.warn("player {0} event {1} not register".format(owner.seat, event))
         proto_re = game_pb2.CommonNotify()
         proto_re.messageId = PLAYER_MSG_RECONNECT
         send(NOTIFY_MSG, proto_re, owner.session)
예제 #27
0
 def send_prompts(self):
     proto = game_pb2.PromptResponse()
     for k, v in self.action_dict.items():
         prompt = proto.prompt.add()
         prompt.action_id = k
         prompt.prompt = v["prompt"]
         prompt.op_card.card = v["op_card"]
         for c in v["ref_cards"]:
             ref_card = prompt.ref_card.add()
             ref_card.card = c
     send(PROMPT, proto, self.session)
     self.table.logger.info(self.action_dict)
예제 #28
0
 def enter(self, owner):
     super(SettleForRoomState, self).enter(owner)
     # 广播大结算数据并解散房间
     if owner.temp_timer:
         IOLoop().instance().remove_timeout(owner.temp_timer)
         owner.temp_timer = None
     owner.et = time.time()
     proto = game_pb2.PokerSettleForRoomResponse()
     proto.end_time = time.strftime('%Y-%m-%d %X', time.localtime())
     proto.room_id = owner.room_id
     dismiss_flag = 0 if owner.dismiss_state else 1
     if owner.dismiss_flag == 2:
         dismiss_flag = 0
     proto.flag = dismiss_flag
     log = {
         "flag": proto.flag,
         "uuid": owner.room_uuid,
         "owner": owner.owner,
         "max_rounds": owner.conf.max_rounds,
         "st": owner.st,
         "et": owner.et,
         "room_id": owner.room_id,
         "player_data": []
     }
     scores = []
     for p in owner.player_dict.values():
         scores.append(p.total)
     top_score = max(scores)
     for p in owner.player_dict.values():
         i = proto.player_data.add()
         i.player = p.uuid
         i.seat = p.seat
         i.total_score = p.total
         i.top_score = top_score
         i.is_owner = 1 if p.uuid == owner.owner else 0
         i.reward_score = p.reward_total
         i.base_score = p.base_total
         log["player_data"].append({
             "player": p.uuid,
             "seat": p.seat,
             "total": p.total,
             "top_score": top_score,
             "reward_score": p.reward_total,
             "is_owner": i.is_owner,
             "base_score": p.base_total,
         })
     owner.logger.info(log)
     owner.dumps()
     for p in owner.player_dict.values():
         send(POKER_SETTLEMENT_FOR_ROOM, proto, p.session)
     owner.request.settle_for_room(log)
     owner.dismiss_flag = 1
예제 #29
0
 def enter(self, owner):
     super(SettleForRoomState, self).enter(owner)
     # 广播大结算数据并解散房间
     if owner.temp_timer:
         IOLoop().instance().remove_timeout(owner.temp_timer)
         owner.temp_timer = None
     owner.et = time.time()
     proto = game_pb2.CockSettleForRoomResponse()
     proto.end_time = time.strftime('%Y-%m-%d %X', time.localtime())
     proto.room_id = owner.room_id
     proto.round = owner.cur_round - 1
     proto.score_mul = owner.conf.base_score
     proto.aa = 0 if owner.conf.aa is not True else 1
     dismiss_flag = 0 if owner.dismiss_state else 1
     if owner.dismiss_flag == 2:
         dismiss_flag = 0
     proto.flag = dismiss_flag
     configs = json.dumps({"play_type": owner.conf.play_type, "reward_type": owner.conf.reward_type,
                           "base_score": owner.conf.base_score})
     log = {"flag": proto.flag, "uuid": owner.room_uuid, "owner": owner.owner, "max_rounds": owner.conf.max_rounds,
            "st": owner.st, "et": owner.et, "room_id": owner.room_id, "config": configs, "player_data": []}
     # scores = []
     # for p in owner.player_dict.values():
     #     scores.append(p.total)
     # top_score = max(scores)
     index = 0
     for p in sorted(owner.player_dict.values(), key=lambda x: x.total, reverse=True):
         i = proto.player_data.add()
         i.player = p.uuid
         i.seat = p.seat
         i.total_score = p.total
         i.index = index
         index += 1
         i.is_owner = 1 if p.uuid == owner.owner else 0
         # i.reward_score = p.reward_total
         # i.base_score = p.base_total
         log["player_data"].append({
             "player": p.uuid,
             "seat": p.seat,
             "total": p.total,
             "top_score": 0,
             "reward_score": 0,
             "is_owner": i.is_owner,
             "base_score": 0,
         })
     owner.logger.info(log)
     owner.dumps()
     for p in owner.player_dict.values():
         send(POKER_SETTLEMENT_FOR_ROOM, proto, p.session)
     owner.request.settle_for_room(log)
     owner.dismiss_flag = 1
예제 #30
0
def dealer_choose(player, proto):
    if player.seat == player.table.dealer_seat and player.seat == player.table.spy_chair:
        choose_code = proto.choose_code
        if choose_code not in [1, 2]:
            player.table.logger.fatal(
                "choose_code : {0} wrong".format(choose_code))
        else:
            player.table.land_lord_chairs = []
            player.table.farmer_chairs = []
            player.table.land_lord_chairs.append(player.seat)
            if choose_code == 1:
                # 一打四
                player.table.spy_chair = -1
            elif choose_code == 2:
                # 叫狗腿
                # 换狗腿牌
                result = player.table.change_spy_card()
                if result:
                    # 换狗腿座位
                    player.table.change_spy_chair()
                    # 地主阵营
                    player.table.land_lord_chairs.append(
                        player.table.spy_chair)
                else:
                    player.table.logger.fatal("Change spy_card Wrong")
                    # 要是实在是找不到狗腿牌就直接判定为一打四
                    player.table.spy_chair = -1
            if player.table.spy_chair == -1:
                player.table.replay["procedure"].append({"dealer_choose": 1})
            else:
                player.table.replay["procedure"].append({"dealer_choose": 2})
            for e_player in player.table.player_dict.values():
                if e_player.seat not in player.table.land_lord_chairs:
                    # 农民阵营
                    player.table.farmer_chairs.append(e_player.seat)

            # 发送选择结果
            if player.table.spy_card != "8G":
                proto_res = game_pb2.PokerDealerChooseResponse()
                proto_res.choose_code = 2
                proto_res.spy_card = player.table.spy_card
                player.table.replay["procedure"].append(
                    {"change_goutui": player.table.spy_card})
                for e_player in player.table.player_dict.values():
                    send(POKER_DEALER_CHOOSE, proto_res, e_player.session)
            from rules.player_rules.manager import PlayerRulesManager
            for player in player.table.player_dict.values():
                PlayerRulesManager().condition(player, PLAYER_RULE_CHOOSE)