| | |
| | | curBatObj.SetMainTagIDList(tagIDList)
|
| | |
|
| | | useTag = ""
|
| | | |
| | | #这个技能是Buff
|
| | | if SkillCommon.IsBuff(useSkill):
|
| | | __doAddBuff(turnFight, curBatObj, useSkill)
|
| | |
| | | clientPack.Len = len(clientPack.Tag)
|
| | | clientPack.Sign = 0
|
| | | turnFight.addBatPack(clientPack)
|
| | | |
| | | __doUseSkill(turnFight, curBatObj, useSkill)
|
| | |
|
| | | DoAttackResult(turnFight, curBatObj, useSkill)
|
| | |
| | | if hurtObj.GetSuckHP() > 0:
|
| | | isSuckHP = True
|
| | |
|
| | | curObj.SetLastHurtValue(totalHurtValue) # 记录最后一次总伤害
|
| | | |
| | | # 记录最后一次总伤害,有伤害目标才记录
|
| | | if useSkill.GetHurtObjList():
|
| | | curObj.SetLastHurtValue(totalHurtValue)
|
| | | |
| | | # 群攻只触发一次特长
|
| | | if isSuperHit:
|
| | | DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuperHit, relatedSkillID)
|
| | |
| | | dHP, dMaxHP = defObj.GetHP(), defObj.GetMaxHP()
|
| | | dDef = 0 if ignoreDef else defObj.GetDef() # 防守方防御力
|
| | |
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByHP, curSkill)
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByJob, curSkill)
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByBuffLayer, curSkill)
|
| | | atkSkillPer += GetAddSkillPer(turnFight, atkObj, defObj, curSkill)
|
| | |
|
| | | aFinalDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPer) # 最终加成
|
| | | dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤
|
| | |
| | | hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
|
| | | return hurtValue, hurtTypes
|
| | |
|
| | | def GetAddSkillPer(turnFight, atkObj, defObj, curSkill):
|
| | | ## 获取额外增加的技能万分比
|
| | | atkSkillPer = 0
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByHP, curSkill)
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByJob, curSkill)
|
| | | atkSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddSkillPerByBuffLayer, curSkill)
|
| | | return atkSkillPer
|
| | |
|
| | | def CanSuperHit(turnFight, atkObj, defObj, curSkill):
|
| | | if TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_MustSuperHit, curSkill):
|
| | | GameWorld.DebugLog("目标血量低于百分x时必定暴击: defID=%s,hp:%s/%s" % (defObj.GetID(), defObj.GetHP(), defObj.GetMaxHP()))
|
| | |
| | | if hurtValue <= 0:
|
| | | return 0, 0, hurtTypes
|
| | |
|
| | | if defObj.CheckInState(ChConfig.BatObjState_Wudi):
|
| | | buffMgr = defObj.GetBuffManager()
|
| | | wudiBuffList = buffMgr.FindBuffListByState(ChConfig.BatObjState_Wudi)
|
| | | if wudiBuffList:
|
| | | hurtTypes |= pow(2, ChConfig.HurtType_Immune) # 添加免疫
|
| | | buffMgr = defObj.GetBuffManager()
|
| | | for index in range(buffMgr.GetBuffCount()):
|
| | | buff = buffMgr.GetBuffByIndex(index)
|
| | | if not buff:
|
| | | continue
|
| | | for buff in wudiBuffList:
|
| | | skillData = buff.GetSkillData()
|
| | | if skillData.GetCurBuffState() != ChConfig.BatObjState_Wudi:
|
| | | continue
|
| | | # 记录免疫的积攒伤害
|
| | | # 记录免疫积攒的伤害
|
| | | buffValue = buff.GetValue1() + buff.GetValue2() * ChConfig.Def_PerPointValue
|
| | | updBuffValue = buffValue + hurtValue
|
| | | buff.SetValue1(updBuffValue % ChConfig.Def_PerPointValue)
|
| | |
| | | # 承伤盾承伤,剩余时间短的优先承伤,承伤不影响输出,相当于额外的HP,仅用于抵扣掉血,仅 改变 realHurtHP
|
| | | realHurtHP = hurtValue
|
| | | shieldBuffList = []
|
| | | buffMgr = defObj.GetBuffManager()
|
| | | for index in range(buffMgr.GetBuffCount()):
|
| | | buff = buffMgr.GetBuffByIndex(index)
|
| | | for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamShield):
|
| | | skillData = buff.GetSkillData()
|
| | | # 承伤盾
|
| | | if SkillCommon.isDamageShieldSkill(skillData):
|
| | | remainTime = buff.GetRemainTime() # 剩余回合
|
| | | if not skillData.GetLastTime():
|
| | | remainTime = 999 # 永久盾
|
| | | buffValue = buff.GetValue1() + buff.GetValue2() * ChConfig.Def_PerPointValue # 剩余盾值
|
| | | shieldBuffList.append([remainTime, buffValue, buff])
|
| | | |
| | | remainTime = buff.GetRemainTime() # 剩余回合
|
| | | if not skillData.GetLastTime():
|
| | | remainTime = 999 # 永久盾
|
| | | buffValue = buff.GetValue1() + buff.GetValue2() * ChConfig.Def_PerPointValue # 剩余盾值
|
| | | shieldBuffList.append([remainTime, buffValue, buff])
|
| | | |
| | | if shieldBuffList:
|
| | | shieldBuffList.sort()
|
| | | for _, buffValue, buff in shieldBuffList:
|
| | |
| | |
|
| | | def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
|
| | | '''计算反弹反弹伤害
|
| | | 注:反伤/荆棘暂不做属性支持,仅做buff效果支持
|
| | | '''
|
| | | if not atkObj.GetCanAttack():
|
| | | return
|
| | |
|
| | | bounceHP = int(hurtObj.GetHurtHP() * random.uniform(0.1, 0.2))
|
| | | damBackPer = 0
|
| | | buffMgr = defObj.GetBuffManager()
|
| | | for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamBackShield):
|
| | | damBackPer += buff.GetValue1()
|
| | | |
| | | if damBackPer <= 0:
|
| | | return
|
| | | |
| | | bounceHP = int(hurtObj.GetHurtHP() * damBackPer / 10000.0)
|
| | | if bounceHP <= 0:
|
| | | return
|
| | |
|
| | | GameWorld.DebugLog(" 反弹伤害=%s,%s/%s" % (bounceHP, atkObj.GetHP(), atkObj.GetMaxHP()))
|
| | | GameWorld.DebugLog(" 反弹伤害=%s,%s/%s, damBackPer=%s" % (bounceHP, atkObj.GetHP(), atkObj.GetMaxHP(), damBackPer))
|
| | | bounceHP, realBounceHP, _ = CalcHurtHPWithBuff(turnFight, defObj, atkObj, curSkill, bounceHP)
|
| | | if bounceHP <= 0:
|
| | | GameWorld.DebugLog(" bounceHP=%s" % (bounceHP))
|
| | |
| | | skillPer = curSkill.GetSkillPer()
|
| | | #skillValue = curSkill.GetSkillValue()
|
| | |
|
| | | skillPer += TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddSkillPer, curSkill)
|
| | | skillPer += GetAddSkillPer(turnFight, userObj, tagObj, curSkill)
|
| | |
|
| | | cureHP = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
|
| | |
|
| | |
| | | GameWorld.DebugLog("额外计算治疗方式: cureType=%s,skillPer=%s" % (cureType, skillPer))
|
| | | cureHPEx = __calcCureHP(turnFight, userObj, tagObj, curSkill, cureType, skillPer, largeNum)
|
| | | cureHP += cureHPEx
|
| | | |
| | | hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
|
| | | if hurtShareEff:
|
| | | tagCnt = max(1, len(curSkill.GetTagObjList()))
|
| | | cureHP = cureHP / tagCnt
|
| | | GameWorld.DebugLog(" 目标均摊治疗: cureHP=%s,tagCnt=%s" % (cureHP, tagCnt))
|
| | |
|
| | | return max(1, int(cureHP)) # 保底1点
|
| | |
|
| | |
| | | dHP = defObj.GetHP()
|
| | | GameWorld.DebugLog("结算dot: atkID=%s,defID=%s,buffID=%s,skillID=%s,ownerID=%s,hurtValue=%s,hurtTypes=%s,dHP=%s"
|
| | | % (atkID, defID, buffID, skillID, ownerID, hurtValue, hurtTypes, dHP))
|
| | | layer = curBuff.GetLayer()
|
| | | if layer > 0:
|
| | | hurtValue *= layer
|
| | | GameWorld.DebugLog(" 多层buff伤害: hurtValue=%s,layer=%s" % (hurtValue, layer))
|
| | | hurtValue, realHurtHP, hurtTypes = CalcHurtHPWithBuff(turnFight, atkObj, defObj, useSkill, hurtValue, hurtTypes)
|
| | |
|
| | | # dot的反弹、吸血待定
|