129 【战斗】战斗系统-服务端(诸葛亮技能; 目标细分增加攻击力最高5; buff状态增加军令19;增加效果6006增加本次技能万分比验证职业;增加效果5015集火攻击军令目标;)
6个文件已修改
2个文件已添加
163 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5015.py 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6006.py 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -132,6 +132,7 @@
    BYTE        Quality;    // 品质
    BYTE        AtkDistType;    //远近类型;1-近战;2-远程
    BYTE        Sex;    //性别;1-男,2-女
    BYTE        Job;    //ְҵ
    list        SkinIDList;    // 皮肤ID列表
    DWORD        NormalSkillID;    //普攻技能ID
    DWORD        AngerSkillID;    //怒气技能ID
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -699,6 +699,7 @@
        self.atkDistType = 0
        self.specialty = 0 # 特长
        self.sex = 0
        self.job = 0
        self.lv = 1
        self.fightPower = 0
        self.faction = 0 # 所属阵营,一般只有双方阵营, 1 或 2,发起方默认1
@@ -779,6 +780,8 @@
    def SetSpecialty(self, specialty): self.specialty = specialty
    def GetSex(self): return self.sex
    def SetSex(self, sex): self.sex = sex
    def GetJob(self): return self.job
    def SetJob(self, job): self.job = job
    def GetNPCID(self): return self.npcID # 如果是NPC战斗单位,则该值非0
    def SetNPCID(self, npcID): self.npcID = npcID # 设置所属的NPCID
    def GetHeroID(self): return self.heroID
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -750,7 +750,7 @@
        heroID = heroInfo.get("HeroID", 0)
        skinID = heroInfo.get("SkinID", 0)
        lv = heroInfo.get("LV", 1)
        specialty, atkDistType, country, sex = 0, 1, 0, 1
        specialty, atkDistType, country, sex, job = 0, 1, 0, 1, 0
        heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if heroID else None
        if heroIpyData:
            objName = heroIpyData.GetName()
@@ -758,6 +758,7 @@
            atkDistType = heroIpyData.GetAtkDistType()
            country = heroIpyData.GetCountry()
            sex = heroIpyData.GetSex()
            job = heroIpyData.GetJob()
            
        if lineupPlayerID:
            fightPower = heroInfo.get("FightPower", 0)
