129 【战斗】战斗系统-服务端(增加属性ID技能增伤65、技能减伤66;曹轶技能;被动触发增加属性支持;)
7个文件已修改
1个文件已添加
311 ■■■■■ 已修改文件
PySysDB/生成IpyGameDataPY/IpyGameDataPYTemp.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py 150 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/Éú³ÉIpyGameDataPY/IpyGameDataPYTemp.py
@@ -291,7 +291,7 @@
    
    def __StrToList(self, strValue):
        setList = []
        if ("[" in strValue and "]" in strValue) or ("(" in strValue and ")" in strValue):
        if (strValue.startswith("[") and strValue.endswith("]")) or (strValue.startswith("(") and strValue.endswith(")")):
            setList = eval(strValue)
        elif strValue in ["0", "-", ""]:
            pass
@@ -301,6 +301,8 @@
            for value in strValue.split(ChConfig.Def_Str_Montant):
                if value.isdigit():
                    value = int(value)
                elif (value.startswith("[") and value.endswith("]")) or (value.startswith("(") and value.endswith(")")):
                    value = eval(value)
                setList.append(value)
            if setList:
                setList = tuple(setList)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -45,7 +45,7 @@
        effList = []
        
        # ä¼˜å…ˆå–关联技能的
        if connSkillTypeID and connSkillTypeID not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_Buff]:
        if connSkillTypeID and connSkillTypeID not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_SkillSelf, ChConfig.TriggerSrc_BuffSelf]:
            # æŠ€èƒ½
            key = (triggerWay, connSkillTypeID)
            if key in self._AffectSkillDict:
@@ -99,13 +99,19 @@
            return
        if triggerWay == ChConfig.TriggerWay_CurSkillEff:
            return
        if triggerSrc == ChConfig.TriggerSrc_Buff:
        if triggerSrc in [ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_BuffSelf]:
            # buff有效的不加进来
            return
        
        skillID = curSkill.GetSkillID()
        effectID = effect.GetEffectID()
        
        if triggerWay == ChConfig.TriggerWay_CalcEffValue:
            triggerWay = "%s_%s" % (triggerWay, effectID)
        if triggerSrc == ChConfig.TriggerSrc_SkillSelf:
            triggerSrc = curSkill.GetSkillTypeID()
        key = (triggerWay, triggerSrc)
        if key not in self._AffectSkillDict:
            self._AffectSkillDict[key] = {}
@@ -143,13 +149,19 @@
            return
        if triggerWay == ChConfig.TriggerWay_CurSkillEff:
            return
        if triggerSrc == ChConfig.TriggerSrc_Skill:
        if triggerSrc in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
            # æŠ€èƒ½æœ‰æ•ˆçš„不加进来
            return
        
        buffID = buff.GetBuffID()
        effectID = effect.GetEffectID()
        
        if triggerWay == ChConfig.TriggerWay_CalcEffValue:
            triggerWay = "%s_%s" % (triggerWay, effectID)
        if triggerSrc == ChConfig.TriggerSrc_BuffSelf:
            triggerSrc = skillData.GetSkillTypeID()
        key = (triggerWay, triggerSrc)
        if key not in self._AffectBuffDict:
            self._AffectBuffDict[key] = {}
@@ -720,8 +732,20 @@
        #    return False
        return True
    
    def IsInState(self, state):
    def CheckInState(self, checkInState):
        ## æ˜¯å¦å¤„于某种状态下
        if isinstance(checkInState, int):
            checkInStateList = [checkInState]
        elif isinstance(checkInState, list) or isinstance(checkInState, tuple):
            checkInStateList = checkInState
        else:
            return False
        for state in checkInStateList:
            if self._buffMgr.IsInBuffState(state):
                return True
        return False
    def IsInState(self, state):
        ## æ˜¯å¦å¤„于指定状态下
        return self._buffMgr.IsInBuffState(state)
    
    def IsInControlled(self):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -160,7 +160,9 @@
