From 95e5cc37cc097f506004f31cdfff1118953296f6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 16 十二月 2025 15:58:24 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(董白全部技能; 增加效果5024 5504;buff持续规则字段支持配置每大回合-1层;动态属性ID变化增加计算方式11-根据自己已损失血量百分比;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5024.py | 42 ++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py | 15 +++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5504.py | 45 +++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py | 21 ++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py | 11 ++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py | 30 +++++-
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 32 +++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 2
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py | 9 ++
9 files changed, 192 insertions(+), 15 deletions(-)
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 f2a0f36..a65e3e0 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/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 # 技能额外目标列表
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 80c54ba..61cdeb7 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/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):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index b789cf7..9a1db09 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/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 # 董白 - 复活
# 经验倍率限制类型
(
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5024.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5024.py
new file mode 100644
index 0000000..97151c3
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5024.py
@@ -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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5504.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5504.py
new file mode 100644
index 0000000..33dede7
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5504.py
@@ -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)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py
index 44cf30a..ceaae8d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_Attr.py
+++ b/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:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
index c41b9f9..5430e6d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnBuff.py
+++ b/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
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
index 02af5af..2aa5c13 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnPassive.py
+++ b/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()
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 38f8ede..c77146a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/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:
--
Gitblit v1.8.0