hxp
2025-12-31 46dbf29a22bd25d8e9c6ea4c34fea35a4828d712
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -185,7 +185,7 @@
    if SkillCommon.IsBuff(useSkill):
        __doAddBuff(turnFight, curBatObj, useSkill, **kwargs)
    else:
        __doUseSkill(turnFight, curBatObj, useSkill)
        __doUseSkill(turnFight, curBatObj, useSkill, **kwargs)
        
    DoAttackResult(turnFight, curBatObj, useSkill, **kwargs)
    
@@ -426,6 +426,11 @@
        aimObjList.sort(key=lambda o:(o.GetHP()), reverse=False)
        #GameWorld.DebugLogEx("血量最低排序: %s", [[o.GetID(), o.GetHP(), o.GetMaxHP()] for o in aimObjList])
        
    # 血量百分比最低
    elif tagAffect == ChConfig.SkillTagAffect_HPPerLowest:
        aimObjList.sort(key=lambda o:(o.GetHP() / float(o.GetMaxHP())), reverse=False)
        #GameWorld.DebugLogEx("血量百分比最低排序: %s", [[o.GetID(), o.GetHP(), o.GetMaxHP(), o.GetHP() / float(o.GetMaxHP())] for o in aimObjList])
    # 血量最高
    elif tagAffect == ChConfig.SkillTagAffect_HPHighest:
        aimObjList.sort(key=lambda o:(o.GetHP()), reverse=True)
@@ -586,6 +591,64 @@
        
    return aimObjList
def __getSameRowObjList(tagObj):
    ## 获取目标对应的同排对象列表,只算活着的
    posNum = tagObj.GetPosNum()
    inRowNum = ChConfig.GetInRowNum(posNum)
    inColNum = ChConfig.GetInColNum(posNum)
    # 优先目标所在纵,为主目标
    colNumList = range(1, 1 + ChConfig.TurnFightCols)
    if inColNum in colNumList:
        colNumList.remove(inColNum)
        colNumList.insert(0, inColNum)
    row = inRowNum # 目标玩家所在横排
    batObjMgr = BattleObj.GetBatObjMgr()
    batLineup = tagObj.GetBatLineup()
    aimObjList = []
    for col in colNumList:
        pNum = (row - 1) * ChConfig.TurnFightCols + col
        if pNum not in batLineup.posObjIDDict:
            continue
        tagObjID = batLineup.posObjIDDict[pNum]
        tagBatObj = batObjMgr.getBatObj(tagObjID)
        if not tagBatObj.IsAlive():
            continue
        aimObjList.append(tagBatObj)
    return aimObjList
def __getSameColObjList(tagObj):
    ## 获取目标对应的同列对象列表,只算活着的
    posNum = tagObj.GetPosNum()
    inRowNum = ChConfig.GetInRowNum(posNum)
    inColNum = ChConfig.GetInColNum(posNum)
    rowNumList = range(1, 1 + ChConfig.TurnFightRows)
    if inRowNum in rowNumList:
        rowNumList.remove(inRowNum)
        rowNumList.insert(0, inRowNum)
    col = inColNum # 目标玩家所在纵排
    batObjMgr = BattleObj.GetBatObjMgr()
    batLineup = tagObj.GetBatLineup()
    aimObjList = []
    for row in range(1, 1 + ChConfig.TurnFightRows):
        pNum = (row - 1) * ChConfig.TurnFightCols + col
        if pNum not in batLineup.posObjIDDict:
            continue
        tagObjID = batLineup.posObjIDDict[pNum]
        tagBatObj = batObjMgr.getBatObj(tagObjID)
        if not tagBatObj.IsAlive():
            continue
        aimObjList.append(tagBatObj)
    return aimObjList
def GetRelativeObj(turnFight, curBatObj):
    '''获取对位目标,仅用于非技能目标的对位逻辑,如连击、弱疗等相对属性的判断,技能目标统一使用 GetSkillTags
    '''
@@ -679,7 +742,7 @@
        
    return
def __doUseSkill(turnFight, curBatObj, useSkill):
def __doUseSkill(turnFight, curBatObj, useSkill, **kwargs):
    
    atkType = useSkill.GetAtkType()
    GameWorld.DebugLogEx("__doUseSkill: curID=%s,skillID=%s,atkType=%s", curBatObj.GetID(), useSkill.GetSkillID(), atkType)