AttrID_WuFinalDamPerDef,                    # å¯¹å´å‡ä¼¤ 62
AttrID_QunFinalDamPer,                      # å¯¹ç¾¤å¢žä¼¤ 63
AttrID_QunFinalDamPerDef,                   # å¯¹ç¾¤å‡ä¼¤ 64
) = range(1, 1 + 64)
AttrID_SkillPer,                            # æŠ€èƒ½å¢žä¼¤ 65
AttrID_SkillPerDef,                         # æŠ€èƒ½å‡ä¼¤ 66
) = range(1, 1 + 66)
# éœ€è¦è®¡ç®—的武将战斗属性ID列表
CalcBattleAttrIDList = [AttrID_Atk, AttrID_Def, AttrID_MaxHP, AttrID_StunRate, AttrID_StunRateDef, 
@@ -4270,8 +4272,8 @@
TriggerWay_HeroTurnEnd, # æ­¦å°†å›žåˆå¼€å§‹æ—¶    5
TriggerWay_HeroActionStart, # æ­¦å°†è¡ŒåŠ¨å‰    6
TriggerWay_HeroActionEnd, # æ­¦å°†è¡ŒåŠ¨åŽ    7
TriggerWay_CalcTagInState, # æ”»å‡»è®¡ç®—时对方处于xx状态时(参数:状态1|2|...)一般用于攻击时属性计算  8
TriggerWay_AttackOverTagInState, # æ”»å‡»è®¡ç®—后对方处于xx状态时(参数:状态1|2|...)一般用于攻击后触发效果  9
TriggerWay_CalcEffValue, # ç»Ÿè®¡è®¡ç®—效果值时  8
TriggerWay_9, # 9
TriggerWay_AttackOverDirect, # ç›´æŽ¥æ”»å‡»åŽ ï¼ˆéžbuff攻击)10
TriggerWay_BeAttackedDirect, # å—到直接攻击时 ï¼ˆéžbuff攻击)11
TriggerWay_ShieldBroken, # æ‰¿ä¼¤ç›¾è¢«å‡»ç ´æ—¶ 12
@@ -4279,8 +4281,10 @@
) = range(1, 1 + 13)
# è¢«åŠ¨è§¦å‘æœ‰æ•ˆæ¥æº
TriggerSrc_Skill = 1
TriggerSrc_Buff = 2
TriggerSrc_Skill = 1    # èº«ä¸ŠæŠ€èƒ½æœ‰æ•ˆ
TriggerSrc_Buff = 2     # èº«ä¸Šbuff有效
TriggerSrc_SkillSelf = 3    # æœ¬æŠ€èƒ½æœ‰æ•ˆ
TriggerSrc_BuffSelf = 4     # æœ¬buff有效
(
TriggerType_BeSuperHit, # è¢«æš´å‡»è§¦å‘技能 1
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -6915,7 +6915,7 @@
    
    def __StrToList(self, strValue):
        setList = []
        if ("[" in strValue and "]" in strValue) or ("(" in strValue and ")" in strValue):
        if (strValue.startswith("[") and strValue.endswith("]")) or (strValue.startswith("(") and strValue.endswith(")")):
            setList = eval(strValue)
        elif strValue in ["0", "-", ""]:
            pass
@@ -6925,6 +6925,8 @@
            for value in strValue.split(ChConfig.Def_Str_Montant):
                if value.isdigit():
                    value = int(value)
                elif (value.startswith("[") and value.endswith("]")) or (value.startswith("(") and value.endswith(")")):
                    value = eval(value)
                setList.append(value)
            if setList:
                setList = tuple(setList)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py
New file
@@ -0,0 +1,30 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveTrigger.PassiveEff_Attr
#
# @todo:被动触发属性
# @author hxp
# @date 2025-09-16
# @version 1.0
#
# è¯¦ç»†æè¿°: è¢«åŠ¨è§¦å‘å±žæ€§
#
#-------------------------------------------------------------------------------
#"""Version = 2025-09-16 14:30"""
#-------------------------------------------------------------------------------
def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
    checkInStateList = curEffect.GetEffectValue(2)
    if checkInStateList:
        if not defender.CheckInState(checkInStateList):
            return 0
    attrValue = curEffect.GetEffectValue(0)
    calcType = curEffect.GetEffectValue(1)
    if calcType == 2: # å‡å°‘,其他默认增加
        attrValue = -attrValue
    return attrValue
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -179,7 +179,7 @@
            continue
        
        if curEffect.GetTriggerWay():
            if curEffect.GetTriggerSrc() != ChConfig.TriggerSrc_Skill:
            if curEffect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
                passiveEffMgr.AddBuffPassiveEffect(addBuff, buffSkill, curEffect)
                
        elif effectID in ChConfig.AttrIDList:
@@ -240,7 +240,7 @@
            continue
        
        if curEffect.GetTriggerWay():
            if curEffect.GetTriggerSrc() != ChConfig.TriggerSrc_Skill:
            if curEffect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
                haveBuffPassiveEff = True
                
        elif effectID in ChConfig.AttrIDList:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
@@ -106,86 +106,74 @@
    callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
    return
def GetTriggerPassiveValue(batObj, triggerType, tagObj=None, useSkill=None):
def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None):
    ''' èŽ·å–è§¦å‘è¢«åŠ¨çš„å€¼ï¼Œä¸€èˆ¬ç”¨äºŽæŸç§æ¡ä»¶ä¸‹æ‰ä¼šäº§ç”Ÿçš„å€¼ï¼Œå¦‚xx情况下属性变化 æˆ– xx情况下是否发生什么
    @return: è§¦å‘的值,0-没有触发或本身触发的值为0;大于0-触发的具体值
    @param calcEffID: éœ€è¦ç»Ÿè®¡çš„æ•ˆæžœID,可以是属性ID或者其他自定义效果ID
    @return: è§¦å‘的值,0-没有触发或本身触发的值为0;非0-触发的具体值
    '''
    return 0
