Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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))
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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")
Exemplo n.º 8
0
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]
Exemplo n.º 9
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
Exemplo n.º 10
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
Exemplo n.º 11
0
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]
Exemplo n.º 12
0
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
Exemplo n.º 13
0
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
Exemplo n.º 14
0
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)
Exemplo n.º 15
0
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
Exemplo n.º 16
0
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)
Exemplo n.º 17
0
def updateTreasure(userId, kindId):
    """
    更新新增宝藏数据
    """
    assert str(kindId) in config.getTreasureConf()
    daobase.executeUserCmd(userId, "HSETNX", _getUserTreasureKey(userId), str(kindId), json.dumps([0, 0, 0]))
Exemplo n.º 18
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)
Exemplo n.º 19
0
def initTreasure(userId):
    """
    初始化宝藏数据
    """
    for kindId in config.getTreasureConf().keys():
        updateTreasure(userId, kindId)