@@ -789,6 +790,7 @@
        batObj.SetSpecialty(specialty)
        batObj.SetCountry(country)
        batObj.SetSex(sex)
        batObj.SetJob(job)
        batObj.SetHero(heroID, skinID)
        
        skillManager = batObj.GetSkillManager()
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -1393,7 +1393,8 @@
SkillTagAffect_HPHighest, # 血量最高 2
SkillTagAffect_Death, # 死亡单位 3
SkillTagAffect_UncontrolledPriority, # 未被控制优先 4
) = range(5)
SkillTagAffect_AtkHighest, # 攻击力最高 5
) = range(6)
#技能施法目标
Def_UseSkillAim_Type = 3
@@ -3153,7 +3154,9 @@
    BatObjState_Weak, # 虚弱 15
    BatObjState_Charm, # 魅惑 16
    BatObjState_Chaos, # 混乱 17
) = range(18)
    BatObjState_18, # Ȩı 18
    BatObjState_FocusFire, # 军令/集火 19
) = range(20)
#玩家状态定义,不能超过31个,如超过,需扩展多个key支持
Def_PlayerStateList = (
@@ -4306,6 +4309,7 @@
PassiveEff_ChangeHurtType = 6002 # 变更伤害类型: 值1-伤害类型;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
PassiveEff_ChangeHurtMulti = 6003 # 变更伤害倍值(可增可减): 值1-变更倍值;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
PassiveEff_AddSkillPer = 6004 # 增加本次技能万分比: 值1-增加的万分比;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
PassiveEff_AddSkillPerByJob = 6006 # 增加本次技能万分比: 值1-增加的万分比;值2-验证目标职业
PassiveEff_AddSkillTagCnt = 6007 # 增加技能目标数:值1-增加目标个数
PassiveEff_ImmuneControlBuff = 6008 # 生命值低于x%时免疫控制效果:值1-百分比
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -152,6 +152,7 @@
                        ("BYTE", "Quality", 0),
                        ("BYTE", "AtkDistType", 0),
                        ("BYTE", "Sex", 0),
                        ("BYTE", "Job", 0),
                        ("list", "SkinIDList", 0),
                        ("DWORD", "NormalSkillID", 0),
                        ("DWORD", "AngerSkillID", 0),
@@ -2725,16 +2726,17 @@
    def GetQuality(self): return self.attrTuple[4] #  品质 BYTE
    def GetAtkDistType(self): return self.attrTuple[5] # 远近类型;1-近战;2-远程 BYTE
    def GetSex(self): return self.attrTuple[6] # 性别;1-男,2-女 BYTE
    def GetSkinIDList(self): return self.attrTuple[7] #  皮肤ID列表 list
    def GetNormalSkillID(self): return self.attrTuple[8] # 普攻技能ID DWORD
    def GetAngerSkillID(self): return self.attrTuple[9] # 怒气技能ID DWORD
    def GetAtkInheritPer(self): return self.attrTuple[10] # 攻击继承 WORD
    def GetDefInheritPer(self): return self.attrTuple[11] # 防御继承 WORD
    def GetHPInheritPer(self): return self.attrTuple[12] # 生命继承 WORD
    def GetBatAttrDict(self): return self.attrTuple[13] # 其他战斗属性字典 {"属性ID":值, ...} dict
    def GetFetterIDList(self): return self.attrTuple[14] # 羁绊ID列表 list
    def GetRecruitBySelf(self): return self.attrTuple[15] #  招募需要本体 BYTE
    def GetSpecialty(self): return self.attrTuple[16] #  武将特长 BYTE
    def GetJob(self): return self.attrTuple[7] # ְҵ BYTE
    def GetSkinIDList(self): return self.attrTuple[8] #  皮肤ID列表 list
    def GetNormalSkillID(self): return self.attrTuple[9] # 普攻技能ID DWORD
    def GetAngerSkillID(self): return self.attrTuple[10] # 怒气技能ID DWORD
    def GetAtkInheritPer(self): return self.attrTuple[11] # 攻击继承 WORD
    def GetDefInheritPer(self): return self.attrTuple[12] # 防御继承 WORD
    def GetHPInheritPer(self): return self.attrTuple[13] # 生命继承 WORD
    def GetBatAttrDict(self): return self.attrTuple[14] # 其他战斗属性字典 {"属性ID":值, ...} dict
    def GetFetterIDList(self): return self.attrTuple[15] # 羁绊ID列表 list
    def GetRecruitBySelf(self): return self.attrTuple[16] #  招募需要本体 BYTE
    def GetSpecialty(self): return self.attrTuple[17] #  武将特长 BYTE
# 武将星级天赋表
class IPY_HeroTalent():
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5015.py
New file
@@ -0,0 +1,84 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveTrigger.PassiveEff_5015
#
# @todo:集火攻击目标
# @author hxp
# @date 2025-09-23
# @version 1.0
#
# 详细描述: 集火攻击目标
#
#-------------------------------------------------------------------------------
#"""Version = 2025-09-23 17:00"""
#-------------------------------------------------------------------------------
import BattleObj
import TurnSkill
import GameWorld
import ChConfig
import TurnBuff
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
    tagBuffMgr = tagObj.GetBuffManager()
    fireBuff = tagBuffMgr.FindBuffByState(ChConfig.BatObjState_FocusFire)
    if not fireBuff:
        #GameWorld.DebugLog("对方没有集火buff: tagID=%s" % (tagObj.GetID()))
        return
    pursueAtkRateList = curEffect.GetEffectValue(0) # 友军按xx排序倒序后的追击概率列表
    pursueSkillFuncType = curEffect.GetEffectValue(1) # 使用追击技能 1-普攻;2-怒技
    country = batObj.GetCountry()
    faction = batObj.GetFaction()
    lineupNum = batObj.GetLineupNum()
    batFaction = turnFight.getBatFaction(faction)
    batLineup = batFaction.getBatlineup(lineupNum)
    objList = []
    batObjMgr = BattleObj.GetBatObjMgr()
    for objID in batLineup.posObjIDDict.values():
        curBatObj = batObjMgr.getBatObj(objID)
        if not curBatObj:
            continue
        objList.append(curBatObj)
    sortRule = 0 # 先按战力,有需要再扩展效果值
    if sortRule == 0:
        objList.sort(key=lambda o:(o.GetFightPower()), reverse=True)
    elif sortRule == 1:
        objList.sort(key=lambda o:(o.GetAtk()), reverse=True)
    else:
        pass
    #友军包含自己,同国概率翻倍
    for pursueIndex, curBatObj in enumerate(objList):
        if not tagObj.IsAlive():
            break
        rate = pursueAtkRateList[pursueIndex] if len(pursueAtkRateList) > pursueIndex else 0
        if curBatObj.GetCountry() == country:
            rate *= 2
        GameWorld.DebugLog("友军集火概率: objID=%s,rate=%s,pursueIndex=%s" % (curBatObj.GetID(), rate, pursueIndex))
        if not GameWorld.CanHappen(rate, 100):
            continue
        passiveSkill = None
        skillManager = curBatObj.GetSkillManager()
        for index in range(0, skillManager.GetSkillCount()):
            skill = skillManager.GetSkillByIndex(index)
            if not skill:
                continue
            if skill.GetFuncType() == pursueSkillFuncType:
                passiveSkill = skill
                break
        if not passiveSkill:
            continue
        # 集火追击限制连击
        TurnSkill.OnUseSkill(turnFight, curBatObj, passiveSkill, [tagObj], batType=ChConfig.TurnBattleType_Pursue, bySkill=connSkill, comboLimit=True)
    # 删除目标集火buff
    TurnBuff.DoBuffDel(turnFight, tagObj, fireBuff, connSkill)
    return True
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6006.py
New file
@@ -0,0 +1,23 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Skill.PassiveTrigger.PassiveEff_6006
#
# @todo:增加本次技能万分比(验证目标职业)
# @author hxp
# @date 2025-09-23
# @version 1.0
#
# 详细描述: 增加本次技能万分比(验证目标职业)
#
#-------------------------------------------------------------------------------
#"""Version = 2025-09-23 17:00"""
#-------------------------------------------------------------------------------
def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
    checkHeroJob = curEffect.GetEffectValue(1)
    if checkHeroJob:
        if checkHeroJob != defender.GetJob():
            return
    return curEffect.GetEffectValue(0)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -45,11 +45,11 @@
    ## 是否无视防御
    return useSkill.GetHurtType() / 10 == 1 # 2为真伤,待扩展
def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None, byBuff=None):
def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None, byBuff=None, comboLimit=False):
    '''使用技能通用入口
    @param useSkill: 使用的技能,注意并不一定是身上的技能,可能只是 SkillData 表数据
    @param bySkill: 由哪个技能额外触发的,比如附加触发的技能或被动技能均可能由某个技能触发
    @param isEnhanceSkill: 是否附加触发的技能,即主技能拆分成多个技能,额外释放的
    @param comboLimit: 是否强制限制连击
    @return: 是否成功
    '''
    if not useSkill:
