ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -59,10 +59,11 @@
    if not skillID:
        return
    
    skillType = useSkill.GetSkillType()
    byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
    if not curBatObj.IsAlive():
        if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
            GameWorld.DebugLogEx("死亡时使用复活自己的技能! skillID=%s", skillID)
        if skillType == ChConfig.Def_SkillType_Revive:
            GameWorld.DebugLogEx("死亡时使用复活技能! skillID=%s", skillID)
        else:
            if byTriggerWay in ChConfig.DeadCanTriggerWayList:
                GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,byTriggerWay=%s", skillID, byTriggerWay)
@@ -103,10 +104,16 @@
            if not tagObjList and isRemove:
                return
            
    if tagObjList and skillType == ChConfig.Def_SkillType_Revive:
        for tagObj in tagObjList[::-1]:
            if tagObj.CheckInState(ChConfig.BatObjState_RebornLimit):
                GameWorld.DebugLogEx("    目标被禁止复活不处理! tagID=%s", tagObj.GetID())
                tagObjList.remove(tagObj)
    if not tagObjList:
        # 可扩展其他目标选择,如复活技能没有死亡单位时则使用另外的效果
        GameWorld.DebugLogEx("找不到技能目标! skillID=%s,mapID=%s,funcLineID=%s", skillID, turnFight.mapID, turnFight.funcLineID, turnFight.getReqPlayerID())
        if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive:
        if skillType == ChConfig.Def_SkillType_Revive and not isinstance(useSkill, IpyGameDataPY.IPY_Skill):
            otherEff = useSkill.GetEffectByID(ChConfig.SkillEff_ReviveNoUse)
            if otherEff:
                otherSkillID = otherEff.GetEffectValue(0)
@@ -126,12 +133,13 @@
    
    # 子技能怒气溢出值也有效,所以子技能不处理
    curXP = curBatObj.GetXP()
    if batType == ChConfig.TurnBattleType_Enhance:
        pass
    elif SkillCommon.isAngerSkill(useSkill):
    if SkillCommon.isAngerSkill(useSkill):
        maxXP = IpyGameDataPY.GetFuncCfg("AngerXP", 2)
        angerOverflow = max(curXP - maxXP, 0)
        curBatObj.SetAngerOverflow(angerOverflow)
        GameWorld.DebugLogEx("怒气溢出值: curXP=%s/%s,angerOverflow=%s", curXP, maxXP, angerOverflow)
    elif batType == ChConfig.TurnBattleType_Enhance:
        pass
    else:
        curBatObj.SetAngerOverflow(0)        
    angerOverflow = curBatObj.GetAngerOverflow()
@@ -195,7 +203,7 @@
def CheckSkillUseCntLimit(batObj, useSkill):
    ## 检查技能使用次数是否受限
    # @return: 是否受限
    # @return: 是否受限,None-没有受限效果,False-不受限,True-受限了
    if not hasattr(useSkill, "GetEffectByID"):
        return
    effect = useSkill.GetEffectByID(ChConfig.SkillEff_SkillUseCntLimit)
@@ -217,7 +225,7 @@
            GameWorld.DebugLogEx("技能每大回合使用次数受限! skillID=%s,turnUseCnt=%s >= %s", skillID, turnUseCnt, turnUseCntLimit)
            return True
        
    return
    return False
def IsNeedSyncSkill(useSkill):
    ## 使用需要同步B427使用技能
@@ -403,6 +411,13 @@
                    tagBatObj = batObjMgr.getBatObj(tagObjID)
                    if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
                        continue
                    if tagAim == ChConfig.SkillTagAim_Male:
                        if tagBatObj.GetSex() != ChConfig.BatObjSex_Male:
                            continue
                    elif tagAim == ChConfig.SkillTagAim_Female:
                        if tagBatObj.GetSex() != ChConfig.BatObjSex_Female:
                            continue
                    aimObjList.append(tagBatObj)
                    
    # 目标细分
