def getSaleItemExtraCoin(userId, coin): """ 神秘金币加赠额外金币 """ extraCoin = 0 try: treasureConf = config.getTreasureConf(effectType=EffectType.SaleItemCoinAdd) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if levelConf: refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] < treasureConf["limitCount"]: extraRate = levelConf.get("params", {}).get("value") if extraRate: extraCoin = int(coin * extraRate) activeTreasure(userId, kindId, treasureData) except Exception as e: ftlog.error("treasure_system.getSaleItemExtraCoin error", e, "userId=", userId, "chip=", coin) if ftlog.is_debug(): ftlog.debug("treasure_system.getSaleItemExtraCoin OUT", "userId=", userId, "chip=", coin, "extraCoin=", extraCoin) return extraCoin
def isUseItemFree(userId, value): """ 时间沙漏,判断是否不消耗道具卡 """ try: treasureConf = config.getTreasureConf(effectType=EffectType.FreeUseItemAdd) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if levelConf: refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] < treasureConf["limitCount"]: chance = levelConf.get("params", {}).get("value") randomValue = random.randint(1, 10000) if ftlog.is_debug(): ftlog.debug("treasure_system.isUseItemFree get", "userId=", userId, "level=", level, "levelConf=", levelConf, "chance=", chance, "randomValue=", randomValue) if randomValue <= chance * 10000: activeTreasure(userId, kindId, treasureData) sendTreasureTriggerMsg(userId, kindId, value) return True except Exception as e: ftlog.error("treasure_system.isUseItemFree error", e, "userId=", userId) return False
def setTreasure(userId, kindId, treasureData): """ 存储单个宝藏数据 """ assert str(kindId) in config.getTreasureConf() assert isinstance(treasureData, list) daobase.executeUserCmd(userId, "HSET", _getUserTreasureKey(userId), str(kindId), json.dumps(treasureData))
def provideTimeMatchRankReward(userId, roomId, rank, rankRewards): """ 回馈赛上榜发放宝藏奖励到邮件 """ treasureConf = config.getTreasureConf(effectType=EffectType.MatchRankRewardAdd) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return rewards = [] lang = util.getLanguage(userId) ratio = levelConf["params"]["time_match"] for _reward in rankRewards: if _reward["name"] in config.BULLET_VALUE: name = config.BRONZE_BULLET_KINDID count = int(math.ceil(_reward["count"] * config.BULLET_VALUE[_reward["name"]] * ratio)) else: name = _reward["name"] count = int(math.ceil(_reward["count"] * ratio)) rewards.append({"name": name, "count": count}) if rewards: matchName = config.getMultiLangTextConf(gdata.getRoomConfigure(roomId).get("name", ""), lang=lang) treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_TIME_MATCH_RANK", lang=lang) message = message.format(matchName, rank, level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData)
def provideFinishGrandPrixReward(userId): """ 完成大奖赛发放宝藏奖励到邮件 """ treasureConf = config.getTreasureConf(effectType=EffectType.MatchItemReward) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return rewards = [] lang = util.getLanguage(userId) for _kindId, _count in levelConf.get("params", {}).iteritems(): rewards.append({"name": int(_kindId), "count": _count}) if rewards: treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_FINISH_GRAND_PRIX", lang=lang).format(level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData)
def getTreasureList(userId): """ 宝藏列表 """ treasures = [] lang = util.getLanguage(userId) for kindId, treasureConf in config.getTreasureConf().iteritems(): kindId = int(kindId) treasure = {} level, _ = getTreasureInfo(userId, kindId) treasure["kindId"] = kindId treasure["sortId"] = treasureConf["sortId"] treasure["name"] = config.getMultiLangTextConf(treasureConf["name"], lang=lang) treasure["desc"] = config.getMultiLangTextConf(treasureConf.get("desc"), lang=lang) treasure["level"] = level treasure["convert"] = treasureConf["convert"] treasures.append(treasure) def cmpSort(x, y): if x["level"] > y["level"]: return 1 elif x["level"] < y["level"]: return -1 else: if x["sortId"] < y["sortId"]: return 1 else: return -1 treasures.sort(cmp=cmpSort, reverse=True) return treasures
def checkTreasureUpgrade(userId): """ 检查宝藏能否升级 """ upTreasures = [] for kindId, _ in config.getTreasureConf().iteritems(): treasureData = getTreasure(userId, kindId) levelConf = config.getTreasureConf(kindId, level=treasureData[INDEX_LEVEL] + 1) if treasureData[INDEX_LEVEL] < len(config.getTreasureConf(kindId).get("levels", {})): consumeItems = [{"name": int(kindId), "count": int(levelConf["cost"])}] if checkUpgradeTreasureItemCount(userId, consumeItems): upTreasures.append(int(kindId)) module_tip.resetModuleTip(userId, "treasure") if upTreasures: module_tip.addModuleTipEvent(userId, "treasure", upTreasures) else: module_tip.resetModuleTipEvent(userId, "treasure")
def getTreasure(userId, kindId): """ 获得单个宝藏数据 """ assert str(kindId) in config.getTreasureConf() value = daobase.executeUserCmd(userId, "HGET", _getUserTreasureKey(userId), str(kindId)) if value: return strutil.loads(value, False, True) return [0, 0, 0]
def getAlmsCoin(userId): """ 获取救济金额度 """ treasureConf = config.getTreasureConf(effectType=EffectType.AlmsCoinAdd) if treasureConf: kindId = treasureConf["kindId"] _, levelConf = getTreasureInfo(userId, kindId) return levelConf.get("params", {}).get("value", 0) return 0
def getTreasureInfo(userId, kindId): """ 获取宝藏详情 :param kindId: 宝藏道具ID :return: 当前等级, 等级配置 """ treasureData = getTreasure(userId, kindId) level = treasureData[INDEX_LEVEL] levelConf = config.getTreasureConf(kindId, level=level) if level else {} return level, levelConf
def upgradeTreasure(userId, kindId): """ 升级宝藏 """ code = 0 treasureData = getTreasure(userId, kindId) levelConf = config.getTreasureConf(kindId, level=treasureData[INDEX_LEVEL] + 1) if treasureData[INDEX_LEVEL] >= len(config.getTreasureConf(kindId).get("levels", {})): code = 3 elif not levelConf or not levelConf.get("cost", 0): code = 2 else: consumeItems = [{"name": int(kindId), "count": int(levelConf["cost"])}] isOK = consumeUpgradeTreasureItem(userId, consumeItems, treasureData[INDEX_LEVEL] + 1) if isOK: treasureData[INDEX_LEVEL] += 1 setTreasure(userId, kindId, treasureData) from newfish.game import TGFish event = TreasureLevelUp(userId, config.FISH_GAMEID, kindId, treasureData[INDEX_LEVEL]) TGFish.getEventBus().publishEvent(event) checkTreasureUpgrade(userId) else: code = 1 return code, treasureData[INDEX_LEVEL]
def convertTreasure(userId, kindId, count): """ 兑换宝藏碎片 """ code, rewards = 1, None treasureConf = config.getTreasureConf(kindId) convert = treasureConf.get("convert") if convert: surplusCount = util.balanceItem(userId, convert["kindId"]) consumeCount = convert["rate"] * count if surplusCount >= consumeCount: consume = [{"name": convert["kindId"], "count": -abs(consumeCount)}] rewards = [{"name": kindId, "count": count}] consume.extend(rewards) code = util.addRewards(userId, consume, "BI_NFISH_TREASURE_CONVERT", kindId) return code, rewards return code, rewards
def getResComplement(userId, count=0): """ 获得珍珠、紫水晶、黄水晶道具补足 """ effect = {} treasureConf = config.getTreasureConf(effectType=EffectType.ResComplement) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return rewards = [] lang = util.getLanguage(userId) for _kindId, _complementCount in levelConf.get("params", {}).iteritems(): _kindId = int(_kindId) _surplusCount = util.balanceItem(userId, _kindId) if _complementCount > _surplusCount: _reward = { "name": _kindId, "count": _complementCount - _surplusCount, "chgCount": [_surplusCount, _complementCount] } rewards.append(_reward) treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) countStr = util.formatScore(_complementCount, lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_SUPPLY_%s" % _kindId, lang=lang) message = message.format(countStr, treasureName, countStr) GameMsg.sendPrivate(FISH_GAMEID, userId, 0, message) if rewards: util.addRewards(userId, rewards, "BI_NFISH_TREASURE_REWARDS", kindId) activeTreasure(userId, kindId, treasureData) effect = { "kindId": kindId, "level": level, "rewards": rewards } return effect
def dealTreasureReward(userId, clientId, dayFirst): """ 处理宝藏奖励发放 """ if ftlog.is_debug(): ftlog.debug("dealTreasureReward", userId, clientId, dayFirst) for kindId, _ in config.getTreasureConf().iteritems(): refreshTreasureState(userId, kindId) if dayFirst: isIn, roomId, tableId, seatId = util.isInFishTable(userId) if isIn and util.getRoomTypeName(roomId) in config.NORMAL_ROOM_TYPE: mo = MsgPack() mo.setCmd("table_call") mo.setParam("action", "treasure_rewards") mo.setParam("gameId", FISH_GAMEID) mo.setParam("clientId", clientId) mo.setParam("userId", userId) mo.setParam("roomId", roomId) mo.setParam("tableId", tableId) mo.setParam("seatId", seatId) router.sendTableServer(mo, roomId) else: getTreasureRewards(userId)
def getCoinComplement(userId, coin=0): """ 获得金币补足 :param userId: :param coin: 当处于渔场中时,使用渔场传过来的金币数 """ effect = {} userCoin = coin if coin > 0 else userchip.getChip(userId) treasureConf = config.getTreasureConf(effectType=EffectType.CoinComplement) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return coinComplement = levelConf.get("params", {}).get("value", 0) if coinComplement > userCoin: lang = util.getLanguage(userId) rewards = [{"name": config.CHIP_KINDID, "count": coinComplement - userCoin, "chgCount": [userCoin, coinComplement]}] util.addRewards(userId, rewards, "BI_NFISH_TREASURE_REWARDS", kindId) activeTreasure(userId, kindId, treasureData) treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) coinStr = util.formatScore(coinComplement, lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_SUPPLY_101", lang=lang) message = message.format(coinStr, treasureName, coinStr) GameMsg.sendPrivate(FISH_GAMEID, userId, 0, message) effect = { "kindId": kindId, "level": level, "rewards": rewards } return effect
def provideFinishTimeMatchReward(userId, bigRoomId): """ 完成回馈赛发放宝藏奖励到邮件 """ treasureConf = config.getTreasureConf(effectType=EffectType.MatchRewardAdd) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return lang = util.getLanguage(userId) if str(bigRoomId) in levelConf.get("params", {}): matchName = config.getMultiLangTextConf(gdata.getRoomConfigure(bigRoomId).get("name", ""), lang=lang) rewards = [{"name": config.CHIP_KINDID, "count": levelConf["params"][str(bigRoomId)]}] treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_FINISH_TIME_MATCH", lang=lang) message = message.format(matchName, level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData)
def updateTreasure(userId, kindId): """ 更新新增宝藏数据 """ assert str(kindId) in config.getTreasureConf() daobase.executeUserCmd(userId, "HSETNX", _getUserTreasureKey(userId), str(kindId), json.dumps([0, 0, 0]))
def provideRankReward(userId, rankId, rankType, rank, params): """ 特定排行榜上榜发放宝藏奖励到邮件 """ from newfish.entity.ranking import ranking_system lang = util.getLanguage(userId) if rankId == config.RANK_GRAND_PRIX: # 大奖赛 treasureConf = config.getTreasureConf(effectType=EffectType.MatchRankRewardAdd) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return rewards = [] ratio = levelConf["params"]["grand_prix"] for _reward in params["rewards"]: if _reward["name"] in config.BULLET_VALUE: name = config.BRONZE_BULLET_KINDID count = int(math.ceil(_reward["count"] * config.BULLET_VALUE[_reward["name"]] * ratio)) else: name = _reward["name"] count = int(math.ceil(_reward["count"] * ratio)) rewards.append({"name": name, "count": count}) if rewards: treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_GRAND_PRIX_RANK", lang=lang) message = message.format(rank, level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData) # elif rankType in ranking_system.SbossPointRankTypeDefineIndexDict: # # Boss幸运榜 # treasureConf = config.getTreasureConf(effectType=EffectType.BossRankRewardAdd) # if treasureConf: # kindId = treasureConf["kindId"] # level, levelConf = getTreasureInfo(userId, kindId) # if not levelConf: # return # refreshTreasureState(userId, kindId) # treasureData = getTreasure(userId, kindId) # if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: # return # rewards = [] # ratio = levelConf["params"]["boss"] # for _reward in params["rewards"]: # if _reward["name"] in config.BULLET_VALUE: # name = config.BRONZE_BULLET_KINDID # count = int(math.ceil(_reward["count"] * config.BULLET_VALUE[_reward["name"]] * ratio)) # else: # name = _reward["name"] # count = int(math.ceil(_reward["count"] * ratio)) # rewards.append({"name": name, "count": count}) # if rewards: # rankRewardConf = config.getRankRewardConf(rankType) # rankName = config.getMultiLangTextConf(rankRewardConf["rankName"], lang=lang) # treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) # message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_BOSS_RANK", lang=lang).format(rankName, rank, level, treasureName) # title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) # mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) # activeTreasure(userId, kindId, treasureData) elif rankId == config.RANK_ROBBERY_DAY_WIN: # 招财赢家榜 treasureConf = config.getTreasureConf(effectType=EffectType.BossRankRewardAdd) if treasureConf: kindId = treasureConf["kindId"] level, levelConf = getTreasureInfo(userId, kindId) if not levelConf: return refreshTreasureState(userId, kindId) treasureData = getTreasure(userId, kindId) if treasureData[INDEX_FINISH_COUNT] >= treasureConf["limitCount"]: return ratio = levelConf["params"]["robbery"] count = int(math.ceil(params["originCount"] * ratio)) rewards = [{"name": config.BRONZE_BULLET_KINDID, "count": count}] treasureName = config.getMultiLangTextConf(treasureConf["name"], lang=lang) message = config.getMultiLangTextConf("ID_CONFIG_TREASURE_ROBBERY_RANK", lang=lang) message = message.format(rank, level, treasureName) title = config.getMultiLangTextConf("ID_MAIL_TITLE_TREASURE_REWARD", lang=lang) mail_system.sendSystemMail(userId, mail_system.MailRewardType.TreasureReward, rewards, message, title) activeTreasure(userId, kindId, treasureData)
def initTreasure(userId): """ 初始化宝藏数据 """ for kindId in config.getTreasureConf().keys(): updateTreasure(userId, kindId)