| | |
| | | def __init__(self, batObj):
|
| | | self._batObj = batObj
|
| | | self._objID = batObj.GetID() if batObj else 0
|
| | | self._skillIDList = [] # 已有技能ID列表,获取被动中快速判断已学技能用
|
| | |
|
| | | # 技能
|
| | | self._AffectSkillDict = {} # 被动技能 {(触发方式, 有效来源):{技能ID:[effID, ...], ...}, ...}
|
| | |
| | | '''
|
| | | effList = []
|
| | |
|
| | | # 额外子技能的一般是未学习的技能,直接加载自身的被动效果
|
| | | # 触发自己未学习的技能,直接加载自身的被动效果,如额外子技能等
|
| | | if connSkill and not isinstance(connSkill, IpyGameDataPY.IPY_Skill) and self._objID == connSkill.GetObjID() \
|
| | | and connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance:
|
| | | and connSkill.GetSkillID() not in self._skillIDList:
|
| | | skillID = connSkill.GetSkillID()
|
| | | if skillID not in self._affectSkillEnhanceDict:
|
| | | effDict = {}
|
| | |
| | |
|
| | | key = (tWay, tSrc)
|
| | | if key not in effDict:
|
| | | effDict[key] = {}
|
| | | effList = effDict[key]
|
| | | if effectID not in effList:
|
| | | effList.append(effList)
|
| | | effDict[key] = []
|
| | | effIDList = effDict[key]
|
| | | if effectID not in effIDList:
|
| | | effIDList.append(effectID)
|
| | | self._affectSkillEnhanceDict[skillID] = effDict
|
| | | GameWorld.DebugLogEx("加载未学技能被动: objID=%s,skillID=%s,%s", self._objID, skillID, effDict)
|
| | |
|
| | | key = (triggerWay, ChConfig.TriggerSrc_SkillSelf)
|
| | | effDict = self._affectSkillEnhanceDict[skillID]
|
| | | if triggerWay in effDict:
|
| | | effList.append(["skill", skillID, 0, effDict[triggerWay]])
|
| | | if key in effDict:
|
| | | effList.append(["skill", skillID, 0, effDict[key]])
|
| | |
|
| | | if triggerWay not in self._skillTriggerWayList and triggerWay not in self._buffTriggerWayList:
|
| | | return effList
|
| | |
| | | curSkill = skillManager.GetSkillByIndex(index)
|
| | | if not curSkill:
|
| | | continue
|
| | | skillID = curSkill.GetSkillID()
|
| | | # 附加添加已学技能,用于判断是否自身技能
|
| | | if skillID not in self._skillIDList:
|
| | | self._skillIDList.append(skillID)
|
| | | for index in xrange(curSkill.GetEffectCount()):
|
| | | curEffect = curSkill.GetEffect(index)
|
| | | effectID = curEffect.GetEffectID()
|
| | |
| | | self._ipyData = ipyData
|
| | | self._skillID = self._ipyData.GetSkillID()
|
| | | self._skillTypeID = self._ipyData.GetSkillTypeID()
|
| | | self._cdTime = self._ipyData.GetCoolDownTime()
|
| | | self._effList = [] # [Effect, ...]
|
| | | self._effDict = {} # {(effID, triggerWay):Effect, ...} ,确保唯一,同个技能可能配置相同的效果ID
|
| | | for num in range(1, 1 + 3):
|
| | |
| | | return self._effDict[(effID, triggerWay)]
|
| | | def GetConnSkill(self): return self._ipyData.GetConnSkill()
|
| | | def GetCoolDownInit(self): return self._ipyData.GetCoolDownInit()
|
| | | def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
|
| | | def GetCoolDownTime(self): return self._cdTime
|
| | | def GetBuffStateLimit(self): return self._ipyData.GetBuffStateLimit()
|
| | | def GetCurBuffState(self): return self._ipyData.GetCurBuffState()
|
| | | def GetLastTime(self): return self._ipyData.GetLastTime() # 持续时间
|
| | |
| | | if buff.GetOwnerID() == ownerID:
|
| | | return buff
|
| | | return
|
| | | def FindBuffByState(self, state):
|
| | | def FindBuffByState(self, state, ownerID=0):
|
| | | ## 查找某种buff状态的buff
|
| | | # @param ownerID: 可指定获取归属于某个对象ID的buff
|
| | | if state not in self._buffStateDict:
|
| | | return
|
| | | buffIDList = self._buffStateDict[state]
|
| | | if not buffIDList:
|
| | | return
|
| | | buffID = buffIDList[0]
|
| | | if buffID in self._buffIDDict:
|
| | | return self._buffIDDict[buffID]
|
| | | if ownerID:
|
| | | for buffID in buffIDList:
|
| | | if buffID not in self._buffIDDict:
|
| | | continue
|
| | | buff = self._buffIDDict[buffID]
|
| | | if buff.GetOwnerID() == ownerID:
|
| | | return buff
|
| | | else:
|
| | | buffID = buffIDList[0]
|
| | | if buffID in self._buffIDDict:
|
| | | return self._buffIDDict[buffID]
|
| | | def FindBuffListByState(self, state):
|
| | | ## 查找某种buff状态的buff列表
|
| | | if state not in self._buffStateDict:
|
| | |
| | | self._skillData = SklllData(ipyData)
|
| | | self._skillID = self._skillData.GetSkillID()
|
| | | self._skillTypeID = self._skillData.GetSkillTypeID()
|
| | | self._cdTime = self._skillData.GetCoolDownTime()
|
| | | self._remainTime = 0
|
| | | self._batType = 0 # 战斗类型,普通、连击、反击、追击等
|
| | | self._tagObjList = [] # 本次技能主要目标列表 [BatObj, ...]
|
| | |
| | | self._hurtListEx = [] # 额外伤血列表,如平摊、溅射 [HurtObj, ...]
|
| | | self._bySkill = None # 由哪个技能触发的
|
| | | self._byBuff = None # 由哪个buff触发的
|
| | | self._byTriggerWay = 0 # 由哪个被动方式触发的
|
| | | self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
|
| | | self._energy = 0 # 技能能量,一般用于累计能量达到某种条件后做逻辑
|
| | |
|
| | |
| | | self._effIgnoreObjIDList = []
|
| | | self._bySkill = None
|
| | | self._byBuff = None
|
| | | self._byTriggerWay = 0
|
| | | self._afterLogicList = []
|
| | | self.ClearHurtObj()
|
| | | return
|
| | |
| | | def GetEffectByID(self, effID, triggerWay=0): return self._skillData.GetEffectByID(effID, triggerWay)
|
| | | def GetConnSkill(self): return self._skillData.GetConnSkill()
|
| | | def GetCoolDownInit(self): return self._skillData.GetCoolDownInit()
|
| | | def GetCoolDownTime(self): return self._skillData.GetCoolDownTime()
|
| | | def GetCoolDownTime(self): return self._cdTime
|
| | | def GetBuffStateLimit(self): return self._skillData.GetBuffStateLimit()
|
| | | def GetCurBuffState(self): return self._skillData.GetCurBuffState()
|
| | | def GetLastTime(self): return self._skillData.GetLastTime() # 持续时间
|
| | |
| | | def GetLayerMax(self): return self._skillData.GetLayerMax()
|
| | | def GetBuffRepeat(self): return self._skillData.GetBuffRepeat() # Buff叠加规则
|
| | | def GetDispersedLimit(self): return self._skillData.GetDispersedLimit() # 驱散限制
|
| | | def GetBuffRetain(self): return self._ipyData.GetBuffRetain()
|
| | | def GetBuffRetain(self): return self._skillData.GetBuffRetain()
|
| | | def GetFightPower(self): return self._skillData.GetFightPower()
|
| | |
|
| | | ## ---------------------------------- 非技能表内容 ----------------------------------
|
| | |
| | | def SetBySkill(self, bySkill): self._bySkill = bySkill
|
| | | def GetByBuff(self): return self._byBuff
|
| | | def SetByBuff(self, byBuff): self._byBuff = byBuff
|
| | | def GetByTriggerWay(self): return self._byTriggerWay
|
| | | def SetByTriggerWay(self, byTriggerWay): self._byTriggerWay = byTriggerWay
|
| | | def GetTagObjList(self): return self._tagObjList # 技能主要目标列表
|
| | | def SetTagObjList(self, tagObjList): self._tagObjList = tagObjList
|
| | | def GetTagObjListEx(self): return self._tagObjListEx # 技能额外目标列表
|
| | |
| | | class BatObj():
|
| | | ## 战斗实体对象数据,目前与某个NPCObj绑定
|
| | |
|
| | | def __init__(self):
|
| | | def __init__(self, objID):
|
| | | self.tfGUID = "" # 所属的某场回合战斗的guid
|
| | | self.ownerID = 0 # 所属玩家ID,可能为0,0代表非玩家的战斗实体
|
| | | self.objID = 0
|
| | | self.objID = objID
|
| | | self.objName = ""
|
| | | self.npcID = 0
|
| | | self.heroID = 0
|
| | |
| | | newObjID = self.__getNewObjID()
|
| | | if not newObjID:
|
| | | return newBatObj
|
| | | newBatObj = BatObj()
|
| | | newBatObj.objID = newObjID
|
| | | newBatObj = BatObj(newObjID)
|
| | | self.batObjDict[newObjID] = newBatObj
|
| | | GameWorld.DebugLogEx("添加战斗单位: objID=%s", newObjID)
|
| | | if False:
|