@@ -741,9 +756,13 @@
        return
    harmPer = harmEff.GetEffectValue(0) # 自残百分比
    noEnoughDo = harmEff.GetEffectValue(1) # 不足时扣除方式 0-不扣;1-自杀;2-扣剩1点
    calcType = harmEff.GetEffectValue(2) # 计算方式:0-按最大血量;1-按当前血量
    curHP = curBatObj.GetHP()
    maxHP = curBatObj.GetMaxHP()
    harmHP = int(maxHP * harmPer / 100.0)
    if calcType == 1:
        harmHP = int(curHP * harmPer / 100.0)
    else:
        harmHP = int(maxHP * harmPer / 100.0)
    lostHP = harmHP
    if curHP <= harmHP:
        if noEnoughDo == 0:
@@ -753,8 +772,8 @@
            
    updHP = max(curHP - lostHP, 0)
    curBatObj.SetHP(updHP, False)
    GameWorld.DebugLogEx("使用技能时自残: curHP=%s/%s,harmPer=%s,harmHP=%s,lostHP=%s,updHP=%s,noEnoughDo=%s",
                         curHP, maxHP, harmPer, harmHP, lostHP, updHP, noEnoughDo)
    GameWorld.DebugLogEx("使用技能时自残: curHP=%s/%s,harmPer=%s,harmHP=%s,lostHP=%s,updHP=%s,noEnoughDo=%s,calcType=%s",
                         curHP, maxHP, harmPer, harmHP, lostHP, updHP, noEnoughDo, calcType)
    
    curBatObj.SetHarmSelfHP(harmHP) # 无视实际扣血量,直接更新
    
@@ -813,7 +832,7 @@
        tagID = tagObj.GetID()
        if tagID == ChConfig.HeroID_Caoren:
            continue
        if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
        if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
            continue
        if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
            caorenProtectObj = tagObj
@@ -891,7 +910,7 @@
            continue
        if tagID == ChConfig.HeroID_Caoren:
            continue
        if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
        if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
            continue
        if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
            caorenProtectObj = tagObj
@@ -1117,7 +1136,7 @@
        else:
            diffType = 1
            tagXP = tagBatObj.GetXP()
            diffValue = GetEnhanceXP(tagBatObj, calcValue)
            diffValue = GetEnhanceXP(tagBatObj, calcValue, useSkill)
            updValue = tagXP + diffValue
            tagBatObj.SetXP(updValue, False)
            GameWorld.DebugLogEx("    加怒气: tagID=%s,diffValue=%s,tagXP=%s,updXP=%s", tagID, diffValue, tagXP, updValue)
@@ -1165,7 +1184,7 @@
    if IsNeedSyncSkill(useSkill):
        Sync_UseSkill(turnFight, curBatObj, useSkill)
        
    __doSkillUserAnger(turnFight, curBatObj, useSkill)
    __doSkillUserAnger(turnFight, curBatObj, useSkill, **kwargs)
    
    DoBeAttackResult(turnFight, curBatObj, useSkill)
    return
@@ -1329,34 +1348,43 @@
    # 统计击杀
    killObjList = [] # 击杀其他阵营目标列表
    dieObjList = [] # 死亡的单位列表,包含友方单位或自己
    nodeadObjList = [] # 不死的单位列表
    tagObjList = useSkill.GetTagObjList() # 主要目标列表
    tagObjListEx = useSkill.GetTagObjListEx() # 额外目标列表
    tagObjListAll = tagObjList + tagObjListEx
    for tagObj in tagObjListAll:
        tagID = tagObj.GetID()
        if tagObj.IsAlive() and tagObj.GetHP() <= 0:
            dieObjList.append(tagObj)
            if tagObj.GetFaction() != curObj.GetFaction():
                killObjList.append(tagObj)
            TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
            if tagObj.CanNoDead():
                tagObj.SetHP(1, True) # 触发不死,保留1点血量
                nodeadObjList.append(tagObj)
            else:
                dieObjList.append(tagObj)
                if tagObj.GetFaction() != curObj.GetFaction():
                    killObjList.append(tagObj)
                TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
    useSkill.SetKillObjList(killObjList)
    # 判断自己,因为反弹、平摊伤害的原因,有可能自己干死自己
    if curObj.IsAlive() and curObj.GetHP() <= 0:
        dieObjList.append(curObj)
        TurnAttack.SetObjKilled(turnFight, curObj)
    # 统计伤血,可能单个技能对同一目标造成多次伤害
    totalHurtValue = 0
    isSuckHP = False
    suckObjIDList = [] # 吸血的对象ID列表
    missObjIDList, immuneObjIDList = [], [] # 闪避、免疫对象ID列表
    stunObjIDList, superHitObjIDList, parryObjIDList = [], [], []
    beHurtObjIDList = [] # 受伤的对象ID列表
    reviveObjList = [] # 复活的对象列表
    bounceObjList = [] # 有反弹的对象列表
    caorenProtectList = [] # 有被曹仁防护的对象列表
    for hurtObj in useSkill.GetHurtObjListAll():
        hurtObjID = hurtObj.GetObjID()
        tagObj = batObjMgr.getBatObj(hurtObjID)
        if not tagObj:
            continue
        bounceHP = hurtObj.GetBounceHP()
        if bounceHP:
            if tagObj not in bounceObjList:
                bounceObjList.append(tagObj)
        if hurtObj.HaveHurtType(ChConfig.HurtAtkType_Hurt) and not hurtObj.HaveHurtType(ChConfig.HurtAtkType_Immune) \
            and (isTurnNormalSkill or isAngerSkill) and tagObj.IsAlive():
            __doSkillHurtAnger(tagObj, hurtObj.GetLostHP(), useSkill)
