4595 【1.2】【后端】装备战力、评分优化(角色装备、神兽装备 )
| | |
| | | Def_CalcAttrFunc_MagicWeaponSoul, # 法宝之魂属性34
|
| | | Def_CalcAttrFunc_Dogz, # 神兽35
|
| | | Def_CalcAttrFunc_DogzBattleSkill, # 助战神兽技能36
|
| | | ) = range(37)
|
| | | Def_CalcAttrFunc_DogzEquip, # 神兽装备37
|
| | | Def_CalcAttrFunc_DogzEquipPlus, # 神兽装备强化38
|
| | | ) = range(39)
|
| | |
|
| | |
|
| | | # 在此列表中的功能属性,不享受百分比加成,--属性参与战力计算
|
| | |
| | |
|
| | | #战斗力分组类型对应功能点属性分类索引列表,并不是一一对应的,有些战斗力类型可由多个功能点组成
|
| | | MFPTypeAttrFuncIndexDict = {ShareDefine.Def_MFPType_Role:[Def_CalcAttrFunc_RoleBase],
|
| | | ShareDefine.Def_MFPType_Equip:[Def_CalcAttrFunc_EquipBaseWeapon, Def_CalcAttrFunc_EquipBaseRelics, |
| | | Def_CalcAttrFunc_EquipBaseArmor, Def_CalcAttrFunc_Equip,
|
| | | Def_CalcAttrFunc_EquipOutOfPrint, Def_CalcAttrFunc_EquipAllStars],
|
| | | # 因为装备评分和实际战力一直出现不匹配的情况,所以装备战力修改为直接由装备评分做为参数计算战力,所以装备评分计算的所有属性不列入战力计算,祥见评分计算函数 ItemCommom.CalcEquipGS
|
| | | # ShareDefine.Def_MFPType_Equip:[Def_CalcAttrFunc_EquipBaseWeapon, Def_CalcAttrFunc_EquipBaseRelics, |
| | | # Def_CalcAttrFunc_EquipBaseArmor, Def_CalcAttrFunc_Equip,
|
| | | # Def_CalcAttrFunc_EquipOutOfPrint, Def_CalcAttrFunc_EquipAllStars],
|
| | | ShareDefine.Def_MFPType_Equip:[Def_CalcAttrFunc_EquipAllStars],
|
| | | ShareDefine.Def_MFPType_Plus:[Def_CalcAttrFunc_PlusBase, Def_CalcAttrFunc_PlusEx],
|
| | | ShareDefine.Def_MFPType_Stone:[Def_CalcAttrFunc_Stone],
|
| | | ShareDefine.Def_MFPType_Suit:[Def_CalcAttrFunc_Suit],
|
| | |
| | | ShareDefine.Def_MFPType_MagicWeapon3:[Def_CalcAttrFunc_MagicWeapon3, Def_CalcAttrFunc_Stove, Def_CalcAttrFunc_VIP],
|
| | | ShareDefine.Def_MFPType_StoveYao:[Def_CalcAttrFunc_StoveYao],
|
| | | ShareDefine.Def_MFPType_MagicWeaponSoul:[Def_CalcAttrFunc_MagicWeaponSoul],
|
| | | ShareDefine.Def_MFPType_Dogz:[Def_CalcAttrFunc_Dogz],
|
| | | # 神兽战力同装备模块战力一致,受评分影响,装备评分相关的战力另外算
|
| | | ShareDefine.Def_MFPType_Dogz:[Def_CalcAttrFunc_Dogz, Def_CalcAttrFunc_DogzEquipPlus],
|
| | | ShareDefine.Def_MFPType_Other:[Def_CalcAttrFunc_Success, Def_CalcAttrFunc_FamilyTech, Def_CalcAttrFunc_EquipDecompose],
|
| | | }
|
| | |
|
| | |
| | | equipPlaceList = [] # 有穿戴装备的装备位列表
|
| | | suitCntDict = {} #套装数量字典
|
| | | legendAttrDict = {} #所有传奇属性
|
| | | equipScoreTotal = 0 #为解决装备评分、战力不一致的情况,装备战力改为由评分作为参数计算战力
|
| | |
|
| | | #玩家当前可装备的装备类型
|
| | | for equipIndex in xrange(playerEquip.GetCount()):
|
| | |
| | | continue
|
| | |
|
| | | equipPlaceList.append(equipIndex)
|
| | | equipScoreTotal += ItemCommon.GetEquipGearScore(curEquip)
|
| | |
|
| | | #基础属性效果
|
| | | for i in range(0, curEquip.GetEffectCount()):
|
| | |
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash, allAttrListWash)
|
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_EquipOutOfPrint, allAttrListOutOfPrintEquip)
|
| | |
|
| | | #计算装备基础属性附加战力
|
| | | LV = curPlayer.GetLV()
|
| | | Atk = baseEquipAttrDict.get(ShareDefine.Def_Effect_Atk, 0)
|
| | | MinAtk = baseEquipAttrDict.get(ShareDefine.Def_Effect_MinAtk, 0) + Atk
|
| | | MaxAtk = baseEquipAttrDict.get(ShareDefine.Def_Effect_MaxAtk, 0) + Atk
|
| | | MaxHP = baseEquipAttrDict.get(ShareDefine.Def_Effect_MaxHP, 0)
|
| | | Def = baseEquipAttrDict.get(ShareDefine.Def_Effect_Def, 0)
|
| | | fightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Equip, fightPowerEx)
|
| | | #计算装备基础属性附加战力 (目前组成: 评分战力 + ...)
|
| | | equipFightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))
|
| | | #GameWorld.DebugLog("装备评分战力: equipScoreTotal=%s,equipFightPowerEx=%s" % (equipScoreTotal, equipFightPowerEx))
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Equip, equipFightPowerEx)
|
| | | return
|
| | |
|
| | |
|
| | |
| | | return
|
| | |
|
| | | def CalcEquipGS(curItem):
|
| | | ##计算装备评分
|
| | | '''计算装备评分
|
| | | 评分组成:装备基础 + 传奇属性 + 绝版属性
|
| | | '''
|
| | | if not CheckNoteEquipGS(curItem):
|
| | | #GameWorld.DebugLog("不设置装备评分")
|
| | | return 0
|
| | |
| | | itemManager = curPlayer.GetItemManager()
|
| | |
|
| | | for packIndex in ChConfig.Def_PlayerLoginInitPackIndexList:
|
| | | itemManager.GetPack(packIndex).Sync_Refresh()
|
| | |
|
| | | rolePack = itemManager.GetPack(packIndex)
|
| | | rolePack.Sync_Refresh()
|
| | | |
| | | # 刷下装备评分,仓库可以暂不处理,取出装备后登录触发刷新
|
| | | for i in xrange(rolePack.GetCount()):
|
| | | curItem = rolePack.GetAt(i)
|
| | | if curItem.IsEmpty():
|
| | | continue
|
| | | newScore = ItemCommon.CalcEquipGS(curItem)
|
| | | hisScore = ItemCommon.GetEquipGearScore(curItem)
|
| | | if hisScore != newScore:
|
| | | ItemCommon.SetEquipGearScore(curItem, newScore)
|
| | | GameWorld.Log("登录更新装备评分: packType=%s,i=%s,hisScore=%s,newScore=%s,itemID=%s,guid=%s" |
| | | % (packIndex, i, hisScore, newScore, curItem.GetItemTypeID(), curItem.GetGUID()), curPlayer.GetPlayerID())
|
| | | |
| | | for packIndex in ChConfig.Def_VPackCnt_Dict.keys():
|
| | | ItemControler.Sync_VPackItem_Refresh(curPlayer, packIndex)
|
| | |
|
| | |
| | |
|
| | | __AttrName = "%s" # 参数为ChConfig.Def_Calc_AllAttrType_MAX对应所有属性列表索引
|
| | | __AttrNameNoline = "Noline_%s" # 参数为ChConfig.Def_Calc_AllAttrType_MAX对应所有属性列表索引
|
| | | __NolineAttrList = [ChConfig.TYPE_Calc_AttrSpeed, ChConfig.TYPE_Calc_AttrATKMin, ChConfig.TYPE_Calc_AttrATKMax, |
| | | ChConfig.TYPE_Calc_AttrMaxHP] # 需要记录的非线性战斗属性
|
| | | __NolineAttrList = [ChConfig.TYPE_Calc_AttrSpeed] # 需要记录的非线性战斗属性
|
| | |
|
| | | ## 初始化
|
| | | # @param self 类实例
|
| | |
| | | #其他需作为公式参数的系数
|
| | | AtkSpeedParameter = fpParam.GetCftAtkSpeed()
|
| | | LuckyHitParameter = fpParam.GetCftLuckyHit()
|
| | | |
| | | fpEx = 0
|
| | | #装备模块特殊处理
|
| | | if self.mfpType == ShareDefine.Def_MFPType_Equip:
|
| | | AtkPer = getattr(self, self.__AttrNameNoline % ChConfig.TYPE_Calc_AttrATKMax) * fpParam.GetCftAtkPer() # 攻击百分比系数
|
| | | MaxHPPer = getattr(self, self.__AttrNameNoline % ChConfig.TYPE_Calc_AttrMaxHP) * fpParam.GetCftMaxHPPer() # 生命百分比系数
|
| | | fpEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 3))
|
| | | GameWorld.DebugLog("装备模块攻击生命百分比传奇属性战力: fpEx=%s" % fpEx)
|
| | | else:
|
| | | AtkPer = 0
|
| | | MaxHPPer = 0
|
| | |
|
| | | #获取策划配置的表格
|
| | | FightpowerFormula = IpyGameDataPY.GetFuncCfg("FightpowerFormula")
|
| | | totalFightPower = eval(FormulaControl.GetCompileFormula("FightpowerFormula", FightpowerFormula)) + fpEx
|
| | | totalFightPower = eval(FormulaControl.GetCompileFormula("FightpowerFormula", FightpowerFormula))
|
| | |
|
| | | #GameWorld.DebugLog("MfpType=%s,FightPower=%s, %s" % (self.mfpType, totalFightPower, self.GetMFPAttrStr()))
|
| | | if totalFightPower > ShareDefine.Def_UpperLimit_DWord:
|
| | |
| | | def GetCalcAttrListValue(curPlayer, funcIndex):
|
| | | ## 获取功能点预先计算的所加属性值
|
| | | attrList = [{} for _ in range(4)]
|
| | | for attrIndex, attrDict in enumerate(attrList):
|
| | | for i in xrange(Def_MaxAddAttrTypeCnt):
|
| | | attrType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrType % (funcIndex, attrIndex, i))
|
| | | if attrType == 0:
|
| | | break
|
| | | attrDict[attrType] = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrValue % (funcIndex, attrIndex, i))
|
| | | if isinstance(funcIndex, int):
|
| | | funcIndexList = [funcIndex]
|
| | | elif isinstance(funcIndex, list):
|
| | | funcIndexList = funcIndex
|
| | | else:
|
| | | return attrList
|
| | | |
| | | for funcIndex in funcIndexList:
|
| | | for attrIndex, attrDict in enumerate(attrList):
|
| | | for i in xrange(Def_MaxAddAttrTypeCnt):
|
| | | attrType = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrType % (funcIndex, attrIndex, i))
|
| | | if attrType == 0:
|
| | | break
|
| | | attrValue = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_CalcAddAttrValue % (funcIndex, attrIndex, i))
|
| | | if attrType in attrDict:
|
| | | attrDict[attrType] = attrValue + attrDict[attrType]
|
| | | else:
|
| | | attrDict[attrType] = attrValue |
| | | return attrList
|
| | |
|
| | | ## 刷属性时累加功能事先计算好的属性值
|
| | |
| | | totalPlusLv = 0 #出战神兽装备总强化等级
|
| | | fightPowerEx = 0
|
| | | allAttrList = [{} for _ in range(4)]
|
| | | allAttrListEquip = [{} for _ in range(4)]
|
| | | allAttrListEquipPlus = [{} for _ in range(4)]
|
| | | equipScoreTotal = 0 #为解决装备评分、战力不一致的情况,装备战力改为由评分作为参数计算战力
|
| | |
|
| | | dogzEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptDogzEquip)
|
| | | equipPackCount = dogzEquipPack.GetCount()
|
| | |
| | | if curEquip.IsEmpty():
|
| | | continue
|
| | |
|
| | | equipScoreTotal += ItemCommon.GetEquipGearScore(curEquip)
|
| | | |
| | | #itemID = curEquip.GetItemTypeID()
|
| | | # 装备基础属性
|
| | | for effIndex in xrange(curEquip.GetEffectCount()):
|
| | |
| | | if not effID or effID == ChConfig.Def_Effect_DogzEquipPlusExp:
|
| | | continue
|
| | | effValue = curEffect.GetEffectValue(0)
|
| | | PlayerControl.CalcAttrDict_Type(effID, effValue, allAttrList)
|
| | | #GameWorld.DebugLog(" 装备基础: itemID=%s,effID=%s,effValue=%s, %s" % (itemID, effID, effValue, allAttrList))
|
| | | PlayerControl.CalcAttrDict_Type(effID, effValue, allAttrListEquip)
|
| | | #GameWorld.DebugLog(" 装备基础: itemID=%s,effID=%s,effValue=%s, %s" % (itemID, effID, effValue, allAttrListEquip))
|
| | |
|
| | | # 强化属性
|
| | | curPlusLV = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetDogzEquipPlus, 0)
|
| | |
| | | if plusAttrTypeList and len(plusAttrTypeList) == len(plusAttrValueList):
|
| | | for plusIndex, plusAttrID in enumerate(plusAttrTypeList):
|
| | | plusAttrValue = plusAttrValueList[plusIndex]
|
| | | PlayerControl.CalcAttrDict_Type(plusAttrID, plusAttrValue, allAttrList)
|
| | | #GameWorld.DebugLog(" 装备强化: itemID=%s,plusAttrID=%s, plusAttrValue=%s, %s" % (itemID, plusAttrID, plusAttrValue, allAttrList))
|
| | | PlayerControl.CalcAttrDict_Type(plusAttrID, plusAttrValue, allAttrListEquipPlus)
|
| | | #GameWorld.DebugLog(" 装备强化: itemID=%s,plusAttrID=%s, plusAttrValue=%s, %s" % (itemID, plusAttrID, plusAttrValue, allAttrListEquipPlus))
|
| | |
|
| | | # 传奇属性
|
| | | ChEquip.CalcAttr_LegendAttr(curPlayer, curEquip, allAttrList)
|
| | | #GameWorld.DebugLog(" 装备传奇: itemID=%s,%s" % (itemID, allAttrList))
|
| | | ChEquip.CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip)
|
| | | #GameWorld.DebugLog(" 装备传奇: itemID=%s,%s" % (itemID, allAttrListEquip))
|
| | |
|
| | | # 附加战力
|
| | | fightPowerEx += ipyData.GetFightPowerEx()
|
| | |
|
| | | # 保存计算值
|
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Dogz, allAttrList)
|
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_DogzEquip, allAttrListEquip)
|
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_DogzEquipPlus, allAttrListEquipPlus)
|
| | | |
| | | #计算装备基础属性附加战力 (目前组成: 评分战力 + ...)
|
| | | equipFightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))
|
| | | #GameWorld.DebugLog("神兽装备评分战力: equipScoreTotal=%s,equipFightPowerEx=%s" % (equipScoreTotal, equipFightPowerEx))
|
| | | fightPowerEx += equipFightPowerEx
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Dogz, fightPowerEx)
|
| | |
|
| | | # 技能属性,从Def_CalcAttrFunc_Dogz获取
|
| | |
| | | import ChConfig
|
| | | import EffGetSet
|
| | | import GameWorld
|
| | | import ShareDefine
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | ## 给玩家添加非线性Buff效果
|
| | |
| | | for mfpObj, attrDict in mfpObjAttrDict.items():
|
| | | #if not attrDict.has_key(key): # 如果该模块没有增加该属性,则跳过
|
| | | if key not in attrDict: # 如果该模块没有增加该属性,则跳过
|
| | | continue
|
| | | #装备模块攻击、生命非线性属性提升的属性不计算战力,战力另外算
|
| | | if mfpObj.mfpType == ShareDefine.Def_MFPType_Equip \
|
| | | and key in [ChConfig.TYPE_Calc_AttrATKMin, ChConfig.TYPE_Calc_AttrATKMax, ChConfig.TYPE_Calc_AttrMaxHP]:
|
| | | GameWorld.DebugLog("装备模块某些属性不计入战力计算: key=%s,value=%s" % (key, attrDict[key]))
|
| | | continue
|
| | | curMValue = attrDict[key]
|
| | | curMAddValue = curValue * curMValue / ChConfig.Def_MaxRateValue # 相对增加值
|
| | |
| | | # @return None
|
| | | def OnCalcBuffEx(defender, curEffect, calcDict, curBuff):
|
| | | attrType = curEffect.GetEffectValue(1)
|
| | | attrList = PlayerControl.GetCalcAttrListValue(defender, ChConfig.Def_CalcAttrFunc_Dogz)
|
| | | attrList = PlayerControl.GetCalcAttrListValue(defender, [ChConfig.Def_CalcAttrFunc_Dogz, ChConfig.Def_CalcAttrFunc_DogzEquip, ChConfig.Def_CalcAttrFunc_DogzEquipPlus])
|
| | | value = int(attrList[2].get(attrType, 0)*curEffect.GetEffectValue(0)*1.0/ChConfig.Def_MaxRateValue)
|
| | |
|
| | | calcDict[attrType] = calcDict.get(attrType, 0) + value
|