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