129 【战斗】战斗系统-服务端(董白全部技能; 增加效果5024 5504;buff持续规则字段支持配置每大回合-1层;动态属性ID变化增加计算方式11-根据自己已损失血量百分比;)
2个文件已添加
7个文件已修改
207 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5024.py 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5504.py 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -579,16 +579,25 @@
            if buff.GetOwnerID() == ownerID:
                return buff
        return
    def FindBuffByState(self, state):
    def FindBuffByState(self, state, ownerID=0):
        ## 查找某种buff状态的buff
        # @param ownerID: 可指定获取归属于某个对象ID的buff
        if state not in self._buffStateDict:
            return
        buffIDList = self._buffStateDict[state]
        if not buffIDList:
            return
        buffID = buffIDList[0]
        if buffID in self._buffIDDict:
            return self._buffIDDict[buffID]
        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列表
        if state not in self._buffStateDict:
@@ -646,6 +655,7 @@
        self._hurtListEx = [] # 额外伤血列表,如平摊、溅射 [HurtObj, ...]
        self._bySkill = None # 由哪个技能触发的
        self._byBuff = None # 由哪个buff触发的
        self._byTriggerWay = 0 # 由哪个被动方式触发的
        self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
        self._energy = 0 # 技能能量,一般用于累计能量达到某种条件后做逻辑
        
@@ -671,6 +681,7 @@
        self._effIgnoreObjIDList = []
        self._bySkill = None
        self._byBuff = None
        self._byTriggerWay = 0
        self._afterLogicList = []
        self.ClearHurtObj()
        return
@@ -722,6 +733,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 # 技能额外目标列表
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -1816,20 +1816,36 @@
        buffID = buff.GetBuffID()
        skillID = buff.GetSkillID()
        skillData = buff.GetSkillData()
        if skillData.GetLastTimeType() != ChConfig.BuffLastTimeType_BigTurn:
        lastType = skillData.GetLastTimeType()
        if lastType not in [ChConfig.BuffLastTimeType_BigTurn, ChConfig.BuffLastTimeType_BigTurnLayer]:
            continue
        if skillData.GetSkillType() in ChConfig.Def_LstBuff_List:
            #GameWorld.DebugLogEx("    持续类buff由触发时机决定剩余时间! curID=%s,index=%s,skillID=%s,buffID=%s", curID, index, skillID, buffID)
            continue
        if skillData.GetSkillType() == ChConfig.Def_SkillType_Halo and buff.GetOwnerID() != curID:
            GameWorld.DebugLogEx("    光环buff非光源不处理! curID=%s,index=%s,skillID=%s,buffID=%s", curID, index, skillID, buffID)
            continue
        remainTime = buff.GetRemainTime()
        if remainTime <= 0:
            continue
        remainTime -= 1
        GameWorld.DebugLogEx("    更新buff回合: curID=%s,buffID=%s,skillID=%s,remainTime=%s", curID, buffID, skillID, remainTime)
        TurnBuff.SetBuffRemainTime(turnFight, batObj, buff, remainTime)
        # 每大回合固定减1回合
        if lastType == ChConfig.BuffLastTimeType_BigTurn:
            remainTime = buff.GetRemainTime()
            if remainTime <= 0:
                continue
            remainTime -= 1
            GameWorld.DebugLogEx("    更新buff回合: curID=%s,buffID=%s,skillID=%s,remainTime=%s", curID, buffID, skillID, remainTime)
            TurnBuff.SetBuffRemainTime(turnFight, batObj, buff, remainTime)
        # 每大回合固定减1层
        elif skillData.GetLastTimeType() == ChConfig.BuffLastTimeType_BigTurnLayer:
            curLayer = buff.GetLayer()
            if curLayer <= 0:
                continue
            updLayer = curLayer - 1
            GameWorld.DebugLogEx("    更新buff层级: curID=%s,buffID=%s,skillID=%s,updLayer=%s", curID, buffID, skillID, updLayer)
            TurnBuff.DoBuffLayerChange(turnFight, batObj, buff, updLayer)
    return
