def sendGameplayInfo(roomId, userId, clientId, mode): """ 发送玩法相关信息 """ bigRoomId, _ = util.getBigRoomId(roomId) key = "%s_%d" % (bigRoomId, mode) lang = util.getLanguage(userId, clientId) conf = config.getSuperBossCommonConf() tabs = conf.get(str(key), {}).get("tabs", []) tabs = [{ "title": config.getMultiLangTextConf(v["title"], lang=lang), "data": v["data"], "param": v.get("param", 0) } for v in tabs] mo = MsgPack() mo.setCmd("superboss_gameplay_info") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("roomId", roomId) mo.setResult("mode", mode) mo.setResult("tabs", tabs) router.sendToUser(mo, userId) checkModuleTip(bigRoomId, userId, mode) if ftlog.is_debug(): ftlog.debug("gameplay, userId =", userId, "mo =", mo)
def convertItem(roomId, idx, count, userId, mode): """ 兑换 """ bigRoomId, _ = util.getBigRoomId(roomId) key = "%s_%d" % (bigRoomId, mode) mgType = config.getSuperBossCommonConf().get(str(key), {}).get("mgType", "") code, rewards, info = _exchange(userId, mgType, mode, idx, count) mo = MsgPack() mo.setCmd("superboss_convert") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("roomId", roomId) mo.setResult("code", code) mo.setResult("idx", idx) mo.setResult("mode", mode) mo.setResult("count", count) mo.setResult("info", info) mo.setResult("rewards", rewards) router.sendToUser(mo, userId) if code == 0: sendConvertInfo(roomId, userId, mode) mgType = config.getSuperBossCommonConf().get(str(key), {}).get("mgType", "") checkModuleTip(mgType, userId, mode)
def sendMiniGameProgress(table, userId, roomId): """ 发送断线重连后发送进度信息 """ roomData = getRoomMinigame(roomId, userId) bigRoomId, _ = util.getBigRoomId(roomId) if roomData and roomData.get("current", {}): locs = roomData.get("current", {}).get("locs", []) reward = roomData.get("current", {}).get("reward", []) msgRet = MsgPack() # 还没有翻完硬币/还未选择箱子 if len(locs) < len(reward): msgRet = MsgPack() msgRet.setCmd("mini_game_continue") msgRet.setResult("gameState", 1) msgRet.setResult("gameId", FISH_GAMEID) msgRet.setResult("userId", userId) cardId = roomData.get("current", {}).get("cardId", 0) msgRet.setResult("locs", locs) msgRet.setResult("cardId", cardId) msgRet.setResult("reward", reward) totalWinCount = roomData.get("current", {}).get("totalWin", 0) msgRet.setResult("totalWin", [{ "name": 101, "count": totalWinCount }]) # 已经选择了箱子,但是还没点击转盘抽奖 elif len(locs) == len(reward): msgRet.setCmd("mini_game_continue") msgRet.setResult("gameState", 2) msgRet.setResult("gameId", FISH_GAMEID) msgRet.setResult("userId", userId) GameMsg.sendMsg(msgRet, table.getBroadcastUids())
def triggerWinCmpttTaskEvent(event): """ 夺宝赛获奖事件 """ bigRoomId, _ = util.getBigRoomId(event.roomId) fishPool = util.getFishPoolByBigRoomId(bigRoomId) userId = event.userId _incQuestValue(userId, TaskType.WinTask, 1, fishPool=fishPool)
def getRoomMinigame(roomId, userId): """ 获取小游戏数据 """ bigRoomId, _ = util.getBigRoomId(roomId) miniGameData = gamedata.getGameAttrJson(userId, FISH_GAMEID, "miniGame", {}) return miniGameData.get(str(bigRoomId))
def __init__(self, table, player, miniGameId): self.miniGameId = miniGameId self.table = table self.bigRoomId, _ = util.getBigRoomId(table.roomId) self.player = player self.conf = config.getMiniGameConf(miniGameId) self.minWeaponId = self.conf["minWeaponId"] self.minChip = self.conf["minChip"]
def triggerWinBonusTaskEvent(event): """ 奖金赛获奖事件 """ bigRoomId, _ = util.getBigRoomId(event.roomId) fishPool = util.getFishPoolByBigRoomId(bigRoomId) userId = event.userId rank = event.rank _incQuestValue(userId, TaskType.WinTask, 1, fishPool=fishPool)
def triggerFireEvent(event): """ 开火事件 """ bigRoomId, _ = util.getBigRoomId(event.roomId) fishPool = util.getFishPoolByBigRoomId(bigRoomId) fpMultiple = event.fpMultiple if hasattr(event, "fpMultiple") else 0 userId = event.userId _incQuestValue(userId, TaskType.FireNum, 1, fishPool=fishPool, fpMultiple=fpMultiple)
def getCurrentGiftConf(self): """ 获取当前可显示礼包的配置 """ isIn, roomId, _, _ = util.isInFishTable(self.userId) if not isIn: return [], "" mode = util.getGiftDTestMode(self.userId) fishPool = util.getFishPoolByBigRoomId(util.getBigRoomId(roomId)[0]) grade, nextGrade = self._getGrade(fishPool) # 获取礼包档位 giftAbcTestConf = config.getGiftAbcTestConf(self.clientId) giftListConf = giftAbcTestConf.get("data", {}).get( str(fishPool), {}).get(grade, {}).get("giftList", {}).get(mode, []) nextGiftListConf = giftAbcTestConf.get("data", {}).get( str(fishPool), {}).get(nextGrade, {}).get("giftList", {}).get(mode, []) buyTimes = self._getBuyTimes(fishPool) recommonGift = [] # 当前房间可以使用的破产礼包列表. for idx, giftGroup in enumerate(zip(giftListConf, nextGiftListConf)): if not set(self.availableGift) & set(giftGroup): # 优先展示可领取的礼包 continue if buyTimes - 1 != idx: continue for giftId in giftGroup: giftConf = giftAbcTestConf.get("gift", {}).get(str(giftId)) if not giftConf: continue recommonGift.append(giftConf) if ftlog.is_debug(): ftlog.debug("BankruptGift_getCurrentGiftConf", fishPool, giftListConf, nextGiftListConf, grade, nextGrade, recommonGift) # 没有可领取礼包则按照已购买次数显示礼包. if not recommonGift: if 0 <= buyTimes < len(giftListConf): listConf2 = giftAbcTestConf.get("data", {}).get( str(fishPool), {}).get(nextGrade, {}).get("giftList", {}).get(mode, []) giftId1, giftId2 = giftListConf[buyTimes], listConf2[buyTimes] recommonGift = [ giftAbcTestConf.get("gift", {}).get(str(giftId1)), giftAbcTestConf.get("gift", {}).get(str(giftId2)) ] lang = util.getLanguage(self.userId, self.clientId) remainTimes = max(0, len(giftListConf) - buyTimes) if recommonGift: gamedata.setGameAttr(self.userId, FISH_GAMEID, GameData.bankruptGiftInfo, json.dumps([fishPool, grade, nextGrade])) tip = config.getMultiLangTextConf("ID_BANKRUPT_GIFT_TIP", lang=lang).format(remainTimes) else: tip = "" return recommonGift, tip
def triggerUseSkillEvent(event): """ 使用技能事件 """ bigRoomId, _ = util.getBigRoomId(event.roomId) fishPool = util.getFishPoolByBigRoomId(bigRoomId) fpMultiple = event.fpMultiple if hasattr(event, "fpMultiple") else 0 userId = event.userId skillId = event.skillId _incQuestValue(userId, TaskType.SkillUseNum, 1, fishPool=fishPool, fpMultiple=fpMultiple)
def triggerEnterTableEvent(event): """ 进入渔场事件(参加回馈赛) """ if event.reconnect: return userId = event.userId bigRoomId, isMatch = util.getBigRoomId(event.roomId) if isMatch: _incQuestValue(userId, TaskType.EnterMatchTimes, 1) fishPool = util.getFishPoolByBigRoomId(bigRoomId) _incQuestValue(userId, TaskType.EnterFishPool, 1, fishPool=fishPool)
def miniGameStart(table, player, miniGameLevel, gunM=1): """ 开始小游戏 """ ret = {"reason": 0} bigRoomId, _ = util.getBigRoomId(table.roomId) addCard(table.roomId, player, gunM) miniGameData = gamedata.getGameAttrJson(player.userId, FISH_GAMEID, "miniGame", {}) roomData = miniGameData.get(str(bigRoomId)) if not roomData or roomData.get("cardNum", 0) == 0: ret["reason"] = 4 elif roomData.get("current", {}): ret["reason"] = 5 else: miniGameIds = config.getMiniGameLevelIds(miniGameLevel) if not miniGameIds: ret["reason"] = 6 else: selected = random.choice(miniGameIds) if ftlog.is_debug(): ftlog.debug("miniGameStart", player.userId, miniGameIds, selected, config.miniGameConf, config.miniGameLevelMap) conf = config.getMiniGameConf(selected) if player.clip * player.fpMultiple + player.tableChip < conf[ "minChip"]: if ftlog.is_debug(): ftlog.debug("miniGameStart chip not enough", player.userId, player.chip, conf["minChip"]) ret["reason"] = 2 elif "minWeaponId" in conf and player.gunLevel < conf[ "minWeaponId"]: if ftlog.is_debug(): ftlog.debug("miniGameStart gunLevel not enough", player.userId, player.gunLevel, conf["minWeaponId"]) ret["reason"] = 1 elif "minUserLevel" in conf and player.level < conf["minUserLevel"]: if ftlog.is_debug(): ftlog.debug("miniGameStart minUserLevel not enough", player.userId, player.level, conf["minUserLevel"]) ret["reason"] = 3 else: ret["cardId"] = selected miniGame = createMiniGame(selected, table, player) startRet = miniGame.start() ret.update(startRet) return ret
def playMinigameShow(roomId, userId, idx, mode, userIds): """ 巨龙转盘展示盘面 """ bigRoomId, _ = util.getBigRoomId(roomId) subkey = "%s_%d" % (bigRoomId, mode) mgType = config.getSuperBossCommonConf().get(str(subkey), {}).get("mgType", "") key = "%s_%d" % (mgType, mode) mo = MsgPack() mo.setCmd("superboss_minigame_show") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("roomId", roomId) mo.setResult("mode", mode) mo.setResult("idx", idx) mo.setResult("type", mgType) data = {} code = 1 gainItems = [] if mgType == "dragon": superbossPlayedTimes = weakdata.getDayFishData(userId, WeakData.superbossMGPlayedTimes, {}) playedTimes = superbossPlayedTimes.setdefault(key, 0) conf = config.getSuperBossMiniGameConf() vipLevel = hallvip.userVipSystem.getUserVip(userId).vipLevel.level maxTimesList = conf.get("info", {}).get(key, {}).get("maxTimes", []) isCanPlay = True items = conf.get("game", {}).get(key, []) maxTimes = maxTimesList[vipLevel] if maxTimesList and len(maxTimesList) > vipLevel else 0 if 0 <= idx < len(items) and (maxTimes == -1 or maxTimes > playedTimes) and isCanPlay: costItems = items[idx]["costs"] gainItems = items[idx]["rewards"] for _val in costItems: if util.balanceItem(userId, _val["name"]) < _val["count"]: code = 2 break else: code = 0 turntable_rewards = [] if code == 0: for gainItem in gainItems: for key in gainItem.keys(): if key == "count": turntable_rewards.append(gainItem[key]) data["turntable_rewards"] = turntable_rewards mo.setResult("data", data) mo.setResult("code", code) userIds.append(userId) GameMsg.sendMsg(mo, userIds)
def spin(self, weightList, fpMultiple): """ 转动轮盘 """ fishPool = str(self.fishPool) prizeConf = self.getPrizeConf(fishPool, fpMultiple) pwData = self._getData(fishPool, fpMultiple) try: # 获取轮盘结果 idx = util.selectIdxByWeight(weightList) rewards = prizeConf["wheel"][idx]["rewards"] ratioList = self._buildRetData(fishPool, fpMultiple, rewards) pwData[PWValueSlot.RET] = ratioList except: code = 1 self._resetPrizeWheelState(fishPool, fpMultiple) ftlog.error("prize_wheel, userId =", self.userId) return code else: code = 0 _idx = len(pwData[PWValueSlot.TAKEN]) if _idx >= len(self.pwConf["energy"]): _idx = -1 pwData[PWValueSlot.TAKEN].append(idx) # 扣除可用抽奖次数. if not self.isEnergyStorageMode: pwData[PWValueSlot.SPINTIMES] = 0 else: pwData[PWValueSlot.SPINTIMES] -= 1 pwData[PWValueSlot.SPINTIMES] = max( 0, pwData[PWValueSlot.SPINTIMES]) pwData[PWValueSlot.STATE] = PWState.NOT_TAKE_REWARD self.sendEnergyProgress(self.fishPool, fpMultiple, self.roomId, -1) # 给其他渔场充能 addEnergy = self.pwConf["energy"][_idx].get(fishPool, {}).get("add", {}) for roomId, val in addEnergy.iteritems(): roomId = int(roomId) bigRoomId, _ = util.getBigRoomId(roomId) fp = util.getFishPoolByBigRoomId(bigRoomId) if self._addEnergy(fp, fpMultiple, val): self.sendEnergyProgress(fp, fpMultiple, roomId, val) self._setData(fishPool, fpMultiple) from newfish.game import TGFish event = PrizeWheelSpinEvent(self.userId, config.FISH_GAMEID, self.roomId) TGFish.getEventBus().publishEvent(event) return code
def triggerEnterTableEvent(event): """ 进入渔场事件 """ if event.reconnect: return userId = event.userId bigRoomId, _ = util.getBigRoomId(event.roomId) if bigRoomId in range(44101, 44105): incrQuestTypeData(userId, QuestType.JoinMatch, 1) # 进入回馈赛多少次 if bigRoomId == 44102: incrQuestTypeData(userId, QuestType.EnterMatch44102, 1) elif bigRoomId == 44103: incrQuestTypeData(userId, QuestType.EnterMatch44103, 1) elif bigRoomId in [44301, 44302]: incrQuestTypeData(userId, QuestType.JoinRobbery, 1) # 进入招财多少次
def sendMinigameInfo(roomId, userId, mode): """ 发送小游戏信息 """ bigRoomId, _ = util.getBigRoomId(roomId) subkey = "%s_%d" % (bigRoomId, mode) mgType = config.getSuperBossCommonConf().get(str(subkey), {}).get("mgType", "") key = "%s_%d" % (mgType, mode) mo = MsgPack() mo.setCmd("superboss_minigame_info") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("roomId", roomId) mo.setResult("mode", mode) mo.setResult("type", mgType) data = {} if mgType in MINIGAME_TYPE_LIST: conf = config.getSuperBossMiniGameConf() superbossPlayedTimes = weakdata.getDayFishData(userId, WeakData.superbossMGPlayedTimes, {}) playedTimes = superbossPlayedTimes.get(key, 0) vipLevel = hallvip.userVipSystem.getUserVip(userId).vipLevel.level maxTimesList = conf.get("info", {}).get(key, {}).get("maxTimes", []) maxTimes = maxTimesList[vipLevel] if maxTimesList and len(maxTimesList) > vipLevel else 0 remainTimes = max(0, maxTimes - playedTimes) if maxTimes >= 0 else -1 currencyList = conf.get("info", {}).get(key, {}).get("currencyList", []) items = config.rwcopy(conf.get("game", {}).get(key, [])) gunLevelVal = util.getGunLevelVal(userId, config.MULTIPLE_MODE) lang = util.getLanguage(userId) itemsinfo = [] for item in items: if gunLevelVal >= item["level"]: item["des"] = config.getMultiLangTextConf(item["des"], lang=lang) if item["des"] else "" itemsinfo.append(item) if mgType == "box": for iteminfo in itemsinfo: rewards = iteminfo["rewards"] groupIdx = util.selectIdxByWeight([int(reward.keys()[0]) for reward in rewards]) iteminfo["rewards"] = rewards[groupIdx].values()[0] iteminfo["groupIdx"] = groupIdx mo.setResult("showItemsList", currencyList) data = {"remainTimes": remainTimes, "items": itemsinfo} else: ftlog.warn("minigame, type error, userId =", userId, "roomId =", roomId, "mode =", mode, "mgType =", mgType) mo.setResult("data", data) router.sendToUser(mo, userId) if ftlog.is_debug(): ftlog.debug("minigame, userId =", userId, "mode =", mode, "mo =", mo)
def sendConvertInfo(roomId, userId, mode): """ 发送兑换信息 """ bigRoomId, _ = util.getBigRoomId(roomId) key = "%s_%d" % (bigRoomId, mode) mgType = config.getSuperBossCommonConf().get(str(key), {}).get("mgType", "") mo = MsgPack() mo.setCmd("superboss_convert_info") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("roomId", roomId) mo.setResult("mode", mode) showItemsList, exchangeItems = _getExchangeData(userId, mgType, mode) mo.setResult("showItemsList", showItemsList) mo.setResult("convertItems", exchangeItems) router.sendToUser(mo, userId)
def addCard(roomId, player, gunM): """ 增加卡片数量 """ userId = player.userId bigRoomId, _ = util.getBigRoomId(roomId) miniGameData = gamedata.getGameAttrJson(userId, FISH_GAMEID, "miniGame", {}) roomData = miniGameData.get(str(bigRoomId)) if not roomData: roomData = {"cardNum": 0, "multi": 0, "roomId": bigRoomId} miniGameData[str(bigRoomId)] = roomData roomData["cardNum"] += 1 roomData["multi"] = gunM gamedata.setGameAttr(userId, FISH_GAMEID, "miniGame", json.dumps(miniGameData)) player.cardNum = 1 return roomData
def triggerCatchEvent(event): """捕获事件""" bigRoomId, _ = util.getBigRoomId(event.roomId) typeName = util.getRoomTypeName(event.roomId) fishPool = util.getFishPoolByBigRoomId(bigRoomId) fpMultiple = event.fpMultiple if hasattr(event, "fpMultiple") else 0 userId = event.userId fishTypes = event.fishTypes gain_chip = event.gainChip resetTime = event.resetTime gunX = event.gunX * event.gunSkinMul fish_boss_num = 0 fish_multiple_num = 0 terror_num = 0 all_fish_num = len(fishTypes) for fishType in fishTypes: fishConf = config.getFishConf(fishType, typeName) if fishConf["type"] in config.BOSS_FISH_TYPE: # Boss fish_boss_num += 1 elif fishConf["type"] in config.ROBBERY_BOSS_FISH_TYPE: # 招财Boss fish_boss_num += 1 all_fish_num -= 1 elif fishConf["type"] in config.MULTIPLE_FISH_TYPE: # 倍率鱼 fish_multiple_num += 1 elif fishConf["type"] in config.ROBBERY_MULTIPLE_FISH_TYPE: # 招财倍率鱼 fish_multiple_num += 1 all_fish_num -= 1 if fishConf["type"] in config.TERROR_FISH_TYPE: # 特殊鱼 terror_num += 1 if fish_boss_num: _incQuestValue(userId, TaskType.GunYBossFishNum, fish_boss_num, resetTime, fishPool=fishPool, fpMultiple=fpMultiple, gunX=gunX) if fish_multiple_num: _incQuestValue(userId, TaskType.GunYMultipleFishNum, fish_multiple_num, resetTime, fishPool=fishPool, fpMultiple=fpMultiple, gunX=gunX) if all_fish_num: _incQuestValue(userId, TaskType.GunYFishNum, all_fish_num, resetTime, fishPool=fishPool, fpMultiple=fpMultiple, gunX=gunX) _incQuestValue(userId, TaskType.FishNum, all_fish_num, resetTime, fishPool=fishPool, fpMultiple=fpMultiple) if gain_chip: _incQuestValue(userId, TaskType.CoinNum, gain_chip, resetTime, fishPool=fishPool, fpMultiple=fpMultiple) if terror_num: _incQuestValue(userId, TaskType.GunYTerrorFishNum, terror_num, resetTime, fishPool=fishPool, fpMultiple=fpMultiple, gunX=gunX) _incQuestValue(userId, TaskType.TerrorFishNum, terror_num, resetTime, fishPool=fishPool, fpMultiple=fpMultiple)
def _triggerEnterTableEvent(event): """进入招财模式渔场""" if event.reconnect: return roomId, isMatch = util.getBigRoomId(event.roomId) _EnterRoomEvent(event.userId, roomId, isMatch)
def getInfo(self, fpMultiple, action=0): """ 获取轮盘数据 """ fishPool = str(self.fishPool) pwData = self._getData(fishPool, fpMultiple) code = 1 mo = MsgPack() mo.setCmd("prize_wheel_info") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", self.userId) mo.setResult("act", action) prizeConf = self.getPrizeConf(fishPool, fpMultiple) info = {} # 获取转盘奖励数据 prizeList = [] weightList = [] info["prizeList"] = prizeList if self._enable(fishPool, fpMultiple): for idx, item in enumerate(prizeConf.get("wheel", [])): prizeList.append({ "name": item["rewards"]["name"], "count": item["rewards"]["count"] }) enable = 1 if idx not in pwData[PWValueSlot.TAKEN] else 0 prizeList[-1].update({"enable": enable}) weightList.append(item["rate"] if enable else 0) if action == 0: # 查询 code = 0 elif action == 1 and prizeList and weightList and sum(weightList) \ and pwData[PWValueSlot.SPINTIMES] > 0 and pwData[PWValueSlot.STATE] == PWState.NOT_SPIN: # 抽奖 code = self.spin(weightList, fpMultiple) # 更新数据. pwData = self._getData(fishPool, fpMultiple) if pwData[PWValueSlot.STATE] in [ PWState.NOT_TAKE_REWARD, PWState.FAIL_SPIN ]: if code == 0: consumeDiamond, rewards = self.getConsumeDiamond(pwData) info["rewards"] = [rewards] info["paidInfo"] = { "name": config.DIAMOND_KINDID, "count": consumeDiamond } info["ratioList"] = pwData[PWValueSlot.RET] # 如果没有设置倍数则直接领取当前奖励. if action == 1 and len(info["ratioList"]) == 1: self.setRewards(fpMultiple, 1, "bet") if pwData[PWValueSlot.STATE] == PWState.FAIL_SPIN: info["betFail"] = pwData[PWValueSlot.BET] else: info["rewards"] = [] info["ratioList"] = [] else: info["rewards"] = [] info["ratioList"] = [] mo.setResult("info", info) mo.setResult("code", code) mo.setResult("state", pwData[PWValueSlot.STATE]) mo.setResult("curRemainTimes", pwData[PWValueSlot.SPINTIMES]) nextRoomId = prizeConf.get("nextRoomId", 0) if nextRoomId: bigRoomId, _ = util.getBigRoomId(nextRoomId) nextFishPool = util.getFishPoolByBigRoomId(bigRoomId) mo.setResult("nextRoomId", nextRoomId) mo.setResult("nextRoomMultiple", prizeConf.get("nextRoomMultiple", 0)) mo.setResult("nextProgressPct", self._getEnergyPct(nextFishPool, fpMultiple)) mo.setResult( "nextRemainTimes", self._getData(nextFishPool, fpMultiple)[PWValueSlot.SPINTIMES]) GameMsg.sendMsg(mo, self.userId) if ftlog.is_debug(): ftlog.debug("prize_wheel, userId =", self.userId, "fishPool =", fishPool, "fpMultiple =", fpMultiple, "msg =", mo)
def playMinigame(roomId, userId, idx, mode, userIds, groupIdx): """ 点击小游戏 """ bigRoomId, _ = util.getBigRoomId(roomId) subkey = "%s_%d" % (bigRoomId, mode) mgType = config.getSuperBossCommonConf().get(str(subkey), {}).get("mgType", "") key = "%s_%d" % (mgType, mode) mo = MsgPack() mo.setCmd("superboss_minigame") mo.setResult("gameId", FISH_GAMEID) mo.setResult("userId", userId) mo.setResult("roomId", roomId) mo.setResult("mode", mode) mo.setResult("idx", idx) mo.setResult("type", mgType) code = 1 data = {} gainItems =[] if mgType in MINIGAME_TYPE_LIST: superbossPlayedTimes = weakdata.getDayFishData(userId, WeakData.superbossMGPlayedTimes, {}) playedTimes = superbossPlayedTimes.setdefault(key, 0) conf = config.getSuperBossMiniGameConf() vipLevel = hallvip.userVipSystem.getUserVip(userId).vipLevel.level maxTimesList = conf.get("info", {}).get(key, {}).get("maxTimes", []) maxTimes = maxTimesList[vipLevel] if maxTimesList and len(maxTimesList) > vipLevel else 0 items = conf.get("game", {}).get(key, []) rewards = [] _idx = 0 isCanPlay = True # 只能抽取满足消耗的最高等级抽奖. # if mgType == "queen": # # 抽奖消耗由多到少配置。 # for _idx, _val in enumerate(itemsinfo): # # 检查消耗是否满足条件 # for v in _val["costs"]: # if util.balanceItem(userId, v["name"]) < v["count"]: # break # else: # isCanPlay = (idx == _idx) # break if 0 <= idx < len(items) and (maxTimes == -1 or maxTimes > playedTimes) and isCanPlay: costItems = items[idx]["costs"] if mgType == "box": gainItems = items[idx]["rewards"][groupIdx].values()[0] else: gainItems = items[idx]["rewards"] for _val in costItems: if util.balanceItem(userId, _val["name"]) < _val["count"]: code = 2 break else: _ret = util.consumeItems(userId, costItems, "BI_NFISH_SUPERBOSS_EXCHANGE", bigRoomId, mode) if not _ret: code = 2 else: superbossPlayedTimes[key] += 1 weakdata.setDayFishData(userId, WeakData.superbossMGPlayedTimes, json.dumps(superbossPlayedTimes)) _idx = util.selectIdxByWeight([v["probb"] for v in gainItems]) if _idx >= 0: rewards = [{"name": gainItems[_idx]["name"], "count": gainItems[_idx]["count"]}] isIn, roomId, tableId, _ = util.isInFishTable(userId) if isIn: code = table_remote.addRewardsToTable(roomId, tableId, userId, rewards, "BI_NFISH_SUPERBOSS_BOX", mode) else: code = util.addRewards(userId, rewards, "BI_NFISH_SUPERBOSS_BOX", bigRoomId, mode) if code != 0: ftlog.error("minigame, userId =", userId, "bigRoomId =", key, "idx =", idx, "rewards =", rewards) playedTimes = superbossPlayedTimes.get(key, 0) remainTimes = max(0, maxTimes - playedTimes) if maxTimes >= 0 else -1 data = {"remainTimes": remainTimes, "rewards": rewards, "rewardIndex": _idx} else: ftlog.warn("minigame, type error, userId =", userId, "roomId =", roomId, "mode =", mode, "idx =", idx, "mgType =", mgType) mo.setResult("code", code) turntable_rewards = [] if mgType == "dragon": for gainItem in gainItems: for key in gainItem.keys(): if key == "count": turntable_rewards.append(gainItem[key]) data["turntable_rewards"] = turntable_rewards mo.setResult("data", data) router.sendToUser(mo, userId) if mgType == "dragon" and code == 0: userIds = userIds GameMsg.sendMsg(mo, userIds) if code == 0: from newfish.game import TGFish event = PlayMiniGame(userId, config.FISH_GAMEID) TGFish.getEventBus().publishEvent(event) checkModuleTip(bigRoomId, userId, mode)