@@ -1393,9 +1421,24 @@
            if hurtObjID not in stunObjIDList:
                stunObjIDList.append(hurtObjID)
                
        if hurtObj.GetSuckHP() > 0:
            isSuckHP = True
        if hurtObj.HaveHurtType(ChConfig.HurtAtkType_CaorenProtect):
            if tagObj not in caorenProtectList:
                caorenProtectList.append(tagObj)
        if hurtObj.GetSuckHP() > 0 and not hurtObj.HaveHurtType(ChConfig.HurtAtkType_PoisonCureSuck):
            if hurtObjID not in suckObjIDList:
                suckObjIDList.append(hurtObjID)
    # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
    if curObj.IsAlive() and curObj.GetHP() <= 0:
        if curObj.CanNoDead():
            curObj.SetHP(1, True) # 触发不死,保留1点血量
            nodeadObjList.append(curObj)
        else:
            dieObjList.append(curObj)
            killer = bounceObjList[0] if bounceObjList else None
            TurnAttack.SetObjKilled(turnFight, curObj, killer)
    # 记录最后一次总伤害,有伤害目标才记录
    if totalHurtValue:
        curObj.SetLastHurtValue(totalHurtValue)
@@ -1405,7 +1448,7 @@
        DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuperHit, relatedSkillID)
    if stunObjIDList:
        DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_Stun, relatedSkillID)
    if isSuckHP:
    if suckObjIDList:
        DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuckHP, relatedSkillID)
        
    # 结算副本相关的攻击结果,仅主动发起玩家阵容武将触发
@@ -1451,11 +1494,15 @@
                    for dieObj in dieObjList:
                        # 敌方单位死亡时
                        if lineupObj.GetFaction() != dieObj.GetFaction():
                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill)
                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill, byKiller=curObj)
                        # 己方单位死亡时
                        else:
                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill)
                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill, byFriendObj=dieObj)
    # 触发不死
    for tagObj in nodeadObjList:
        TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_NoDead, curObj, connSkill=useSkill)
    # 复活时
    for tagObj in reviveObjList:
        # 同步最新的怒气及buff,血量已经在技能中通知了
@@ -1464,6 +1511,20 @@
        TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Revive, curObj, connSkill=useSkill)
        TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_InBattlefield, curObj, connSkill=useSkill)
        
    # 曹仁防护触发,暂写死
    for tagObj in caorenProtectList:
        tagBatLineup = tagObj.GetBatLineup()
        caorenObj = tagBatLineup.getHeroObj(ChConfig.HeroID_Caoren) # 获取被防护目标阵容的曹仁
        if not caorenObj or not caorenObj.IsAlive():
            continue
        caoRenSkill = caorenObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_CaorenProtect)
        if not caoRenSkill:
            continue
        passiveSkillID = caoRenSkill.GetEffect(0).GetEffectValue(0) # 防护成功后的触发技能ID,默认写在效果1的值
        GameWorld.DebugLogEx("曹仁防护后触发技能: caorenID=%s,protectID=%s,passiveSkillID=%s", caorenObj.GetID(), tagObj.GetID(), passiveSkillID)
        if passiveSkillID:
            OnUsePassiveSkill(turnFight, caorenObj, curObj, passiveSkillID, connSkill=useSkill)
    triggerOne = False
    batType = useSkill.GetBatType()
    isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