def RefreshObjBuffTime(turnFight, batObj):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1546,6 +1546,7 @@
#【注】光环类buff默认与光源(施法者)同步,其他受光环影响的目标同步该buff持续时间,持续时间及效果由施法者决定
BuffLastTimeType_Default = 0 # 默认以获得buff时自身回合前后判断
BuffLastTimeType_BigTurn = 1 # 大回合buff,每大回合开始固定减1回合
BuffLastTimeType_BigTurnLayer = 2 # 大回合buff,每大回合开始固定减1层
#动作类区分标识
(
@@ -4757,6 +4758,7 @@
# 部分技能ID
SkillID_SmyFanzhao = 1012050 # 返照
SkillID_DongbaiRevive = 4009240 # 董白 - 复活
# 经验倍率限制类型
(
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5024.py
New file
@@ -0,0 +1,42 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveTrigger.PassiveEff_5024
#
# @todo:额外增加/减少buff效果ID/属性ID值(根据buff层级)
# @author hxp
# @date 2025-12-16
# @version 1.0
#
# 详细描述: 额外增加/减少buff效果ID/属性ID值(根据buff层级)
#
#-------------------------------------------------------------------------------
#"""Version = 2025-12-16 16:00"""
#-------------------------------------------------------------------------------
import GameWorld
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
    buffState = curEffect.GetEffectValue(0)
    effEx = curEffect.GetEffectValue(1) # 支持多个属性
    sameCountryExValue = curEffect.GetEffectValue(2)
    if not isinstance(effEx, list) or len(effEx) != 3:
        return
    curBuff = batObj.GetBuffManager().FindBuffByState(buffState)
    if not curBuff:
        return
    buffLayers = max(1, curBuff.GetLayer())
    attrID, attrValue, calcType = effEx
    totalValue = attrValue * buffLayers
    GameWorld.DebugLogEx("额外buff效果ID/属性ID值根据buff层级: attrID=%s,attrValue=%s,calcType=%s,buffState=%s,layers=%s,totalValue=%s",
                         attrID, attrValue, calcType, buffState, buffLayers, totalValue)
    if sameCountryExValue and batObj.GetCountry() == tagObj.GetCountry():
        totalValue += (sameCountryExValue * buffLayers)
        GameWorld.DebugLogEx("    相同国家每层额外增加值: %s,totalValue=%s", sameCountryExValue, totalValue)
    connBuff.AddEffectValueEx(attrID, totalValue, calcType)
    return True
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5504.py
New file
@@ -0,0 +1,45 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveTrigger.PassiveEff_5504
#
# @todo:触发释放技能(验证目标状态)
# @author hxp
# @date 2025-12-16
# @version 1.0
#
# 详细描述: 触发释放技能(验证目标状态)
#
#-------------------------------------------------------------------------------
#"""Version = 2025-12-16 16:00"""
#-------------------------------------------------------------------------------
import TurnSkill
import IpyGameDataPY
import GameWorld
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
    skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
    checkState = curEffect.GetEffectValue(1) # 可附加验证目标处于xx状态
    checkOwner = curEffect.GetEffectValue(2) # 是否只限归属自己的状态buff
    if checkState:
        ownerID = batObj.GetID() if checkOwner else 0
        if not tagObj.GetBuffManager().FindBuffByState(checkState, ownerID):
            GameWorld.DebugLogEx("目标不在状态下不触发: tagID=%s,checkState=%s,ownerID=%s", tagObj.GetID(), checkState, ownerID)
            return
    if not skillID:
        passiveSkill = effSkill
    else:
        passiveSkill = IpyGameDataPY.GetIpyGameData("Skill", skillID)
    if not passiveSkill:
        return
    effectID = curEffect.GetEffectID()
    effSkillID = effSkill.GetSkillID()
    return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID, connBuff, **kwargs)
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
    effSkill = effBuff.GetSkillData().GetIpyData()
    return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py
@@ -36,6 +36,15 @@
            attrValue = maxValue
        GameWorld.DebugLog("按对方buff层级增加属性: attrID=%s,attrValue=%s,buffStateList=%s,layerTotal=%s,maxValue=%s" 
                           % (attrID, attrValue, buffStateList, layerTotal, maxValue))
    # 11-根据自己已损失血量百分比
    elif calcType == 11:
        curHP = attacker.GetHP()
        maxHP = attacker.GetMaxHP()
        lostPer = int((maxHP - curHP) / float(maxHP) * 100) # 只算取整
        attrValue = lostPer * attrValue
        GameWorld.DebugLog("按自身已损失生命百分比增加属性: attrID=%s,attrValue=%s,curHP=%s/%s,lostPer=%s"
                           % (attrID, attrValue, curHP, maxHP, lostPer))
    else:
        checkInStateList = curEffect.GetEffectValue(2)
        if checkInStateList:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -268,8 +268,16 @@
            isRefreshAttr = True
            
    if refreshType and buffSkill and buffOwner:
        TurnPassive.OnTriggerPassiveEffect(turnFight, buffOwner, ChConfig.TriggerWay_BuffAddByOwner, connSkill=buffSkill, connBuff=curBuff)
        TurnPassive.OnTriggerPassiveEffect(turnFight, buffOwner, ChConfig.TriggerWay_BuffAddByOwner, tagObj=batObj, connSkill=buffSkill, connBuff=curBuff)
        # 判断是否有额外属性的
        if not isRefreshAttr:
            effExDict = curBuff.GetEffectExDict()
            for effCalcInfo in effExDict.keys():
                effID = effCalcInfo[0]
                if effID in ChConfig.AttrIDList:
                    isRefreshAttr = True
                    break
    if isRefreshAttr:
        RefreshBuffAttr(batObj)
        
@@ -558,6 +566,9 @@
            effID = effect.GetEffectID()
            if effID not in ChConfig.AttrIDList:
                continue
            if effect.GetTriggerWay():
                # 需要触发才有效的不算
                continue
            if effect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill]:
                # 技能属性仅技能时有效
                continue
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
@@ -37,8 +37,17 @@
    ''' 触发被动效果,可能触发技能、buff,需根据优先级触发
    '''
    if not batObj.IsAlive():
        if triggerWay in ChConfig.DeadCanTriggerWayList or (connSkill and connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance):
        if triggerWay in ChConfig.DeadCanTriggerWayList:
            pass # 死亡状态下可触发的被动
        elif connSkill:
            if connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance:
                pass # 子技能不限制死亡触发,由主技能决定,主技能能触发了,才会执行到子技能,那么子技能也一定能触发
            elif connSkill.GetByTriggerWay() in ChConfig.DeadCanTriggerWayList:
                pass
                #GameWorld.DebugLogEx("关联技能是由死亡状态下可触发的方式触发的,则也可触发! triggerWay=%s,connSkillID=%s,byTriggerWay=%s",
                #                     triggerWay, connSkill.GetSkillID(), connSkill.GetByTriggerWay())
            else:
                return
        else:
            return
    passiveEffMgr = batObj.GetPassiveEffManager()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -59,11 +59,11 @@
    if not skillID:
        return
    
    triggerWay = kwargs["triggerWay"] if "triggerWay" in kwargs else 0
    if not curBatObj.IsAlive():
        if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
            GameWorld.DebugLogEx("死亡时使用复活自己的技能! skillID=%s", skillID)
        else:
            triggerWay = kwargs.get("triggerWay", 0)
            if triggerWay in ChConfig.DeadCanTriggerWayList:
                GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,triggerWay=%s", skillID, triggerWay)
            elif batType == ChConfig.TurnBattleType_Enhance:
