129 【战斗】战斗系统-服务端(吕玲绮技能,除了突破8潜能; buff持续回合计算增加规则3;技能目标范围增加男女;增加效果6030-掉血保护;5022效果支持配置仅对指定性别有效;)
6个文件已修改
1个文件已添加
115 ■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5022.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6030.py 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -1029,9 +1029,16 @@
    def SetLV(self, lv): self.lv = lv
    def GetStar(self): return self._star
    def SetStar(self, star): self._star = star
    def GetDictByKey(self, key): return self._kvDict.get(key, 0)
    def SetDict(self, key, value): self._kvDict[key] = value
    def GetDictByKey(self, key):
        if key in self._kvDict:
            return self._kvDict[key]
        return 0
    def SetDict(self, key, value):
        if not value:
            self._kvDict.pop(key, None)
        else:
            self._kvDict[key] = value
    def GetSkillManager(self): return self._skillMgr
    def GetBuffManager(self):return self._buffMgr
    def GetPassiveEffManager(self):return self._passiveEffMgr
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -1711,7 +1711,7 @@
            batObj.SetTiming(ChConfig.TurnTiming_Before) # 重置时机到回合前
            if turnNum > 1: # 第1回合不用刷新技能
                RefreshObjSkillByBigTurn(batObj)
                RefreshObjByBigTurn(turnFight, batObj)
                RefreshObjByBigTurn(turnFight, batObj, turnNum)
            batObj.ResetBigTurn() # 每大回合重置
            
            if not batObj.IsAlive():
@@ -1813,7 +1813,7 @@
        GameWorld.DebugLogEx("    更新技能CD: curID=%s,skillID=%s,remainTime=%s", curID, skillID, remainTime)
    return
def RefreshObjByBigTurn(turnFight, batObj):
def RefreshObjByBigTurn(turnFight, batObj, turnNum):
    ## 根据大回合开始刷新buff持续时间,每个大回合-1,第1回合不处理
    curID = batObj.GetID()
    buffMgr = batObj.GetBuffManager()
@@ -1824,7 +1824,7 @@
        skillData = buff.GetSkillData()
        lastType = skillData.GetLastTimeType()
        
        if lastType not in [ChConfig.BuffLastTimeType_BigTurn, ChConfig.BuffLastTimeType_BigTurnLayer]:
        if lastType not in [ChConfig.BuffLastTimeType_BigTurn, ChConfig.BuffLastTimeType_BigTurnLayer, ChConfig.BuffLastTimeType_BigTurnLimit]:
            continue
        
        if skillData.GetSkillType() in ChConfig.Def_LstBuff_List:
@@ -1835,12 +1835,17 @@
            continue
        
        # 每大回合固定减1回合
        if lastType == ChConfig.BuffLastTimeType_BigTurn:
        if lastType in [ChConfig.BuffLastTimeType_BigTurn, ChConfig.BuffLastTimeType_BigTurnLimit]:
            remainTime = buff.GetRemainTime()
            if remainTime <= 0:
                continue
            remainTime -= 1
            GameWorld.DebugLogEx("    更新buff回合: curID=%s,buffID=%s,skillID=%s,remainTime=%s", curID, buffID, skillID, remainTime)
            if lastType == ChConfig.BuffLastTimeType_BigTurnLimit and remainTime > 0:
                lastTurnMax = skillData.GetLastTime()
                if lastTurnMax and turnNum > lastTurnMax:
                    remainTime = 0
                    GameWorld.DebugLogEx("        超过最大限制回合数,强制清除!: curID=%s,buffID=%s,skillID=%s,remainTime=%s", curID, buffID, skillID, remainTime)
            TurnBuff.SetBuffRemainTime(turnFight, batObj, buff, remainTime)
            
        # 每大回合固定减1层
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1339,6 +1339,10 @@
    # @return:  1 ~ 总行数
    return (posNum - 1) / TurnFightCols + 1
