| | |
| | | import TurnPassive
|
| | | import TurnBuff
|
| | |
|
| | | class PassiveEffManager():
|
| | | ## 被动效果管理器
|
| | | |
| | | def __init__(self, batObj):
|
| | | self._batObj = batObj
|
| | | # 被影响的技能ID: 0为所有技能
|
| | | self._AffectSkillDict = {} # 被动技能 {(触发方式, 被影响的技能ID):{技能ID:[effID, ...], ...}, ...}
|
| | | self._AffectBuffDict = {} # 被动buff {(触发方式, 被影响的技能ID):{buffID:[effID, ...], ...}, ...}
|
| | | return
|
| | | |
| | | def GetPassiveEffByTrigger(self, triggerWay, connSkill=None):
|
| | | '''获取可触发的效果列表,技能跟buff根据触发优先级按顺序触发,优先级越高越先执行,相同时技能优先
|
| | | 优先级之后有需要再扩展
|
| | | @return: [["skill/buff", skillID/buffID, effIDList], ...]
|
| | | '''
|
| | | connSkillID = connSkill.GetSkillTypeID() if connSkill else 0
|
| | | effList = []
|
| | | # 技能
|
| | | key = (triggerWay, connSkillID)
|
| | | if key in self._AffectSkillDict:
|
| | | effDict = self._AffectSkillDict[key]
|
| | | for skillID, effIDList in effDict.items():
|
| | | effList.append(["skill", skillID, effIDList])
|
| | | if connSkillID != 0:
|
| | | key = (triggerWay, 0)
|
| | | effDict = self._AffectSkillDict.get(key, {})
|
| | | for skillID, effIDList in effDict.items():
|
| | | effList.append(["skill", skillID, effIDList])
|
| | | |
| | | # buff
|
| | | key = (triggerWay, connSkillID)
|
| | | if key in self._AffectBuffDict:
|
| | | effDict = self._AffectBuffDict[key]
|
| | | for buffID, effIDList in effDict.items():
|
| | | effList.append(["buff", buffID, effIDList])
|
| | | if connSkillID != 0:
|
| | | key = (triggerWay, 0)
|
| | | effDict = self._AffectBuffDict.get(key, {})
|
| | | for buffID, effIDList in effDict.items():
|
| | | effList.append(["buff", buffID, effIDList])
|
| | | |
| | | return effList
|
| | | |
| | | def RefreshSkillPassiveEffect(self):
|
| | | self._AffectSkillDict = {}
|
| | | |
| | | skillManager = self._batObj.GetSkillManager()
|
| | | for index in range(0, skillManager.GetSkillCount()):
|
| | | curSkill = skillManager.GetSkillByIndex(index)
|
| | | if not curSkill:
|
| | | continue
|
| | | for index in xrange(curSkill.GetEffectCount()):
|
| | | curEffect = curSkill.GetEffect(index)
|
| | | effectID = curEffect.GetEffectID()
|
| | | if effectID == 0:
|
| | | continue
|
| | | self.AddSkillPassiveEffect(curSkill, curEffect)
|
| | | |
| | | return self._AffectSkillDict
|
| | | |
| | | def AddSkillPassiveEffect(self, curSkill, effect):
|
| | | ## 添加技能被动效果
|
| | | triggerWay = effect.GetTriggerWay()
|
| | | triggerSrc = effect.GetTriggerSrc()
|
| | | if not triggerWay or triggerSrc != 1:
|
| | | return
|
| | | |
| | | skillID = curSkill.GetSkillID()
|
| | | connSkillID = curSkill.GetConnSkill()
|
| | | #priority = curSkill.GetPriority()
|
| | | |
| | | effectID = effect.GetEffectID()
|
| | | |
| | | key = (triggerWay, connSkillID)
|
| | | if key not in self._AffectSkillDict:
|
| | | self._AffectSkillDict[key] = {}
|
| | | effDict = self._AffectSkillDict[key]
|
| | | if skillID not in effDict:
|
| | | effDict[skillID] = []
|
| | | effDict[skillID].append(effectID)
|
| | | return
|
| | | |
| | | def RefreshBuffPassiveEffect(self):
|
| | | self._AffectBuffDict = {}
|
| | | buffMgr = self._batObj.GetBuffManager()
|
| | | for index in range(buffMgr.GetBuffCount()):
|
| | | buff = buffMgr.GetBuffByIndex(index)
|
| | | if not buff:
|
| | | continue
|
| | | skillData = buff.GetSkillData()
|
| | | for index in xrange(skillData.GetEffectCount()):
|
| | | curEffect = skillData.GetEffect(index)
|
| | | effectID = curEffect.GetEffectID()
|
| | | if effectID == 0:
|
| | | continue
|
| | | self.AddBuffPassiveEffect(buff, skillData, curEffect)
|
| | | |
| | | return self._AffectBuffDict
|
| | | |
| | | def AddBuffPassiveEffect(self, buff, skillData, effect):
|
| | | '''添加Buff被动效果
|
| | | 同个buff的技能ID如果叠加规则是独立的,那么可能同时存在多个相同技能效果的buff
|
| | | 如果触发效果,就要触发多次,所以buff的效果以buffID为key
|
| | | '''
|
| | | triggerWay = effect.GetTriggerWay()
|
| | | triggerSrc = effect.GetTriggerSrc()
|
| | | if not triggerWay or triggerSrc != 2:
|
| | | return
|
| | | |
| | | buffID = buff.GetBuffID()
|
| | | connSkillID = skillData.GetConnSkill()
|
| | | #priority = skillData.GetPriority()
|
| | | |
| | | effectID = effect.GetEffectID()
|
| | | key = (triggerWay, connSkillID)
|
| | | if key not in self._AffectBuffDict:
|
| | | self._AffectBuffDict[key] = {}
|
| | | effDict = self._AffectBuffDict[key]
|
| | | if buffID not in effDict:
|
| | | effDict[buffID] = []
|
| | | effDict[buffID].append(effectID)
|
| | | return
|
| | | |
| | | def DelBuffPassiveEffect(self, buffID):
|
| | | ## 删除Buff被动效果
|
| | | for key, effDict in self._AffectBuffDict.items():
|
| | | if buffID not in effDict:
|
| | | continue
|
| | | effDict.pop(buffID)
|
| | | if not effDict:
|
| | | self._AffectBuffDict.pop(key)
|
| | | return
|
| | | |
| | | class HurtObj():
|
| | | ## 伤血统计
|
| | |
|
| | |
| | | return
|
| | | def HaveHurtType(self, hurtType):
|
| | | ## 判断是否存在某种伤血类型
|
| | | return self._hurtTypes&pow(2, hurtType) |
| | | return self._hurtTypes & pow(2, hurtType) |
| | | def GetHurtHP(self): return self._hurtHP
|
| | | def SetHurtHP(self, hurtHP): self._hurtHP = hurtHP
|
| | | def GetLostHP(self): return self._lostHP
|
| | |
| | | def GetBounceHP(self): return self._bounceHP
|
| | | def SetBounceHP(self, bounceHP): self._bounceHP = bounceHP
|
| | |
|
| | | class Effect():
|
| | | class SkillEffect():
|
| | |
|
| | | def __init__(self, effID, values):
|
| | | def __init__(self, effID, values, triggerWay=0, triggerSrc=0, triggerParams=None):
|
| | | self._effID = effID
|
| | | self._values = values
|
| | | self._triggerWay = triggerWay
|
| | | self._triggerSrc = triggerSrc
|
| | | self._triggerParams = triggerParams if triggerParams else []
|
| | | return
|
| | |
|
| | | def GetEffectID(self): return self._effID
|
| | | def GetEffectValue(self, index): return self._values[index] if len(self._values) > index else 0
|
| | | def GetEffectValueCount(self): return len(self._values)
|
| | | def GetTriggerWay(self): return self._triggerWay
|
| | | def GetTriggerSrc(self): return self._triggerSrc
|
| | | def GetTriggerParams(self, index): return self._triggerParams[index] if len(self._triggerParams) > index else 0
|
| | |
|
| | | EmptyEffect = SkillEffect(0, [])
|
| | |
|
| | | class SklllData():
|
| | |
|
| | | def __init__(self, ipyData):
|
| | | self._ipyData = ipyData
|
| | | self._effList = [] # [Effect, ...]
|
| | | self._effDict = {} # {effID:Effect, ...}
|
| | | for num in range(1, 1 + 3):
|
| | | effID = getattr(ipyData, "GetEffectID%s" % num)()
|
| | | values = getattr(ipyData, "GetEffectValues%s" % num)()
|
| | | self._effList.append(ObjPool.GetPoolMgr().acquire(Effect, effID, values))
|
| | | triggerWay = getattr(ipyData, "GetTriggerWay%s" % num)()
|
| | | triggerSrc = getattr(ipyData, "GetTriggerSrc%s" % num)()
|
| | | triggerParams = getattr(ipyData, "GetTriggerParams%s" % num)()
|
| | | effect = ObjPool.GetPoolMgr().acquire(SkillEffect, effID, values, triggerWay, triggerSrc, triggerParams)
|
| | | self._effList.append(effect)
|
| | | self._effDict[effID] = effect
|
| | | return
|
| | |
|
| | | def GetSkillID(self): return self._ipyData.GetSkillID()
|
| | |
| | | def GetTagSelf(self): return self._ipyData.GetTagSelf() # 是否含自己
|
| | | def GetTagAffect(self): return self._ipyData.GetTagAffect() # 目标细分
|
| | | def GetTagCount(self): return self._ipyData.GetTagCount() # 目标个数
|
| | | def GetHappenRate(self): return self._ipyData.GetHappenRate() # 释放或添加几率
|
| | | def GetLastTime(self): return self._ipyData.GetLastTime() # 持续时间
|
| | | def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
|
| | | def GetCalcType(self): return self._ipyData.GetCalcType()
|
| | | def GetSkillPer(self): return self._ipyData.GetSkillPer()
|
| | | def GetSkillValue(self): return self._ipyData.GetSkillValue()
|
| | | def GetHappenRate(self): return self._ipyData.GetHappenRate() # 触发概率
|
| | | def GetEffect(self, index): return self._effList[index] if len(self._effList) > index else 0
|
| | | def GetEffectCount(self): return len(self._effList)
|
| | | def GetConnSkill(self): return self._ipyData.GetConnSkill() # 关联技能
|
| | | def GetEffectByID(self, effID): return self._effDict.get(effID, EmptyEffect)
|
| | | def GetConnSkill(self): return self._ipyData.GetConnSkill()
|
| | | def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
|
| | | def GetIgnoreStates(self): return self._ipyData.GetIgnoreStates() # 无视限制列表
|
| | | def GetBuffStates(self): return self._ipyData.GetBuffStates()
|
| | | def GetLastTime(self): return self._ipyData.GetLastTime() # 持续时间
|
| | | def GetLayerCnt(self): return self._ipyData.GetLayerCnt()
|
| | | def GetLayerMax(self): return self._ipyData.GetLayerMax()
|
| | | def GetBuffRepeat(self): return self._ipyData.GetBuffRepeat() # Buff叠加规则
|
| | | def GetDieContinue(self): return self._ipyData.GetDieContinue() # Buff死亡存在
|
| | | def GetEnhanceSkillList(self): return self._ipyData.GetEnhanceSkillList() # 额外触发的技能ID列表
|
| | | def GetFightPower(self): return self._ipyData.GetFightPower()
|
| | |
|
| | |
| | | self._buffID = 0
|
| | | self._ownerID = 0
|
| | | self._layer = 0
|
| | | self._calcTime = 0
|
| | | self._remainTime = 0
|
| | | self._valueList = []
|
| | | return
|
| | |
| | | def SetOwnerID(self, ownerID): self._ownerID = ownerID
|
| | | def GetLayer(self): return self._layer
|
| | | def SetLayer(self, layer): self._layer = layer
|
| | | def GetCalcTime(self): return self._calcTime
|
| | | def SetCalcTime(self, calcTime): self._calcTime = calcTime
|
| | | def GetRemainTime(self): return self._remainTime
|
| | | def SetRemainTime(self, remainTime): self._remainTime = remainTime
|
| | | def SetValueList(self, valueList): self._valueList = valueList
|
| | | def GetValue(self, index):
|
| | | def SetBuffValueList(self, valueList): self._valueList = valueList
|
| | | def GetBuffValue(self, index):
|
| | | return self._valueList[index] if len(self._valueList) > index else 0
|
| | |
|
| | | class BuffManager():
|
| | | ## 战斗对象buff管理器
|
| | |
|
| | | def __init__(self):
|
| | | def __init__(self, batObj):
|
| | | self._batObj = batObj
|
| | | self._buffList = [] # [PyBuff, ...]
|
| | | self._buffIDDict = {} # {buffID:PyBuff, ...}
|
| | | self._skillTypeIDBuffIDs = {} # 技能TypeID对应的buff {skillTypeID:[buffID, ...], ...}
|
| | |
| | | return
|
| | |
|
| | | def GetBuffCount(self): return len(self._buffList)
|
| | | def GetBuffByIndex(self, index):
|
| | | buff = self._buffList[index]
|
| | | #if False:
|
| | | # buff = PyBuff()
|
| | | return buff
|
| | | |
| | | def GetBuffByIndex(self, index): return self._buffList[index]
|
| | | |
| | | def AddBuff(self, skillID):
|
| | | buff = None
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
|
| | |
| | | skillTypeID = ipyData.GetSkillTypeID()
|
| | | self._buffID += 1
|
| | |
|
| | | buffID = self._buffID
|
| | | buff = ObjPool.GetPoolMgr().acquire(PyBuff, ipyData)
|
| | | buff.SetBuffID(self._buffID)
|
| | | buff.SetBuffID(buffID)
|
| | |
|
| | | self._buffList.append(buff)
|
| | | self._buffIDDict[self._buffID] = buff
|
| | | self._buffIDDict[buffID] = buff
|
| | | if skillTypeID not in self._skillTypeIDBuffIDs:
|
| | | self._skillTypeIDBuffIDs[skillTypeID] = []
|
| | | buffIDs = self._skillTypeIDBuffIDs[skillTypeID]
|
| | | if self._buffID not in buffIDs:
|
| | | buffIDs.append(self._buffID)
|
| | | if buffID not in buffIDs:
|
| | | buffIDs.append(buffID)
|
| | |
|
| | | #if False:
|
| | | # buff = PyBuff()
|
| | | return buff
|
| | |
|
| | | def DelBuff(self, buffID):
|
| | |
| | | break
|
| | | return
|
| | |
|
| | | def GetBuff(self, buffID):
|
| | | buff = None
|
| | | if buffID in self._buffIDDict:
|
| | | buff = self._buffIDDict[buffID]
|
| | | #if False:
|
| | | # buff = PyBuff()
|
| | | return buff
|
| | | |
| | | def GetBuff(self, buffID): return self._buffIDDict.get(buffID, None)
|
| | | def FindBuffIDBySkillID(self, skillID):
|
| | | ## 返回该技能ID的所有buffID列表
|
| | | skillData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
|
| | |
| | | if buffID not in buffIDList:
|
| | | return
|
| | | buffIDList.remove(buffID)
|
| | | if not len(buffIDList):
|
| | | if not buffIDList:
|
| | | self._buffStateDict.pop(state)
|
| | | GameWorld.DebugLog(" DelBuffState state=%s,buffID=%s,%s" % (state, buffID, self._buffStateDict))
|
| | | return
|
| | |
|
| | | def IsInBuffState(self, state):
|
| | | ## 是否处于某种状态下
|
| | | return state in self._buffStateDict and len(self._buffStateDict[state]) > 0
|
| | | def IsInBuffState(self, state): return state in self._buffStateDict ## 是否处于某种状态下
|
| | | def GetStateBuffIDList(self, state): return self._buffStateDict.get(state, []) # 获取某种状态的所有buffID列表
|
| | | |
| | |
|
| | | class PySkill():
|
| | |
|
| | | def __init__(self, ipyData):
|
| | | self._skillData = ObjPool.GetPoolMgr().acquire(SklllData, ipyData)
|
| | | self._calcTime = 0
|
| | | self._remainTime = 0
|
| | | self._batType = 0 # 战斗类型,普通、连击、反击、追击等
|
| | | self._tagObjList = [] # 本次技能目标列表 [BatObj, ...]
|
| | | self._hurtList = [] # 本次伤血列表,可能同一个对象有多个伤害,如弹射等 [HurtObj, ...]
|
| | | self._bySkill = None # 由哪个技能触发的
|
| | | self._isEnhanceSkill = False # 是否由主技能额外触发的(非被动触发,即主技能的EnhanceSkillList字段中的技能)
|
| | | return
|
| | | |
| | | def ResetUseRec(self):
|
| | | self._batType = 0
|
| | | self._tagObjList = []
|
| | | self._bySkill = None
|
| | | self._isEnhanceSkill = False
|
| | | self.ClearHurtObj()
|
| | | return
|
| | |
|
| | | def GetSkillID(self): return self._skillData.GetSkillID()
|
| | |
| | | def GetTagSelf(self): return self._skillData.GetTagSelf() # 是否含自己
|
| | | def GetTagAffect(self): return self._skillData.GetTagAffect() # 目标细分
|
| | | def GetTagCount(self): return self._skillData.GetTagCount() # 目标个数
|
| | | def GetHappenRate(self): return self._skillData.GetHappenRate() # 释放或添加几率
|
| | | def GetLastTime(self): return self._skillData.GetLastTime() # 持续时间
|
| | | def GetCoolDownTime(self): return self._skillData.GetCoolDownTime()
|
| | | def GetCalcType(self): return self._skillData.GetCalcType()
|
| | | def GetSkillPer(self): return self._skillData.GetSkillPer()
|
| | | def GetSkillValue(self): return self._skillData.GetSkillValue()
|
| | | def GetHappenRate(self): return self._skillData.GetHappenRate() # 触发概率
|
| | | def GetEffect(self, index): return self._skillData.GetEffect(index)
|
| | | def GetEffectCount(self): return self._skillData.GetEffectCount()
|
| | | def GetConnSkill(self): return self._skillData.GetConnSkill() # 关联技能
|
| | | def GetEffectByID(self, effID): return self._skillData.GetEffectByID()
|
| | | def GetConnSkill(self): return self._skillData.GetConnSkill()
|
| | | def GetCoolDownTime(self): return self._skillData.GetCoolDownTime()
|
| | | def GetIgnoreStates(self): return self._skillData.GetIgnoreStates() # 无视限制列表
|
| | | def GetBuffStates(self): return self._skillData.GetBuffStates()
|
| | | def GetLastTime(self): return self._skillData.GetLastTime() # 持续时间
|
| | | def GetLayerCnt(self): return self._skillData.GetLayerCnt()
|
| | | def GetLayerMax(self): return self._skillData.GetLayerMax()
|
| | | def GetBuffRepeat(self): return self._skillData.GetBuffRepeat() # Buff叠加规则
|
| | | def GetDieContinue(self): return self._skillData.GetDieContinue() # Buff死亡存在
|
| | | def GetEnhanceSkillList(self): return self._skillData.GetEnhanceSkillList() # 额外触发的技能ID列表
|
| | | def GetFightPower(self): return self._skillData.GetFightPower()
|
| | |
|
| | | ## ---------------------------------- 非技能表内容 ----------------------------------
|
| | | def GetCalcTime(self): return self._calcTime
|
| | | def SetCalcTime(self, calcTime): self._calcTime = calcTime
|
| | | def GetRemainTime(self): return self._remainTime
|
| | | def SetRemainTime(self, remainTime): self._remainTime = remainTime
|
| | | def GetBatType(self): return self._batType
|
| | |
| | | self._skillUseCntDict = {} # 技能累计使用次数 {skillID:useCnt, ...}
|
| | | self._skillTurnUseCntDict = {} # 技能单回合累计使用次数 {skillID:useCnt, ...}
|
| | | self._skillMgr = ObjPool.GetPoolMgr().acquire(SkillManager)
|
| | | self._buffMgr = ObjPool.GetPoolMgr().acquire(BuffManager)
|
| | | self._buffMgr = ObjPool.GetPoolMgr().acquire(BuffManager, self)
|
| | | self._passiveEffMgr = ObjPool.GetPoolMgr().acquire(PassiveEffManager, self)
|
| | |
|
| | | # 统计
|
| | | self.hurtStat = 0 # 输出统计
|
| | |
| | |
|
| | | def GetSkillManager(self): return self._skillMgr
|
| | | def GetBuffManager(self):return self._buffMgr
|
| | | def GetPassiveEffManager(self):return self._passiveEffMgr
|
| | |
|
| | | def GetCanAttack(self):
|
| | | ## 可否被攻击
|