129 【战斗】战斗系统-服务端(甄姬、曹操技能;增加本次技能万分比效果ID6004;)
| | |
| | | self._AffectBuffDict = {} # 被动buff {(触发方式, 有效来源):{buffID:[effID, ...], ...}, ...}
|
| | | return
|
| | |
|
| | | def GetPassiveEffByTrigger(self, triggerWay, connSkillTypeID=0):
|
| | | def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0):
|
| | | '''获取可触发的效果列表,技能跟buff根据触发优先级按顺序触发,优先级越高越先执行,相同时技能优先
|
| | | 优先级之后有需要再扩展
|
| | | @return: [["skill/buff", skillID/buffID, effIDList], ...]
|
| | | '''
|
| | | effList = []
|
| | |
|
| | | if not connSkillTypeID and connSkill:
|
| | | connSkillTypeID = connSkill.GetSkillTypeID()
|
| | | |
| | | if connSkill:
|
| | | skillID = connSkill.GetSkillID()
|
| | | skillManager = self._batObj.GetSkillManager()
|
| | | # 非对象身上的技能,读取本技能被动触发的效果,一般是主技能拆分的子技能
|
| | | if not skillManager.FindSkillByID(skillID):
|
| | | effIDList = []
|
| | | for index in xrange(connSkill.GetEffectCount()):
|
| | | effect = connSkill.GetEffect(index)
|
| | | effectID = effect.GetEffectID()
|
| | | if effectID == 0:
|
| | | continue
|
| | | triggerWay = effect.GetTriggerWay()
|
| | | triggerSrc = effect.GetTriggerSrc()
|
| | | if not triggerWay:
|
| | | continue
|
| | | if triggerWay == ChConfig.TriggerWay_CurSkillEff:
|
| | | continue
|
| | | if triggerSrc != ChConfig.TriggerSrc_SkillSelf:
|
| | | # 仅添加本技能的
|
| | | continue
|
| | | effIDList.append(effectID)
|
| | | if effIDList:
|
| | | effList.append(["skill", skillID, effIDList])
|
| | | |
| | | # 优先取关联技能的
|
| | | if connSkillTypeID and connSkillTypeID not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_SkillSelf, ChConfig.TriggerSrc_BuffSelf]:
|
| | | # 技能
|
| | |
| | | self._buffMgr = ObjPool.GetPoolMgr().acquire(BuffManager, self)
|
| | | self._passiveEffMgr = ObjPool.GetPoolMgr().acquire(PassiveEffManager, self)
|
| | | self._lastHurtValue = 0
|
| | | self._mainTagIDList = [] # 主技能目标ID列表,一般用于技能拆分成多个技能效果时,子技能可能会用到主技能的对象做逻辑
|
| | |
|
| | | # 统计
|
| | | self.hurtStat = 0 # 输出统计
|
| | |
| | | def GetLastHurtValue(self): return self._lastHurtValue
|
| | | def SetLastHurtValue(self, lastHurtValue): self._lastHurtValue = lastHurtValue
|
| | |
|
| | | def GetMainTagIDList(self): return self._mainTagIDList
|
| | | def SetMainTagIDList(self, mainTagIDList): self._mainTagIDList = mainTagIDList
|
| | | |
| | | def StatHurtValue(self, hurtValue):
|
| | | ## 统计输出
|
| | | self.hurtStat += hurtValue
|
| | |
| | | PassiveEff_AddBuffLayerByWeight = 6001 # 根据权重随机添加buff层数 数值1-[[权重,层级], ...]
|
| | | PassiveEff_ChangeHurtType = 6002 # 变更伤害类型: 值1-伤害类型;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
|
| | | PassiveEff_ChangeHurtMulti = 6003 # 变更伤害倍值(可增可减): 值1-变更倍值;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
|
| | | PassiveEff_AddSkillPer = 6004 # 增加本次技能万分比: 值1-增加的万分比;值2-可附加验证处于xx状态 [状态1, 状态2, ...]
|
| | |
|
| | | # 被动效果ID有触发值时就返回的
|
| | | PassiveEffHappenValueList = [PassiveEff_ChangeHurtType]
|
| New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_6004
|
| | | #
|
| | | # @todo:增加本次技能万分比
|
| | | # @author hxp
|
| | | # @date 2025-09-17
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 增加本次技能万分比
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-09-17 17:30"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import BattleObj
|
| | | #import GameWorld
|
| | |
|
| | | def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
|
| | | checkInStateList = curEffect.GetEffectValue(1)
|
| | | if checkInStateList:
|
| | | checkMainSkillTag = curEffect.GetEffectValue(2)
|
| | | if checkMainSkillTag:
|
| | | inState = False
|
| | | objMgr = BattleObj.GetBatObjMgr()
|
| | | for tagID in attacker.GetMainTagIDList():
|
| | | tagObj = objMgr.getBatObj(tagID)
|
| | | if tagObj.CheckInState(checkInStateList):
|
| | | inState = True
|
| | | #GameWorld.DebugLog("主技能的目标在状态中! tagID=%s,%s" % (tagID, checkInStateList))
|
| | | break
|
| | | if not inState:
|
| | | #GameWorld.DebugLog("主技能的目标都不在状态中! tagID=%s,%s" % (attacker.GetMainTagIDList(), checkInStateList))
|
| | | return
|
| | | else:
|
| | | if not defender.CheckInState(checkInStateList):
|
| | | return
|
| | | return curEffect.GetEffectValue(0)
|
| | |
| | | ''' 触发被动效果,可能触发技能、buff,需根据优先级触发
|
| | | '''
|
| | | passiveEffMgr = batObj.GetPassiveEffManager()
|
| | | if not connSkillTypeID and connSkill:
|
| | | connSkillTypeID = connSkill.GetSkillTypeID()
|
| | | effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkillTypeID)
|
| | | effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID)
|
| | | if not effInfoList:
|
| | | return
|
| | | # [["skill/buff", skillID/buffID, effIDList], ...]
|
| | |
| | | def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None):
|
| | | skillMgr = batObj.GetSkillManager()
|
| | | effSkill = skillMgr.FindSkillByID(skillID)
|
| | | if not effSkill and connSkill and connSkill.GetSkillID() == skillID:
|
| | | effSkill = connSkill
|
| | | if not effSkill:
|
| | | return
|
| | |
|
| | |
| | |
|
| | | triggerWay = ChConfig.TriggerWay_CalcEffValue
|
| | | passiveEffMgr = atkObj.GetPassiveEffManager()
|
| | | connSkillTypeID = connSkill.GetSkillTypeID() if connSkill else 0
|
| | | effInfoList = passiveEffMgr.GetPassiveEffByTrigger("%s_%s" % (triggerWay, calcEffID), connSkillTypeID)
|
| | | effInfoList = passiveEffMgr.GetPassiveEffByTrigger("%s_%s" % (triggerWay, calcEffID), connSkill)
|
| | | if not effInfoList:
|
| | | return 0
|
| | |
|
| | |
| | | if sign == "skill":
|
| | | skillID, effIDList = effInfo[1:]
|
| | | effSkill = skillMgr.FindSkillByID(skillID)
|
| | | if not effSkill and connSkill and connSkill.GetSkillID() == skillID:
|
| | | effSkill = connSkill
|
| | | elif sign == "buff":
|
| | | buffID, effIDList = effInfo[1:]
|
| | | effBuff = buffMgr.GetBuff(buffID)
|
| | |
| | | useSkill.SetBySkill(bySkill)
|
| | |
|
| | | curBatObj.ClearSkillTempAttr()
|
| | | tagIDList = []
|
| | | for tagObj in tagObjList:
|
| | | tagIDList.append(tagObj.GetID())
|
| | | tagObj.ClearSkillTempAttr()
|
| | | |
| | | # 有功能分类的技能都认为是主技能
|
| | | if useSkill.GetFuncType():
|
| | | curBatObj.SetMainTagIDList(tagIDList)
|
| | |
|
| | | objID = curBatObj.GetID()
|
| | | useTag = ""
|
| | |
| | |
|
| | | skillID = useSkill.GetSkillID()
|
| | | for tagBatObj in useSkill.GetTagObjList():
|
| | | cureHP = CalcCureHP(curBatObj, tagBatObj, useSkill, largeNum=True)
|
| | | cureHP = CalcCureHP(turnFight, curBatObj, tagBatObj, useSkill, largeNum=True)
|
| | | if cureHP <= 0:
|
| | | continue
|
| | |
|
| | |
| | | continue
|
| | |
|
| | | effID = curEffect.GetEffectID()
|
| | | GameWorld.DebugLog("执行额外技能效果: %s, triggerWay=%s,missObjIDList=%s" % (effID, triggerWay, missObjIDList))
|
| | | GameWorld.DebugLog("◆执行额外技能效果: %s, triggerWay=%s,missObjIDList=%s" % (effID, triggerWay, missObjIDList))
|
| | | if effID == 5010:
|
| | | # 额外技能效果
|
| | | __doUseEnhanceSkill(turnFight, curObj, useSkill, curEffect, missObjIDList)
|
| | |
| | | dHP = defObj.GetHP()
|
| | | dDef = 0 if ignoreDef else defObj.GetDef() # 防守方防御力
|
| | |
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
|
| | | |
| | | aFinalDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPer) # 最终加成
|
| | | dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤
|
| | |
|
| | |
| | | TurnAttack.AddTurnObjCureHP(atkObj, atkObj, suckHP, cureHP)
|
| | | return
|
| | |
|
| | | def CalcCureHP(userObj, tagObj, curSkill, largeNum=False):
|
| | | def CalcCureHP(turnFight, userObj, tagObj, curSkill, largeNum=False):
|
| | | ''' 计算治疗值
|
| | | '''
|
| | | cureType = curSkill.GetCalcType()
|
| | |
| | |
|
| | | cureBaseValue = GetCalcBaseValue(cureType, userObj, tagObj)
|
| | |
|
| | | #skillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(userObj, None, curSkill, ChConfig.TriggerType_AddHP)
|
| | | skillPer += TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
|
| | |
|
| | | # 回合制
|
| | | curePer = 0 # 治疗加成
|