| | |
| | | import ChNetSendPack
|
| | | import ShareDefine
|
| | | import ChConfig
|
| | | import ObjPool
|
| | | import TurnPassive
|
| | | import TurnBuff
|
| | |
|
| | |
| | |
|
| | | def __init__(self, batObj):
|
| | | self._batObj = batObj
|
| | | # 被影响的技能ID: 0为所有技能
|
| | | self._objID = batObj.GetID() if batObj else 0
|
| | | |
| | | # 技能
|
| | | self._AffectSkillDict = {} # 被动技能 {(触发方式, 有效来源):{技能ID:[effID, ...], ...}, ...}
|
| | | self._affectSkillEnhanceDict = {} # 未学习的额外子技能被动效果 {skillID:{(触发方式, 有效来源):[effID, ...], ...}, ...}
|
| | | self._skillTriggerWayList = [] # 技能有的触发方式 [触发方式, ...] ,优化效率用,减少多余逻辑
|
| | | |
| | | # buff
|
| | | self._AffectBuffDict = {} # 被动buff {(触发方式, 有效来源):{buffID:[effID, ...], ...}, ...}
|
| | | self._buffSkillIDDict = {} # {buffID:skillID, ...}
|
| | | self._buffTriggerWayList = [] # buff有的触发方式 [触发方式, ...] ,优化效率用,减少多余逻辑
|
| | | return
|
| | |
|
| | | def onRelease(self):
|
| | |
| | | '''
|
| | | effList = []
|
| | |
|
| | | if not connSkillTypeID:
|
| | | if connSkill:
|
| | | connSkillTypeID = connSkill.GetSkillTypeID()
|
| | | elif connBuff:
|
| | | skillData = connBuff.GetSkillData()
|
| | | connSkillTypeID = skillData.GetSkillTypeID()
|
| | | |
| | | # SkillData 对象暂时没有 GetObjID
|
| | | if connSkill and hasattr(connSkill, "GetObjID") and self._batObj.GetID() == connSkill.GetObjID():
|
| | | # 额外子技能的一般是未学习的技能,直接加载自身的被动效果
|
| | | if connSkill and not isinstance(connSkill, IpyGameDataPY.IPY_Skill) and self._objID == connSkill.GetObjID() \
|
| | | and connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance:
|
| | | skillID = connSkill.GetSkillID()
|
| | | skillManager = self._batObj.GetSkillManager()
|
| | | # 非对象身上的技能,读取本技能被动触发的效果,一般是主技能拆分的子技能
|
| | | if not skillManager.FindSkillByID(skillID):
|
| | | effIDList = []
|
| | | if skillID not in self._affectSkillEnhanceDict:
|
| | | effDict = {}
|
| | | for index in xrange(connSkill.GetEffectCount()):
|
| | | effect = connSkill.GetEffect(index)
|
| | | effectID = effect.GetEffectID()
|
| | |
| | | continue
|
| | | if tWay == ChConfig.TriggerWay_CalcEffValue:
|
| | | tWay = "%s_%s" % (tWay, effectID)
|
| | | if tWay != triggerWay:
|
| | | continue
|
| | | effIDList.append(effectID)
|
| | | if effIDList:
|
| | | effList.append(["skill", skillID, 0, effIDList])
|
| | | |
| | | |
| | | key = (tWay, tSrc)
|
| | | if key not in effDict:
|
| | | effDict[key] = {}
|
| | | effList = effDict[key]
|
| | | if effectID not in effList:
|
| | | effList.append(effList)
|
| | | self._affectSkillEnhanceDict[skillID] = effDict
|
| | | |
| | | effDict = self._affectSkillEnhanceDict[skillID]
|
| | | if triggerWay in effDict:
|
| | | effList.append(["skill", skillID, 0, effDict[triggerWay]])
|
| | | |
| | | if triggerWay not in self._skillTriggerWayList and triggerWay not in self._buffTriggerWayList:
|
| | | return effList
|
| | | |
| | | if not connSkillTypeID:
|
| | | if connSkill:
|
| | | connSkillTypeID = connSkill.GetSkillTypeID()
|
| | | elif connBuff:
|
| | | connSkillTypeID = connBuff.GetSkillTypeID()
|
| | | |
| | | # 优先取关联技能的
|
| | | if connSkillTypeID and connSkillTypeID not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_SkillSelf, ChConfig.TriggerSrc_BuffSelf]:
|
| | | # 技能
|
| | |
| | | if key in self._AffectBuffDict:
|
| | | effDict = self._AffectBuffDict[key]
|
| | | for buffID, effIDList in effDict.items():
|
| | | effList.append(["buff", self._buffSkillIDDict.get(buffID, 0), buffID, effIDList])
|
| | | skillID = self._buffSkillIDDict[buffID] if buffID in self._buffSkillIDDict else 0
|
| | | effList.append(["buff", skillID, buffID, effIDList])
|
| | |
|
| | | # 所有技能有效的
|
| | | key = (triggerWay, ChConfig.TriggerSrc_Skill)
|
| | | effDict = self._AffectSkillDict.get(key, {})
|
| | | for skillID, effIDList in effDict.items():
|
| | | effList.append(["skill", skillID, 0, effIDList])
|
| | | if key in self._AffectSkillDict:
|
| | | effDict = self._AffectSkillDict[key]
|
| | | for skillID, effIDList in effDict.items():
|
| | | effList.append(["skill", skillID, 0, effIDList])
|
| | |
|
| | | # 所有buff有效的
|
| | | key = (triggerWay, ChConfig.TriggerSrc_Buff)
|
| | | effDict = self._AffectBuffDict.get(key, {})
|
| | | for buffID, effIDList in effDict.items():
|
| | | effList.append(["buff", self._buffSkillIDDict.get(buffID, 0), buffID, effIDList])
|
| | | if key in self._AffectBuffDict:
|
| | | effDict = self._AffectBuffDict[key]
|
| | | for buffID, effIDList in effDict.items():
|
| | | skillID = self._buffSkillIDDict[buffID] if buffID in self._buffSkillIDDict else 0
|
| | | effList.append(["buff", skillID, buffID, effIDList])
|
| | |
|
| | | return effList
|
| | |
|
| | | def RefreshSkillPassiveEffect(self):
|
| | | self._AffectSkillDict = {}
|
| | | self._skillTriggerWayList = []
|
| | |
|
| | | skillManager = self._batObj.GetSkillManager()
|
| | | for index in range(0, skillManager.GetSkillCount()):
|
| | |
| | | if skillID not in effDict:
|
| | | effDict[skillID] = []
|
| | | effDict[skillID].append(effectID)
|
| | | if triggerWay not in self._skillTriggerWayList:
|
| | | self._skillTriggerWayList.append(triggerWay)
|
| | | return
|
| | |
|
| | | def RefreshBuffPassiveEffect(self):
|
| | | self._AffectBuffDict = {}
|
| | | self._buffTriggerWayList = []
|
| | | |
| | | buffMgr = self._batObj.GetBuffManager()
|
| | | for index in range(buffMgr.GetBuffCount()):
|
| | | buff = buffMgr.GetBuffByIndex(index)
|
| | |
| | | if effectID not in effIDList:
|
| | | effIDList.append(effectID)
|
| | | self._buffSkillIDDict[buffID] = skillData.GetSkillID()
|
| | | if triggerWay not in self._buffTriggerWayList:
|
| | | self._buffTriggerWayList.append(triggerWay)
|
| | | return
|
| | |
|
| | | def DelBuffPassiveEffect(self, buffID):
|
| | |
| | | for key, effDict in self._AffectBuffDict.items():
|
| | | if buffID not in effDict:
|
| | | continue
|
| | | self._buffSkillIDDict.pop(buffID, 0)
|
| | | effDict.pop(buffID)
|
| | | if not effDict:
|
| | | self._AffectBuffDict.pop(key)
|
| | | self._buffSkillIDDict.pop(buffID, 0)
|
| | | # 检查移除存在的触发方式
|
| | | triggerWay = key[0]
|
| | | hasTrigger = False
|
| | | for k in self._AffectBuffDict.keys():
|
| | | if triggerWay == k[0]:
|
| | | hasTrigger = True
|
| | | break
|
| | | if not hasTrigger and triggerWay in self._buffTriggerWayList:
|
| | | self._buffTriggerWayList.remove(triggerWay)
|
| | | return
|
| | |
|
| | | class HurtObj():
|
| | |
| | | def GetBounceHP(self): return self._bounceHP
|
| | | def SetBounceHP(self, bounceHP): self._bounceHP = bounceHP
|
| | | def ClearHurtObjEx(self):
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | for hurtObjEx in self._hurtListEx:
|
| | | poolMgr.release(hurtObjEx)
|
| | | self._hurtListEx = []
|
| | | return
|
| | | def AddHurtObjEx(self, tagID):
|
| | | hurtObj = ObjPool.GetPoolMgr().acquire(HurtObj)
|
| | | hurtObj = HurtObj()
|
| | | hurtObj.SetObjID(tagID)
|
| | | self._hurtListEx.append(hurtObj)
|
| | | return hurtObj
|
| | |
| | |
|
| | | def __init__(self, ipyData):
|
| | | self._ipyData = ipyData
|
| | | self._skillID = self._ipyData.GetSkillID()
|
| | | self._skillTypeID = self._ipyData.GetSkillTypeID()
|
| | | self._effList = [] # [Effect, ...]
|
| | | self._effDict = {} # {(effID, triggerWay):Effect, ...} ,确保唯一,同个技能可能配置相同的效果ID
|
| | | for num in range(1, 1 + 3):
|
| | |
| | | values = getattr(ipyData, "GetEffectValues%s" % num)()
|
| | | triggerWay = getattr(ipyData, "GetTriggerWay%s" % num)()
|
| | | triggerSrc = getattr(ipyData, "GetTriggerSrc%s" % num)()
|
| | | effect = ObjPool.GetPoolMgr().acquire(SkillEffect, effID, values, triggerWay, triggerSrc)
|
| | | effect = SkillEffect(effID, values, triggerWay, triggerSrc)
|
| | | self._effList.append(effect)
|
| | | self._effDict[(effID, triggerWay)] = effect
|
| | | return
|
| | |
| | | ## 回收前处理,主要处理一些其他不需要释放的对象池对象,防止被连同误回收
|
| | | return
|
| | |
|
| | | def GetObjID(self): return 0 # 减少判断 hasattr 用
|
| | | def GetBatType(self): return -1 # 减少判断 hasattr 用
|
| | | def GetIpyData(self): return self._ipyData
|
| | | def GetSkillID(self): return self._ipyData.GetSkillID()
|
| | | def GetSkillTypeID(self): return self._ipyData.GetSkillTypeID()
|
| | | def GetSkillID(self): return self._skillID
|
| | | def GetSkillTypeID(self): return self._skillTypeID
|
| | | def GetSkillLV(self): return self._ipyData.GetSkillLV()
|
| | | def GetSkillMaxLV(self): return self._ipyData.GetSkillMaxLV()
|
| | | def GetSkillName(self): return self._ipyData.GetSkillName()
|
| | |
| | | def GetSkillValue(self): return self._ipyData.GetSkillValue()
|
| | | def GetHurtAtkPerMax(self): return self._ipyData.GetHurtAtkPerMax()
|
| | | def GetHappenRate(self): return self._ipyData.GetHappenRate() # 触发概率
|
| | | def GetEffect(self, index): return self._effList[index] if len(self._effList) > index else 0
|
| | | def GetEffect(self, index): return self._effList[index]# if len(self._effList) > index else 0
|
| | | def GetEffectCount(self): return len(self._effList)
|
| | | def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), None)
|
| | | def GetEffectByID(self, effID, triggerWay=0):
|
| | | if (effID, triggerWay) in self._effDict:
|
| | | 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()
|
| | |
| | | class PyBuff():
|
| | |
|
| | | def __init__(self, ipyData):
|
| | | self._skillData = ObjPool.GetPoolMgr().acquire(SklllData, ipyData)
|
| | | self._skillData = SklllData(ipyData)
|
| | | self._skillID = self._skillData.GetSkillID()
|
| | | self._skillTypeID = self._skillData.GetSkillTypeID()
|
| | | self._addTiming = 0 # 添加该buff时间点,0-自身回合前;1-自身回合后
|
| | | self._refreshState = 0 # 添加buff后是否刷新过剩余回合,未刷新过的需要先设置为已刷新,防止添加后马上被扣除1回合的时长
|
| | | self._buffID = 0
|
| | |
| | | self._value2 = 0
|
| | | self._value3 = 0
|
| | | self._isCopy = 0 # 是否复制的buff
|
| | | self._effExDict = {} # 效果ID额外数值 {effID:value, ...} # 计算方式取决于本buff技能中属性效果ID的配置
|
| | | self._effExDict = {} # 效果ID额外数值 {(effID, calcType):value, ...} # 计算方式取决于本buff技能中属性效果ID的配置
|
| | | self._haloObjIDList = [] # 光环有效目标ID列表 [objID, ...],ownerID为自己时即为光源,包含光源
|
| | | return
|
| | |
|
| | |
| | | return
|
| | |
|
| | | def GetSkillData(self): return self._skillData
|
| | | def GetSkillID(self): return self._skillData.GetSkillID()
|
| | | def GetSkillID(self): return self._skillID
|
| | | def GetSkillTypeID(self): return self._skillTypeID
|
| | | def GetCurBuffState(self): return self._skillData.GetCurBuffState()
|
| | | def GetDispersedLimit(self): return self._skillData.GetDispersedLimit()
|
| | | def GetBuffRetain(self): return self._skillData.GetBuffRetain()
|
| | |
| | | def SetValue3(self, value): self._value3 = value
|
| | | def GetIsCopy(self): return self._isCopy
|
| | | def SetIsCopy(self, isCopy): self._isCopy = isCopy
|
| | | def GetEffectValueEx(self, effID): return self._effExDict.get(effID, 0)
|
| | | def ResetEffectValueEx(self): self._effExDict = {}
|
| | | def AddEffectValueEx(self, effID, valueEx): self._effExDict[effID] = self._effExDict.get(effID, 0) + valueEx
|
| | | def AddEffectValueEx(self, effID, valueEx, calcType=1): self._effExDict[(effID, calcType)] = self._effExDict.get((effID, calcType), 0) + valueEx
|
| | | def GetEffectExDict(self): return self._effExDict
|
| | | def GetHaloObjIDList(self): return self._haloObjIDList
|
| | | def SetHaloObjIDList(self, haloObjIDList): self._haloObjIDList = haloObjIDList
|
| | |
| | | return
|
| | |
|
| | | def ClearBuff(self):
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | for buff in self._buffList:
|
| | | poolMgr.release(buff)
|
| | | self._buffList = []
|
| | | self._buffIDDict = {}
|
| | | self._skillTypeIDBuffIDs = {}
|
| | |
| | | self._buffID += 1
|
| | |
|
| | | buffID = self._buffID
|
| | | buff = ObjPool.GetPoolMgr().acquire(PyBuff, ipyData)
|
| | | buff = PyBuff(ipyData)
|
| | | buff.SetBuffID(buffID)
|
| | |
|
| | | self._buffList.append(buff)
|
| | | self._buffIDDict[buffID] = buff
|
| | | #GameWorld.DebugLog("ObjBuff:%s, AddBuff buffID=%s, %s, %s, %s, %s, %s" % (self._batObj.GetID(), buffID, buff, len(self._buffList), len(self._buffIDDict), self._buffList, self._buffIDDict))
|
| | | #GameWorld.DebugLogEx("ObjBuff:%s, AddBuff buffID=%s, %s, %s, %s, %s, %s", self._batObj.GetID(), buffID, buff, len(self._buffList), len(self._buffIDDict), self._buffList, self._buffIDDict)
|
| | | if skillTypeID not in self._skillTypeIDBuffIDs:
|
| | | self._skillTypeIDBuffIDs[skillTypeID] = []
|
| | | buffIDs = self._skillTypeIDBuffIDs[skillTypeID]
|
| | |
| | |
|
| | | def DelBuff(self, buffID, release=True):
|
| | | if buffID not in self._buffIDDict:
|
| | | #GameWorld.DebugLog("ObjBuff:%s, DelBuff not in self._buffIDDict, buffID=%s, %s" % (self._batObj.GetID(), buffID, self._buffIDDict.keys()))
|
| | | #GameWorld.DebugLogEx("ObjBuff:%s, DelBuff not in self._buffIDDict, buffID=%s, %s", self._batObj.GetID(), buffID, self._buffIDDict.keys())
|
| | | return
|
| | | #GameWorld.DebugLog("ObjBuff:%s, DelBuff %s, buffID=%s, dict:%s, len:%s, list:%s" % (self._batObj.GetID(), release, buffID, self._buffIDDict, len(self._buffList), self._buffList))
|
| | | #GameWorld.DebugLogEx("ObjBuff:%s, DelBuff %s, buffID=%s, dict:%s, len:%s, list:%s", self._batObj.GetID(), release, buffID, self._buffIDDict, len(self._buffList), self._buffList)
|
| | | buff = self._buffIDDict.pop(buffID)
|
| | | if buff in self._buffList:
|
| | | self._buffList.remove(buff)
|
| | |
| | | if lBuff.GetBuffID() == buffID:
|
| | | self._buffList.remove(lBuff)
|
| | | GameWorld.ErrLog("删除buff异常不在列表里! buffID=%s,lBuff=%s,buff=%s" % (buffID, lBuff, buff))
|
| | | #GameWorld.DebugLog(" ObjBuff:%s, buffID=%s, dict:%s, len:%s, dictKeys:%s, list:%s" % (self._batObj.GetID(), buffID, len(self._buffIDDict), len(self._buffList), self._buffIDDict.keys(), self._buffList))
|
| | | #GameWorld.DebugLogEx(" ObjBuff:%s, buffID=%s, dict:%s, len:%s, dictKeys:%s, list:%s", self._batObj.GetID(), buffID, len(self._buffIDDict), len(self._buffList), self._buffIDDict.keys(), self._buffList)
|
| | | for skillTypeID, buffIDList in self._skillTypeIDBuffIDs.items():
|
| | | if buffID not in buffIDList:
|
| | | continue
|
| | |
| | | if not buffIDList:
|
| | | self._skillTypeIDBuffIDs.pop(skillTypeID)
|
| | | break
|
| | | if release:
|
| | | ObjPool.GetPoolMgr().release(buff)
|
| | | return
|
| | |
|
| | | def GetBuff(self, buffID): return self._buffIDDict.get(buffID, None)
|
| | | def GetBuff(self, buffID):
|
| | | if buffID in self._buffIDDict:
|
| | | return self._buffIDDict[buffID]
|
| | | def FindBuffListBySkillID(self, skillID):
|
| | | ## 返回该技能ID的所有buff列表
|
| | | skillData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
|
| | |
| | | return
|
| | | def FindBuffByState(self, state):
|
| | | ## 查找某种buff状态的buff
|
| | | buffIDList = self._buffStateDict.get(state, [])
|
| | | if state not in self._buffStateDict:
|
| | | return
|
| | | buffIDList = self._buffStateDict[state]
|
| | | if not buffIDList:
|
| | | return
|
| | | buffID = buffIDList[0]
|
| | | return self._buffIDDict.get(buffID, None)
|
| | | if buffID in self._buffIDDict:
|
| | | return self._buffIDDict[buffID]
|
| | | def FindBuffListByState(self, state):
|
| | | ## 查找某种buff状态的buff列表
|
| | | buffIDList = self._buffStateDict.get(state, [])
|
| | | if state not in self._buffStateDict:
|
| | | return []
|
| | | buffIDList = self._buffStateDict[state]
|
| | | buffs = []
|
| | | for buffID in buffIDList:
|
| | | if buffID not in self._buffIDDict:
|
| | |
| | | buffIDList = self._buffStateDict[state]
|
| | | if buffID not in buffIDList:
|
| | | buffIDList.append(buffID)
|
| | | GameWorld.DebugLog(" AddBuffState state=%s,buffID=%s,%s" % (state, buffID, self._buffStateDict))
|
| | | GameWorld.DebugLogEx(" AddBuffState state=%s,buffID=%s,%s", state, buffID, self._buffStateDict)
|
| | | return
|
| | |
|
| | | def DelBuffState(self, state, buffID):
|
| | |
| | | buffIDList.remove(buffID)
|
| | | if not buffIDList:
|
| | | self._buffStateDict.pop(state)
|
| | | GameWorld.DebugLog(" DelBuffState state=%s,buffID=%s,%s" % (state, buffID, self._buffStateDict))
|
| | | GameWorld.DebugLogEx(" DelBuffState state=%s,buffID=%s,%s", state, buffID, self._buffStateDict)
|
| | | return
|
| | |
|
| | | def IsInBuffState(self, state): return state in self._buffStateDict ## 是否处于某种状态下
|
| | | def GetStateBuffIDList(self, state): return self._buffStateDict.get(state, []) # 获取某种状态的所有buffID列表
|
| | | def GetStateBuffIDList(self, state): # 获取某种状态的所有buffID列表
|
| | | if state in self._buffStateDict:
|
| | | return self._buffStateDict[state]
|
| | | return []
|
| | |
|
| | | class PySkill():
|
| | |
|
| | | def __init__(self, ipyData, objID):
|
| | | self._objID = objID # 该技能谁的
|
| | | self._skillData = ObjPool.GetPoolMgr().acquire(SklllData, ipyData)
|
| | | self._skillData = SklllData(ipyData)
|
| | | self._skillID = self._skillData.GetSkillID()
|
| | | self._skillTypeID = self._skillData.GetSkillTypeID()
|
| | | self._remainTime = 0
|
| | | self._batType = 0 # 战斗类型,普通、连击、反击、追击等
|
| | | self._tagObjList = [] # 本次技能主要目标列表 [BatObj, ...]
|
| | |
| | |
|
| | | def GetObjID(self): return self._objID
|
| | | def GetSkillData(self): return self._skillData
|
| | | def GetSkillID(self): return self._skillData.GetSkillID()
|
| | | def GetSkillTypeID(self): return self._skillData.GetSkillTypeID()
|
| | | def GetSkillID(self): return self._skillID
|
| | | def GetSkillTypeID(self): return self._skillTypeID
|
| | | def GetSkillLV(self): return self._skillData.GetSkillLV()
|
| | | def GetSkillMaxLV(self): return self._skillData.GetSkillMaxLV()
|
| | | def GetSkillName(self): return self._skillData.GetSkillName()
|
| | |
| | | return
|
| | | def ClearHurtObj(self):
|
| | | ## 清空伤血统计
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | for hurtObj in self._hurtList:
|
| | | hurtObj.ClearHurtObjEx()
|
| | | poolMgr.release(hurtObj)
|
| | | self._hurtList = []
|
| | |
|
| | | for hurtObjEx in self._hurtListEx:
|
| | | hurtObjEx.ClearHurtObjEx()
|
| | | poolMgr.release(hurtObjEx)
|
| | | self._hurtListEx = []
|
| | | return
|
| | | def AddHurtObj(self, tagID, isEx=False):
|
| | | ## 添加某个伤血
|
| | | # @param isEx: 是否额外伤血
|
| | | hurtObj = ObjPool.GetPoolMgr().acquire(HurtObj)
|
| | | hurtObj = HurtObj()
|
| | | hurtObj.SetObjID(tagID)
|
| | | if isEx:
|
| | | self._hurtListEx.append(hurtObj)
|
| | |
| | | ## 检查并设置开始连击相关,一般是开始使用技能时调用
|
| | | if not force:
|
| | | if self._comboState == 1:
|
| | | #GameWorld.DebugLog("连击进行中,不重置")
|
| | | #GameWorld.DebugLogEx("连击进行中,不重置")
|
| | | return
|
| | | self.__commboClear()
|
| | | self._comboState = 1 # 设置已初始化连击相关
|
| | | #GameWorld.DebugLog("连击重置")
|
| | | #GameWorld.DebugLogEx("连击重置")
|
| | | return
|
| | |
|
| | | def ComboEnable(self): return self._comboState == 1 ## 可否执行连击相关
|
| | |
| | | return
|
| | |
|
| | | def SkillReset(self):
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | for skill in self._skillList:
|
| | | poolMgr.release(skill)
|
| | | self._skillList = []
|
| | | self._skillDict = {}
|
| | | return
|
| | |
| | | def GetSkillCount(self): return len(self._skillList)
|
| | | def GetSkillByIndex(self, index): return self._skillList[index]
|
| | | def GetSkillIDList(self): return sorted(self._skillDict.keys())
|
| | | def FindSkillByID(self, skillID): return self._skillDict.get(skillID, None)
|
| | | def FindSkillByID(self, skillID):
|
| | | if skillID in self._skillDict:
|
| | | return self._skillDict[skillID]
|
| | | def FindSkillByTypeID(self, skillTypeID):
|
| | | skill = None
|
| | | for s in self._skillList:
|
| | |
| | | self.__deleteSkill(curSkill)
|
| | |
|
| | | # 学新技能
|
| | | curSkill = ObjPool.GetPoolMgr().acquire(PySkill, ipyData, self._batObj.GetID())
|
| | | curSkill = PySkill(ipyData, self._batObj.GetID())
|
| | | self._skillDict[skillID] = curSkill
|
| | | self._skillList.append(curSkill)
|
| | | return curSkill
|
| | |
| | | self._skillDict.pop(skillID, None)
|
| | | if curSkill in self._skillList:
|
| | | self._skillList.remove(curSkill)
|
| | | ObjPool.GetPoolMgr().release(curSkill)
|
| | | return
|
| | |
|
| | | class BatObj():
|
| | |
| | | self._skillHappenFailCntDict = {} # 技能累计概率触发次数,使用成功后重置 {skillID:failCnt, ...}
|
| | | self._skillUseCntDict = {} # 技能累计使用次数 {skillID:useCnt, ...}
|
| | | self._skillTurnUseCntDict = {} # 技能单回合累计使用次数 {skillID:useCnt, ...}
|
| | | self._skillMgr = ObjPool.GetPoolMgr().acquire(SkillManager, self)
|
| | | self._buffMgr = ObjPool.GetPoolMgr().acquire(BuffManager, self)
|
| | | self._passiveEffMgr = ObjPool.GetPoolMgr().acquire(PassiveEffManager, self)
|
| | | self._skillMgr = SkillManager(self)
|
| | | self._buffMgr = BuffManager(self)
|
| | | self._passiveEffMgr = PassiveEffManager(self)
|
| | | self._lastHurtValue = 0
|
| | | self._harmSelfHP = 0 # 自残值
|
| | | self._mainTagIDList = [] # 主技能目标ID列表,一般用于技能拆分成多个技能效果时,子技能可能会用到主技能的对象做逻辑
|
| | |
| | | newObjID = self.__getNewObjID()
|
| | | if not newObjID:
|
| | | return newBatObj
|
| | | newBatObj = ObjPool.GetPoolMgr().acquire(BatObj)
|
| | | newBatObj = BatObj()
|
| | | newBatObj.objID = newObjID
|
| | | self.batObjDict[newObjID] = newBatObj
|
| | | GameWorld.DebugLog("添加战斗单位: objID=%s" % (newObjID))
|
| | | GameWorld.DebugLogEx("添加战斗单位: objID=%s", newObjID)
|
| | | if False:
|
| | | newBatObj = BatObj(None, 0)
|
| | | return newBatObj
|
| | |
| | | if not batObj:
|
| | | return
|
| | | objID = batObj.objID
|
| | | GameWorld.DebugLog("回收战斗单位: objID=%s" % (objID))
|
| | | GameWorld.DebugLogEx("回收战斗单位: objID=%s", objID)
|
| | | #前端确认不需要通知消失
|
| | | #turnFight = batObj.GetTurnFight()
|
| | | #if turnFight:
|
| | |
| | | # turnFight.addBatPack(clientPack)
|
| | |
|
| | | # 最后回收对象
|
| | | ObjPool.GetPoolMgr().release(batObj)
|
| | | if objID not in self._freeIDList: # 回收ID,重复利用
|
| | | self._freeIDList.append(objID)
|
| | | return
|
| | |
| | | turnFight = TurnAttack.GetTurnFightMgr().getTurnFight(batObj.GetTFGUID())
|
| | | if not turnFight:
|
| | | return
|
| | | clientPack = ObjPool.GetPoolMgr().acquire(ChNetSendPack.tagObjInfoRefresh)
|
| | | clientPack = ChNetSendPack.tagObjInfoRefresh()
|
| | | clientPack.ObjID = batObj.GetID()
|
| | | clientPack.RefreshType = refreshType
|
| | | if isBig:
|