ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
@@ -26,8 +26,18 @@
import PlayerOnline
import ChConfig
# 特殊效果类型
GubaoEffType_GoldRush = 1 # 参与淘金
GubaoEffType_Arena = 2 # 参与演武场
GubaoEffType_Tianzi = 3 # 每参加1次天子的考验
GubaoEffType_MainLevelBoss = 4 # 每击败1只主线BOSS
GubaoEffType_Zhanchui = 5 # 每完成1次白骨盈野
GubaoEffType_Travel = 6 # 每游历1次(消耗体力)
# 特权效果类型
GubaoPowerType_TravelMultiRate = 1 # 游历双倍奖励概率
GubaoPowerType_InvestMonthAwardPer = 2 # 月卡领取额外奖励
GubaoPowerType_InvestLifeAwardPer = 3 # 永久卡领取额外奖励
def GetGubaoInfo(curPlayer, gubaoID):
    info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoInfo % gubaoID)
@@ -126,9 +136,24 @@
    if not nextIpyData:
        GameWorld.DebugLog("古宝已满星! gubaoID=%s,quality=%s,star=%s" % (gubaoID, quality, star), playerID)
        return
    qualityStarCond = nextIpyData.GetQualityStarCond() # 需同品质X个X星
    needSelfCnt = nextIpyData.GetStarUPNeedSelfCnt()
    needItemList = nextIpyData.GetStarUPNeedItemList()
    
    if qualityStarCond and len(qualityStarCond) == 2:
        needGBCnt, needGBStar = qualityStarCond
        condGubaoCnt = 0
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in xrange(ipyDataMgr.GetGubaoCount()):
            gbIpyData = ipyDataMgr.GetGubaoByIndex(index)
            _, gbStar, _ = GetGubaoInfo(curPlayer, gbIpyData.GetGubaoID())
            if gbIpyData.GetGubaoQuality() == quality and gbStar >= needGBStar:
                condGubaoCnt += 1
        if condGubaoCnt < needGBCnt:
            GameWorld.DebugLog("古宝升星所需同品质星级古宝数不足! quality=%s,nextStar=%s,condGubaoCnt=%s < %s,needGBStar=%s"
                               % (quality, nextStar, condGubaoCnt, needGBCnt, needGBStar), playerID)
            return
    if needItemList:
        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
@@ -247,6 +272,7 @@
    
    playerID = curPlayer.GetPlayerID()
    attrDict = {}
    powerDict = {}
    
    gubaoStarDict = {}
    ipyDataMgr = IpyGameDataPY.IPY_Data()
@@ -271,30 +297,41 @@
            perStarAdd = BaseAttrPerStarAddList[bIndex]
            attrValue = baseValue + perStarAdd * star
            attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
        GameWorld.DebugLog("古宝基础属性! gubaoID=%s,star=%s,addAttr=%s,v:%s,perStar:%s,%s"
                           % (gubaoID, star, BaseAttrIDList, BaseAttrValueList, BaseAttrPerStarAddList, attrDict), playerID)
        #GameWorld.DebugLog("古宝基础属性! gubaoID=%s,star=%s,addAttr=%s,v:%s,perStar:%s,%s"
        #                   % (gubaoID, star, BaseAttrIDList, BaseAttrValueList, BaseAttrPerStarAddList, attrDict), playerID)
        
        # 特殊属性
        attrID = ipyData.GetSpecAttrID()
        effType = ipyData.GetSpecEffType()
        layerMax = ipyData.GetSpecEffLayerMax()
        SpecAttrValue = ipyData.GetSpecAttrValue()
        SpecAttrPerStarAdd = ipyData.GetSpecAttrPerStarAdd()
        specLVAttr = 0
        lvAttrIpyData = IpyGameDataPY.GetIpyGameData("GubaoLVAttr", quality, lv)
        if lvAttrIpyData:
            specAttrIDList = lvAttrIpyData.GetSpecAttrIDList()
            specAttrValueList = lvAttrIpyData.GetSpecAttrValueList()
            for sIndex in range(min(len(specAttrIDList), len(specAttrValueList))):
                if specAttrIDList[sIndex] == attrID:
                    specLVAttr = specAttrValueList[sIndex]
        if not layerMax:
            layer, layerMax = 1, 1 # 无层级限制的默认1层
        attrValue = int((SpecAttrValue + SpecAttrPerStarAdd * star + specLVAttr / float(layerMax)) * layer)
        attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
        GameWorld.DebugLog("古宝特殊属性! gubaoID=%s,quality=%s,lv=%s,star=%s,effType=%s,layer=%s/%s,attrID=%s,v=%s,perStar=%s,specLVAttr=%s,attrValue=%s,%s"
                           % (gubaoID, quality, lv, star, effType, layer, layerMax, attrID, SpecAttrValue, SpecAttrPerStarAdd, specLVAttr, attrValue, attrDict), playerID)
        if attrID:
            effType = ipyData.GetSpecEffType()
            layerMax = ipyData.GetSpecEffLayerMax()
            SpecAttrValue = ipyData.GetSpecAttrValue()
            SpecAttrPerStarAdd = ipyData.GetSpecAttrPerStarAdd()
            specLVAttr = 0
            lvAttrIpyData = IpyGameDataPY.GetIpyGameData("GubaoLVAttr", quality, lv)
            if lvAttrIpyData:
                specAttrIDList = lvAttrIpyData.GetSpecAttrIDList()
                specAttrValueList = lvAttrIpyData.GetSpecAttrValueList()
                for sIndex in range(min(len(specAttrIDList), len(specAttrValueList))):
                    if specAttrIDList[sIndex] == attrID:
                        specLVAttr = specAttrValueList[sIndex]
            if not layerMax or not effType:
                layer, layerMax = 1, 1 # 无层级限制的默认1层
            attrValue = int((SpecAttrValue + SpecAttrPerStarAdd * star + specLVAttr / float(layerMax)) * layer)
            attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
            #GameWorld.DebugLog("古宝特殊属性! gubaoID=%s,quality=%s,lv=%s,star=%s,effType=%s,layer=%s/%s,attrID=%s,v=%s,perStar=%s,specLVAttr=%s,attrValue=%s,%s"
            #                   % (gubaoID, quality, lv, star, effType, layer, layerMax, attrID, SpecAttrValue, SpecAttrPerStarAdd, specLVAttr, attrValue, attrDict), playerID)
        
        # 特权
        powerType = ipyData.GetPowerType()
        if powerType:
            powerTypeValue = ipyData.GetPowerTypeValue()
            powerValue = ipyData.GetPowerValue()
            powerPerStarAdd = ipyData.GetPowerPerStarAdd()
            powerValueTotal = powerValue + powerPerStarAdd * star
            powerKey = (powerType, powerTypeValue)
            powerDict[powerKey] = powerDict.get(powerKey, 0) + powerValueTotal
    # 共鸣
    for index in range(ipyDataMgr.GetGubaoResonanceCount()):
        ipyData = ipyDataMgr.GetGubaoResonanceByIndex(index)
@@ -302,8 +339,11 @@
        gubaoIDList = ipyData.GetGubaoIDList()
        if not gubaoIDList:
            continue
        starList = [gubaoStarDict.get(gubaoID, 0) for gubaoID in gubaoIDList]
        starList = [gubaoStarDict.get(gubaoID, -1) for gubaoID in gubaoIDList]
        minStar = min(starList) # 共鸣星级,取组合中最低古宝星级
        if minStar < 0:
            #GameWorld.DebugLog("共鸣存在未激活的古宝,无效")
            continue
        
        attrIpyDataList = IpyGameDataPY.GetIpyGameDataList("GubaoResonanceAttr", resonanceID)
        if not attrIpyDataList:
@@ -317,7 +357,7 @@
            resonanceAttrIpyData = attrIpyData
            
        if not resonanceAttrIpyData:
            GameWorld.DebugLog("没有古宝共鸣属性! resonanceID=%s,minStar=%s,starList=%s" % (resonanceID, minStar, starList), playerID)
            #GameWorld.DebugLog("没有古宝共鸣属性! resonanceID=%s,minStar=%s,starList=%s" % (resonanceID, minStar, starList), playerID)
            continue
        
        resonanceAttrIDList = resonanceAttrIpyData.GetResonanceAttrIDList()
@@ -325,15 +365,24 @@
        for i, attrID in enumerate(resonanceAttrIDList):
            attrValue = resonanceAttrValueList[i]
            attrDict[attrID] = attrDict.get(attrID, 0) + attrValue
        GameWorld.DebugLog("古宝共鸣: resonanceID=%s,resonanceStar=%s,starList=%s,addAttr=%s,%s,%s"
                           % (resonanceID, resonanceAttrIpyData.GetResonanceStar(), starList,
                              resonanceAttrIDList, resonanceAttrValueList, attrDict), playerID)
        #GameWorld.DebugLog("古宝共鸣: resonanceID=%s,resonanceStar=%s,starList=%s,addAttr=%s,%s,%s"
        #                   % (resonanceID, resonanceAttrIpyData.GetResonanceStar(), starList,
        #                      resonanceAttrIDList, resonanceAttrValueList, attrDict), playerID)
        
    # 保存计算值
    GameWorld.DebugLog("古宝属性: %s" % attrDict, playerID)
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_Gubao, attrDict)
    GameWorld.DebugLog("古宝特权: %s" % powerDict, playerID)
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_Gubao, attrDict, powerDict)
    return
def GetGubaoPowerValue(curPlayer, powerType, powerTypeValue=0):
    ## 获取古宝特权值
    powerDict = PlayerOnline.GetOnlinePlayer(curPlayer).GetCalcSpecInfo(ChConfig.Def_CalcAttr_Gubao)
    powerKey = (powerType, powerTypeValue)
    if powerKey not in powerDict:
        return 0
    return powerDict[powerKey]
def AddGubaoSpecEffLayer(curPlayer, effType, addLayer):
    ## 增加古宝特殊效果属性层级
    gubaoIDList = []