From 30dd8ff93a00ada8262a35da0ede9c2088a7fd37 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 23 九月 2025 16:52:52 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(诸葛亮技能; 目标细分增加攻击力最高5; buff状态增加军令19;增加效果6006增加本次技能万分比验证职业;增加效果5015集火攻击军令目标;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6006.py |   23 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py                     |    3 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py                        |   22 ++++---
 PySysDB/PySysDBPY.h                                                                                         |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py                    |    4 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py                      |   20 +++++-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5015.py |   84 ++++++++++++++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                             |    8 ++
 8 files changed, 148 insertions(+), 17 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index d05378c..2daf835 100644
--- a/PySysDB/PySysDBPY.h
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
index c96bb09..8af1cb2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
index 64127de..06c2a8d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/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()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index ebdbc46..26475c4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/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-百分比
 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 067de62..c5b679f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/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():
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5015.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5015.py
new file mode 100644
index 0000000..6150af6
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5015.py
@@ -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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6006.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6006.py
new file mode 100644
index 0000000..f884724
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_6006.py
@@ -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)
\ No newline at end of file
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
index 1bc08e6..0c989bb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/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:
@@ -793,7 +804,7 @@
     effIgnoreObjIDList = missObjIDList + immuneObjIDList
     # 优先触发本技能额外效果,注:仅该技能释放后该技能的额外效果视为主技能的效果,优先级最高
     __DoCurSkillEff(turnFight, curObj, useSkill, effIgnoreObjIDList, isUseSkill)
-        
+    
     # ========== 以下触发被动 ==========
     
     # 破盾时
@@ -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) # 最终减伤

--
Gitblit v1.8.0