From 6f2c8b0e79e4963cc6aceda674847d04d23e02b2 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 24 十二月 2025 18:25:40 +0800
Subject: [PATCH] 16 卡牌服务端(MainLevelPass流向增加祝福树等级信息;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py |  281 +++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 185 insertions(+), 96 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
index 1a3d1bb..d7b8c8e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -23,7 +23,6 @@
 import ChNetSendPack
 import ShareDefine
 import ChConfig
-import ObjPool
 import TurnPassive
 import TurnBuff
 
@@ -32,10 +31,19 @@
     
     def __init__(self, batObj):
         self._batObj = batObj
-        # 被影响的技能ID: 0为所有技能
+        self._objID = batObj.GetID() if batObj else 0
+        self._skillIDList = [] # 已有技能ID列表,获取被动中快速判断已学技能用
+        self.noDeadSkill = None # 不死技能效果,暂时只支持最多1个这种技能
+        
+        # 技能
         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):
@@ -50,20 +58,12 @@
         '''
         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.GetSkillID() not in self._skillIDList:
             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()
@@ -80,12 +80,30 @@
                         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] = []
+                    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 key in effDict:
+                effList.append(["skill", skillID, 0, effDict[key]])
+                
+        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]:
             # 技能
@@ -100,30 +118,39 @@
             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()):
             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()
@@ -161,10 +188,19 @@
         if skillID not in effDict:
             effDict[skillID] = []
         effDict[skillID].append(effectID)
+        if triggerWay not in self._skillTriggerWayList:
+            self._skillTriggerWayList.append(triggerWay)
+            
+        # 加载不死技能效果
+        if triggerWay == ChConfig.TriggerWay_NoDead:
+            self.noDeadSkill = curSkill
+            
         return
         
     def RefreshBuffPassiveEffect(self):
         self._AffectBuffDict = {}
+        self._buffTriggerWayList = []
+        
         buffMgr = self._batObj.GetBuffManager()
         for index in range(buffMgr.GetBuffCount()):
             buff = buffMgr.GetBuffByIndex(index)
@@ -214,6 +250,8 @@
         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):
@@ -221,10 +259,19 @@
         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():
@@ -271,13 +318,10 @@
     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
@@ -315,6 +359,9 @@
     
     def __init__(self, ipyData):
         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):
@@ -322,7 +369,7 @@
             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
@@ -331,9 +378,11 @@
         ## 回收前处理,主要处理一些其他不需要释放的对象池对象,防止被连同误回收
         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()
@@ -351,12 +400,14 @@
     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()
+    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() # 持续时间
@@ -371,7 +422,9 @@
 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
@@ -382,7 +435,7 @@
         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
     
@@ -391,7 +444,8 @@
         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()
@@ -425,9 +479,8 @@
     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
@@ -454,9 +507,6 @@
         return
     
     def ClearBuff(self):
-        poolMgr = ObjPool.GetPoolMgr()
-        for buff in self._buffList:
-            poolMgr.release(buff)
         self._buffList = []
         self._buffIDDict = {}
         self._skillTypeIDBuffIDs = {}
@@ -465,7 +515,7 @@
         return
     
     def GetBuffCount(self): return len(self._buffList)
-    def GetBuffByIndex(self, index): return self._buffList[index]
+    def GetBuffByIndex(self, index): return self._buffList[index] if len(self._buffList) > index else None
     
     def AddBuff(self, skillID):
         buff = None
@@ -476,12 +526,12 @@
         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]
@@ -492,9 +542,9 @@
     
     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)
@@ -504,7 +554,7 @@
                 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
@@ -512,11 +562,11 @@
             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)
@@ -543,16 +593,30 @@
             if buff.GetOwnerID() == ownerID:
                 return buff
         return
-    def FindBuffByState(self, state):
+    def FindBuffByState(self, state, ownerID=0):
         ## 查找某种buff状态的buff
-        buffIDList = self._buffStateDict.get(state, [])
+        # @param ownerID: 可指定获取归属于某个对象ID的buff
+        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 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列表
-        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:
@@ -567,7 +631,7 @@
         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):
@@ -579,17 +643,23 @@
         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._cdTime = self._skillData.GetCoolDownTime()
         self._remainTime = 0
         self._batType = 0 # 战斗类型,普通、连击、反击、追击等
         self._tagObjList = [] # 本次技能主要目标列表 [BatObj, ...]
@@ -600,6 +670,7 @@
         self._hurtListEx = [] # 额外伤血列表,如平摊、溅射 [HurtObj, ...]
         self._bySkill = None # 由哪个技能触发的
         self._byBuff = None # 由哪个buff触发的
+        self._byTriggerWay = 0 # 由哪个被动方式触发的
         self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
         self._energy = 0 # 技能能量,一般用于累计能量达到某种条件后做逻辑
         
@@ -625,14 +696,15 @@
         self._effIgnoreObjIDList = []
         self._bySkill = None
         self._byBuff = None
+        self._byTriggerWay = 0
         self._afterLogicList = []
         self.ClearHurtObj()
         return
     
     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()
@@ -655,7 +727,7 @@
     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() # 持续时间
@@ -664,7 +736,7 @@
     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()
     
     ## ---------------------------------- 非技能表内容 ----------------------------------
@@ -676,6 +748,8 @@
     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 # 技能额外目标列表
@@ -696,21 +770,18 @@
         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)
@@ -733,11 +804,11 @@
         ## 检查并设置开始连击相关,一般是开始使用技能时调用
         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 ## 可否执行连击相关
@@ -772,9 +843,6 @@
         return
     
     def SkillReset(self):
-        poolMgr = ObjPool.GetPoolMgr()
-        for skill in self._skillList:
-            poolMgr.release(skill)
         self._skillList = []
         self._skillDict = {}
         return
@@ -782,7 +850,9 @@
     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:
@@ -805,7 +875,7 @@
             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
@@ -815,16 +885,15 @@
         self._skillDict.pop(skillID, None)
         if curSkill in self._skillList:
             self._skillList.remove(curSkill)
-        ObjPool.GetPoolMgr().release(curSkill)
         return
     
 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
@@ -843,6 +912,7 @@
         self._hp = 0 # 当前生命值
         self._xp = 0 # 当前怒气值
         self._isAlive = True # 是否活着
+        self._killer = None # 被谁击杀的
         self._initAttrDict = {} # 初始化时的属性,固定不变,初始化时已经算好的属性  {attrID:value, ...}
         self._batAttrDict = {} # 实际战斗属性,包含buff层级的实际属性 {attrID:+-value, ...} value可能是负值
         self._skillTempAttrDict = {} # 某次技能释放中临时的属性增减 {attrID:+-value, ...} value可能是负值
@@ -852,9 +922,9 @@
         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列表,一般用于技能拆分成多个技能效果时,子技能可能会用到主技能的对象做逻辑
@@ -966,9 +1036,16 @@
     def SetLV(self, lv): self.lv = lv
     def GetStar(self): return self._star
     def SetStar(self, star): self._star = star
-    def GetDictByKey(self, key): return self._kvDict.get(key, 0)
-    def SetDict(self, key, value): self._kvDict[key] = value
-    
+    def GetDictByKey(self, key): 
+        if key in self._kvDict:
+            return self._kvDict[key]
+        return 0
+    def SetDict(self, key, value):
+        if not value:
+            self._kvDict.pop(key, None)
+        else:
+            self._kvDict[key] = value
+            
     def GetSkillManager(self): return self._skillMgr
     def GetBuffManager(self):return self._buffMgr
     def GetPassiveEffManager(self):return self._passiveEffMgr
@@ -1016,6 +1093,17 @@
             return False
         return True
     
+    def CanNoDead(self):
+        '''是否还可触发不死效果
+        暂定单个武将最多只支持配置1个不死效果,且单场战斗最多触发x次,即按技能cd判断即可
+        '''
+        noDeadSkill = self._passiveEffMgr.noDeadSkill # 固定有被动触发
+        if not noDeadSkill:
+            return
+        if noDeadSkill.GetRemainTime():
+            return
+        return True
+    
     def GetSneerTagObj(self):
         ## 获取被嘲讽的目标,如果存在则一定是活着的目标
         buffIDList = self._buffMgr.GetStateBuffIDList(ChConfig.BatObjState_Sneer)
@@ -1033,12 +1121,15 @@
     
     # 战斗属性
     def IsAlive(self): return self._isAlive # 是否活着
-    def SetDead(self):
+    def SetDead(self, killer=None):
+        self._killer = killer
         self._isAlive = False
         self._hp = 0
     def SetRevive(self, hp):
+        self._killer = None
         self._isAlive = True
         self._hp = hp
+    def GetKiller(self): return self._killer
     def GetMaxHP(self): return int(self._batAttrDict.get(ChConfig.AttrID_MaxHP, 0))
     def SetMaxHP(self, maxHP, isNotify=False):
         maxHP = int(maxHP)
@@ -1180,10 +1271,9 @@
         newObjID = self.__getNewObjID()
         if not newObjID:
             return newBatObj
-        newBatObj = ObjPool.GetPoolMgr().acquire(BatObj)
-        newBatObj.objID = newObjID
+        newBatObj = BatObj(newObjID)
         self.batObjDict[newObjID] = newBatObj
-        GameWorld.DebugLog("添加战斗单位: objID=%s" % (newObjID))
+        GameWorld.DebugLogEx("添加战斗单位: objID=%s", newObjID)
         if False:
             newBatObj = BatObj(None, 0)
         return newBatObj
@@ -1203,7 +1293,7 @@
         if not batObj:
             return
         objID = batObj.objID
-        GameWorld.DebugLog("回收战斗单位: objID=%s" % (objID))
+        GameWorld.DebugLogEx("回收战斗单位: objID=%s", objID)
         #前端确认不需要通知消失
         #turnFight = batObj.GetTurnFight()
         #if turnFight:
@@ -1214,7 +1304,6 @@
         #    turnFight.addBatPack(clientPack)
         
         # 最后回收对象
-        ObjPool.GetPoolMgr().release(batObj)
         if objID not in self._freeIDList: # 回收ID,重复利用
             self._freeIDList.append(objID)
         return
@@ -1238,7 +1327,7 @@
     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:

--
Gitblit v1.8.0