def sendUserBenefitsIfNeed(gameId, userId, roomId): # vip奖励映射表 vipmap = dizhuconf.getPublic().get('VipBenefits', {}).get('VipMap', {}) # 玩家vip等级 userChip = userchip.getChip(userId) info = hallvip.userVipSystem.getUserVip(userId) uservip = info.vipLevel.level if info else 0 vipmapitem = vipmap.get(str(uservip)) sendMinCoin = dizhuconf.getPublic().get('VipBenefits', {}).get('SendMinCoin', 0) if ftlog.is_debug(): ftlog.debug('sendUserBenefitsIfNeed: vipmapitem', 'userId=', userId, 'userChip=', userChip, 'sendMinCoin=', sendMinCoin, 'vipmapitem=', vipmapitem) if not vipmapitem: return chip = vipmapitem.get('chip') sendCount = vipmapitem.get('sendCount') minRoomLevel = vipmapitem.get('minRoomLevel') if chip <= 0 or sendCount <= 0 or minRoomLevel <= 0 or userChip >= sendMinCoin: return # 发送VIP救济金 ret = sendUserVipBenefits(userId, roomId, minRoomLevel, sendCount, chip) if not ret: return vipmsg = [[{ 'type': 'ttf', 'font': 'ArialMT', 'text': 'VIP' + str(uservip), 'color': 0x482904 }, { 'type': 'ttf', 'font': 'ArialMT', 'text': '特权,附', 'color': 0x482904 }, { 'type': 'ttf', 'font': 'ArialMT', 'text': '+' + str(chip), 'color': 0xFF0000 }, { 'type': 'ttf', 'font': 'ArialMT', 'text': '金!', 'color': 0x482904 }]] if ftlog.is_debug(): ftlog.debug('sendUserBenefitsIfNeed:', 'userId=', userId, 'uservip=', uservip) mo = MsgPack() mo.setCmd('table_call') mo.setResult('gameId', gameId) mo.setResult('userId', userId) mo.setResult('action', 'benefits') mo.setResult('benefits', 1) mo.setResult('message', json.dumps(vipmsg)) router.sendToUser(mo, userId)
def buildMatchTimeForDisplay(roomInfo, isFromCoinRoom, timestamp): if roomInfo.startType != MatchType.TIMING or not roomInfo.startTime: return None nextMatchTimeConf = dizhuconf.getPublic().get('nextmatchtime') if not nextMatchTimeConf: if ftlog.is_debug(): ftlog.debug( 'dizhuhallinfo.buildMatchTimeForDisplay NotNextMatchTimeConf roomId=', roomInfo.roomId, 'isFromCoinRoom=', isFromCoinRoom, 'startTime=', roomInfo.startTime) nowTime = datetime.fromtimestamp(timestamp) startTime = datetime.fromtimestamp(roomInfo.startTime) timeFormat = '%H:%M' if ftlog.is_debug(): ftlog.debug('dizhuhallinfo.buildMatchTimeForDisplay roomId=', roomInfo.roomId, 'isFromCoinRoom=', isFromCoinRoom, 'startTime=', startTime) if isFromCoinRoom and not nextMatchTimeConf.get('coinRoomShowDayInfo'): return startTime.strftime(timeFormat) # 在此获取日期的显示信息了:今天明天,后天还是显示日期 dateInfo = getNextMatchDateInfo(nowTime, startTime, nextMatchTimeConf) return dateInfo + startTime.strftime(timeFormat)
def _doMatchQuickStart(self): tableInfo = self._match_table_info userInfos = tableInfo['userInfos'] userIds = [] userSeatList = [] for i, userInfo in enumerate(userInfos): this_seat = self.seats[i] userIds.append(userInfo['userId']) this_seat.userId = userInfo['userId'] this_seat.state = TYSeat.SEAT_STATE_WAIT this_seat.call123 = -1 userSeatList.append((userInfo['userId'], i + 1)) # 初始化用户数据 for x in xrange(len(self.players)): self.players[x].initUser(0, 1) ctrlRoomId = self.room.ctrlRoomId ctrlRoomTableId = ctrlRoomId * 10000 for userId, seatId in userSeatList: onlinedata.removeOnlineLoc(userId, ctrlRoomId, ctrlRoomTableId) onlinedata.addOnlineLoc(userId, self.roomId, self.tableId, seatId) if ftlog.is_debug(): ftlog.debug("|locList:", onlinedata.getOnlineLocList(userId), caller=self) # 做一个延迟 delayConf = dizhuconf.getPublic().get('matchAnimationDelay', '') inter = delayConf.get('waitToNextMatch', 3) FTTasklet.getCurrentFTTasklet().sleepNb(inter) for x in xrange(len(self.seats)): this_seat = self.seats[x] if this_seat.userId > 0: mq = MsgPack() mq.setCmd('quick_start') mq.setResult('userId', this_seat.userId) mq.setResult('gameId', self.gameId) mq.setResult('roomId', self.roomId) mq.setResult('tableId', self.tableId) mq.setResult('seatId', x + 1) # 发送用户的quick_start router.sendToUser(mq, this_seat.userId) # 发送table_info self.gamePlay.sender.sendTableInfoResAll() delay = self._playAnimation(userInfos) if delay > 0: FTTasklet.getCurrentFTTasklet().sleepNb(delay) for x in xrange(len(self.players)): self.gamePlay.doReady(self.players[x], False) self._sendRanks(userInfos)
def _getWaitToNextMatchInter(self): mnotes = self.matchTableInfo['mnotes'] isStartStep = mnotes.get('isStartStep', False) if isStartStep: # 第一个阶段不做延迟 return 0 delayConf = dizhuconf.getPublic().get('matchAnimationDelay', '') return delayConf.get('waitToNextMatch', 3)
def _getWaitToNextMatchInter(self): tableInfo = self.table.matchTableInfo isStartStage = tableInfo.get('stage', {}).get('isStartStage', False) if isStartStage: # 第一个阶段不做延迟 return 0 delayConf = dizhuconf.getPublic().get('matchAnimationDelay', '') return delayConf.get('waitToNextMatch', 3)
def getMatchRankConf(): timestamp = pktimestamp.getCurrentTimestamp() matchRankConfList = dizhuconf.getPublic().get('matchRankConfig1', []) for matchRankConf in matchRankConfList: periods = matchRankConf.get('periods', []) if not periods: return matchRankConf.get('ranks') for timePeriod in periods: if isInTimePeriod(timestamp, timePeriod): return matchRankConf.get('ranks') return None
def buildPlayerCountDisplay(roomInfo): ''' 返回指定比赛房间的在线人数描述信息 ''' if ftlog.is_debug(): ftlog.debug('dizhuhallinfo.buildPlayerCountDisplay', 'roomId=', roomInfo.roomId, 'playerCount=', roomInfo.playerCount) peopleNumber_online = dizhuconf.getPublic().get( 'match_v3_77', {}).get('peopleNumber_online') return strutil.replaceParams(peopleNumber_online, {'people_number': roomInfo.playerCount})
def buildSigninCountDisplay(roomInfo): ''' 返回指定比赛房间的报名人数描述信息 ''' if ftlog.is_debug(): ftlog.debug('dizhuhallinfo.buildSigninCountDisplay', 'roomId=', roomInfo.roomId, 'signinCount=', roomInfo.signinCount) peopleNumber_signup = dizhuconf.getPublic().get( 'match_v3_77', {}).get('peopleNumber_signup') return strutil.replaceParams(peopleNumber_signup, {'people_number': roomInfo.signinCount})
def _getAnimationDelay(self, animationType, isStartStep, clientId): _, clientVer, _ = strutil.parseClientId(clientId) if str(clientVer) < 3.77: return self.MSTART_SLEEP delayConf = dizhuconf.getPublic().get('matchAnimationDelay') if not delayConf: return 3 valKey = 'startStep' if not isStartStep: valKey = 'type' + str(animationType) return delayConf.get(valKey, 3)
def __getAnimationInter(self, AnimationType, isStartStep, clientVer): if clientVer<3.77: return self.MSTART_SLEEP delayConf = dizhuconf.getPublic().get('matchAnimationDelay', '') if not delayConf: if isStartStep: return 5 return 3 valKey = 'startStep' if not isStartStep: valKey = 'type'+str(AnimationType) return delayConf.get(valKey, 3)
def _onSitdown(self, event): if ftlog.is_debug(): ftlog.debug('DizhuTableProtoArenaMatch._onSitdown', 'tableId=', event.table.tableId, 'seatId=', event.seat.seatId, 'userId=', event.seat.userId) if event.table.idleSeatCount == 0: delayConf = dizhuconf.getPublic().get('matchAnimationDelay', '') inter = delayConf.get('waitToNextMatch', 3) FTTasklet.getCurrentFTTasklet().sleepNb(inter) for seat in event.table.seats: self.sendQuickStartRes(seat, True, TYRoom.ENTER_ROOM_REASON_OK) # 所有人都坐下后发tableInfo self.sendTableInfoResAll() # 向前端发送牌桌动画信息 delay = self._playAnimation() if delay > 0: FTTasklet.getCurrentFTTasklet().sleepNb(delay) if event.table.runConf.isSitDownAutoReady: self._sendRanks()
def getWarmupSystemConfig(): ''' 获得热身系统的配置 ''' return dizhuconf.getPublic().get('warmupSystem', {})
def fillMatchInfo(gameId, userId, clientId, room, roomInfo, timestamp): # TODO 过滤地主版本 if ftlog.is_debug(): ftlog.debug('dizhuhallinfo.fillMatchInfo:', 'userId=', userId, 'room=', room, 'roomInfo=', roomInfo.__dict__, 'roomInf.fees=', roomInfo.fees) room['signupState'] = isSignin(userId, roomInfo) if roomInfo.startType == MatchType.TIMING: room['matchType'] = 'TIMING' else: room['matchType'] = 'USER_COUNT' # 按规则显示人数信息 roomconf = gdata.getRoomConfigure(roomInfo.roomId) tipinfo = roomconf.get('matchListPeopleNumberTip', '暂未开始报名') isArena = roomconf.get('typeName') in ('arena_match', 'dizhu_arena_match') peopleNumberBase = max(roomInfo.playerCount, roomInfo.signinCount) if ftlog.is_debug(): ftlog.debug('dizhuhallinfo.fillMatchInfo:', 'userId=', userId, 'roomId=', roomInfo.roomId, 'isArena=', isArena, 'peopleNumberBase=', peopleNumberBase) if isArena: peopleNumber = str(peopleNumberBase * 9) startTime = roomconf.get('matchConf', {}).get('startTime') stopTime = roomconf.get('matchConf', {}).get('stopTime') if ftlog.is_debug(): ftlog.debug('dizhuhallinfo.fillMatchInfo:ArenaMatch', 'userId=', userId, 'roomId=', roomInfo.roomId, 'startTime=', startTime, 'stopTime=', stopTime, 'peopleNumber=', peopleNumber) if checkTime(startTime, stopTime): room['peopleNumber'] = peopleNumber else: room['peopleNumber'] = tipinfo else: if roomInfo.startType == MatchType.TIMING: peopleNumber = str(roomInfo.playerCount + roomInfo.signinCount) curstamp = pktimestamp.getCurrentTimestamp() if ftlog.is_debug(): ftlog.debug('dizhuhallinfo.fillMatchInfo:MatchType.TIMING', 'userId=', userId, 'roomId=', roomInfo.roomId, 'peopleNumber=', peopleNumber, 'roomInfo.startTime=', roomInfo.startTime, 'roomInfo.signinTime=', roomInfo.signinTime, 'curstamp=', curstamp) if not roomInfo.startTime or not roomInfo.signinTime: room['peopleNumber'] = peopleNumber else: if curstamp < roomInfo.signinTime: # 报名未开始 room['peopleNumber'] = tipinfo else: room['peopleNumber'] = peopleNumber elif roomInfo.startType == MatchType.USER_COUNT: peopleNumber = str(peopleNumberBase) if ftlog.is_debug(): ftlog.debug('dizhuhallinfo.fillMatchInfo:MatchType.USER_COUNT', 'userId=', userId, 'roomId=', roomInfo.roomId, 'peopleNumber=', peopleNumber, 'roomInfo.playerCount=', roomInfo.playerCount, 'roomInfo.signinCount=', roomInfo.signinCount) room[ 'peopleNumber'] = peopleNumber if roomInfo.playerCount > 0 else '0' else: room['peopleNumber'] = '0' if ftlog.is_debug(): ftlog.debug('dizhuhallinfo.fillMatchInfo:result', 'userId=', userId, 'roomId=', roomInfo.roomId, 'room.peopleNumber=', room.get('peopleNumber')) ## 报名费自动填充 # signupFee = room.get('signupFee', {}) # if not signupFee.get('desc'): # signupFee['desc'] = buildFeeDisplay(room, roomInfo) # room['signupFee'] = signupFee nextTimeDisplay = buildMatchTimeForDisplay(roomInfo, False, timestamp) if nextTimeDisplay: room['condition'] = nextTimeDisplay if roomInfo.startTime: room['matchStamp'] = roomInfo.startTime room['nowStamp'] = timestamp startTimeDT = datetime.fromtimestamp(roomInfo.startTime) ## 格式化比赛时间字符串 matchCondition = room.get('matchCondition', {}) matchCondition['bottom'] = startTimeDT.strftime('%H:%M') ## 根据配置生成,年月日日期字符串 conditionType = matchCondition.get('type') if conditionType == 'datetime': datetimeTopDate = dizhuconf.getPublic().get('datetime_topdate') try: matchCondition['top'] = startTimeDT.strftime(datetimeTopDate) except: matchCondition['top'] = startTimeDT.strftime('%m月%d日')
def getConf(cls, key, default=None): return dizhuconf.getPublic().get('erdayi.misc', {}).get(key, default)
def sendUserBenefitsIfNeed(gameId, userId, roomId, timestamp): benefitsSend, userBenefits = hallbenefits.benefitsSystem.sendBenefits( gameId, userId, timestamp) ftlog.debug('sendUserBenefitsIfNeed', 'userId=', userId, 'benefitsSend=', benefitsSend) if benefitsSend: ## vip奖励映射表 vipmap = dizhuconf.getPublic().get('VipBenefits', {}).get('VipMap', {}) ## 玩家vip等级 info = hallvip.userVipSystem.getUserVip(userId) uservip = info.vipLevel.level if info else 0 vipmsg = None vipmapitem = vipmap.get(str(uservip)) ftlog.debug('sendUserBenefitsIfNeed: vipmapitem', 'userId=', userId, 'vipmapitem=', vipmapitem) if vipmapitem: chip = vipmapitem.get('chip') sendCount = vipmapitem.get('sendCount') minRoomLevel = vipmapitem.get('minRoomLevel') if chip and chip > 0 and sendCount and minRoomLevel and sendUserVipBenefits( userId, roomId, minRoomLevel, sendCount, chip): vipmsg = [[{ 'type': 'ttf', 'font': 'ArialMT', 'text': 'VIP' + str(uservip), 'color': 0x482904 }, { 'type': 'ttf', 'font': 'ArialMT', 'text': '特权,附', 'color': 0x482904 }, { 'type': 'ttf', 'font': 'ArialMT', 'text': '+' + str(chip), 'color': 0xFF0000 }, { 'type': 'ttf', 'font': 'ArialMT', 'text': '金!', 'color': 0x482904 }]] message = [[{ 'type': 'ttf', 'font': 'ArialMT', 'text': '送您%s金币救急,' % (userBenefits.sendChip), 'color': 0x482904 }], [{ 'type': 'ttf', 'font': 'ArialMT', 'text': '继续努力吧!', 'color': 0x482904 }], [{ 'type': 'ttf', 'font': 'ArialMT', 'text': '(今天第', 'color': 0x482904 }, { 'type': 'ttf', 'font': 'ArialMT', 'text': userBenefits.times, 'color': 0x25E10B }, { 'type': 'ttf', 'font': 'ArialMT', 'text': '次,共%s次)' % (userBenefits.totalMaxTimes), 'color': 0x482904 }]] ftlog.debug('sendUserBenefitsIfNeed:', 'userId=', userId, 'uservip=', uservip) mo = MsgPack() mo.setCmd('table_call') mo.setResult('gameId', gameId) mo.setResult('userId', userId) mo.setResult('action', 'benefits') mo.setResult('benefits', 1) # 有救济金了 mo.setResult('message', json.dumps(message)) if vipmsg: mo.setResult('vipmsg', json.dumps(vipmsg)) router.sendToUser(mo, userId) else: ftlog.debug('sendUserBenefitsIfNeed: no benefitsSend', 'userId=', userId) mo = MsgPack() mo.setCmd('table_call') mo.setResult('gameId', gameId) mo.setResult('userId', userId) mo.setResult('action', 'benefits') mo.setResult('benefits', 0) # 没有救济金了 router.sendToUser(mo, userId)
def doChuPai(self, player, cards, mcrc, tuoGuanType): ftlog.debug('doChuPai tid=', self.table.tableId, 'the mcrc=', mcrc, 'ccrc=', self.table.status.cardCrc, 'cards=', cards, 'mcrc=', mcrc, 'tuoGuanType=', tuoGuanType) if not player or self.table.status.state != DizhuState.TABLE_STATE_PLAYING: ftlog.warn('ERROR !!, doChuPai table.status=', self.table.status, player) return # 清理超时的次数 seat = self.table.seats[player.seatIndex] #seat.robotCardCount = 0 # 首先校验出牌的CRC if mcrc >= 0 and mcrc != self.table.status.cardCrc: ftlog.warn('doChuPai the ccrc error ! mcrc=', mcrc, 'ccrc=', self.table.status.cardCrc) self.sender.sendTableInfoRes(player.userId, player.clientId, 0) return # 托管出牌处理 ftlog.debug("doChuPai userId=", player.userId, "card=", cards, "tuoGuanType=", tuoGuanType) if tuoGuanType != DizhuPlayer.TUGUAN_TYPE_USERACT: cards = self.punish.doRobotAutoCard(player.seatId, tuoGuanType) # 出牌数据校验 canOutCard, cards = self._doChuPaiVerifyCard(player.seatId, cards) ftlog.debug('doChuPai tid=', self.table.tableId, 'canOutCard=', canOutCard, 'cards=', cards) if not canOutCard: ftlog.warn('ERROR cardOp verifyCard error') return if not cards and self.table.status.topSeatId == player.seatId: ftlog.warn( 'ERROR GameTable->doChuPai the top seat must chupai, but cards is none !' ) return precard = seat.cards[:] # 出牌牌型校验 validCards = self.card.validateCards(cards, None) delayNextStep = False if cards: if not validCards: ftlog.warn('ERROR GameTable->doChuPai the cards is invalid!', 'tableId=', self.table.tableId, 'seat=', (player.userId, player.seatId), 'cards=', cards) return # 如果是管牌,并且(牌型不对或者牌型管不住TOPCARD)则忽略出牌 if (self.table.status.topSeatId != 0 and self.table.status.topSeatId != player.seatId and (not validCards or not self._isGreaterThan( validCards, self.table.status.topCardList))): ftlog.warn('doChuPai seatId=', player.seatId, 'cards=', cards, 'topseat=', self.table.status.topSeatId, 'topcards=', self.table.status.topCardList, 'validCards=', validCards) cards = [] validCards = None if cards: if validCards: if validCards.isHuoJian(): # 火箭, 倍数翻倍 delayNextStep = True self.table.status.bomb += 1 seat.couponCard[0] += 1 elif validCards.isZhaDan(): # 炸弹, 倍数翻倍 delayNextStep = True self.table.status.bomb += 1 seat.couponCard[1] += 1 elif validCards.isFeiJiDai1() or validCards.isFeiJiDai2(): # 飞机 seat.couponCard[2] += 1 # 出牌处理 self._outCard(player, seat, cards) # 如果出的是火箭, 那么记录另外两个玩家的ID, 需要进行快速不出牌处理 if self.card.isDoubleKing(cards): for x in xrange(len(self.table.seats)): if x != player.seatIndex: self._doubleKingNoCard[x + 1] = 1 # 记录最后出牌的信息 seat.outCardCount += 1 self.table.status.topValidCard = validCards self.table.status.topCardList = cards self.table.status.topSeatId = player.seatId # 清除当前的计时器 ftlog.debug('doChuPai tid=', self.table.tableId, 'seat.cards=', seat.cards, 'topSeatId=', player.seatId, 'outCards=', cards) self.table.tableTimer.cancel() # 刷新上一次出牌 seat.lastOutCards = seat.outCards seat.outCards = cards # 发送出牌的响应消息 self.sender.sendChuPaiRes(player.seatId, player.userId, cards, precard, tuoGuanType) # 牌局记录器处理 self.table.gameRound.outCard(player.seatIndex, cards[:], self.calcCurTotalMulti()) # BI日志汇报 if TYPlayer.isRobot(player.userId): player.clientId = 'robot_3.7_-hall6-robot' bireport.reportCardEvent('TABLE_CARD', player.userId, self.table.gameId, self.table.roomId, self.table.tableId, self.table.gameRound.number, 0, 0, 0, cards, player.clientId, 0, 0) if delayNextStep: interval = dizhuconf.getPublic().get('bombNextDelay', 0) if interval > 0: FTTasklet.getCurrentFTTasklet().sleepNb(interval) self.nextStep(player)
def _doMatchQuickStart(self): ''' 牌桌开始 初始化牌桌玩家 如果是机器人,根据需求初始化机器人信息 ''' robots = [1, 2] tableInfo = self._match_table_info userInfos = tableInfo['users'] userIds = [] userSeatList = [] for i, userInfo in enumerate(userInfos): if userInfo['type'] == 'robot': userInfo['userId'] = robots.pop() this_seat = self.seats[i] userIds.append(userInfo['userId']) this_seat.userId = userInfo['userId'] this_seat.state = TYSeat.SEAT_STATE_WAIT this_seat.call123 = -1 userSeatList.append((userInfo['userId'], i + 1)) # 初始化用户数据 from dizhu.wx_resource import wx_resource wx_resource.initRobotSetting() robotCount = wx_resource.getRobotCount() robotRange = range(0, robotCount) robots = random.sample(robotRange, 3) for x in xrange(len(self.players)): self.players[x].initUser(0, 1, robots[x]) for userId, seatId in userSeatList: if TYPlayer.isRobot(userId): continue onlinedata.addOnlineLoc(userId, self.roomId, self.tableId, seatId) if ftlog.is_debug(): ftlog.debug("|locList:", onlinedata.getOnlineLocList(userId), caller=self) # 做一个延迟 delayConf = dizhuconf.getPublic().get('matchAnimationDelay', '') inter = delayConf.get('waitToNextMatch', 3) FTTasklet.getCurrentFTTasklet().sleepNb(inter) for x in xrange(len(self.seats)): this_seat = self.seats[x] if TYPlayer.isHuman(this_seat.userId): mq = MsgPack() mq.setCmd('quick_start') mq.setResult('userId', this_seat.userId) mq.setResult('gameId', self.gameId) mq.setResult('roomId', self.roomId) mq.setResult('tableId', self.tableId) mq.setResult('seatId', x + 1) mq.setResult('isOK', True) # 发送用户的quick_start router.sendToUser(mq, this_seat.userId) # 发送table_info self.gamePlay.sender.sendTableInfoResAll() delay = self._playAnimation(userInfos) if delay > 0: FTTasklet.getCurrentFTTasklet().sleepNb(delay) for x in xrange(len(self.players)): self.gamePlay.doReady(self.players[x], False) self._sendRanks(userInfos)
def getMatchHistoryConfig(): ''' 获得比赛历时记录的配置 ''' return dizhuconf.getPublic().get('match_history', {})
def _getWaitToNextMatchInter(self): if self.matchTableInfo['step']['stageIndex'] == 0: # 第一个阶段不做延迟 return 0 delayConf = dizhuconf.getPublic().get('matchAnimationDelay', {}) return delayConf.get('waitToNextMatch', 3)