@@ -150,6 +150,7 @@
    useSkill.SetBatType(batType)
    useSkill.SetBySkill(bySkill)
    useSkill.SetByBuff(byBuff)
    useSkill.SetByTriggerWay(triggerWay)
    
    isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
    if isTurnNormalSkill:
@@ -1417,6 +1418,7 @@
    if dieObjList:
        for dieObj in dieObjList:
            TurnPassive.OnTriggerPassiveEffect(turnFight, dieObj, ChConfig.TriggerWay_WhenDie, curObj, connSkill=useSkill)
            __dongbaiRevive(turnFight, dieObj, useSkill) # 写死特殊处理董白复活
            
        for faction in [ChConfig.Def_FactionA, ChConfig.Def_FactionB]:
            batFaction = turnFight.getBatFaction(faction)
@@ -1522,6 +1524,33 @@
    if dieObjList:
        turnFight.checkOverByKilled()
        
    return
def __dongbaiRevive(turnFight, batObj, useSkill):
    '''特殊处理董白复活: 董白死亡之后的时间,若有敌方单位阵亡,董白以50%血量复活
    '''
    faction = batObj.GetFaction()
    batFaction = turnFight.getBatFaction(ChConfig.Def_FactionA if faction == ChConfig.Def_FactionB else ChConfig.Def_FactionB)
    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])
    if not dongbaiObj or dongbaiObj.IsAlive():
        return
    skill = dongbaiObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_DongbaiRevive)
    if not skill:
        GameWorld.DebugLogEx("董白还还未学习特殊复活技能! %s", ChConfig.SkillID_DongbaiRevive)
        return
    enemyDeadCnt = dongbaiObj.GetDictByKey("EnemyDeadCnt") + 1
    dongbaiObj.SetDict("EnemyDeadCnt", enemyDeadCnt)
    GameWorld.DebugLogEx("董白记录自身死亡后的敌方阵亡单位数: %s" % enemyDeadCnt)
    needDeadCnt = skill.GetEffect(0).GetEffectValue(0) # 固定配置在效果1值
    if enemyDeadCnt < needDeadCnt:
        return
    dongbaiObj.SetDict("EnemyDeadCnt", 0)
    OnUseSkill(turnFight, dongbaiObj, skill, batType=ChConfig.TurnBattleType_Passive, bySkill=useSkill)
    return
def __doCostZhanchui(turnFight, curBatObj, useSkill):
@@ -1894,6 +1923,7 @@
    dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤
    
    aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
    aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
    
    aNormalSkillPer, dNormalSkillPerDef = 0, 0
    if isTurnNormalSkill: