129 【战斗】战斗系统-服务端(刘备所有技能;增加触发方式54-不死时,支持不死逻辑;增加效果6032;5022效果增加计算规则102;5507效果支持复活触发来源友军;)
| | |
| | | self._batObj = batObj
|
| | | self._objID = batObj.GetID() if batObj else 0
|
| | | self._skillIDList = [] # 已有技能ID列表,获取被动中快速判断已学技能用
|
| | | self.noDeadSkill = None # 不死技能效果,暂时只支持最多1个这种技能
|
| | |
|
| | | # 技能
|
| | | self._AffectSkillDict = {} # 被动技能 {(触发方式, 有效来源):{技能ID:[effID, ...], ...}, ...}
|
| | |
| | | effDict[skillID].append(effectID)
|
| | | if triggerWay not in self._skillTriggerWayList:
|
| | | self._skillTriggerWayList.append(triggerWay)
|
| | | |
| | | # 加载不死技能效果
|
| | | if triggerWay == ChConfig.TriggerWay_NoDead:
|
| | | self.noDeadSkill = curSkill
|
| | | |
| | | return
|
| | |
|
| | | def RefreshBuffPassiveEffect(self):
|
| | |
| | | return False
|
| | | return True
|
| | |
|
| | | def CanNoDead(self):
|
| | | '''是否还可触发不死效果
|
| | | 暂定单个武将最多只支持配置1个不死效果,且单场战斗最多触发x次,即按技能cd判断即可
|
| | | '''
|
| | | noDeadSkill = self._passiveEffMgr.noDeadSkill # 固定有被动触发
|
| | | if not noDeadSkill:
|
| | | return
|
| | | if noDeadSkill.GetRemainTime():
|
| | | return
|
| | | return True
|
| | | |
| | | def GetSneerTagObj(self):
|
| | | ## 获取被嘲讽的目标,如果存在则一定是活着的目标
|
| | | buffIDList = self._buffMgr.GetStateBuffIDList(ChConfig.BatObjState_Sneer)
|
| | |
| | | TriggerWay_FriendAttackOverDirectOneNoSelf, # 友方使用技能后(多目标仅触发一次,不含自己) 51
|
| | | TriggerWay_DOTHurt, # 造成持续伤害时 52
|
| | | TriggerWay_FriendDotHurt, # 友方造成持续伤害时(多目标仅触发一次,包含自己) 53
|
| | | ) = range(1, 1 + 53)
|
| | | TriggerWay_NoDead, # 不时死(有配置该触发方式的视为有不死,触发死亡时不死保留1点血量) 54
|
| | | ) = range(1, 1 + 54)
|
| | |
|
| | | # 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
|
| | | TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
|
| | |
| | | PassiveEff_AddBatDamPerByLayer = 6029 # 提升技能战斗伤害(根据身上buff状态层数)
|
| | | PassiveEff_LostHPProtect = 6030 # 掉血上限保护
|
| | | PassiveEff_ImmuneControlDepBuff = 6031 # 某种buff状态层达到x时免疫减益控制效果
|
| | | PassiveEff_AddCureMultiBySkillType = 6032 # 提升治疗技能最终治疗效果(根据目标buff类型层数)
|
| | |
|
| | | # 被动效果ID有触发值时就返回的
|
| | | PassiveEffHappenValueList = [PassiveEff_ChangeHurtType, PassiveEff_ImmuneControlBuff, PassiveEff_MustSuperHit, PassiveEff_SkillInvalid,
|
| | |
| | | effEx2 = curEffect.GetEffectValue(1) # 支持多个属性
|
| | | calcRule = curEffect.GetEffectValue(2) # 附加计算规则,没配置默认增加固定值
|
| | |
|
| | | effExAdd = [0, 0, 0] # 某种条件下再额外效果值组 [buff效果ID/属性ID, 值, 计算方式]
|
| | | calcLayer = 1 # 没配置的默认1层,相当于固定值
|
| | | if calcRule:
|
| | | ruleType = calcRule[0]
|
| | |
| | | if tagObj.GetSex() != onlySex:
|
| | | GameWorld.DebugLogEx("5022额外buff对该性别无效: ruleType=%s,onlySex=%s,tagSex=%s,tagID=%s", ruleType, onlySex, tagObj.GetSex(), tagObj.GetID())
|
| | | return
|
| | | |
| | | # 102 - 同国武将额外提升 参数1:额外提升值
|
| | | elif ruleType == 102:
|
| | | if batObj.GetCountry() == tagObj.GetCountry() and len(calcRule) == 4:
|
| | | effExAdd = calcRule[1:]
|
| | | GameWorld.DebugLogEx("同国武将再额外buff属性: ruleType=%s,country=%s,effExAdd=%s", ruleType, tagObj.GetCountry(), effExAdd)
|
| | | |
| | | if calcLayer <= 0:
|
| | | return
|
| | |
|
| | | for effEX in [effEx1, effEx2]:
|
| | | for effEX in [effEx1, effEx2, effExAdd]:
|
| | | if not isinstance(effEX, list) or len(effEX) != 3:
|
| | | continue
|
| | | attrID, attrValue, calcType = effEX
|
| | | if not attrID or not attrValue:
|
| | | continue
|
| | | if calcLayer > 1:
|
| | | attrValue = int(attrValue * calcLayer)
|
| | | GameWorld.DebugLogEx("额外buff效果ID/属性ID值: attrID=%s,attrValue=%s,calcType=%s", attrID, attrValue, calcType)
|
| | |
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
|
| | |
|
| | | passiveSkillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
|
| | | effHeroID = curEffect.GetEffectValue(1) # 指定目标武将ID
|
| | | effHeroID = curEffect.GetEffectValue(1) # 指定目标武将ID,0时为来源友军目标
|
| | | costHPPer = curEffect.GetEffectValue(2) # 可附加消耗自身血量百分比,配0不消耗,大于0血量不足时不释放
|
| | | searchFrom = curEffect.GetEffectValue(3) # 目标武将ID是否从阵容中搜索
|
| | |
|
| | | tagHero = tagObj
|
| | | if searchFrom:
|
| | | batLineup = batObj.GetBatLineup()
|
| | | tagHero = batLineup.getHeroObj(effHeroID)
|
| | | if effHeroID:
|
| | | if searchFrom:
|
| | | batLineup = batObj.GetBatLineup()
|
| | | tagHero = batLineup.getHeroObj(effHeroID)
|
| | | |
| | | if not tagHero:
|
| | | return
|
| | |
|
| | | if not effHeroID or not tagHero:
|
| | | return
|
| | | |
| | | tagHeroID = tagHero.GetHeroID()
|
| | | if tagHeroID != effHeroID:
|
| | | GameWorld.DebugLogEx("5507非目标武将死亡不处理! tagHeroID=%s,effHeroID=%s", tagHeroID, effHeroID)
|
| | | return
|
| | | |
| | | if tagHero.IsAlive():
|
| | | return
|
| | | |
| | | tagHeroID = tagHero.GetHeroID()
|
| | | if tagHeroID != effHeroID:
|
| | | #GameWorld.DebugLogEx("5507非目标武将死亡不处理! tagHeroID=%s,effHeroID=%s", tagHeroID, effHeroID)
|
| | | return
|
| | |
|
| | | if not passiveSkillID:
|
| | |
| | | GameWorld.DebugLogEx("5507目标被禁止复活不处理! tagHeroID=%s", tagHeroID)
|
| | | return
|
| | |
|
| | | tagHeroID = tagHero.GetHeroID()
|
| | | tagID = tagHero.GetID()
|
| | | if costHPPer:
|
| | | curHP = batObj.GetHP()
|
| | |
| | | if curHP < costHP:
|
| | | GameWorld.DebugLogEx("5507自身血量不足,无法复活对方! curHP=%s/%s,costHPPer=%s,costHP=%s", curHP, maxHP, costHPPer, costHP)
|
| | | return
|
| | | GameWorld.DebugLogEx("5507扣血复活指定目标! curHP=%s/%s,costHPPer=%s,costHP=%s,tagHeroID=%s,tagID=%s", curHP, maxHP, costHPPer, costHP, tagHeroID, tagID)
|
| | | batObj.SetHP(max(1, curHP - costHP), True) # 直接扣除
|
| | | updHP = curHP - costHP
|
| | | GameWorld.DebugLogEx("5507扣血复活指定目标! curHP=%s/%s,costHPPer=%s,costHP=%s,updHP=%s,tagHeroID=%s,tagID=%s", curHP, maxHP, costHPPer, costHP, updHP, tagHeroID, tagID)
|
| | | batObj.SetHP(updHP, True) # 直接扣除
|
| | | else:
|
| | | GameWorld.DebugLogEx("5507直接复活指定目标! tagHeroID=%s,tagID=%s,searchFrom=%s", tagHeroID, tagID, searchFrom)
|
| | |
|
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_6032
|
| | | #
|
| | | # @todo:提升治疗技能最终治疗效果(根据目标buff类型层数)
|
| | | # @author hxp
|
| | | # @date 2025-12-24
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 提升治疗技能最终治疗效果(根据目标buff类型层数)
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-12-24 13:50"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | def GetHappenValue(attacker, defender, curEffect, effSkill, effBuff, connSkill, **skillkwargs):
|
| | | addPerLayer = curEffect.GetEffectValue(0) # 每层提升百分比
|
| | | skillTypeList = curEffect.GetEffectValue(1) # 目标buff类型[类型1, 2, ...]
|
| | | |
| | | layerTotal = 0
|
| | | buffMgr = defender.GetBuffManager()
|
| | | for index in range(buffMgr.GetBuffCount()):
|
| | | buff = buffMgr.GetBuffByIndex(index)
|
| | | skillData = buff.GetSkillData()
|
| | | if skillData.GetSkillType() not in skillTypeList:
|
| | | continue
|
| | | layerTotal += max(1, buff.GetLayer())
|
| | | |
| | | return layerTotal * addPerLayer
|
| | |
| | | # 统计击杀
|
| | | killObjList = [] # 击杀其他阵营目标列表
|
| | | dieObjList = [] # 死亡的单位列表,包含友方单位或自己
|
| | | nodeadObjList = [] # 不死的单位列表
|
| | | tagObjList = useSkill.GetTagObjList() # 主要目标列表
|
| | | tagObjListEx = useSkill.GetTagObjListEx() # 额外目标列表
|
| | | tagObjListAll = tagObjList + tagObjListEx
|
| | | for tagObj in tagObjListAll:
|
| | | tagID = tagObj.GetID()
|
| | | if tagObj.IsAlive() and tagObj.GetHP() <= 0:
|
| | | dieObjList.append(tagObj)
|
| | | if tagObj.GetFaction() != curObj.GetFaction():
|
| | | killObjList.append(tagObj)
|
| | | TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
|
| | | if tagObj.CanNoDead():
|
| | | tagObj.SetHP(1, True) # 触发不死,保留1点血量
|
| | | nodeadObjList.append(tagObj)
|
| | | else:
|
| | | dieObjList.append(tagObj)
|
| | | if tagObj.GetFaction() != curObj.GetFaction():
|
| | | killObjList.append(tagObj)
|
| | | TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
|
| | | useSkill.SetKillObjList(killObjList)
|
| | |
|
| | | # 统计伤血,可能单个技能对同一目标造成多次伤害
|
| | |
| | |
|
| | | # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
|
| | | if curObj.IsAlive() and curObj.GetHP() <= 0:
|
| | | dieObjList.append(curObj)
|
| | | killer = bounceObjList[0] if bounceObjList else None
|
| | | TurnAttack.SetObjKilled(turnFight, curObj, killer)
|
| | | if curObj.CanNoDead():
|
| | | curObj.SetHP(1, True) # 触发不死,保留1点血量
|
| | | nodeadObjList.append(curObj)
|
| | | else:
|
| | | dieObjList.append(curObj)
|
| | | killer = bounceObjList[0] if bounceObjList else None
|
| | | TurnAttack.SetObjKilled(turnFight, curObj, killer)
|
| | |
|
| | | # 记录最后一次总伤害,有伤害目标才记录
|
| | | if totalHurtValue:
|
| | |
| | | # 己方单位死亡时
|
| | | else:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill, byFriendObj=dieObj)
|
| | | |
| | | |
| | | # 触发不死
|
| | | for tagObj in nodeadObjList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_NoDead, curObj, connSkill=useSkill)
|
| | | |
| | | # 复活时
|
| | | for tagObj in reviveObjList:
|
| | | # 同步最新的怒气及buff,血量已经在技能中通知了
|
| | |
| | | cureHP += cureHPEx
|
| | | GameWorld.DebugLogEx(" 额外治疗值(%s): cureType=%s,baseValue=%s,skillPer=%s,cureHP=%s", cureHPEx, cureType, baseValue, skillPer, cureHP)
|
| | |
|
| | | addCureMulti = TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddCureMultiBySkillType, curSkill)
|
| | | if addCureMulti:
|
| | | multiValue += addCureMulti / 100.0
|
| | | if multiValue and multiValue != 1:
|
| | | cureHP = int(cureHP * multiValue)
|
| | | GameWorld.DebugLogEx(" 治疗倍值: cureHP=%s,multiValue=%s", cureHP, multiValue)
|