@@ -1475,6 +1536,10 @@
        if tagID in missObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeMiss, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill)
        # 免疫
        if tagID in immuneObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_ImmuneHurt, curObj, connSkill=useSkill)
            
        if tagID in effIgnoreObjIDList:
            continue
@@ -1494,6 +1559,7 @@
        if isExObj:
            continue
        
        isDotHurt = False
        # 直接攻击
        if isAttackDirect:
            if not triggerOne:
@@ -1504,7 +1570,9 @@
        elif not isAttackDirect:
            # 受到持续伤害
            if tagID in beHurtObjIDList:
                TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeDOTHurt, curObj, connSkill=useSkill)
                isDotHurt = True
                TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_DOTHurt, tagObj, connSkill=useSkill, connBuff=timeBuff)
                TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeDOTHurt, curObj, connSkill=useSkill, connBuff=timeBuff)
                
        # 使用技能后
        if isUseSkill:
@@ -1527,6 +1595,12 @@
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeParry, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill)
            
        # 吸血
        if tagID in suckObjIDList:
            if not triggerOne:
                TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuckHP, curObj, connSkill=useSkill)
        # 连击
        if batType == ChConfig.TurnBattleType_Combo:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill)
@@ -1542,7 +1616,7 @@
            
            
        # 敌友方
        if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue]:
        if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt:
            if not curBatLineup:
                curBatLineup = curObj.GetBatLineup()
            for lineupObjID in curBatLineup.posObjIDDict.values():
@@ -1556,7 +1630,11 @@
                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOne, tagObj, connSkill=useSkill, byFriendObj=curObj)
                        if curID != lineupObj.GetID():
                            TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOneNoSelf, tagObj, connSkill=useSkill, byFriendObj=curObj)
                # 持续伤害
                elif isDotHurt:
                    if not triggerOne:
                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
                # 连击
                if batType == ChConfig.TurnBattleType_Combo:
                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
@@ -1637,10 +1715,14 @@
        
    return
def __doSkillUserAnger(turnFight, curBatObj, useSkill):
def __doSkillUserAnger(turnFight, curBatObj, useSkill, **kwargs):
    ## 技能释放者怒气相关
    if SkillCommon.isAngerSkill(useSkill):
        curBatObj.SetXP(0)
        if "noUseXP" in kwargs:
            kwargs.pop("noUseXP")
            GameWorld.DebugLogEx("本次不消耗怒气")
        else:
            curBatObj.SetXP(0)
    elif SkillCommon.isTurnNormalSkill(useSkill) and useSkill.GetBatType() == ChConfig.TurnBattleType_Normal:
        addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 3)
        AddFightXP(curBatObj, addXP, "skillID:%s" % useSkill.GetSkillID())
@@ -1690,11 +1772,14 @@
    Sync_PropertyRefreshView(turnFight, gameObj, ChConfig.AttrID_XP, updXP, addXP, diffType=1, relatedSkillID=relatedSkillID)
    return
def GetEnhanceXP(gameObj, addXP):
def GetEnhanceXP(gameObj, addXP, useSkill=None):
    ## 获取提升后的xp值
    addPer = gameObj.GetBatAttrValue(ChConfig.AttrID_XPRecoverPer)
    # 其他强化、弱化
    if addPer == 0:
        return addXP
    if useSkill and useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PotentialSkill and useSkill.GetSkillValue() == 50:
        GameWorld.DebugLogEx("潜能初始50点暂时写死不受限: objID=%s,addXP=%s,skillID=%s", gameObj.GetID(), addXP, useSkill.GetSkillID())
        return addXP
    objID = gameObj.GetID()
    updAddXP = int(addXP * max(10000 + addPer, 0) / 10000.0)
