| | |
| | | triggerWay = kwargs.get("triggerWay", 0)
|
| | | if triggerWay in ChConfig.DeadCanTriggerWayList:
|
| | | GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,triggerWay=%s", skillID, triggerWay)
|
| | | elif batType == ChConfig.TurnBattleType_Enhance:
|
| | | GameWorld.DebugLogEx("死亡状态额外技能不限制,主技能能放的话也就能放! skillID=%s", skillID) |
| | | else:
|
| | | GameWorld.DebugLogEx("死亡状态下无法释放该技能! skillID=%s", skillID)
|
| | | return
|
| | |
| | |
|
| | | calcCureResults = []
|
| | | relativeObj = GetRelativeObj(turnFight, curBatObj)
|
| | | multiValue = 1
|
| | | addCureMulti = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddCureMulti, useSkill)
|
| | | if addCureMulti:
|
| | | multiValue += addCureMulti / 100.0
|
| | | |
| | | for tagBatObj in useSkill.GetTagObjList():
|
| | | cureHP = CalcCureHP(turnFight, curBatObj, tagBatObj, useSkill, relativeObj=relativeObj)
|
| | | cureHP = CalcCureHP(turnFight, curBatObj, tagBatObj, useSkill, relativeObj=relativeObj, multiValue=multiValue)
|
| | | poisonCureOwner = GetPoisonCureOwner(tagBatObj)
|
| | | calcCureResults.append([tagBatObj, cureHP, poisonCureOwner])
|
| | |
|
| | |
| | |
|
| | | # 优先处理afterLogic,可再预先汇总一些会触发被动的信息
|
| | | relatedSkillID = useSkill.GetSkillID()
|
| | | shieldBrokenList = [] # 记录盾破
|
| | | delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
|
| | | afterLogicList = useSkill.GetAfterLogicList()
|
| | | for logicType, logicData in afterLogicList:
|
| | | if logicType == ChConfig.AfterLogic_DelBuff:
|
| | | buffObjID, buff, tagObjID = logicData
|
| | | buffSkillData = buff.GetSkillData()
|
| | | buffSkillTypeID = buffSkillData.GetSkillTypeID()
|
| | | buffObjID, buff, tagObjID, afterTriggerData = logicData
|
| | | TurnBuff.DoBuffDelAfterLogicOver(turnFight, buffObjID, buff, useSkill)
|
| | | if SkillCommon.isDamageShieldSkill(buffSkillData):
|
| | | shieldBrokenList.append([buffObjID, tagObjID, buffSkillTypeID])
|
| | | if afterTriggerData:
|
| | | delBuffAfterEffList.append([buffObjID, buff, tagObjID, afterTriggerData])
|
| | |
|
| | | elif logicType == ChConfig.AfterLogic_AddBuff:
|
| | | batObj = logicData[0]
|
| | |
| | | TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
|
| | | useSkill.SetKillObjList(killObjList)
|
| | | # 判断自己,因为反弹、平摊伤害的原因,有可能自己干死自己
|
| | | selfAlive = curObj.IsAlive()
|
| | | if selfAlive and curObj.GetHP() <= 0:
|
| | | selfAlive = False
|
| | | if curObj.IsAlive() and curObj.GetHP() <= 0:
|
| | | dieObjList.append(curObj)
|
| | | TurnAttack.SetObjKilled(turnFight, curObj)
|
| | |
|
| | |
| | | effIgnoreObjIDList = missObjIDList + immuneObjIDList
|
| | | useSkill.SetEffIgnoreObjIDList(effIgnoreObjIDList)
|
| | | # 优先触发本技能额外效果,注:仅该技能释放后该技能的额外效果视为主技能的效果,优先级最高
|
| | | if selfAlive:
|
| | | if curObj not in dieObjList:
|
| | | __DoCurSkillEff(turnFight, curObj, useSkill, effIgnoreObjIDList, isUseSkill)
|
| | |
|
| | | # ========== 以下触发被动 ==========
|
| | |
|
| | | # 破盾时
|
| | | for buffObjID, tagObjID, buffSkillTypeID in shieldBrokenList:
|
| | | # buff消失后置处理的被动,优先处理,如破盾,区别于被动方式 ChConfig.TriggerWay_BuffDel(立即触发)
|
| | | for buffObjID, buff, tagObjID, afterTriggerData in delBuffAfterEffList:
|
| | | triggerWay, effInfoList = afterTriggerData
|
| | | buffObj = batObjMgr.getBatObj(buffObjID)
|
| | | tagObj = batObjMgr.getBatObj(tagObjID)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, buffObj, ChConfig.TriggerWay_ShieldBroken, tagObj, connSkillTypeID=buffSkillTypeID)
|
| | | tagObj = batObjMgr.getBatObj(tagObjID) # 导致该buff消失的目标
|
| | | GameWorld.DebugLogEx("buff消失后置处理的被动: buffObjID=%s,tagObjID=%s,triggerWay=%s,%s", buffObjID, tagObjID, triggerWay, effInfoList)
|
| | | TurnPassive.OnTriggerPassiveEffList(turnFight, buffObj, triggerWay, tagObj, effInfoList, connSkill=useSkill, connBuff=buff)
|
| | |
|
| | | # 有击杀时
|
| | | for index, tagObj in enumerate(killObjList):
|
| | |
| | | batType = curSkill.GetBatType()
|
| | |
|
| | | changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtType, curSkill)
|
| | | if not changeHurtType:
|
| | | changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtTypeByBuff, curSkill)
|
| | | if changeHurtType == 1:
|
| | | ignoreDef = True
|
| | | GameWorld.DebugLogEx("强制变更本次伤害为无视防御! skillID=%s", skillID)
|
| | |
| | | defObj, hurtValue, hurtTypes, immuneHurt = hurtInfo[:4]
|
| | | isEx = hurtInfo[4] if len(hurtInfo) > 4 else 0 # 是否是额外目标
|
| | |
|
| | | lostHP = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
|
| | | |
| | | lostHP, ignoreShield = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
|
| | | if ignoreShield:
|
| | | hurtTypes |= pow(2, ChConfig.HurtAtkType_IgnoreShield)
|
| | | |
| | | #伤害结构体
|
| | | defID = defObj.GetID()
|
| | | if isEx:
|
| | |
| | | @param hpCanNegative: 扣除后的生命是否允许负值
|
| | | @param immuneHurt: 免疫的伤害值
|
| | | @param isSkillSelfTag: 是否技能自身的直接目标,如平摊伤害目标、溅射伤害目标这种就不算直接目标
|
| | | @return: lostHP
|
| | | @return: lostHP, ignoreShield
|
| | | '''
|
| | |
|
| | | ignoreShield = None
|
| | | if immuneHurt > 0:
|
| | | buffMgr = defObj.GetBuffManager()
|
| | | wudiBuffList = buffMgr.FindBuffListByState(ChConfig.BatObjState_Wudi)
|
| | |
| | | defObj.GetID(), buff.GetBuffID(), buffSkillID, buffValue, immuneHurt, updBuffValue, lostType)
|
| | |
|
| | | if hurtValue <= 0:
|
| | | return 0
|
| | | return 0, ignoreShield
|
| | |
|
| | | atkID = atkObj.GetID()
|
| | | defID = defObj.GetID()
|
| | |
| | | shieldBuffList = []
|
| | | buffMgr = defObj.GetBuffManager()
|
| | | for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamShield):
|
| | | if ignoreShield == None:
|
| | | if TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_IgnoreShield, curSkill):
|
| | | ignoreShield = True # 无视承伤盾
|
| | | break
|
| | | ignoreShield = False
|
| | | skillData = buff.GetSkillData()
|
| | | remainTime = buff.GetRemainTime() # 剩余回合
|
| | | if not skillData.GetLastTime():
|
| | |
| | | shieldHurtValue -= decShieldValue # 承伤值
|
| | | if decShieldValue >= buffValue:
|
| | | GameWorld.DebugLogEx(" 删除盾: buffID=%s,剩余盾伤=%s", buffID, shieldHurtValue)
|
| | | TurnBuff.DoBuffDel(turnFight, defObj, buff, relatedSkill=curSkill, afterLogic=True, tagObj=atkObj)
|
| | | #盾破时buff会被删除,导致绑定在该buff上的被动效果同步被清除,后续就无法触发盾破后被动,固先取出来
|
| | | effInfoList = defObj.GetPassiveEffManager().GetPassiveEffByTrigger(ChConfig.TriggerWay_ShieldBroken, connSkillTypeID=buffSkillID)
|
| | | TurnBuff.DoBuffDel(turnFight, defObj, buff, relatedSkill=curSkill, afterLogic=True, tagObj=atkObj, afterTriggerData=[ChConfig.TriggerWay_ShieldBroken, effInfoList])
|
| | | else:
|
| | | updShieldValue = buffValue - decShieldValue
|
| | | GameWorld.DebugLogEx(" 更新盾: updShieldValue=%s,剩余盾伤=%s", updShieldValue, shieldHurtValue)
|
| | |
| | | GameWorld.DebugLogEx(" 扣血: atkID=%s,defID=%s,hurtValue=%s,lostType=%s,lostHP=%s,dHP=%s,updHP=%s/%s",
|
| | | atkID, defID, hurtValue, lostType, lostHP, dHP, defObj.GetHP(), defObj.GetMaxHP())
|
| | | TurnAttack.AddTurnObjHurtValue(atkObj, defObj, hurtValue, lostHP, skillID, lostType)
|
| | | return lostHP
|
| | | return lostHP, ignoreShield
|
| | |
|
| | | def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
|
| | | '''计算反弹反弹伤害
|
| | |
| | | TurnAttack.AddTurnObjCureHP(atkObj, atkObj, suckHP, cureHP)
|
| | | return
|
| | |
|
| | | def CalcCureHP(turnFight, userObj, tagObj, curSkill, relativeObj=None):
|
| | | def CalcCureHP(turnFight, userObj, tagObj, curSkill, relativeObj=None, multiValue=1):
|
| | | ''' 计算治疗值
|
| | | '''
|
| | |
|
| | |
| | | cureHP += cureHPEx
|
| | | GameWorld.DebugLogEx(" 额外治疗值(%s): cureType=%s,baseValue=%s,skillPer=%s,cureHP=%s", cureHPEx, cureType, baseValue, skillPer, cureHP)
|
| | |
|
| | | if multiValue and multiValue != 1:
|
| | | cureHP = int(cureHP * multiValue)
|
| | | GameWorld.DebugLogEx(" 治疗倍值: cureHP=%s,multiValue=%s", cureHP, multiValue)
|
| | | |
| | | hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
|
| | | if hurtShareEff:
|
| | | tagCnt = max(1, len(curSkill.GetTagObjList()))
|