@@ -689,7 +752,7 @@
    
    # 通用攻击
    if atkType == 1:
        SkillModule_1(turnFight, curBatObj, useSkill)
        SkillModule_1(turnFight, curBatObj, useSkill, **kwargs)
    # 治疗
    if atkType == 2:
        SkillModule_2(turnFight, curBatObj, useSkill)
@@ -784,7 +847,7 @@
    Sync_PropertyRefreshView(turnFight, curBatObj, ChConfig.AttrID_HP, updHP, diffValue, diffType, skillID, relatedSkillID, hurtTypes)
    return
def SkillModule_1(turnFight, curBatObj, useSkill):
def SkillModule_1(turnFight, curBatObj, useSkill, **kwargs):
    ## 通用攻击,单攻、群攻
    
    addPer = 0
@@ -800,7 +863,10 @@
            addPer = addPerMax
        GameWorld.DebugLogEx("司马懿特殊潜能技能额外增加比例: frozenCnt=%s,addPer=%s" % (frozenCnt, addPer))
        
    addBatDamPer = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddBatDamPerByLayer, useSkill)
    addBatDamPer = 0
    if "addBatDamPer" in kwargs:
        addBatDamPer += kwargs.pop("addBatDamPer", 0)
    addBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddBatDamPerByLayer, useSkill)
    
    # 计算伤害
    calcHurtResults = []
@@ -1839,6 +1905,10 @@
            GameWorld.DebugLogEx("有击杀目标时该技能无效! enhanceSkillID=%s", enhanceSkillID)
            return
        
    if checkHeroSex:
        if TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_IgnoreSex, connSkillTypeID=enhanceSkillData.GetSkillTypeID(), connSkillID=enhanceSkillID):
            checkHeroSex = 0
    # 继承主技能目标
    if enhanceSkillData.GetTagAim() == ChConfig.SkillTagAim_MainSkill:
        GameWorld.DebugLogEx("继承主技能目标! enhanceSkillID=%s", enhanceSkillID)
@@ -1968,6 +2038,20 @@
        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=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
    # 继承主技能目标同横排 11
    elif tagAim == ChConfig.SkillTagAim_MainSkillRow:
        if not tagObj:
            return
        GameWorld.DebugLogEx("被动触发技能,针对目标同排对象! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
        passiveTagObjList = __getSameRowObjList(tagObj)
        isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
    # 继承主技能目标同纵排 12
    elif tagAim == ChConfig.SkillTagAim_MainSkillCol:
        if not tagObj:
            return
        GameWorld.DebugLogEx("被动触发技能,针对目标同纵对象! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
        passiveTagObjList = __getSameColObjList(tagObj)
        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)
@@ -2201,14 +2285,25 @@
        GameWorld.DebugLogEx("    伤害最高限制: hurtValue=%s,hurtAtkPerMax=%s,aAtk=%s", hurtValue, hurtAtkPerMax, aAtk)
        
    # 均摊
    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
    if hurtShareEff:
    if HaveShareEff(atkObj, curSkill):
        tagCnt = max(1, len(curSkill.GetTagObjList()))
        hurtValue = hurtValue / tagCnt
        GameWorld.DebugLogEx("    目标均摊伤害: hurtValue=%s,tagCnt=%s", hurtValue, tagCnt)
        
    hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
    return hurtValue, hurtTypes
def HaveShareEff(atkObj, curSkill):
    ## 玩家技能是否有分摊效果: 均摊伤害/治疗/承伤盾值
    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
    if not hurtShareEff:
        return False
    needLearnSkillID = hurtShareEff.GetEffectValue(0)
    if needLearnSkillID:
        if not atkObj.GetSkillManager().FindSkillByID(needLearnSkillID):
            GameWorld.DebugLogEx("所需技能未学习,分摊效果不生效! skillID=%s,needLearnSkillID=%s", curSkill.GetSkillID(), needLearnSkillID)
            return False
    return True
def GetAddSkillPer(turnFight, atkObj, defObj, curSkill):
    ## 获取额外增加的技能万分比
@@ -2827,8 +2922,7 @@
        cureHP = int(cureHP * multiValue)
        GameWorld.DebugLogEx("    治疗倍值: cureHP=%s,multiValue=%s", cureHP, multiValue)
        
    hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
    if hurtShareEff:
    if HaveShareEff(userObj, curSkill):
        tagCnt = max(1, len(curSkill.GetTagObjList()))
        cureHP = cureHP / tagCnt
        GameWorld.DebugLogEx("    目标均摊治疗: cureHP=%s,tagCnt=%s", cureHP, tagCnt)