@@ -151,7 +151,7 @@
        
    # 处理反击 或 连击
    if isTurnNormalSkill:
        if not DoCombo(turnFight, curBatObj, useSkill):
        if comboLimit or not DoCombo(turnFight, curBatObj, useSkill):
            useSkill.ComboInterrupt()
            
    # 最后重置、回收对象
@@ -176,6 +176,12 @@
        return [curBatObj]
    
    tagCount += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillTagCnt, useSkill)
    # 目标选择优先级,集火 > 魅惑 > 混乱 > 嘲讽 > 常规
    # 集火:直接通过效果5015指定了目标,所以这里可不处理
    # 魅惑: 敌友互换; 不打自己,只剩自己互换后是己方时不释放技能
    # 混乱: 随机敌友; 不打自己,只剩自己随机后是己方时不释放技能
    # 嘲讽: 目标是敌方时强制目标一定包含施法者
    
    sneerObj = None # 嘲讽目标
    sneerObjID, sneerObjPosNum = 0, 0
@@ -288,6 +294,11 @@
    elif tagAffect == ChConfig.SkillTagAffect_HPHighest:
        aimObjList.sort(key=lambda o:(o.GetHP()), reverse=True)
        #GameWorld.DebugLog("血量最高排序: %s" % [[o.GetID(), o.GetHP(), o.GetMaxHP()] for o in aimObjList])
    # 攻击力最高
    elif tagAffect == ChConfig.SkillTagAffect_AtkHighest:
        aimObjList.sort(key=lambda o:(o.GetAtk()), reverse=True)
        #GameWorld.DebugLog("攻击力最高排序: %s" % [[o.GetID(), o.GetHP(), o.GetMaxHP()] for o in aimObjList])
        
    # 未被控制优先
    elif tagAffect == ChConfig.SkillTagAffect_UncontrolledPriority:
@@ -1161,6 +1172,7 @@
    dDef = 0 if ignoreDef else defObj.GetDef() # 防守方防御力
    
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
    atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByJob, curSkill)
    
    aFinalDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPer) # 最终加成
    dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