@@ -1765,8 +1850,11 @@
        for tagObj in tagObjList:
            tagID = tagObj.GetID()
            if not tagObj.IsAlive():
                GameWorld.DebugLogEx("    已被击杀不触发: tagID=%s", tagID)
                continue
                if enhanceSkillData.GetCurBuffState() == ChConfig.BatObjState_RebornLimit:
                    GameWorld.DebugLogEx("    禁止复活buff允许对死亡对象释放: tagID=%s", tagID)
                else:
                    GameWorld.DebugLogEx("    已被击杀不触发: tagID=%s", tagID)
                    continue
            if tagID in effIgnoreObjIDList:
                GameWorld.DebugLogEx("    闪避或免疫的不触发: tagID=%s", tagID)
                continue
@@ -1817,7 +1905,7 @@
    OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
    return
def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, **kwargs):
def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, batType=ChConfig.TurnBattleType_Passive, **kwargs):
    '''被动触发使用技能
    @param passiveSkill: 释放的被动技能 或 技能ID
    @param connSkill: 由什么技能引起的
@@ -1867,12 +1955,12 @@
            GameWorld.DebugLogEx("    概率不触发: tagID=%s,happenRate=%s", tagID, happenRate)
            return
        passiveTagObjList = [tagObj]
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
    elif tagAim == ChConfig.SkillTagAim_MainSkillEx:
        if not connSkill:
            return
        passiveTagObjList = connSkill.GetTagObjList()
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
    elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
        if "byFriendObj" not in kwargs:
            return
@@ -1880,10 +1968,10 @@
        passiveTagObjList = [byFriendObj]
        GameWorld.DebugLogEx("被动触发技能,针对来源友军! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s,byFriendID=%s", 
                             effSkillID, effectID, passiveSkillID, bySkillID, byFriendObj.GetID())
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
    else:
        GameWorld.DebugLogEx("被动触发技能,重新锁定目标! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
        
    return isOK
@@ -1997,9 +2085,14 @@
        aDOTPer = atkObj.GetBatAttrValue(ChConfig.AttrID_DOTPer)
        dDOTPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_DOTPerDef)
        GameWorld.DebugLogEx("aDOTPer=%s,dDOTPerDef=%s", aDOTPer, dDOTPerDef)
        if curSkill.GetCurBuffState() in ChConfig.BurnStateList:
            aDOTPer += atkObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPer)
            dDOTPerDef += defObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPerDef)
            GameWorld.DebugLogEx("是灼烧: aDOTPer=%s,dDOTPerDef=%s", aDOTPer, dDOTPerDef)
    #aAddSkillPer = 0 # 技能增伤
    aBatDamPer, dBatDamPerDef = 0, 0 # 战斗增减伤
    dBatDamPerDef = 0 # 战斗增减伤
    aBatDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_BatDamPer)
    aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
    aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddBatDamPerByTagLostHP, curSkill)
    aBatDamPer += addBatDamPer
@@ -2191,7 +2284,7 @@
        return hurtValue, hurtTypes, immuneHurt
    
    hurtValue = int(hurtValue)
    if defObj.CheckInState(ChConfig.BatObjState_Wudi):
    if defObj.CheckInState(ChConfig.ImmuneHurtStateList):
        hurtTypes |= pow(2, ChConfig.HurtAtkType_Immune) # 添加免疫
        immuneHurt = hurtValue
        hurtValue = 0
@@ -2221,7 +2314,7 @@
        defObj, hurtValue, hurtTypes, immuneHurt = hurtInfo[:4]
        isEx = hurtInfo[4] if len(hurtInfo) > 4 else 0 # 是否是额外目标
        
        lostHP, ignoreShield = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
        lostHP, ignoreShield, hurtValue = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
        if ignoreShield:
            hurtTypes |= pow(2, ChConfig.HurtAtkType_IgnoreShield)
            
@@ -2362,7 +2455,7 @@
    # 曹仁的分担触发条件暂时程序内固定,有修改时程序同步修改
    # 曹仁: 我方英雄受到直接攻击时(受到群攻时选择血量最低的友方进行防护),曹仁有30%概率为其分担一半所受伤害,每成功分担一次,曹仁获得1层坚韧,使我方全体减伤提升5%,最多6层,曹仁死亡效果消失
    # 董白怒气    同命锁    对敌方攻击最高的1个目标造成攻击力450%物理伤害,并与其连接,使两人受到的任意伤害平摊(平摊伤害不会被再次平摊),持续2回合
    caorenSkillID = 1015070
    caorenSkillID = ChConfig.SkillID_CaorenProtect
    effHeroIDList = [ChConfig.HeroID_Zhenfu, ChConfig.HeroID_Caoren, ChConfig.HeroID_Dongbai] # 暂固定,有增加武将再同步修改
    
    isAve = False
@@ -2475,7 +2568,7 @@
            
            immuneHurt = immuneHurtDict.get(aveObjID)
            if immuneHurt == None:
                if aveObj.CheckInState(ChConfig.BatObjState_Wudi):
                if aveObj.CheckInState(ChConfig.ImmuneHurtStateList):
                    immuneHurt = 0
                else:
                    immuneHurt = -1 # 标记没有无敌
@@ -2511,7 +2604,7 @@
    @param hpCanNegative: 扣除后的生命是否允许负值
    @param immuneHurt: 免疫的伤害值
    @param isSkillSelfTag: 是否技能自身的直接目标,如平摊伤害目标、溅射伤害目标这种就不算直接目标
    @return: lostHP, ignoreShield
    @return: lostHP, ignoreShield, hurtValue
    '''
    
    ignoreShield = None
@@ -2529,8 +2622,14 @@
                                 defObj.GetID(), buff.GetBuffID(), buffSkillID, buffValue, immuneHurt, updBuffValue, lostType)
            
    if hurtValue <= 0:
        return 0, ignoreShield
        return 0, ignoreShield, hurtValue
    
    # 伤血上限保护
    lostHPProtect = TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_LostHPProtect, curSkill)
    if lostHPProtect > 0 and hurtValue > lostHPProtect:
        GameWorld.DebugLogEx("    扣血时最大伤血保护: defID=%s,hurtValue=%s,lostHPProtect=%s", defObj.GetID(), hurtValue, lostHPProtect)
        hurtValue = lostHPProtect
    atkID = atkObj.GetID()
    defID = defObj.GetID()
    skillID = curSkill.GetSkillID()
@@ -2596,7 +2695,7 @@
    GameWorld.DebugLogEx("    扣血: atkID=%s,defID=%s,hurtValue=%s,lostType=%s,lostHP=%s,dHP=%s,updHP=%s/%s", 
                         atkID, defID, hurtValue, lostType, lostHP, dHP, defObj.GetHP(), defObj.GetMaxHP())
    TurnAttack.AddTurnObjHurtValue(atkObj, defObj, hurtValue, lostHP, skillID, lostType)
    return lostHP, ignoreShield
    return lostHP, ignoreShield, hurtValue
def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
    '''计算反弹反弹伤害
@@ -2618,12 +2717,12 @@
        return
    
    GameWorld.DebugLogEx("    反弹伤害=%s,%s/%s, damBackPer=%s", bounceHP, atkObj.GetHP(), atkObj.GetMaxHP(), damBackPer)
    bounceHP, _, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, bounceHP)
    bounceHP, _, immuneHurt = CalcHurtWithBuff(turnFight, defObj, atkObj, bounceHP)
    if bounceHP <= 0:
        GameWorld.DebugLogEx("        bounceHP=%s", bounceHP)
        return
    hurtObj.SetBounceHP(bounceHP)
    DoLostHP(turnFight, atkObj, defObj, bounceHP, curSkill, "Bounce", hpCanNegative=True, immuneHurt=immuneHurt) # 反弹后生命允许负值
    DoLostHP(turnFight, defObj, atkObj, bounceHP, curSkill, "Bounce", hpCanNegative=True, immuneHurt=immuneHurt) # 反弹后生命允许负值
    return
def CalcSuckBlood(turnFight, atkObj, defObj, hurtObj, curSkill):
@@ -2721,6 +2820,9 @@
        cureHP += cureHPEx
        GameWorld.DebugLogEx("    额外治疗值(%s): cureType=%s,baseValue=%s,skillPer=%s,cureHP=%s", cureHPEx, cureType, baseValue, skillPer, cureHP)
        
    addCureMulti = TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddCureMultiBySkillType, curSkill)
    if addCureMulti:
        multiValue += addCureMulti / 100.0
    if multiValue and multiValue != 1:
        cureHP = int(cureHP * multiValue)
        GameWorld.DebugLogEx("    治疗倍值: cureHP=%s,multiValue=%s", cureHP, multiValue)