#    attacker = FindRealAttacker(attacker)
#    if not attacker:
#        return 0
#
#    stopPassiveSkill = False   # è¢«åŠ¨æŠ€èƒ½ä¸èƒ½å†è§¦å‘è¢«åŠ¨æŠ€èƒ½ï¼Œä½†å¯ä»¥è§¦å‘å¤©èµ‹æŠ€èƒ½
#    if useSkill and SkillCommon.isPassiveSkill(useSkill) and isStopPassiveSkill:
#        #GameWorld.DebugLog("被动技能不能再次触发被动技能")
#        #return 0
#        if not PassPassiveLimit(useSkill):
#            stopPassiveSkill = True
#
#
#    passiveEff = GetPassiveEffManager().GetPassiveEff(attacker)
#    if not passiveEff:
#        return 0
#    buffDict = passiveEff.GetBuffsByTriggerType(triggerType)
#    if not buffDict:
#        return 0
#
#    # å½“前战斗关系 pvp pve
#    battleRelationType = AttackCommon.GetBattleRelationType(attacker, defender)
#    if not AttackCommon.CheckBattleRelationType(attacker, defender, useSkill, battleRelationType):
#        return 0
#
#    useSkillID = useSkill.GetSkillID() if useSkill else 0
#    #tick = GameWorld.GetGameWorld().GetTick()
#    curValue = 0
#
#    for skillID, effectList in buffDict.items():
#        if skillID == useSkillID:
#            continue
#        curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
#        if not curSkill:
#            continue
#
#        if not IsValidPassiveSkill(curSkill):
#            continue
#
#        triggerCount = 0 # æˆåŠŸè§¦å‘æ¬¡æ•°
#        for effectInfo in effectList:
#            if stopPassiveSkill and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_GiftSkill:
#                # åªæœ‰å¤©èµ‹æ‰å¯ä»¥å†æ¬¡è¢«è§¦å‘
#                continue
#            passiveEffect = effectInfo[0]
#            # è¢«åŠ¨è§¦å‘çš„æŠ€èƒ½
#            pyName = "PassiveBuff_%s"%passiveEffect.GetEffectID()
#
#            callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "CheckCanHappen"))
#            if not callFunc:
#                continue
#
#            # æ¡ä»¶ä¸æ»¡è¶³
#            if not callFunc(attacker, defender, passiveEffect, skillID, useSkill=useSkill, ownerID=effectInfo[1], ownerType=effectInfo[2]):
#                continue
#
#            callFunc = GameWorld.GetExecFunc(PassiveBuff, "%s.%s" % (pyName, "GetValue"))
#            if callFunc is None:
#                continue
#
#            # å¦‚被动技能:千幻冥炎真实伤害从2变4倍
#            #curValue += GetPassiveSkillValueByTriggerType(attacker, defender, curSkill, ChConfig.TriggerType_PassiveBuffValue)
#            value = callFunc(attacker, defender, passiveEffect)
#            if triggerType in TriggerValueMaxList:
#                curValue = max(curValue, value) # å–最大值
#            elif triggerType in TriggerValueMinList:
#                if not curValue:
#                    curValue = value
#                elif value > 0:
#                    curValue = min(curValue, value) # å–最小值
#            else:
#                curValue += value
#
#            triggerCount += 1
#
#        if triggerCount:
#            OnTriggerBuffDel(attacker, curSkill, triggerCount)
#
#    return curValue
    triggerWay = ChConfig.TriggerWay_CalcEffValue
    passiveEffMgr = atkObj.GetPassiveEffManager()
    connSkillTypeID = connSkill.GetSkillTypeID() if connSkill else 0
    effInfoList = passiveEffMgr.GetPassiveEffByTrigger("%s_%s" % (triggerWay, calcEffID), connSkillTypeID)
    if not effInfoList:
        return 0
    curValue = 0
    skillMgr = atkObj.GetSkillManager()
    buffMgr = atkObj.GetBuffManager()
    # [["skill/buff", skillID/buffID, effIDList], ...]
    tagID = defObj.GetID() if defObj else 0
    GameWorld.DebugLog("统计被动效果值: calcEffID=%s,objID=%s,tagID=%s,%s" % (calcEffID, atkObj.GetID(), tagID, effInfoList))
    for effInfo in effInfoList:
        sign = effInfo[0]
        if sign == "skill":
            skillID, effIDList = effInfo[1:]
            effSkill = skillMgr.FindSkillByID(skillID)
        elif sign == "buff":
            buffID, effIDList = effInfo[1:]
            effBuff = buffMgr.GetBuff(buffID)
            if not effBuff:
                continue
            effSkill = effBuff.GetSkillData()
        else:
            continue
        if not effSkill:
            continue
        for effID in effIDList:
            effect = effSkill.GetEffectByID(effID, triggerWay)
            if not effect:
                continue
            effID = effect.GetEffectID()
            if not effID or effID != calcEffID:
                continue
            if effID in ChConfig.AttrIDList:
                pyName = "PassiveEff_Attr"
            else:
                pyName = "PassiveEff_%s" % effID
            callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "GetHappenValue"))
            if not callFunc:
                continue
            value = callFunc(atkObj, defObj, effect, effSkill)
            if value is None:
                continue
            #if triggerType in TriggerValueMaxList:
            #    curValue = max(curValue, value) # å–最大值
            #elif triggerType in TriggerValueMinList:
            #    if not curValue:
            #        curValue = value
            #    elif value > 0:
            #        curValue = min(curValue, value) # å–最小值
            #else:
            curValue += value
            #if skillTypeID not in Def_PassiveSkillValueNoCD:
            #    if curSkill.GetCoolDownTime():
            #        SkillCommon.SetSkillRemainTime(curSkill, 0, tick, attacker)
    return curValue
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -562,7 +562,7 @@
    DoBeAttackResult(turnFight, curBatObj, useSkill, True)
    return
