#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package SkillDataBoost # # @todo: ¼¼ÄÜÔöǿЧ¹û¹¦ÄÜ # @author Alee # @date 2013-10-31 14:45 # @version 1.3 # # ÏêϸÃèÊö: # @change: "2013-11-01 14:45" Alee ÐÞÕýNPCÔöÇ¿ÌØÐ§ # @change: "2015-03-05 14:30" hxp Ôö¼Ó±»¶¯buffÔöǿЧ¹û # @change: "2016-11-16 15:30" hxp Ôö¼Ó±»¶¯buffË¥ÈõЧ¹û #--------------------------------------------------------------------- #"""Version = 2016-11-16 15:30""" #--------------------------------------------------------------------- import PassiveBuffEffMng import IPY_GameWorld import PySkillManager import ChConfig import ItemControler import SkillCommon import SkillBoosts import GameWorld import BuffSkill #µ¼Èë GameWorld.ImportAll("Script\\Skill\\", "SkillBoosts") # ¼ÆËãÁбíË÷Òý #[¼¼ÄÜID£¬ ÔöÇ¿ÀàÐÍ£¬¼¼ÄÜЧ¹ûID£¬¸¸¼¼ÄÜ£¨ÈçÕÙ»½£©£¬ÊýÖµ] ( Def_SkillTypeID, # ¼¼ÄÜID Def_BoostType, # ÔöÇ¿ÀàÐÍ Def_SkillEffectID, # ¼¼ÄÜЧ¹ûID Def_ParentSkillTypeID, # ¸¸¼¼ÄÜ£¨ÈçÕÙ»½£© Def_BoostValue, # ÊýÖµ ) = range(5) # ¼ÆËã¼õÈõÁбíË÷Òý #[¼¼ÄÜID£¬ ¼õÈõÀàÐÍ£¬¼¼ÄÜЧ¹ûID£¬¸¸¼¼ÄÜ£¨ÈçÕÙ»½£©£¬Õë¶ÔµÄbuff״ֵ̬, ÊýÖµ] ( Def_WeakSkillTypeID, # ¼õÈõµÄ¼¼ÄÜID Def_WeakType, # ¼õÈõÀàÐÍ Def_WeakSkillEffectID, # ¼¼ÄÜЧ¹ûID Def_WeakParentSkillTypeID, # ¸¸¼¼ÄÜ£¨ÈçÕÙ»½£© Def_WeakBuffState, # Õë¶ÔµÄ¼¼ÄÜbuff״ֵ̬ Def_WeakValue, # ÊýÖµ ) = range(6) ##¼¼ÄÜÔöÇ¿¸Ä±äskilldata½á¹¹ # @param isEnhanceSkill ÊÇ·ñ¸½¼Ó¼¼ÄÜ # @return skilldata def ChangeSkillData(attacker, defender, skillData, isEnhanceSkill): # ´¦Àí¹¥»÷·½ÔöÇ¿ #skillData = __BoostSkillData(attacker, skillData, isEnhanceSkill) # ´¦Àí·ÀÊØ·½¼õÈõ #skillData = __WeakenSkillData(defender, skillData, isEnhanceSkill) return skillData def __BoostSkillData(attacker, skillData, isEnhanceSkill): # ¼¼ÄÜÔöÇ¿´¦Àí atkObjType = attacker.GetGameObjType() skillBoostList = [] # ÕÒµ½ÔöÇ¿¶ÓÁÐ if atkObjType == IPY_GameWorld.gotNPC: if attacker.GetDictByKey(ChConfig.Def_SummonBoost_Count) == 0: #¼¼ÄÜδÔöÇ¿ return skillData #NPC Õâ±ßÒª½¨Á¢Áбí skillBoostList = GetNPCSkillBoostList(attacker) elif atkObjType == IPY_GameWorld.gotPlayer: #±»¶¯buffÔöÇ¿ passiveBuffBoostList = []#PassiveBuffEffMng.GetPassiveSkillBoostList(attacker) skillBoostList.extend(passiveBuffBoostList) if skillBoostList == []: #ûÓÐÔöǿЧ¹û¶ÓÁÐÍ˳ö return skillData skillTypeID = skillData.GetSkillTypeID() needBoost = False for tmpList in skillBoostList: if skillTypeID == tmpList[Def_SkillTypeID] \ and tmpList[Def_BoostType] != ChConfig.BoostType_HappenRate: needBoost = True break if not needBoost: #¸Ã¼¼Äܲ»ÔÚÔöǿЧ¹ûÖÐÍ˳ö return skillData # ´¥·¢¼¼ÄܺÍÖ÷¶¯¼¼ÄÜÐè·Ö¿ª´¦Àí£¬·ñÔòÊý¾Ý´íÂÒ if isEnhanceSkill: PySkillManager.Py_SkillDataTrigger.CopySkillData(skillData) skillData = PySkillManager.Py_SkillDataTrigger else: PySkillManager.Py_SkillData.CopySkillData(skillData) skillData = PySkillManager.Py_SkillData #ÓжÔÓ¦ÔöǿЧ¹ûµÄ´¦Àí for skillBoostInfo in skillBoostList: if skillTypeID != skillBoostInfo[Def_SkillTypeID]: continue pyName = "SkillBoost_%s"%skillBoostInfo[Def_BoostType] callFunc = GameWorld.GetExecFunc(SkillBoosts, "%s.OnCalcSkillValue"%pyName) if callFunc is None: continue callFunc(skillData, skillBoostInfo[Def_SkillEffectID], skillBoostInfo[Def_BoostValue]) return skillData def __WeakenSkillData(defender, skillData, isEnhanceSkill): # ¼¼ÄܼõÈõ´¦Àí if not defender: return skillData objType = defender.GetGameObjType() skillWeakenList = [] # ÕÒµ½¼õÈõ¶ÓÁÐ if objType == IPY_GameWorld.gotPlayer: #±»¶¯buff¼õÈõ passiveBuffWeakenList = []#PassiveBuffEffMng.GetPassiveSkillWeakenList(defender) skillWeakenList.extend(passiveBuffWeakenList) if skillWeakenList == []: #ûÓмõÈõЧ¹û¶ÓÁÐÍ˳ö return skillData skillTypeID = skillData.GetSkillTypeID() needWeaken = False for tmpList in skillWeakenList: if tmpList[Def_WeakType] == ChConfig.WeakenType_HappenRate: continue if skillTypeID == tmpList[Def_WeakSkillTypeID] or tmpList[Def_WeakSkillTypeID] == 0: needWeaken = True break if not needWeaken: #¸Ã¼¼Äܲ»ÔÚ¼õÈõЧ¹ûÖÐÍ˳ö return skillData # ´¥·¢¼¼ÄܺÍÖ÷¶¯¼¼ÄÜÐè·Ö¿ª´¦Àí£¬·ñÔòÊý¾Ý´íÂÒ if not isinstance(skillData, PySkillManager.PySkillData): if isEnhanceSkill: PySkillManager.Py_SkillDataTrigger.CopySkillData(skillData) skillData = PySkillManager.Py_SkillDataTrigger else: PySkillManager.Py_SkillData.CopySkillData(skillData) skillData = PySkillManager.Py_SkillData curBuffStateType = None #ÓжÔÓ¦ÔöǿЧ¹ûµÄ´¦Àí for skillWeakenInfo in skillWeakenList: # Ϊ0ʱÕë¶ÔËùÓм¼ÄÜ if skillWeakenInfo[Def_WeakSkillTypeID] > 0 and skillTypeID != skillWeakenInfo[Def_WeakSkillTypeID]: continue weakBuffState = skillWeakenInfo[Def_WeakBuffState] if weakBuffState > 0: if curBuffStateType is None: curBuffStateType = SkillCommon.GetBuffStateType(skillData) if not curBuffStateType: # ¸ÃbuffÎÞbuffÀàÐÍ£¬Õë¶ÔµÄbuffÎÞЧ continue if not weakBuffState & pow(2, curBuffStateType): # ¸ÃbuffÀàÐͲ»ÊÇËùÕë¶ÔµÄbuff, ÎÞЧ continue pyName = "SkillWeaken_%s" % skillWeakenInfo[Def_WeakType] callFunc = GameWorld.GetExecFunc(SkillBoosts, "%s.OnCalcSkillValue"%pyName) if callFunc is None: continue callFunc(skillData, skillWeakenInfo[Def_WeakSkillEffectID], skillWeakenInfo[Def_WeakValue]) return skillData ## ÕÙ»½ÊÞЧ¹ûÔöÇ¿Âß¼­ # @param None # @return None def SetSummonNPCSkillBoost(curPlayer, summonNPC, curSkill): #ÕÙ»½Ç°Çå¿Õ summonNPC.SetDict(ChConfig.Def_SummonBoost_Count, 0) skillBoostList = [] # #Íæ¼ÒÐèÅж¨ÎäÆ÷ # itemControl = ItemControler.PlayerItemControler(curPlayer) # skillBoostList = itemControl.GetSkillBoostList() #±»¶¯buffÔöÇ¿ passiveBuffBoostList = []#PassiveBuffEffMng.GetPassiveSkillBoostList(curPlayer) skillBoostList.extend(passiveBuffBoostList) skillTypeID = curSkill.GetSkillTypeID() summonSkillBoostList = [] for tmpList in skillBoostList: # Èç¹ûÖ÷¼¼ÄÜÓжà¸ö¿ÉÒÔ¿¼ÂǸijÉ×ÓÁбí if skillTypeID == tmpList[Def_ParentSkillTypeID]: summonSkillBoostList.append(tmpList) if summonSkillBoostList == []: return summonNPC.SetDict(ChConfig.Def_SummonBoost_Count, len(summonSkillBoostList)) # Èç¹ûÁбí¹ý³¤¿ÉÒÔ¿¼ÂǼǼ¼¼ÄÜÔöÇ¿Ë÷ÒýºÍÊýÖµ£¬ÆäËûÖµÓɱíÈ¡ for i, tmpList in enumerate(summonSkillBoostList): summonNPC.SetDict(ChConfig.Def_SummonBoost_SkillTypeID%i, tmpList[Def_SkillTypeID]) summonNPC.SetDict(ChConfig.Def_SummonBoost_BoostType%i, tmpList[Def_BoostType]) summonNPC.SetDict(ChConfig.Def_SummonBoost_EffectID%i, tmpList[Def_SkillEffectID]) summonNPC.SetDict(ChConfig.Def_SummonBoost_ParentID%i, 0) # ×Ó¼¼Äܲ»ÔټǼ summonNPC.SetDict(ChConfig.Def_SummonBoost_Value%i, tmpList[Def_BoostValue]) return ## ´æ´¢NPC£¨ÕÙ»½£©¼¼ÄÜÔöǿЧ¹û # @param None # @return None def GetNPCSkillBoostList(curNPC): skillBoostList = [] for i in xrange(curNPC.GetDictByKey(ChConfig.Def_SummonBoost_Count)): skillBoostList.append([curNPC.GetDictByKey(ChConfig.Def_SummonBoost_SkillTypeID%i), curNPC.GetDictByKey(ChConfig.Def_SummonBoost_BoostType%i), curNPC.GetDictByKey(ChConfig.Def_SummonBoost_EffectID%i), curNPC.GetDictByKey(ChConfig.Def_SummonBoost_ParentID%i), curNPC.GetDictByKey(ChConfig.Def_SummonBoost_Value%i)]) return skillBoostList ## ͨ¹ý¼¼ÄÜÔöǿЧ¹ûÀàÐÍÕÒ³ö×ÔÉíµÄÔöǿЧ¹ûÖµ # @param boostType ÔöÇ¿ÀàÐÍ # @return Ôöǿֵ def GetSkillBoostValeByType(attacker, skillData, boostType): atkObjType = attacker.GetGameObjType() skillBoostList = [] # ÕÒµ½ÔöÇ¿¶ÓÁÐ if atkObjType == IPY_GameWorld.gotNPC: if attacker.GetDictByKey(ChConfig.Def_SummonBoost_Count) == 0: #¼¼ÄÜδÔöÇ¿ return 0 #NPC Õâ±ßÒª½¨Á¢Áбí skillBoostList = GetNPCSkillBoostList(attacker) elif atkObjType == IPY_GameWorld.gotPlayer: # #Íæ¼ÒÐèÅж¨ÎäÆ÷ # itemControl = ItemControler.PlayerItemControler(attacker) # skillBoostList = itemControl.GetSkillBoostList() #±»¶¯buffÔöÇ¿ passiveBuffBoostList = []#PassiveBuffEffMng.GetPassiveSkillBoostList(attacker) skillBoostList.extend(passiveBuffBoostList) if skillBoostList == []: #ûÓÐÔöǿЧ¹û¶ÓÁÐÍ˳ö return 0 skillTypeID = skillData.GetSkillTypeID() addValue = 0 for tmpList in skillBoostList: if skillTypeID == tmpList[Def_SkillTypeID] and tmpList[Def_BoostType] == boostType: addValue += tmpList[Def_BoostValue] return addValue ## ͨ¹ý¼¼ÄܼõÈõЧ¹ûÀàÐÍÕÒ³ö×ÔÉíµÄ¼õÈõЧ¹ûÖµ # @return ¼õÈõЧ¹ûÖµ def GetSkillWeakenValeByType(curPlayer, skillData, weakType): if not curPlayer: return 0 objType = curPlayer.GetGameObjType() skillWeakList = [] if objType == IPY_GameWorld.gotPlayer: #±»¶¯buff passiveBuffWeakList = []#PassiveBuffEffMng.GetPassiveSkillWeakenList(curPlayer) skillWeakList.extend(passiveBuffWeakList) if skillWeakList == []: return 0 skillTypeID = skillData.GetSkillTypeID() weakValue = 0 curBuffStateType = None for tmpList in skillWeakList: # Ϊ0ʱÕë¶ÔËùÓм¼ÄÜ if tmpList[Def_WeakSkillTypeID] > 0 and skillTypeID != tmpList[Def_WeakSkillTypeID]: continue if tmpList[Def_WeakType] != weakType: continue weakBuffState = tmpList[Def_WeakBuffState] if weakBuffState > 0: if curBuffStateType is None: curBuffStateType = SkillCommon.GetBuffStateType(skillData) if not curBuffStateType: # ¸ÃbuffÎÞbuffÀàÐÍ£¬Õë¶ÔµÄbuffÎÞЧ continue if not weakBuffState & pow(2, curBuffStateType): # ¸ÃbuffÀàÐͲ»ÊÇËùÕë¶ÔµÄbuff, ÎÞЧ continue weakValue += tmpList[Def_WeakValue] return weakValue ## ͨ¹ýЧ¹ûID»ñµÃ¼¼ÄÜÔöǿЧ¹ûÌí¼ÓµÄBUFFÔöǿֵ # @param None # @return None def GetBuffValueByEffectID(curSkill, effectID): boostBuffValue = 0 if hasattr(curSkill, 'GetBuffValueByEffectID'): boostBuffValue = getattr(curSkill, 'GetBuffValueByEffectID')(effectID) return boostBuffValue ## ͨ¹ýЧ¹ûID»ñµÃ¼¼ÄÜÔöǿЧ¹ûÌí¼ÓµÄBUFFÔöǿֵ # @param None # @return None def GetBuffValueDict(curSkill, effectID): tmpDict = {} if hasattr(curSkill, 'GetBuffValueDict'): tmpDict = getattr(curSkill, 'GetBuffValueDict')() return tmpDict #=============================================================================== # # def AffectedSkillData(attacker, skillData, isEnhanceSkill): # # ¼¼ÄÜÔöÇ¿´¦Àí # atkObjType = attacker.GetGameObjType() # # if atkObjType != IPY_GameWorld.gotPlayer: # return skillData # # passiveEff = PassiveBuffEffMng.GetPassiveEffManager().GetPassiveEff(attacker) # if not passiveEff: # return skillData # #Ó°Ïì¼¼ÄܵÄBUFF # buffAffectInfo = passiveEff.GetChangeBuff_StartSkill(skillData.GetSkillID()) # if not buffAffectInfo: # return skillData # # # ´¥·¢¼¼ÄܺÍÖ÷¶¯¼¼ÄÜÐè·Ö¿ª´¦Àí£¬·ñÔòÊý¾Ý´íÂÒ # if isEnhanceSkill: # PySkillManager.Py_SkillDataTrigger.CopySkillData(skillData) # skillData = PySkillManager.Py_SkillDataTrigger # else: # PySkillManager.Py_SkillData.CopySkillData(skillData) # skillData = PySkillManager.Py_SkillData # # #¸Ä±äÖ÷¶¯¼¼ÄÜ # passiveEff.CalcChangeBuff_StartSkill(attacker, skillData, buffAffectInfo) # # return skillData #===============================================================================