129 【战斗】战斗系统-服务端(命格技能朱雀;增加触发方式61-附加持续伤害buff时;群攻触发的命格buff默认只触发一次;增加效果5029-额外结算dot伤害;)
| | |
| | | TriggerWay_EnemyBeControlledHard, # 敌方受控时(硬控) 58
|
| | | TriggerWay_PursueAtk, # 追击直接攻击时 59
|
| | | TriggerWay_Frozen, # 冰冻目标时 60
|
| | | ) = range(1, 1 + 60)
|
| | | TriggerWay_AddDOTBuff, # 附加持续伤害buff时 61
|
| | | ) = range(1, 1 + 61)
|
| | |
|
| | | # 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
|
| | | TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
|
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_5029
|
| | | #
|
| | | # @todo:额外结算dot伤害(敌方全体有dot的,不影响原dot)
|
| | | # @author hxp
|
| | | # @date 2026-01-20
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 额外结算dot伤害(敌方全体有dot的,不影响原dot)
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2026-01-20 21:30"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import TurnSkill
|
| | | import BattleObj
|
| | | import GameWorld
|
| | | import ChConfig
|
| | |
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
|
| | | hurtPer = curEffect.GetEffectValue(0) # 额外结算dot总值的万分比
|
| | | |
| | | effSkillID = effSkill.GetSkillID()
|
| | | faction = batObj.GetFaction()
|
| | | lineupNum = batObj.GetLineupNum()
|
| | | tagFaction = ChConfig.Def_FactionB if faction == ChConfig.Def_FactionA else ChConfig.Def_FactionA
|
| | | |
| | | tagBatFaction = turnFight.getBatFaction(tagFaction)
|
| | | tagBatLineup = tagBatFaction.getBatlineup(lineupNum)
|
| | | |
| | | isOK = False
|
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | for objID in tagBatLineup.getBatHeroObjIDList():
|
| | | tObj = batObjMgr.getBatObj(objID)
|
| | | if not tObj or not tObj.IsAlive():
|
| | | continue
|
| | | |
| | | dotValueDict = {}
|
| | | buffMgr = tObj.GetBuffManager()
|
| | | for buffIndex in range(buffMgr.GetBuffCount()):
|
| | | buff = buffMgr.GetBuffByIndex(buffIndex)
|
| | | buffSkillData = buff.GetSkillData()
|
| | | |
| | | if buffSkillData.GetSkillType() != ChConfig.Def_SkillType_LstDepBuff:
|
| | | continue
|
| | | buffValue = buff.GetValue1() + buff.GetValue2() * ChConfig.Def_PerPointValue
|
| | | ownerID = buff.GetOwnerID()
|
| | | dotValueDict[ownerID] = dotValueDict.get(ownerID, 0) + buffValue
|
| | | |
| | | for ownerID, dotValueTotal in dotValueDict.items():
|
| | | hurtValue = int(dotValueTotal * hurtPer / 10000.0)
|
| | | GameWorld.DebugLogEx("5029额外结算dot伤害: objID=%s,ownerID=%s,dotValueTotal=%s,hurtPer=%s,hurtValue=%s", objID, ownerID, dotValueTotal, hurtPer, hurtValue)
|
| | | atkObj = batObjMgr.getBatObj(ownerID)
|
| | | if not atkObj:
|
| | | continue
|
| | | if TurnSkill.DoHurtExAtk(turnFight, atkObj, tObj, hurtValue, effSkillID):
|
| | | isOK = True
|
| | | |
| | | return isOK
|
| | |
|
| | |
| | | ownerID = buffOwner.GetID()
|
| | | buffID = buff.GetBuffID()
|
| | | timing = batObj.GetTiming()
|
| | | skillType = buffSkill.GetSkillType()
|
| | | remainTime = buffSkill.GetLastTime()
|
| | | remainTime += TurnPassive.GetTriggerEffectValue(turnFight, buffOwner, batObj, ChConfig.PassiveEff_AddBuffTime, buffSkill)
|
| | |
|
| | |
| | | if curBuffState:
|
| | | buffMgr.AddBuffState(curBuffState, buffID)
|
| | |
|
| | | if buffSkill.GetSkillType() == ChConfig.Def_SkillType_Halo:
|
| | | if skillType == ChConfig.Def_SkillType_Halo:
|
| | | __addHaloBuffEffObjID(curID, buff, skillID, ownerID, haloSrcBuff)
|
| | |
|
| | | if afterLogic and buffSkill:
|
| | |
| | | if curBuffState and IsControlledHardState(curBuffState):
|
| | | buffSkill.AddAfterLogic(ChConfig.AfterLogic_TriggerAddBuff, [ChConfig.TriggerWay_BeControlledHard, batObj, buff, buffOwner])
|
| | |
|
| | | #添加持续减益buff
|
| | | if skillType == ChConfig.Def_SkillType_LstDepBuff:
|
| | | buffSkill.AddAfterLogic(ChConfig.AfterLogic_TriggerAddBuff, [ChConfig.TriggerWay_AddDOTBuff, batObj, buff, buffOwner])
|
| | | |
| | | return buff
|
| | |
|
| | | def IsControlledHardState(state):
|
| | |
| | | relatedSkillID = useSkill.GetSkillID()
|
| | | delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
|
| | | beControlledHardDict = {} # 受控目标 {objID:buff, ...}
|
| | | beDotBuffDict = {} # 被添加dot的目标 {objID:buff, ...}
|
| | | afterLogicList = useSkill.GetAfterLogicList()
|
| | | for logicType, logicData in afterLogicList:
|
| | | if logicType == ChConfig.AfterLogic_DelBuff:
|
| | |
| | | if buffOwner.GetID() == curID:
|
| | | if triggerType == ChConfig.TriggerWay_BeControlledHard:
|
| | | beControlledHardDict[batObj.GetID()] = buff
|
| | | elif triggerType == ChConfig.TriggerWay_AddDOTBuff:
|
| | | beDotBuffDict[batObj.GetID()] = buff
|
| | |
|
| | | # 统计击杀
|
| | | killObjList = [] # 击杀其他阵营目标列表
|
| | |
| | | isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
|
| | | curBatLineup = curObj.GetTFBatLineup()
|
| | | curMGObj = curBatLineup.getMinggeObj()
|
| | | mgTriggerWayList = [] # 命格本次技能已触发方式列表,命格固定只触发一次
|
| | | for tagObj in tagObjListAll:
|
| | | tagID = tagObj.GetID()
|
| | |
|
| | |
| | | if tagID in beControlledHardDict:
|
| | | buff = beControlledHardDict[tagID]
|
| | | if buff.GetCurBuffState() == ChConfig.BatObjState_Frozen:
|
| | | if curMGObj:
|
| | | if curMGObj and ChConfig.TriggerWay_Frozen not in mgTriggerWayList:
|
| | | mgTriggerWayList.append(ChConfig.TriggerWay_Frozen)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Frozen, tagObj, connSkill=useSkill, byBatObj=curObj)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeControlledHard, curObj, connSkill=useSkill, connBuff=buff)
|
| | |
|
| | | # 附加dot
|
| | | if tagID in beDotBuffDict:
|
| | | if curMGObj and ChConfig.TriggerWay_AddDOTBuff not in mgTriggerWayList:
|
| | | mgTriggerWayList.append(ChConfig.TriggerWay_AddDOTBuff)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_AddDOTBuff, tagObj, connSkill=useSkill, byBatObj=curObj)
|
| | | |
| | | # 暴击
|
| | | if tagID in superHitObjIDList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill)
|
| | |
| | | elif batType == ChConfig.TurnBattleType_Pursue:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Pursue, tagObj, connSkill=useSkill)
|
| | | if isAttackDirect:
|
| | | if curMGObj:
|
| | | if curMGObj and ChConfig.TriggerWay_PursueAtk not in mgTriggerWayList:
|
| | | mgTriggerWayList.append(ChConfig.TriggerWay_PursueAtk)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_PursueAtk, tagObj, connSkill=useSkill, byBatObj=curObj)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
|
| | | # 反击
|
| | |
| | | @param effectID: 被动效果ID
|
| | | 注:可能由A引起触发B技能的效果释放技能C
|
| | | '''
|
| | | if not passiveSkill:
|
| | | if not passiveSkill or not batObj:
|
| | | return
|
| | | if isinstance(passiveSkill, int):
|
| | | passiveSkillID = passiveSkill
|
| | |
| | | useSkill.ResetUseRec()
|
| | | return
|
| | |
|
| | | def DoHurtExAtk(turnFight, atkObj, defObj, hurtValue, skillID, hurtTypes=0):
|
| | | ## 额外结算指定伤害
|
| | | skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
|
| | | if not skillIpyData:
|
| | | return
|
| | | |
| | | atkID = atkObj.GetID()
|
| | | defID = defObj.GetID()
|
| | | |
| | | # 结算需要同步标签
|
| | | useTag = "Skill_%s_%s_Dot_%s" % (atkID, skillID, atkObj.GetIncrementValue()) # 复用dot的标签
|
| | | Sync_TurnFightTag(turnFight, useTag, 0)
|
| | | |
| | | dHP = defObj.GetHP()
|
| | | dMaxHP = defObj.GetMaxHP()
|
| | | GameWorld.DebugLogEx("额外结算指定伤害: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,,dHP=%s/%s", |
| | | atkID, defID, skillID, hurtValue, dHP, dMaxHP)
|
| | | |
| | | useSkill = BattleObj.PySkill(skillIpyData, atkID)
|
| | | useSkill.SetTagObjList([defObj])
|
| | | useSkill.SetBatType(ChConfig.TurnBattleType_Dot) # 要修改表现的话等前端同步修改
|
| | | |
| | | hurtTypes |= pow(2, ChConfig.HurtAtkType_Hurt) # 确保有基础的伤害类型
|
| | | hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
|
| | | calcHurtResults = [[defObj, hurtValue, hurtTypes, immuneHurt]]
|
| | | DoSkillHurtHP(turnFight, atkObj, useSkill, calcHurtResults, "HurtExAtk")
|
| | | |
| | | Sync_UseSkill(turnFight, atkObj, useSkill)
|
| | | |
| | | DoBeAttackResult(turnFight, atkObj, useSkill)
|
| | | |
| | | # 通知结束标签
|
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|
| | | |
| | | useSkill.ResetUseRec()
|
| | | return True
|
| | |
|
| | | def Sync_TurnFightTag(turnFight, useTag, sign):
|
| | | ## 通知技能标签
|
| | | clientPack = ChPyNetSendPack.tagSCTurnFightTag()
|