def DoCombo(turnFight, curBatObj, useSkill):
def DoCombo(turnFight, atkObj, useSkill):
    '''
        æ ¼æŒ¡ã€åå‡»ã€è¿žå‡»è§„则
        1. æ‰€æœ‰æ­¦å°†æˆ–怪物均可能产生格挡,群攻时格挡一对一判断,均可能产生格挡
@@ -586,7 +586,7 @@
    
    tagFriendly = useSkill.GetTagFriendly()
    if tagFriendly:
        tagObj = GetRelativeObj(turnFight, curBatObj)
        tagObj = GetRelativeObj(turnFight, atkObj)
    else:
        tagObjList = useSkill.GetTagObjList()
        if not tagObjList:
@@ -596,18 +596,31 @@
        if atkBackSkill:
            # å¯ä»¥åå‡»ï¼Œæ‰“断连击
            GameWorld.DebugLog("● %s ã€åå‡»ã€‘" % TurnAttack.GetObjName(tagObj))
            OnUseSkill(turnFight, tagObj, atkBackSkill, [curBatObj], ChConfig.TurnBattleType_AtkBack)
            OnUseSkill(turnFight, tagObj, atkBackSkill, [atkObj], ChConfig.TurnBattleType_AtkBack)
            return
        
    if not tagObj:
        return
    
    if CanCombo(curBatObj, tagObj):
        # è¿žå‡»æ ¹æ®æŠ€èƒ½ç›®æ ‡é…ç½®é€»è¾‘重新选择目标
        GameWorld.DebugLog("● %s ã€è¿žå‡»ã€‘" % TurnAttack.GetObjName(curBatObj))
        DoHeroSpecialty(turnFight, curBatObj, ChConfig.HeroSpecialty_Combo, useSkill.GetSkillID())
        OnUseSkill(turnFight, curBatObj, useSkill, batType=ChConfig.TurnBattleType_Combo)
    comboNum = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum)
    aComboRate = atkObj.GetBatAttrValue(ChConfig.AttrID_ComboRate)
    aComboRate += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, tagObj, ChConfig.AttrID_ComboRate, useSkill)
    dComboRateDef = tagObj.GetBatAttrValue(ChConfig.AttrID_ComboRateDef)
    happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("ComboCfg", 1))
    if not GameWorld.CanHappen(happenRate):
        GameWorld.DebugLog("无法连击! atkID=%s,happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s"
                           % (atkObj.GetID(), happenRate, aComboRate, dComboRateDef, comboNum))
        return
    GameWorld.DebugLog("● %s ã€è¿žå‡»ã€‘ happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s"
                       % (TurnAttack.GetObjName(atkObj), happenRate, aComboRate, dComboRateDef, comboNum))
    atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum + 1)
    # è¿žå‡»ç‰¹é•¿
    DoHeroSpecialty(turnFight, atkObj, ChConfig.HeroSpecialty_Combo, useSkill.GetSkillID())
    # è¿žå‡»æ ¹æ®æŠ€èƒ½ç›®æ ‡é…ç½®é€»è¾‘重新选择目标
    OnUseSkill(turnFight, atkObj, useSkill, batType=ChConfig.TurnBattleType_Combo)
    return
def __getCanAtkBackSkill(useSkill, tagObj):
@@ -642,21 +655,6 @@
            GameWorld.DebugLog("可以反击! tagID=%s" % tagID)
            return useSkill
    return
def CanCombo(atkObj, defObj):
    ## å¯å¦è¿žå‡»
    comboNum = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum)
    aComboRate = atkObj.GetBatAttrValue(ChConfig.AttrID_ComboRate)
    dComboRateDef = defObj.GetBatAttrValue(ChConfig.AttrID_ComboRateDef)
    happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("ComboCfg", 1))
    if GameWorld.CanHappen(happenRate):
        GameWorld.DebugLog("可以连击! atkID=%s,happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s"
                           % (atkObj.GetID(), happenRate, aComboRate, dComboRateDef, comboNum))
        atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum + 1)
        return True
    GameWorld.DebugLog("无法连击! atkID=%s,happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s"
                       % (atkObj.GetID(), happenRate, aComboRate, dComboRateDef, comboNum))
    return False
def DoBeAttackResult(turnFight, curObj, useSkill, isUseSkill=False):
    '''被攻击结果
