| | |
| | | skillType = useSkill.GetSkillType()
|
| | | byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
|
| | | if not curBatObj.IsAlive():
|
| | | if skillType == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
|
| | | GameWorld.DebugLogEx("死亡时使用复活自己的技能! skillID=%s", skillID)
|
| | | if skillType == ChConfig.Def_SkillType_Revive:
|
| | | GameWorld.DebugLogEx("死亡时使用复活技能! skillID=%s", skillID)
|
| | | else:
|
| | | if byTriggerWay in ChConfig.DeadCanTriggerWayList:
|
| | | GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,byTriggerWay=%s", skillID, byTriggerWay)
|
| | |
| | | return
|
| | | harmPer = harmEff.GetEffectValue(0) # 自残百分比
|
| | | noEnoughDo = harmEff.GetEffectValue(1) # 不足时扣除方式 0-不扣;1-自杀;2-扣剩1点
|
| | | calcType = harmEff.GetEffectValue(2) # 计算方式:0-按最大血量;1-按当前血量
|
| | | curHP = curBatObj.GetHP()
|
| | | maxHP = curBatObj.GetMaxHP()
|
| | | if calcType == 1:
|
| | | harmHP = int(curHP * harmPer / 100.0)
|
| | | else:
|
| | | harmHP = int(maxHP * harmPer / 100.0)
|
| | | lostHP = harmHP
|
| | | if curHP <= harmHP:
|
| | |
| | |
|
| | | updHP = max(curHP - lostHP, 0)
|
| | | curBatObj.SetHP(updHP, False)
|
| | | GameWorld.DebugLogEx("使用技能时自残: curHP=%s/%s,harmPer=%s,harmHP=%s,lostHP=%s,updHP=%s,noEnoughDo=%s", |
| | | curHP, maxHP, harmPer, harmHP, lostHP, updHP, noEnoughDo)
|
| | | GameWorld.DebugLogEx("使用技能时自残: curHP=%s/%s,harmPer=%s,harmHP=%s,lostHP=%s,updHP=%s,noEnoughDo=%s,calcType=%s", |
| | | curHP, maxHP, harmPer, harmHP, lostHP, updHP, noEnoughDo, calcType)
|
| | |
|
| | | curBatObj.SetHarmSelfHP(harmHP) # 无视实际扣血量,直接更新
|
| | |
|
| | |
| | | killObjList.append(tagObj)
|
| | | TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
|
| | | useSkill.SetKillObjList(killObjList)
|
| | | # 判断自己,因为反弹、平摊伤害的原因,有可能自己干死自己
|
| | | if curObj.IsAlive() and curObj.GetHP() <= 0:
|
| | | dieObjList.append(curObj)
|
| | | TurnAttack.SetObjKilled(turnFight, curObj)
|
| | |
|
| | | # 统计伤血,可能单个技能对同一目标造成多次伤害
|
| | | totalHurtValue = 0
|
| | |
| | | stunObjIDList, superHitObjIDList, parryObjIDList = [], [], []
|
| | | beHurtObjIDList = [] # 受伤的对象ID列表
|
| | | reviveObjList = [] # 复活的对象列表
|
| | | bounceObjList = [] # 有反弹的对象列表
|
| | | for hurtObj in useSkill.GetHurtObjListAll():
|
| | | hurtObjID = hurtObj.GetObjID()
|
| | | tagObj = batObjMgr.getBatObj(hurtObjID)
|
| | | if not tagObj:
|
| | | continue
|
| | | |
| | | bounceHP = hurtObj.GetBounceHP()
|
| | | if bounceHP:
|
| | | if tagObj not in bounceObjList:
|
| | | bounceObjList.append(tagObj)
|
| | | |
| | | if hurtObj.HaveHurtType(ChConfig.HurtAtkType_Hurt) and not hurtObj.HaveHurtType(ChConfig.HurtAtkType_Immune) \
|
| | | and (isTurnNormalSkill or isAngerSkill) and tagObj.IsAlive():
|
| | | __doSkillHurtAnger(tagObj, hurtObj.GetLostHP(), useSkill)
|
| | |
| | |
|
| | | if hurtObj.GetSuckHP() > 0:
|
| | | isSuckHP = True
|
| | | |
| | | # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
|
| | | if curObj.IsAlive() and curObj.GetHP() <= 0:
|
| | | dieObjList.append(curObj)
|
| | | killer = bounceObjList[0] if bounceObjList else None
|
| | | TurnAttack.SetObjKilled(turnFight, curObj, killer)
|
| | |
|
| | | # 记录最后一次总伤害,有伤害目标才记录
|
| | | if totalHurtValue:
|
| | |
| | | for dieObj in dieObjList:
|
| | | # 敌方单位死亡时
|
| | | if lineupObj.GetFaction() != dieObj.GetFaction():
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill, byKiller=curObj)
|
| | | # 己方单位死亡时
|
| | | else:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill, byFriendObj=dieObj)
|
| | |
| | | if isExObj:
|
| | | continue
|
| | |
|
| | | isDotHurt = False
|
| | | # 直接攻击
|
| | | if isAttackDirect:
|
| | | if not triggerOne:
|
| | |
| | | elif not isAttackDirect:
|
| | | # 受到持续伤害
|
| | | if tagID in beHurtObjIDList:
|
| | | isDotHurt = True
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_DOTHurt, tagObj, connSkill=useSkill, connBuff=timeBuff)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeDOTHurt, curObj, connSkill=useSkill, connBuff=timeBuff)
|
| | |
|
| | |
| | |
|
| | |
|
| | | # 敌友方
|
| | | if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue]:
|
| | | if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt:
|
| | | if not curBatLineup:
|
| | | curBatLineup = curObj.GetBatLineup()
|
| | | for lineupObjID in curBatLineup.posObjIDDict.values():
|
| | |
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOne, tagObj, connSkill=useSkill, byFriendObj=curObj)
|
| | | if curID != lineupObj.GetID():
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOneNoSelf, tagObj, connSkill=useSkill, byFriendObj=curObj)
|
| | | # 持续伤害
|
| | | elif isDotHurt:
|
| | | if not triggerOne:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
|
| | |
|
| | | # 连击
|
| | | if batType == ChConfig.TurnBattleType_Combo:
|