129 【战斗】战斗系统-服务端(张星彩怒技,觉醒技能;增加buff消失后触发时机;增加效果6007 6008 7001 7002;技能友好目标增加类型2:一定包含自己的友方单位)
| | |
| | | self._AffectBuffDict = {} # 被动buff {(触发方式, 有效来源):{buffID:[effID, ...], ...}, ...}
|
| | | return
|
| | |
|
| | | def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0):
|
| | | def GetPassiveEffByTrigger(self, triggerWay, connSkill=None, connSkillTypeID=0, connBuff=None):
|
| | | '''获取可触发的效果列表,技能跟buff根据触发优先级按顺序触发,优先级越高越先执行,相同时技能优先
|
| | | 优先级之后有需要再扩展
|
| | | @return: [["skill/buff", skillID/buffID, effIDList], ...]
|
| | | '''
|
| | | effList = []
|
| | |
|
| | | if not connSkillTypeID and connSkill:
|
| | | connSkillTypeID = connSkill.GetSkillTypeID()
|
| | | |
| | | if connSkill and self._batObj.GetID() == connSkill.GetObjID():
|
| | | if not connSkillTypeID:
|
| | | if connSkill:
|
| | | connSkillTypeID = connSkill.GetSkillTypeID()
|
| | | elif connBuff:
|
| | | skillData = connBuff.GetSkillData()
|
| | | connSkillTypeID = skillData.GetSkillTypeID()
|
| | | |
| | | # SkillData 对象暂时没有 GetObjID
|
| | | if connSkill and hasattr(connSkill, "GetObjID") and self._batObj.GetID() == connSkill.GetObjID():
|
| | | skillID = connSkill.GetSkillID()
|
| | | skillManager = self._batObj.GetSkillManager()
|
| | | # 非对象身上的技能,读取本技能被动触发的效果,一般是主技能拆分的子技能
|
| | |
| | | triggerSrc = effect.GetTriggerSrc()
|
| | | if not triggerWay:
|
| | | continue
|
| | | if triggerWay == ChConfig.TriggerWay_CurSkillEff:
|
| | | if triggerWay in ChConfig.TriggerWayNoLoadList:
|
| | | continue
|
| | | if triggerSrc != ChConfig.TriggerSrc_SkillSelf:
|
| | | # 仅添加本技能的
|
| | |
| | | triggerSrc = effect.GetTriggerSrc()
|
| | | if not triggerWay:
|
| | | return
|
| | | if triggerWay == ChConfig.TriggerWay_CurSkillEff:
|
| | | if triggerWay in ChConfig.TriggerWayNoLoadList:
|
| | | return
|
| | | if triggerSrc in [ChConfig.TriggerSrc_Buff, ChConfig.TriggerSrc_BuffSelf]:
|
| | | # buff有效的不加进来
|
| | |
| | | triggerSrc = effect.GetTriggerSrc()
|
| | | if not triggerWay:
|
| | | return
|
| | | if triggerWay == ChConfig.TriggerWay_CurSkillEff:
|
| | | if triggerWay in ChConfig.TriggerWayNoLoadList:
|
| | | return
|
| | | if triggerSrc in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
|
| | | # 技能有效的不加进来
|
| | |
| | | def GetTriggerWay(self): return self._triggerWay
|
| | | def GetTriggerSrc(self): return self._triggerSrc
|
| | | #def GetTriggerParams(self, index): return self._triggerParams[index] if len(self._triggerParams) > index else 0
|
| | | |
| | | EmptyEffect = SkillEffect(0, [])
|
| | |
|
| | | class SklllData():
|
| | |
|
| | |
| | | def GetHappenRate(self): return self._ipyData.GetHappenRate() # 触发概率
|
| | | def GetEffect(self, index): return self._effList[index] if len(self._effList) > index else 0
|
| | | def GetEffectCount(self): return len(self._effList)
|
| | | def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), EmptyEffect)
|
| | | def GetEffectByID(self, effID, triggerWay=0): return self._effDict.get((effID, triggerWay), None)
|
| | | def GetConnSkill(self): return self._ipyData.GetConnSkill()
|
| | | def GetCoolDownTime(self): return self._ipyData.GetCoolDownTime()
|
| | | def GetIgnoreStates(self): return self._ipyData.GetIgnoreStates() # 无视限制列表
|
| | |
| | | self._tagObjList = [] # 本次技能目标列表 [BatObj, ...]
|
| | | self._hurtList = [] # 本次伤血列表,可能同一个对象有多个伤害,如弹射等 [HurtObj, ...]
|
| | | self._bySkill = None # 由哪个技能触发的
|
| | | self._byBuff = None # 由哪个buff触发的
|
| | | self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
|
| | |
|
| | | # 连击相关
|
| | |
| | | self._batType = 0
|
| | | self._tagObjList = []
|
| | | self._bySkill = None
|
| | | self._byBuff = None
|
| | | self._afterLogicList = []
|
| | | self.ClearHurtObj()
|
| | | return
|
| | |
| | | def SetBatType(self, batType): self._batType = batType
|
| | | def GetBySkill(self): return self._bySkill
|
| | | def SetBySkill(self, bySkill): self._bySkill = bySkill
|
| | | def GetByBuff(self): return self._byBuff
|
| | | def SetByBuff(self, byBuff): self._byBuff = byBuff
|
| | | def GetTagObjList(self): return self._tagObjList # 技能目标列表
|
| | | def SetTagObjList(self, tagObjList): self._tagObjList = tagObjList
|
| | | def GetAfterLogicList(self): return self._afterLogicList
|
| | |
| | | #GameWorld.DebugLog(" 永久buff不处理! curID=%s,index=%s,skillID=%s" % (curID, index, skillID))
|
| | | continue
|
| | | calcTimeline = buff.GetCalcTime()
|
| | | passTurn = __calcPassturn(calcTimeline, nowTimeline, False)
|
| | | passTurn = __calcPassturn(calcTimeline, nowTimeline, True)
|
| | | if passTurn <= 0:
|
| | | #GameWorld.DebugLog(" passTurn <= 0 passTurn=%s,calcTimeline=%s,nowTimeline=%s,skillID=%s" % (passTurn, calcTimeline, nowTimeline, skillID))
|
| | | continue
|
| | |
| | |
|
| | | def __calcPassturn(calcTimeline, nowTimeline, equalOK):
|
| | | ## 计算已经过了的回合数
|
| | | # @param equalOK: 时间节点相同时是否算1回合,一般技能可以算,buff不算
|
| | | # @param equalOK: 时间节点相同时是否算1回合,一般技能可以算,buff可算可不算,具体看需求调整
|
| | | calcTurnNum = calcTimeline / TimelineSet
|
| | | calcTimeNode = calcTimeline % TimelineSet
|
| | | nowTurnNum = nowTimeline / TimelineSet
|
| | |
| | | Def_Calc_MaxHP, # 最大生命值 1
|
| | | Def_Calc_LastHurt, # 最后一次伤害值 2
|
| | | Def_Calc_TagMaxHP, # 目标最大生命值 3
|
| | | ) = range(4)
|
| | | Def_Calc_ByBuffValue, # 触发buff的buff值 4
|
| | | ) = range(5)
|
| | |
|
| | | #治疗类型(影响公式参数)
|
| | | Def_CureTypeList = (
|
| | |
| | | TriggerWay_CurSkillEffLst, # 本持续buff结算后额外触发效果,仅该持续buff结算后有效 14
|
| | | TriggerWay_KillOneObj, # 击杀目标后(单次击杀多目标只触发一次) 15
|
| | | TriggerWay_KillTagObj, # 击杀每目标后(单次击杀多目标每个目标触发一次) 16
|
| | | ) = range(1, 1 + 16)
|
| | | TriggerWay_BuffDel, # buff消失后 17
|
| | | ) = range(1, 1 + 17)
|
| | |
|
| | | # 不加载的被动触发方式,一般用于本技能固定触发逻辑用的
|
| | | TriggerWayNoLoadList = [TriggerWay_CurSkillEff, TriggerWay_CurSkillEffLst]
|
| | |
|
| | | # 被动触发有效来源
|
| | | TriggerSrc_Skill = 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, ...]
|
| | | PassiveEff_AddSkillTagCnt = 6007 # 增加技能目标数:值1-增加目标个数
|
| | | PassiveEff_ImmuneControlBuff = 6008 # 生命值低于x%时免疫控制效果:值1-百分比
|
| | |
|
| | | # 被动效果ID有触发值时就返回的
|
| | | PassiveEffHappenValueList = [PassiveEff_ChangeHurtType]
|
| | |
| | | PassiveEffValueMaxList = []
|
| | | # 被动效果ID触发值取最小值的
|
| | | PassiveEffValueMinList = []
|
| | |
|
| | | # 技能效果 - 不需要配置触发方式的
|
| | | SkillEff_CureWayEx = 7001 # 额外治疗值计算(对CalcType、SkillPer治疗计算方式扩展): 值1-计算方式;值2-万分比
|
| | | SkillEff_HurtShare = 7002 # 均摊伤害
|
| | |
|
| | | (
|
| | | TriggerType_BeSuperHit, # 被暴击触发技能 1
|
| | |
| | | TriggerType_ThumpSkillValue, # 重击增加技能固定值伤害 88
|
| | | TriggerType_HitValue, # 记录命中个数 89
|
| | | TriggerType_ChangeSkillEff, # 改变技能特效广播 90
|
| | | ) = range(1, 91)
|
| | | ) = range(1001, 1091)
|
| | |
|
| | |
|
| | | #不可以佩戴翅膀的地图
|
| | |
| | |
|
| | | import TurnBuff
|
| | |
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
|
| | | #结算一次扣除1回合
|
| | | remainTime = max(0, effBuff.GetRemainTime() - 1)
|
| | | effBuff.SetRemainTime(remainTime)
|
| | |
| | | import IpyGameDataPY
|
| | | import TurnSkill
|
| | |
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
|
| | | effectID = curEffect.GetEffectID()
|
| | | buffState = curEffect.GetEffectValue(0)
|
| | | needLayers = curEffect.GetEffectValue(1) # 累计达到多少层时才结算
|
| | |
| | |
|
| | | import TurnBuff
|
| | |
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
|
| | | #结算一次扣除1回合
|
| | | remainLayer = max(0, effBuff.GetLayer() - 1)
|
| | | effBuff.SetLayer(remainLayer)
|
| | |
| | | import TurnSkill
|
| | | import IpyGameDataPY
|
| | |
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
|
| | | skillID = curEffect.GetEffectValue(0) # 技能ID,为0时释放本技能
|
| | | if not skillID:
|
| | | passiveSkill = effSkill
|
| | |
| | | return
|
| | | effectID = curEffect.GetEffectID()
|
| | | effSkillID = effSkill.GetSkillID()
|
| | | return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID)
|
| | | return TurnSkill.OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill, effSkillID, effectID, connBuff)
|
| | |
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
|
| | | effSkill = effBuff.GetSkillData().GetIpyData()
|
| | | return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
|
| | | return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
|
| | |
| | | import GameWorld
|
| | | import ChConfig
|
| | |
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs):
|
| | | rate = curEffect.GetEffectValue(0)
|
| | | if not GameWorld.CanHappen(rate):
|
| | | #GameWorld.DebugLog("概率进行追击不触发!")
|
| | |
| | | passiveSkill = IpyGameDataPY.GetIpyGameData("Skill", skillID)
|
| | | if not passiveSkill:
|
| | | return
|
| | | return TurnSkill.OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Pursue, bySkill=connSkill)
|
| | | return TurnSkill.OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Pursue, bySkill=connSkill, byBuff=connBuff)
|
| | |
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
|
| | | effSkill = effBuff.GetSkillData().GetIpyData()
|
| | | return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
|
| | | return DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_6007
|
| | | #
|
| | | # @todo:增加技能目标数
|
| | | # @author hxp
|
| | | # @date 2025-09-22
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 增加技能目标数
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-09-22 16:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
|
| | | return curEffect.GetEffectValue(0) |
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package Skill.PassiveTrigger.PassiveEff_6008
|
| | | #
|
| | | # @todo:生命值低于x%时免疫控制效果
|
| | | # @author hxp
|
| | | # @date 2025-09-22
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 生命值低于x%时免疫控制效果
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2025-09-22 16:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | def GetHappenValue(attacker, defender, curEffect, effSkill, **skillkwargs):
|
| | | lowerThanPer = curEffect.GetEffectValue(0)
|
| | | nowPer = attacker.GetHP() / float(attacker.GetMaxHP())
|
| | | return 1 if nowPer < lowerThanPer else 0
|
| | |
| | | import TurnBuffs
|
| | | import BattleObj
|
| | | import ObjPool
|
| | | import TurnPassive
|
| | |
|
| | | GameWorld.ImportAll("Script\\Skill\\", "TurnBuffs")
|
| | |
|
| | |
| | | % (curID, skillID, ownerID, relatedSkillID))
|
| | | return False
|
| | |
|
| | | #被动触发免疫控制buff
|
| | | if buffSkill.GetSkillType() == ChConfig.Def_SkillType_Action:
|
| | | if TurnPassive.GetTriggerEffectValue(turnFight, batObj, buffOwner, ChConfig.PassiveEff_ImmuneControlBuff, buffSkill):
|
| | | GameWorld.DebugLog("血量低于百分x时免疫控制buff: curID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s,hp:%s/%s" |
| | | % (curID, skillID, ownerID, relatedSkillID, batObj.GetHP(), batObj.GetMaxHP()))
|
| | | return False
|
| | | |
| | | buffValueList = GetAddBuffValue(turnFight, buffOwner, batObj, buffSkill)
|
| | | GameWorld.DebugLog("OnAddBuff: curID=%s,skillID=%s,atkType=%s,buffValueList=%s,ownerID=%s,relatedSkillID=%s"
|
| | | % (curID, skillID, buffSkill.GetAtkType(), buffValueList, ownerID, relatedSkillID))
|
| | |
| | | buffMgr = batObj.GetBuffManager()
|
| | | buffID = curBuff.GetBuffID()
|
| | | skillData = curBuff.GetSkillData()
|
| | | |
| | | # 先删除buff再触发其他内容,防止当前要删除的buff影响后续触发的内容,如无敌buff等,理论上触发的后续内容无敌buff不应该再生效
|
| | | curBuffState = skillData.GetCurBuffState()
|
| | | if curBuffState:
|
| | | buffMgr.DelBuffState(curBuffState, buffID)
|
| | | |
| | | buffMgr.DelBuff(buffID, release)
|
| | | if isSync:
|
| | | SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
|
| | | if afterLogic and relatedSkill:
|
| | | tagObjID = tagObj.GetID() if tagObj else buffObjID
|
| | | relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
|
| | | |
| | | #buff消失的触发
|
| | | for effectIndex in range(0, skillData.GetEffectCount()):
|
| | | curEffect = skillData.GetEffect(effectIndex)
|
| | |
| | | if not effectID:
|
| | | continue
|
| | |
|
| | | if curEffect.GetTriggerWay():
|
| | | triggerWay = curEffect.GetTriggerWay()
|
| | | if triggerWay:
|
| | | if triggerWay == ChConfig.TriggerWay_BuffDel:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BuffDel, connBuff=curBuff)
|
| | | |
| | | if curEffect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill, ChConfig.TriggerSrc_SkillSelf]:
|
| | | haveBuffPassiveEff = True
|
| | |
|
| | | elif effectID in ChConfig.AttrIDList:
|
| | | isRefreshAttr = True
|
| | |
|
| | | else:
|
| | | callFunc = GameWorld.GetExecFunc(TurnBuffs, "Buff_%d.%s" % (effectID, "OnBuffDel"))
|
| | | if callFunc:
|
| | | callFunc(turnFight, batObj, curBuff, curEffect)
|
| | | |
| | | if haveBuffPassiveEff:
|
| | | batObj.GetPassiveEffManager().DelBuffPassiveEffect(buffID)
|
| | | |
| | | curBuffState = skillData.GetCurBuffState()
|
| | | if curBuffState:
|
| | | buffMgr.DelBuffState(curBuffState, buffID)
|
| | | |
| | | # 最后删除buff、通知
|
| | | buffMgr.DelBuff(buffID, release)
|
| | | if isSync:
|
| | | SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
|
| | | if afterLogic and relatedSkill:
|
| | | tagObjID = tagObj.GetID() if tagObj else buffObjID
|
| | | relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID])
|
| | |
|
| | | if isRefreshAttr:
|
| | | RefreshBuffAttr(batObj)
|
| | |
| | | calcType = curSkill.GetCalcType()
|
| | | skillPer = curSkill.GetSkillPer()
|
| | | skillValue = curSkill.GetSkillValue()
|
| | | baseValue = TurnSkill.GetCalcBaseValue(calcType, attacker, defender)
|
| | | baseValue = TurnSkill.GetCalcBaseValue(calcType, attacker, defender, curSkill)
|
| | | shieldValue = int(baseValue * skillPer / 10000.0) + skillValue
|
| | | return [shieldValue % ChConfig.Def_PerPointValue, shieldValue / ChConfig.Def_PerPointValue]
|
| | |
| | | buffEffInfo and GameWorld.DebugLog(" 被动Buff效果: %s" % buffEffInfo)
|
| | | return
|
| | |
|
| | | def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0):
|
| | | def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0, connBuff=None, **kwargs):
|
| | | ''' 触发被动效果,可能触发技能、buff,需根据优先级触发
|
| | | '''
|
| | | passiveEffMgr = batObj.GetPassiveEffManager()
|
| | | effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID)
|
| | | effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID, connBuff)
|
| | | if not effInfoList:
|
| | | return
|
| | | # [["skill/buff", skillID/buffID, effIDList], ...]
|
| | |
| | | sign = effInfo[0]
|
| | | if sign == "skill":
|
| | | skillID, effIDList = effInfo[1:]
|
| | | __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill)
|
| | | __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill, connBuff, **kwargs)
|
| | |
|
| | | elif sign == "buff":
|
| | | buffID, effIDList = effInfo[1:]
|
| | | __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill)
|
| | | __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill, connBuff, **kwargs)
|
| | |
|
| | | return
|
| | |
|
| | | def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None):
|
| | | def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None, connBuff=None, **kwargs):
|
| | | skillMgr = batObj.GetSkillManager()
|
| | | effSkill = skillMgr.FindSkillByID(skillID)
|
| | | if not effSkill and connSkill and connSkill.GetSkillID() == skillID:
|
| | |
| | | curEffect = effSkill.GetEffectByID(effID, triggerWay)
|
| | | if not curEffect:
|
| | | continue
|
| | | DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
|
| | | DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
|
| | |
|
| | | return
|
| | |
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
|
| | | def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff=None, **kwargs):
|
| | | effID = curEffect.GetEffectID()
|
| | | if not effID:
|
| | | return
|
| | |
| | | callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoSkillEffectLogic"))
|
| | | if not callFunc:
|
| | | return
|
| | | callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
|
| | | callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill, connBuff, **kwargs)
|
| | | return
|
| | |
|
| | | def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill=None):
|
| | | def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill=None, connBuff=None, **kwargs):
|
| | | buffMgr = batObj.GetBuffManager()
|
| | | effBuff = buffMgr.GetBuff(buffID)
|
| | | if not effBuff and connBuff and connBuff.GetBuffID() == buffID:
|
| | | effBuff = connBuff
|
| | | if not effBuff:
|
| | | return
|
| | | skillData = effBuff.GetSkillData()
|
| | |
| | | curEffect = skillData.GetEffectByID(effID, triggerWay)
|
| | | if not curEffect:
|
| | | continue
|
| | | DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
|
| | | DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs)
|
| | |
|
| | | return
|
| | |
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
|
| | | def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs):
|
| | | effID = curEffect.GetEffectID()
|
| | | if not effID:
|
| | | return
|
| | |
| | | callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoBuffEffectLogic"))
|
| | | if not callFunc:
|
| | | return
|
| | | callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
|
| | | callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill, connBuff, **kwargs)
|
| | | return
|
| | |
|
| | | def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None):
|
| | | def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None, **kwargs):
|
| | | ''' 获取触发被动的值,一般用于某种条件下才会产生的值,如xx情况下属性变化 或 xx情况下是否发生什么
|
| | | @param calcEffID: 需要统计的效果ID,可以是属性ID或者其他自定义效果ID
|
| | | @return: 触发的值,0-没有触发或本身触发的值为0;非0-触发的具体值
|
| | |
| | | callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "GetHappenValue"))
|
| | | if not callFunc:
|
| | | continue
|
| | | value = callFunc(atkObj, defObj, effect, effSkill)
|
| | | value = callFunc(atkObj, defObj, effect, effSkill, **kwargs)
|
| | | if value is None:
|
| | | continue
|
| | |
|
| | |
| | | ## 是否无视防御
|
| | | return useSkill.GetHurtType() / 10 == 1 # 2为真伤,待扩展
|
| | |
|
| | | def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None):
|
| | | def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None, byBuff=None):
|
| | | '''使用技能通用入口
|
| | | @param useSkill: 使用的技能,注意并不一定是身上的技能,可能只是 SkillData 表数据
|
| | | @param bySkill: 由哪个技能额外触发的,比如附加触发的技能或被动技能均可能由某个技能触发
|
| | |
| | |
|
| | | #没有指定目标,则按技能自身的目标逻辑
|
| | | if not tagObjList:
|
| | | tagAim = useSkill.GetTagAim()
|
| | | tagFriendly = useSkill.GetTagFriendly()
|
| | | tagAffect = useSkill.GetTagAffect()
|
| | | tagCount = useSkill.GetTagCount()
|
| | | tagObjList = GetSkillTags(turnFight, curBatObj, tagAim, tagFriendly, tagAffect, tagCount)
|
| | | tagObjList = GetSkillTags(turnFight, curBatObj, useSkill)
|
| | | rate = useSkill.GetHappenRate()
|
| | | if rate and rate != ChConfig.Def_MaxRateValue:
|
| | | for tagObj in tagObjList[::-1]:
|
| | |
| | | useSkill.SetTagObjList(tagObjList)
|
| | | useSkill.SetBatType(batType)
|
| | | useSkill.SetBySkill(bySkill)
|
| | | useSkill.SetByBuff(byBuff)
|
| | |
|
| | | isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
|
| | | if isTurnNormalSkill:
|
| | |
| | | poolMgr.release(useSkill)
|
| | | return True
|
| | |
|
| | | def GetSkillTags(turnFight, curBatObj, tagAim, tagFriendly, tagAffect, tagCount):
|
| | | def GetSkillTags(turnFight, curBatObj, useSkill):
|
| | | ## 获取技能目标
|
| | | # @return: [主目标, 目标2, ...]
|
| | | |
| | | tagAim = useSkill.GetTagAim()
|
| | | tagFriendly = useSkill.GetTagFriendly()
|
| | | tagAffect = useSkill.GetTagAffect()
|
| | | tagCount = useSkill.GetTagCount()
|
| | |
|
| | | curFaction = curBatObj.GetFaction()
|
| | |
|
| | | # 自己,直接返回
|
| | | if tagAim == ChConfig.SkillTagAim_Self:
|
| | | return [curBatObj]
|
| | | |
| | | tagCount += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillTagCnt, useSkill)
|
| | |
|
| | | sneerObj = None # 嘲讽目标
|
| | | sneerObjID, sneerObjPosNum = 0, 0
|
| | |
| | | if sneerObj in aimObjList and aimObjList.index(sneerObj) != 0:
|
| | | aimObjList.remove(sneerObj)
|
| | | aimObjList.insert(0, sneerObj)
|
| | | |
| | | # 一定包含自己
|
| | | if tagFriendly == 2:
|
| | | if curBatObj not in aimObjList:
|
| | | aimObjList.append(curBatObj)
|
| | |
|
| | | if tagCount and len(aimObjList) > tagCount:
|
| | | aimObjList = aimObjList[:tagCount]
|
| | |
| | | OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
|
| | | return
|
| | |
|
| | | def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0):
|
| | | def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None):
|
| | | '''被动触发使用技能
|
| | | @param passiveSkill: 释放的被动技能
|
| | | @param connSkill: 由什么技能引起的
|
| | |
| | | GameWorld.DebugLog(" 概率不触发: tagID=%s,happenRate=%s" % (tagID, happenRate))
|
| | | return
|
| | | passiveTagObjList = [tagObj]
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill)
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff)
|
| | | else:
|
| | | GameWorld.DebugLog("被动触发技能,重新锁定目标! effSkillID=%s,effectID=%s,passiveSkillID=%s" % (effSkillID, effectID, passiveSkillID))
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill)
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff)
|
| | |
|
| | | return isOK
|
| | |
|
| | |
| | | aPursueDamPer /= 10000.0
|
| | |
|
| | | if calcType != ChConfig.Def_Calc_Attack:
|
| | | aAtk = GetCalcBaseValue(calcType, atkObj, defObj)
|
| | | aAtk = GetCalcBaseValue(calcType, atkObj, defObj, curSkill)
|
| | | GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s,aAddSkillPer=%s"
|
| | | % (atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, hurtTypes, aAddSkillPer))
|
| | |
|
| | |
| | | elif isDot:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
|
| | | GameWorld.DebugLog(" 持续技能伤害=%s" % (hurtValue))
|
| | | elif calcType == ChConfig.Def_Calc_ByBuffValue:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 2))
|
| | | GameWorld.DebugLog(" 按最后一次buff值计算伤害=%s,calcType=%s,LastHurt=%s" % (hurtValue, calcType, aAtk))
|
| | | elif calcType != ChConfig.Def_Calc_Attack:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 1))
|
| | | GameWorld.DebugLog(" 非按攻击力伤害=%s,calcType=%s,aAtk=%s" % (hurtValue, calcType, aAtk))
|
| | |
| | | hurtValueMax = aAtk * hurtAtkPerMax / 10000.0
|
| | | hurtValue = min(hurtValue, hurtValueMax)
|
| | | GameWorld.DebugLog(" 伤害最高限制: hurtValue=%s,hurtAtkPerMax=%s,aAtk=%s" % (hurtValue, hurtAtkPerMax, aAtk))
|
| | | |
| | | # 均摊
|
| | | hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
|
| | | if hurtShareEff:
|
| | | tagCnt = max(1, len(curSkill.GetTagObjList()))
|
| | | hurtValue = hurtValue / tagCnt
|
| | | GameWorld.DebugLog(" 目标均摊伤害: hurtValue=%s,tagCnt=%s" % (hurtValue, tagCnt))
|
| | |
|
| | | hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
|
| | | return hurtValue, hurtTypes
|
| | |
| | | skillPer = curSkill.GetSkillPer()
|
| | | #skillValue = curSkill.GetSkillValue()
|
| | |
|
| | | cureBaseValue = GetCalcBaseValue(cureType, userObj, tagObj)
|
| | | |
| | | skillPer += TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
|
| | | |
| | | cureHP = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
|
| | | |
| | | cureWayExEff = curSkill.GetEffectByID(ChConfig.SkillEff_CureWayEx)
|
| | | if cureWayExEff:
|
| | | cureType = cureWayExEff.GetEffectValue(0)
|
| | | skillPer = cureWayExEff.GetEffectValue(1)
|
| | | GameWorld.DebugLog("额外计算治疗方式: cureType=%s,skillPer=%s" % (cureType, skillPer))
|
| | | cureHPEx = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
|
| | | cureHP += cureHPEx
|
| | | |
| | | return max(1, int(cureHP)) # 保底1点
|
| | |
|
| | | def __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum=False):
|
| | | cureBaseValue = GetCalcBaseValue(cureType, userObj, tagObj, curSkill)
|
| | |
|
| | | # 回合制
|
| | | curePer = 0 # 治疗加成
|
| | |
| | | % (cureHP, curSkill.GetSkillID(), cureType, baseValue, skillPer, curePer, cureDefPer, angerOverflow))
|
| | | return cureHP
|
| | |
|
| | | def GetCalcBaseValue(calcType, curObj, tagObj):
|
| | | def GetCalcBaseValue(calcType, curObj, tagObj, curSkill):
|
| | | ##获得基础计算值
|
| | | baseValue = 0
|
| | | if calcType == ChConfig.Def_Calc_Attack:
|
| | | baseValue = curObj.GetAtk()
|
| | | elif calcType == ChConfig.Def_Calc_MaxHP:
|
| | |
| | | baseValue = curObj.GetLastHurtValue()
|
| | | elif calcType == ChConfig.Def_Calc_TagMaxHP:
|
| | | baseValue = 0 if not tagObj else tagObj.GetMaxHP()
|
| | | elif calcType == ChConfig.Def_Calc_ByBuffValue:
|
| | | byBuff = curSkill.GetByBuff()
|
| | | if byBuff:
|
| | | baseValue = byBuff.GetValue1() + byBuff.GetValue2() * ChConfig.Def_PerPointValue
|
| | | GameWorld.DebugLog("根据buff值: %s" % baseValue)
|
| | | return baseValue
|
| | |
|
| | | def DoDOTAttack(turnFight, batObj, curBuff, hurtValue, hurtTypes):
|