@@ -880,9 +878,6 @@
    #    return
    enhanceSkillID = curEffect.GetEffectValue(0)
    checkInStateList = curEffect.GetEffectValue(1)
    if checkInStateList:
        if isinstance(checkInStateList, int):
            checkInStateList = [checkInStateList]
    GameWorld.DebugLog("额外触发的技能: enhanceSkillID=%s,checkInStateList=%s" % (enhanceSkillID, checkInStateList))
    tagObjList = useSkill.GetTagObjList()
    
@@ -905,12 +900,7 @@
                GameWorld.DebugLog("    é—ªé¿çš„不触发: tagID=%s" % (tagID))
                continue
            if checkInStateList:
                inState = False
                for state in checkInStateList:
                    if tagObj.IsInState(state):
                        inState = True
                        break
                if not inState:
                if not tagObj.CheckInState(checkInStateList):
                    GameWorld.DebugLog("    ä¸åœ¨çŠ¶æ€ä¸‹ä¸è§¦å‘: tagID=%s not in state:%s" % (tagID, checkInStateList))
                    continue
            if enhanceRate and enhanceRate != ChConfig.Def_MaxRateValue and not GameWorld.CanHappen(enhanceRate, ChConfig.Def_MaxRateValue):
@@ -929,11 +919,8 @@
    if checkInStateList:
        inState = False
        for tagObj in tagObjList:
            for state in checkInStateList:
                if not state or tagObj.IsInState(state):
                    inState = True
                    break
            if inState:
            if tagObj.CheckInState(checkInStateList):
                inState = True
                break
        if not inState:
            GameWorld.DebugLog("    æ²¡æœ‰ç›®æ ‡åœ¨çŠ¶æ€ä¸‹ä¸è§¦å‘: tagObj not in state:%s" % str(checkInStateList))