# 性别
BatObjSex_Male = 1 # 男
BatObjSex_Female = 2 # Ů
# 技能目标 - 瞄准范围
(
SkillTagAim_All, # 全部 0
@@ -1350,7 +1354,9 @@
SkillTagAim_MainSkill, # 继承主技能目标 6
SkillTagAim_MainSkillEx, # 继承主技能目标一次性处理 7
SkillTagAim_MainSkillFriend, # 继承主技能友军 8
) = range(9)
SkillTagAim_Male, # 男性 9
SkillTagAim_Female, # 女性 10
) = range(11)
# 技能目标 - 细分
(
@@ -1551,6 +1557,7 @@
BuffLastTimeType_Default = 0 # 默认以获得buff时自身回合前后判断
BuffLastTimeType_BigTurn = 1 # 大回合buff,每大回合开始固定减1回合
BuffLastTimeType_BigTurnLayer = 2 # 大回合buff,每大回合开始固定减1层
BuffLastTimeType_BigTurnLimit = 3 # 在1的基础上,额外限制不超过战场当前回合
#动作类区分标识
(
@@ -4065,6 +4072,7 @@
PassiveEff_AddHurtAtkPerMax = 6027 # 增加技能最大攻击万分比限制
PassiveEff_AddChangeLayers5008 = 6028 # 增减5008效果的转化层数
PassiveEff_AddBatDamPerByLayer = 6029 # 提升技能战斗伤害(根据身上buff状态层数)
PassiveEff_LostHPProtect = 6030 # 掉血上限保护
# 被动效果ID有触发值时就返回的
PassiveEffHappenValueList = [PassiveEff_ChangeHurtType, PassiveEff_ImmuneControlBuff, PassiveEff_MustSuperHit, PassiveEff_SkillInvalid, 
@@ -4072,7 +4080,7 @@
# 被动效果ID触发值取最大值的
PassiveEffValueMaxList = [PassiveEff_ChangeHurtMulti]
# 被动效果ID触发值取最小值的
PassiveEffValueMinList = []
PassiveEffValueMinList = [PassiveEff_LostHPProtect]
# 技能效果 - 不需要配置触发方式的
SkillEff_CureWayEx = 7001 # 额外治疗值计算(对CalcType、SkillPer治疗计算方式扩展): 值1-计算方式;值2-万分比
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5022.py
@@ -43,6 +43,12 @@
                countryCnt += 1
            calcLayer = countryCnt
            GameWorld.DebugLogEx("按友方某个国家武将数计算额外buff属性: ruleType=%s,country=%s,countryCnt=%s", ruleType, country, countryCnt)
        # 101 - 仅对指定性别有效  参数1:性别
        elif ruleType == 101:
            onlySex = calcRule[1] if len(calcRule) > 1 else 0
            if tagObj.GetSex() != onlySex:
                GameWorld.DebugLogEx("5022额外buff对该性别无效: ruleType=%s,onlySex=%s,tagSex=%s,tagID=%s", ruleType, onlySex, tagObj.GetSex(), tagObj.GetID())
                return
            
    if calcLayer <= 0:
        return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6030.py
New file
@@ -0,0 +1,27 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveTrigger.PassiveEff_6030
#
# @todo:掉血上限保护
# @author hxp
# @date 2025-12-22
# @version 1.0
#
# 详细描述: 掉血上限保护
#
#-------------------------------------------------------------------------------
#"""Version = 2025-12-22 14:00"""
#-------------------------------------------------------------------------------
def GetHappenValue(attacker, defender, curEffect, effSkill, effBuff, connSkill, **skillkwargs):
    maxPer = curEffect.GetEffectValue(0) # 最大不超过计算方式的万分比
    calcType = curEffect.GetEffectValue(1) # 计算方式 1-最大血量
    calcValue = attacker.GetMaxHP() # 默认按最大血量
    # 其他方式可支持
    if calcType == 1:
        pass
    return int(calcValue * maxPer / 10000.0)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
@@ -452,6 +452,15 @@
    if haveBuffPassiveEff:
        batObj.GetPassiveEffManager().DelBuffPassiveEffect(buffID)
        
    # 判断是否有额外属性的
    if not isRefreshAttr:
        effExDict = curBuff.GetEffectExDict()
        for effCalcInfo in effExDict.keys():
            effID = effCalcInfo[0]
            if effID in ChConfig.AttrIDList:
                isRefreshAttr = True
                break
    if isRefreshAttr and not noRefreshAttr:
        RefreshBuffAttr(batObj)
        
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -133,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)
    if batType == ChConfig.TurnBattleType_Enhance:
        pass
    else:
        curBatObj.SetAngerOverflow(0)        
    angerOverflow = curBatObj.GetAngerOverflow()
@@ -410,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)
                    
    # 目标细分
@@ -1124,7 +1132,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)
@@ -1702,11 +1710,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)
@@ -2241,7 +2252,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)
            
@@ -2531,7 +2542,7 @@
    @param hpCanNegative: 扣除后的生命是否允许负值
    @param immuneHurt: 免疫的伤害值
    @param isSkillSelfTag: 是否技能自身的直接目标,如平摊伤害目标、溅射伤害目标这种就不算直接目标
    @return: lostHP, ignoreShield
    @return: lostHP, ignoreShield, hurtValue
    '''
    
    ignoreShield = None
@@ -2549,8 +2560,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()
@@ -2616,7 +2633,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):
    '''计算反弹反弹伤害