ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -398,13 +398,14 @@
                    colNumList.insert(0, specInColNum)
                    
            GameWorld.DebugLogEx("纵排: colNumList=%s,specObjID-PosNum=%s-%s", colNumList, specObjID, specObjPosNum)
            posObjIDDict = batLineup.getPosObjIDDict()
            for col in colNumList:
                for row in range(1, 1 + ChConfig.TurnFightRows):
                    pNum = (row - 1) * ChConfig.TurnFightCols + col
                    #GameWorld.DebugLogEx("    col=%s,row=%s,pNum=%s", col, row, pNum)
                    if pNum not in batLineup.posObjIDDict:
                    if pNum not in posObjIDDict:
                        continue
                    tagObjID = batLineup.posObjIDDict[pNum]
                    tagObjID = posObjIDDict[pNum]
                    tagBatObj = batObjMgr.getBatObj(tagObjID)
                    if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
                        continue
@@ -423,13 +424,14 @@
                
            GameWorld.DebugLogEx("全部: colNumList=%s,specObjID-PosNum=%s-%s", colNumList, specObjID, specObjPosNum)
            # 按前排优先原则
            posObjIDDict = batLineup.getPosObjIDDict()
            for row in range(1, 1 + ChConfig.TurnFightRows):
                for col in colNumList:
                    pNum = (row - 1) * ChConfig.TurnFightCols + col
                    #GameWorld.DebugLogEx("    col=%s,row=%s,pNum=%s", col, row, pNum)
                    if pNum not in batLineup.posObjIDDict:
                    if pNum not in posObjIDDict:
                        continue
                    tagObjID = batLineup.posObjIDDict[pNum]
                    tagObjID = posObjIDDict[pNum]
                    tagBatObj = batObjMgr.getBatObj(tagObjID)
                    if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
                        continue
@@ -561,7 +563,7 @@
    batObjMgr = BattleObj.GetBatObjMgr()
    for num in lineupNumList:
        batLineup = batFaction.getBatlineup(num)
        for tagID in batLineup.posObjIDDict.values():
        for tagID in batLineup.getBatHeroObjIDList():
            tagObj = batObjMgr.getBatObj(tagID)
            if tagObj.IsAlive() and tagObj.CheckInState(checkInStates):
                return lineupNum, changeTagSet
@@ -597,13 +599,14 @@
        
    GameWorld.DebugLogEx("前后排: rowNumList=%s,colNumList=%s,specObjID-PosNum=%s-%s", rowNumList, colNumList, specObjID, specObjPosNum)
    aimObjList = []
    posObjIDDict = batLineup.getPosObjIDDict()
    for row in rowNumList:
        for col in colNumList:
            pNum = (row - 1) * ChConfig.TurnFightCols + col
            #GameWorld.DebugLogEx("    row=%s,col=%s,pNum=%s", row, col, pNum)
            if pNum not in batLineup.posObjIDDict:
            if pNum not in posObjIDDict:
                continue
            tagObjID = batLineup.posObjIDDict[pNum]
            tagObjID = posObjIDDict[pNum]
            tagBatObj = batObjMgr.getBatObj(tagObjID)
            if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
                continue
@@ -630,11 +633,12 @@
    batObjMgr = BattleObj.GetBatObjMgr()
    batLineup = tagObj.GetTFBatLineup()
    aimObjList = []
    posObjIDDict = batLineup.getPosObjIDDict()
    for col in colNumList:
        pNum = (row - 1) * ChConfig.TurnFightCols + col
        if pNum not in batLineup.posObjIDDict:
        if pNum not in posObjIDDict:
            continue
        tagObjID = batLineup.posObjIDDict[pNum]
        tagObjID = posObjIDDict[pNum]
        tagBatObj = batObjMgr.getBatObj(tagObjID)
        if not tagBatObj.IsAlive():
            continue
@@ -659,11 +663,12 @@
    batObjMgr = BattleObj.GetBatObjMgr()
    batLineup = tagObj.GetTFBatLineup()
    aimObjList = []
    posObjIDDict = batLineup.getPosObjIDDict()
    for row in range(1, 1 + ChConfig.TurnFightRows):
        pNum = (row - 1) * ChConfig.TurnFightCols + col
        if pNum not in batLineup.posObjIDDict:
        if pNum not in posObjIDDict:
            continue
        tagObjID = batLineup.posObjIDDict[pNum]
        tagObjID = posObjIDDict[pNum]
        tagBatObj = batObjMgr.getBatObj(tagObjID)
        if not tagBatObj.IsAlive():
            continue
@@ -715,12 +720,13 @@
        colNumList.insert(0, inColNum)
        
    # 按前排优先原则
    posObjIDDict = batLineup.getPosObjIDDict()
    for row in range(ChConfig.TurnFightRows):
        for col in colNumList:
            pNum = row * ChConfig.TurnFightCols + col
            if pNum not in batLineup.posObjIDDict:
            if pNum not in posObjIDDict:
                continue
            tagObjID = batLineup.posObjIDDict[pNum]
            tagObjID = posObjIDDict[pNum]
            tagBatObj = batObjMgr.getBatObj(tagObjID)
            if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf=True):
                continue
@@ -1415,6 +1421,8 @@
    # 优先处理afterLogic,可再预先汇总一些会触发被动的信息
    relatedSkillID = useSkill.GetSkillID()
    delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
    beControlledHardDict = {} # 受控目标 {objID:buff, ...}
    beDotBuffDict = {} # 被添加dot的目标 {objID:buff, ...}
    afterLogicList = useSkill.GetAfterLogicList()
    for logicType, logicData in afterLogicList:
        if logicType == ChConfig.AfterLogic_DelBuff:
@@ -1433,6 +1441,15 @@
            buff = logicData[1]
            TurnBuff.SyncBuffRefresh(turnFight, buffObj, buff, relatedSkillID)
            
        # 统计添加buff需要触发的被动
        elif logicType == ChConfig.AfterLogic_TriggerAddBuff:
            triggerType, batObj, buff, buffOwner = logicData
            if buffOwner.GetID() == curID:
                if triggerType == ChConfig.TriggerWay_BeControlledHard:
                    beControlledHardDict[batObj.GetID()] = buff
                elif triggerType == ChConfig.TriggerWay_AddDOTBuff:
                    beDotBuffDict[batObj.GetID()] = buff
    # 统计击杀
    killObjList = [] # 击杀其他阵营目标列表
    dieObjList = [] # 死亡的单位列表,包含友方单位或自己
@@ -1575,7 +1592,7 @@
            batFaction = turnFight.getBatFaction(faction)
            for lineupNum in batFaction.lineupDict.keys():
                batLineup = batFaction.getBatlineup(lineupNum)
                for lineupObjID in batLineup.posObjIDDict.values():
                for lineupObjID in batLineup.getBatHeroObjIDList():
                    lineupObj = batObjMgr.getBatObj(lineupObjID)
                    if not lineupObj.IsAlive():
                        continue
@@ -1618,6 +1635,7 @@
    isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
    curBatLineup = curObj.GetTFBatLineup()
    curMGObj = curBatLineup.getMinggeObj()
    mgTriggerWayList = [] # 命格本次技能已触发方式列表,命格固定只触发一次
    for tagObj in tagObjListAll:
        tagID = tagObj.GetID()
        
@@ -1674,6 +1692,21 @@
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeStun, curObj, connSkill=useSkill)
            
        # 控制
        if tagID in beControlledHardDict:
            buff = beControlledHardDict[tagID]
            if buff.GetCurBuffState() == ChConfig.BatObjState_Frozen:
                if curMGObj and ChConfig.TriggerWay_Frozen not in mgTriggerWayList:
                    mgTriggerWayList.append(ChConfig.TriggerWay_Frozen)
                    TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Frozen, tagObj, connSkill=useSkill, byBatObj=curObj)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeControlledHard, curObj, connSkill=useSkill, connBuff=buff)
        # 附加dot
        if tagID in beDotBuffDict:
            if curMGObj and ChConfig.TriggerWay_AddDOTBuff not in mgTriggerWayList:
                mgTriggerWayList.append(ChConfig.TriggerWay_AddDOTBuff)
                TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_AddDOTBuff, tagObj, connSkill=useSkill, byBatObj=curObj)
        # 暴击
        if tagID in superHitObjIDList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill)
@@ -1698,7 +1731,8 @@
        elif batType == ChConfig.TurnBattleType_Pursue:
            TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Pursue, tagObj, connSkill=useSkill)
            if isAttackDirect:
                if curMGObj:
                if curMGObj and ChConfig.TriggerWay_PursueAtk not in mgTriggerWayList:
                    mgTriggerWayList.append(ChConfig.TriggerWay_PursueAtk)
                    TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_PursueAtk, tagObj, connSkill=useSkill, byBatObj=curObj)
            TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
        # 反击
@@ -1708,8 +1742,8 @@
            
            
        # 敌友方
        if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt:
            for lineupObjID in curBatLineup.posObjIDDict.values():
        if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt or tagID in beControlledHardDict:
            for lineupObjID in curBatLineup.getBatHeroObjIDList():
                lineupObj = batObjMgr.getBatObj(lineupObjID)
                if not lineupObj.IsAlive():
                    continue
@@ -1725,6 +1759,10 @@
                    if not triggerOne:
                        TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
                        
                # 敌方被控时
                if tagID in beControlledHardDict and lineupObj.GetFaction() != tagObj.GetFaction():
                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyBeControlledHard, tagObj, connSkill=useSkill)
                # 连击
                if batType == ChConfig.TurnBattleType_Combo:
                    TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
@@ -1749,9 +1787,7 @@
    if not batFaction:
        return
    batLineup = batFaction.getBatlineup(1)
    if ChConfig.HeroID_Dongbai not in batLineup.heroObjIDDict:
        return
    dongbaiObj = BattleObj.GetBatObjMgr().getBatObj(batLineup.heroObjIDDict[ChConfig.HeroID_Dongbai])
    dongbaiObj = batLineup.getHeroObj(ChConfig.HeroID_Dongbai)
    if not dongbaiObj or dongbaiObj.IsAlive():
        return
    skill = dongbaiObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_DongbaiRevive)
@@ -2007,7 +2043,7 @@
    @param effectID: 被动效果ID
    注:可能由A引起触发B技能的效果释放技能C
    '''
    if not passiveSkill:
    if not passiveSkill or not batObj:
        return
    if isinstance(passiveSkill, int):
        passiveSkillID = passiveSkill
@@ -2618,12 +2654,10 @@
                         faction, lineupNum, hurtValueDict, immuneHurtDict)
    # 按优先级顺序处理拥有分摊效果的武将
    for effHeroID in effHeroIDList:
        if effHeroID not in batLineup.heroObjIDDict:
            continue
        objID = batLineup.heroObjIDDict[effHeroID]
        batObj = batObjMgr.getBatObj(objID)
        batObj = batLineup.getHeroObj(effHeroID)
        if not batObj or not batObj.IsAlive():
            continue
        objID = batObj.GetID()
        buffMgr = batObj.GetBuffManager()
        
        inHurt = objID in hurtValueDict # 光环里的人员是否有受伤
@@ -3081,6 +3115,43 @@
    useSkill.ResetUseRec()
    return
def DoHurtExAtk(turnFight, atkObj, defObj, hurtValue, skillID, hurtTypes=0):
    ## 额外结算指定伤害
    skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
    if not skillIpyData:
        return
    atkID = atkObj.GetID()
    defID = defObj.GetID()
    # 结算需要同步标签
    useTag = "Skill_%s_%s_Dot_%s" % (atkID, skillID, atkObj.GetIncrementValue()) # 复用dot的标签
    Sync_TurnFightTag(turnFight, useTag, 0)
    dHP = defObj.GetHP()
    dMaxHP = defObj.GetMaxHP()
    GameWorld.DebugLogEx("额外结算指定伤害: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,,dHP=%s/%s",
                         atkID, defID, skillID, hurtValue, dHP, dMaxHP)
    useSkill = BattleObj.PySkill(skillIpyData, atkID)
    useSkill.SetTagObjList([defObj])
    useSkill.SetBatType(ChConfig.TurnBattleType_Dot) # 要修改表现的话等前端同步修改
    hurtTypes |= pow(2, ChConfig.HurtAtkType_Hurt) # 确保有基础的伤害类型
    hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
    calcHurtResults = [[defObj, hurtValue, hurtTypes, immuneHurt]]
    DoSkillHurtHP(turnFight, atkObj, useSkill, calcHurtResults, "HurtExAtk")
    Sync_UseSkill(turnFight, atkObj, useSkill)
    DoBeAttackResult(turnFight, atkObj, useSkill)
    # 通知结束标签
    Sync_TurnFightTag(turnFight, useTag, 1)
    useSkill.ResetUseRec()
    return True
def Sync_TurnFightTag(turnFight, useTag, sign):
    ## 通知技能标签
    clientPack = ChPyNetSendPack.tagSCTurnFightTag()