@@ -1102,7 +1089,10 @@
    if isAngerSkill:
        aAngerSkillPer = atkObj.GetBatAttrValue(ChConfig.AttrID_AngerSkillPer) # æ™®æŠ€å¢žä¼¤
        dAngerSkillPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_AngerSkillPerDef) # æ™®æŠ€å‡ä¼¤
    aAddSkillPer = 0 # æŠ€èƒ½å¢žä¼¤
    aAddSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SkillPer, curSkill)
    # ç‰©æ³•增减伤
    if pmType == IPY_GameWorld.ghtMag: # æ³•伤
        aPMDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_MagDamPer)
@@ -1117,6 +1107,7 @@
    dNormalSkillPerDef /= 10000.0
    aAngerSkillPer /= 10000.0
    dAngerSkillPerDef /= 10000.0
    aAddSkillPer /= 10000.0
    aPMDamPer /= 10000.0
    dPMDamPerDef /= 10000.0
    aSuperDamPer /= 10000.0
@@ -1124,8 +1115,8 @@
    aFinalDamPer /= 10000.0
    dFinalDamPerDef /= 10000.0
    
    GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s"
                       % (atkID, defID, skillID, atkSkillPer, aAtk, dDef, dHP, hurtTypes))
    GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s,aAddSkillPer=%s"
                       % (atkID, defID, skillID, atkSkillPer, aAtk, dDef, dHP, hurtTypes, aAddSkillPer))
    
    # æŒç»­æ€§ä¼¤å®³
    if isDot: