| | |
| | | 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 # 月卡领取额外奖励
|
| | |
|
| | | def GetGubaoInfo(curPlayer, gubaoID):
|
| | | info = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoInfo % gubaoID)
|
| | |
| | | return lv, star, layer
|
| | | def SetGubaoInfo(curPlayer, gubaoID, lv, star, layer):
|
| | | ## 特殊效果层*100000 + 等级*100 + 星级
|
| | | info = min(layer, 99) * 100000 + min(lv, 999) * 100 + min(star, 99)
|
| | | info = min(layer, 9999) * 100000 + min(lv, 999) * 100 + min(star, 99)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoInfo % gubaoID, info)
|
| | | return
|
| | |
|
| | |
| | | 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)
|
| | |
| | |
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | attrDict = {}
|
| | | powerDict = {}
|
| | |
|
| | | gubaoStarDict = {}
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | |
| | |
|
| | | if not IsGubaoActivated(curPlayer, gubaoID):
|
| | | continue
|
| | | |
| | | quality = ipyData.GetGubaoQuality()
|
| | |
|
| | | lv, star, layer = GetGubaoInfo(curPlayer, gubaoID)
|
| | | gubaoStarDict[gubaoID] = star
|
| | |
| | | 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()
|
| | | #effType = ipyData.GetSpecEffType()
|
| | | layerMax = ipyData.GetSpecEffLayerMax()
|
| | | SpecAttrValue = ipyData.GetSpecAttrValue()
|
| | | SpecAttrPerLVAdd = ipyData.GetSpecAttrPerLVAdd()
|
| | | SpecAttrPerStarAdd = ipyData.GetSpecAttrPerStarAdd()
|
| | | attrValue = SpecAttrValue + SpecAttrPerLVAdd * max(lv - 1, 0) + SpecAttrPerStarAdd * star
|
| | | if effType: # 有特殊效果类型的
|
| | | attrValue *= layer
|
| | | 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,lv=%s,star=%s,effType=%s,layer=%s,attrID=%s,v=%s,perLV=%s,perStar=%s,attrValue=%s,%s" |
| | | % (gubaoID, lv, star, effType, layer, attrID, SpecAttrValue, SpecAttrPerLVAdd, SpecAttrPerStarAdd, attrValue, attrDict), playerID)
|
| | | #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)
|
| | |
| | | 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:
|
| | |
| | | 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()
|
| | |
| | | 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 = []
|