| | |
| | | import TurnPassive
|
| | | import TurnAttack
|
| | | import TurnBuff
|
| | | import ObjPool
|
| | | import FBLogic
|
| | |
|
| | | import random
|
| | |
| | | if not skillID:
|
| | | return
|
| | |
|
| | | skillType = useSkill.GetSkillType()
|
| | | byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
|
| | | if not curBatObj.IsAlive():
|
| | | if useSkill.GetSkillType() == 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:
|
| | | triggerWay = kwargs.get("triggerWay", 0)
|
| | | if triggerWay in ChConfig.DeadCanTriggerWayList:
|
| | | GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,triggerWay=%s", skillID, triggerWay)
|
| | | if byTriggerWay in ChConfig.DeadCanTriggerWayList:
|
| | | GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,byTriggerWay=%s", skillID, byTriggerWay)
|
| | | elif batType == ChConfig.TurnBattleType_Enhance:
|
| | | GameWorld.DebugLogEx("死亡状态额外技能不限制,主技能能放的话也就能放! skillID=%s", skillID) |
| | | else:
|
| | | GameWorld.DebugLogEx("死亡状态下无法释放该技能! skillID=%s", skillID)
|
| | | return
|
| | |
| | | if not tagObjList and isRemove:
|
| | | return
|
| | |
|
| | | if tagObjList and skillType == ChConfig.Def_SkillType_Revive:
|
| | | for tagObj in tagObjList[::-1]:
|
| | | if tagObj.CheckInState(ChConfig.BatObjState_RebornLimit):
|
| | | GameWorld.DebugLogEx(" 目标被禁止复活不处理! tagID=%s", tagObj.GetID())
|
| | | tagObjList.remove(tagObj)
|
| | | |
| | | if not tagObjList:
|
| | | # 可扩展其他目标选择,如复活技能没有死亡单位时则使用另外的效果
|
| | | GameWorld.DebugLogEx("找不到技能目标! skillID=%s,mapID=%s,funcLineID=%s", skillID, turnFight.mapID, turnFight.funcLineID, turnFight.getReqPlayerID())
|
| | | if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive:
|
| | | if skillType == ChConfig.Def_SkillType_Revive and not isinstance(useSkill, IpyGameDataPY.IPY_Skill):
|
| | | otherEff = useSkill.GetEffectByID(ChConfig.SkillEff_ReviveNoUse)
|
| | | if otherEff:
|
| | | otherSkillID = otherEff.GetEffectValue(0)
|
| | |
| | |
|
| | | # 子技能怒气溢出值也有效,所以子技能不处理
|
| | | curXP = curBatObj.GetXP()
|
| | | if batType == ChConfig.TurnBattleType_Enhance:
|
| | | pass
|
| | | elif SkillCommon.isAngerSkill(useSkill):
|
| | | if SkillCommon.isAngerSkill(useSkill):
|
| | | maxXP = IpyGameDataPY.GetFuncCfg("AngerXP", 2)
|
| | | angerOverflow = max(curXP - maxXP, 0)
|
| | | curBatObj.SetAngerOverflow(angerOverflow)
|
| | | GameWorld.DebugLogEx("怒气溢出值: curXP=%s/%s,angerOverflow=%s", curXP, maxXP, angerOverflow)
|
| | | elif batType == ChConfig.TurnBattleType_Enhance:
|
| | | pass
|
| | | else:
|
| | | curBatObj.SetAngerOverflow(0)
|
| | | angerOverflow = curBatObj.GetAngerOverflow()
|
| | |
| | | objID, skillID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
|
| | | # 以下为技能可以使用的处理,之后的逻辑默认技能使用成功
|
| | |
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | usePoolSkill = False
|
| | | if isinstance(useSkill, IpyGameDataPY.IPY_Skill):
|
| | | usePoolSkill = True
|
| | | # 统一使用 BattleObj.PySkill
|
| | | useSkill = poolMgr.acquire(BattleObj.PySkill, useSkill, objID)
|
| | | useSkill = BattleObj.PySkill(useSkill, objID)
|
| | |
|
| | | useSkill.ResetUseRec()
|
| | | useSkill.SetTagObjList(tagObjList)
|
| | | useSkill.SetBatType(batType)
|
| | | useSkill.SetBySkill(bySkill)
|
| | | useSkill.SetByBuff(byBuff)
|
| | | useSkill.SetByTriggerWay(byTriggerWay)
|
| | |
|
| | | isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
|
| | | if isTurnNormalSkill:
|
| | |
| | | else:
|
| | | __doUseSkill(turnFight, curBatObj, useSkill)
|
| | |
|
| | | DoAttackResult(turnFight, curBatObj, useSkill)
|
| | | DoAttackResult(turnFight, curBatObj, useSkill, **kwargs)
|
| | |
|
| | | if useTag:
|
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|
| | |
| | |
|
| | | # 最后重置、回收对象
|
| | | useSkill.ResetUseRec()
|
| | | if usePoolSkill:
|
| | | poolMgr.release(useSkill)
|
| | | return True
|
| | |
|
| | | def CheckSkillUseCntLimit(batObj, useSkill):
|
| | | ## 检查技能使用次数是否受限
|
| | | # @return: 是否受限
|
| | | # @return: 是否受限,None-没有受限效果,False-不受限,True-受限了
|
| | | if not hasattr(useSkill, "GetEffectByID"):
|
| | | return
|
| | | effect = useSkill.GetEffectByID(ChConfig.SkillEff_SkillUseCntLimit)
|
| | |
| | | GameWorld.DebugLogEx("技能每大回合使用次数受限! skillID=%s,turnUseCnt=%s >= %s", skillID, turnUseCnt, turnUseCntLimit)
|
| | | return True
|
| | |
|
| | | return
|
| | | return False
|
| | |
|
| | | def IsNeedSyncSkill(useSkill):
|
| | | ## 使用需要同步B427使用技能
|
| | | if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_Revive, ChConfig.Def_SkillType_CleanBuff]:
|
| | | if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_Revive, ChConfig.Def_SkillType_CleanBuff, |
| | | ChConfig.Def_SkillType_AtkEx]:
|
| | | return True
|
| | | if useSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_TurnNormaSkill, ChConfig.Def_SkillFuncType_AngerSkill]:
|
| | | return True
|
| | |
| | | tagBatObj = batObjMgr.getBatObj(tagObjID)
|
| | | if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
|
| | | continue
|
| | | |
| | | if tagAim == ChConfig.SkillTagAim_Male:
|
| | | if tagBatObj.GetSex() != ChConfig.BatObjSex_Male:
|
| | | continue
|
| | | elif tagAim == ChConfig.SkillTagAim_Female:
|
| | | if tagBatObj.GetSex() != ChConfig.BatObjSex_Female:
|
| | | continue
|
| | | aimObjList.append(tagBatObj)
|
| | |
|
| | | # 目标细分
|
| | |
| | | for aimObj in aimObjList[::-1]:
|
| | | if not aimObj.CheckInState(ChConfig.BatObjState_PoisonCure):
|
| | | aimObjList.remove(aimObj)
|
| | | |
| | | # 仅流血目标
|
| | | elif tagAffect == ChConfig.SkillTagAffect_Bleeding:
|
| | | atkBackTagFrist = False
|
| | | for aimObj in aimObjList[::-1]:
|
| | | if not aimObj.CheckInState(ChConfig.BatObjState_Bleeding):
|
| | | aimObjList.remove(aimObj)
|
| | | |
| | | else:
|
| | | # 范围目标超过个数,则随机取
|
| | | if tagCount and len(aimObjList) > tagCount:
|
| | |
| | | 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()
|
| | | harmHP = int(maxHP * harmPer / 100.0)
|
| | | if calcType == 1:
|
| | | harmHP = int(curHP * harmPer / 100.0)
|
| | | else:
|
| | | harmHP = int(maxHP * harmPer / 100.0)
|
| | | lostHP = harmHP
|
| | | if curHP <= harmHP:
|
| | | if noEnoughDo == 0:
|
| | |
| | |
|
| | | 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) # 无视实际扣血量,直接更新
|
| | |
|
| | |
| | | addPer = addPerMax
|
| | | GameWorld.DebugLogEx("司马懿特殊潜能技能额外增加比例: frozenCnt=%s,addPer=%s" % (frozenCnt, addPer))
|
| | |
|
| | | addBatDamPer = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddBatDamPerByLayer, useSkill)
|
| | | |
| | | # 计算伤害
|
| | | calcHurtResults = []
|
| | | for tagBatObj in useSkill.GetTagObjList():
|
| | | hurtValue, hurtTypes, immuneHurt = __calcSkillHurt(turnFight, curBatObj, tagBatObj, useSkill, addPer)
|
| | | hurtValue, hurtTypes, immuneHurt = __calcSkillHurt(turnFight, curBatObj, tagBatObj, useSkill, addPer, addBatDamPer)
|
| | | calcHurtResults.append([tagBatObj, hurtValue, hurtTypes, immuneHurt])
|
| | |
|
| | | DoSkillHurtHP(turnFight, curBatObj, useSkill, calcHurtResults)
|
| | | return
|
| | |
|
| | | def __calcSkillHurt(turnFight, atkObj, defObj, curSkill, addPer=0):
|
| | | def __calcSkillHurt(turnFight, atkObj, defObj, curSkill, addPer=0, addBatDamPer=0):
|
| | | ## 计算技能伤害,只计算值,不做实际处理
|
| | | # @param addPer: 外部指定增加的比例
|
| | | # @return: hurtValue, hurtTypes, immuneHurt
|
| | | atkSkillPer = curSkill.GetSkillPer() + addPer
|
| | | atkSkillValue = curSkill.GetSkillValue()
|
| | | hurtValue, hurtTypes = CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer)
|
| | | hurtValue, hurtTypes = CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, addBatDamPer)
|
| | | hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
|
| | | return hurtValue, hurtTypes, immuneHurt
|
| | |
|
| | |
| | | tagID = tagObj.GetID()
|
| | | if tagID == ChConfig.HeroID_Caoren:
|
| | | continue
|
| | | if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
|
| | | if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
|
| | | continue
|
| | | if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
|
| | | caorenProtectObj = tagObj
|
| | |
| | |
|
| | | 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])
|
| | |
|
| | |
| | | continue
|
| | | if tagID == ChConfig.HeroID_Caoren:
|
| | | continue
|
| | | if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
|
| | | if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
|
| | | continue
|
| | | if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
|
| | | caorenProtectObj = tagObj
|
| | |
| | | # hurtValue *= (10000 + FinalDamPer) / 10000.0
|
| | | # GameWorld.DebugLogEx(" 增伤: hurtValue=%s,FinalDamPer=%s", hurtValue, FinalDamPer)
|
| | |
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | useSkill = poolMgr.acquire(BattleObj.PySkill, skillIpyData, atkID)
|
| | | useSkill = BattleObj.PySkill(skillIpyData, atkID)
|
| | | useSkill.SetTagObjList([defObj])
|
| | | useSkill.SetBatType(ChConfig.TurnBattleType_Cot)
|
| | |
|
| | |
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|
| | |
|
| | | useSkill.ResetUseRec()
|
| | | poolMgr.release(useSkill)
|
| | | return
|
| | |
|
| | | def SkillModule_6(turnFight, curBatObj, useSkill, opType):
|
| | |
| | | else:
|
| | | diffType = 1
|
| | | tagXP = tagBatObj.GetXP()
|
| | | diffValue = GetEnhanceXP(tagBatObj, calcValue)
|
| | | diffValue = GetEnhanceXP(tagBatObj, calcValue, useSkill)
|
| | | updValue = tagXP + diffValue
|
| | | tagBatObj.SetXP(updValue, False)
|
| | | GameWorld.DebugLogEx(" 加怒气: tagID=%s,diffValue=%s,tagXP=%s,updXP=%s", tagID, diffValue, tagXP, updValue)
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def DoAttackResult(turnFight, curBatObj, useSkill):
|
| | | def DoAttackResult(turnFight, curBatObj, useSkill, **kwargs):
|
| | | '''执行攻击结果
|
| | | @param curBatObj: 施法方或buff归属方
|
| | | '''
|
| | |
| | | if useSkill.GetCoolDownTime():
|
| | | useSkill.SetRemainTime(useSkill.GetCoolDownTime())
|
| | |
|
| | | if "byEffSkill" in kwargs:
|
| | | byEffSkill = kwargs["byEffSkill"]
|
| | | cdTime = byEffSkill.GetCoolDownTime()
|
| | | if cdTime:
|
| | | if hasattr(byEffSkill, "GetRemainTime"):
|
| | | byEffSkill.SetRemainTime(cdTime)
|
| | | GameWorld.DebugLogEx("提前设置效果技能触发后CD,防止嵌套循环触发! effSkillID=%s,cdTime=%s", byEffSkill.GetSkillID(), cdTime)
|
| | | |
| | | __doCostZhanchui(turnFight, curBatObj, useSkill) # 先扣除再同步技能
|
| | |
|
| | | # 需先技能使用 - 前端按顺序优先表现技能释放内容,前端需要动作或有伤血则通知
|
| | | if IsNeedSyncSkill(useSkill):
|
| | | Sync_UseSkill(turnFight, curBatObj, useSkill)
|
| | |
|
| | | __doSkillUserAnger(turnFight, curBatObj, useSkill)
|
| | | __doSkillUserAnger(turnFight, curBatObj, useSkill, **kwargs)
|
| | |
|
| | | DoBeAttackResult(turnFight, curBatObj, useSkill)
|
| | | return
|
| | |
| | | return useSkill
|
| | | return
|
| | |
|
| | | def DoBeAttackResult(turnFight, curObj, useSkill, curBuff=None):
|
| | | def DoBeAttackResult(turnFight, curObj, useSkill, timeBuff=None):
|
| | | '''被攻击结果
|
| | | @param curObj: 施法方或buff归属方
|
| | | @param timeBuff: 持续结算的buff,如持续攻击、持续治疗等
|
| | | '''
|
| | |
|
| | | #curID = curObj.GetID()
|
| | | isUseSkill = False if curBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
|
| | | curID = curObj.GetID()
|
| | | isUseSkill = False if timeBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
|
| | | isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
|
| | | isAngerSkill = SkillCommon.isAngerSkill(useSkill)
|
| | |
|
| | |
| | |
|
| | | # 优先处理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]
|
| | |
| | | # 统计击杀
|
| | | killObjList = [] # 击杀其他阵营目标列表
|
| | | dieObjList = [] # 死亡的单位列表,包含友方单位或自己
|
| | | nodeadObjList = [] # 不死的单位列表
|
| | | tagObjList = useSkill.GetTagObjList() # 主要目标列表
|
| | | tagObjListEx = useSkill.GetTagObjListEx() # 额外目标列表
|
| | | tagObjListAll = tagObjList + tagObjListEx
|
| | | for tagObj in tagObjListAll:
|
| | | tagID = tagObj.GetID()
|
| | | if tagObj.IsAlive() and tagObj.GetHP() <= 0:
|
| | | dieObjList.append(tagObj)
|
| | | if tagObj.GetFaction() != curObj.GetFaction():
|
| | | killObjList.append(tagObj)
|
| | | TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
|
| | | if tagObj.CanNoDead():
|
| | | tagObj.SetHP(1, True) # 触发不死,保留1点血量
|
| | | nodeadObjList.append(tagObj)
|
| | | else:
|
| | | dieObjList.append(tagObj)
|
| | | if tagObj.GetFaction() != curObj.GetFaction():
|
| | | killObjList.append(tagObj)
|
| | | TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
|
| | | useSkill.SetKillObjList(killObjList)
|
| | | # 判断自己,因为反弹、平摊伤害的原因,有可能自己干死自己
|
| | | selfAlive = curObj.IsAlive()
|
| | | if selfAlive and curObj.GetHP() <= 0:
|
| | | selfAlive = False
|
| | | dieObjList.append(curObj)
|
| | | TurnAttack.SetObjKilled(turnFight, curObj)
|
| | | |
| | | |
| | | # 统计伤血,可能单个技能对同一目标造成多次伤害
|
| | | totalHurtValue = 0
|
| | | isSuckHP = False
|
| | | suckObjIDList = [] # 吸血的对象ID列表
|
| | | missObjIDList, immuneObjIDList = [], [] # 闪避、免疫对象ID列表
|
| | | stunObjIDList, superHitObjIDList, parryObjIDList = [], [], []
|
| | | beHurtObjIDList = [] # 受伤的对象ID列表
|
| | | reviveObjList = [] # 复活的对象列表
|
| | | bounceObjList = [] # 有反弹的对象列表
|
| | | caorenProtectList = [] # 有被曹仁防护的对象列表
|
| | | 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 hurtObjID not in stunObjIDList:
|
| | | stunObjIDList.append(hurtObjID)
|
| | |
|
| | | if hurtObj.GetSuckHP() > 0:
|
| | | isSuckHP = True
|
| | | |
| | | if hurtObj.HaveHurtType(ChConfig.HurtAtkType_CaorenProtect):
|
| | | if tagObj not in caorenProtectList:
|
| | | caorenProtectList.append(tagObj)
|
| | | |
| | | if hurtObj.GetSuckHP() > 0 and not hurtObj.HaveHurtType(ChConfig.HurtAtkType_PoisonCureSuck):
|
| | | if hurtObjID not in suckObjIDList:
|
| | | suckObjIDList.append(hurtObjID)
|
| | | |
| | | # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
|
| | | if curObj.IsAlive() and curObj.GetHP() <= 0:
|
| | | if curObj.CanNoDead():
|
| | | curObj.SetHP(1, True) # 触发不死,保留1点血量
|
| | | nodeadObjList.append(curObj)
|
| | | else:
|
| | | dieObjList.append(curObj)
|
| | | killer = bounceObjList[0] if bounceObjList else None
|
| | | TurnAttack.SetObjKilled(turnFight, curObj, killer)
|
| | | |
| | | # 记录最后一次总伤害,有伤害目标才记录
|
| | | if totalHurtValue:
|
| | | curObj.SetLastHurtValue(totalHurtValue)
|
| | |
| | | DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuperHit, relatedSkillID)
|
| | | if stunObjIDList:
|
| | | DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_Stun, relatedSkillID)
|
| | | if isSuckHP:
|
| | | if suckObjIDList:
|
| | | DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuckHP, relatedSkillID)
|
| | |
|
| | | # 结算副本相关的攻击结果,仅主动发起玩家阵容武将触发
|
| | |
| | | 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):
|
| | |
| | | if dieObjList:
|
| | | for dieObj in dieObjList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, dieObj, ChConfig.TriggerWay_WhenDie, curObj, connSkill=useSkill)
|
| | | __dongbaiRevive(turnFight, dieObj, useSkill) # 写死特殊处理董白复活
|
| | |
|
| | | for faction in [ChConfig.Def_FactionA, ChConfig.Def_FactionB]:
|
| | | batFaction = turnFight.getBatFaction(faction)
|
| | |
| | | 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)
|
| | | |
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill, byFriendObj=dieObj)
|
| | | |
| | | # 触发不死
|
| | | for tagObj in nodeadObjList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_NoDead, curObj, connSkill=useSkill)
|
| | | |
| | | # 复活时
|
| | | for tagObj in reviveObjList:
|
| | | # 同步最新的怒气及buff,血量已经在技能中通知了
|
| | |
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Revive, curObj, connSkill=useSkill)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_InBattlefield, curObj, connSkill=useSkill)
|
| | |
|
| | | # 曹仁防护触发,暂写死
|
| | | for tagObj in caorenProtectList:
|
| | | tagBatLineup = tagObj.GetBatLineup()
|
| | | caorenObj = tagBatLineup.getHeroObj(ChConfig.HeroID_Caoren) # 获取被防护目标阵容的曹仁
|
| | | if not caorenObj or not caorenObj.IsAlive():
|
| | | continue
|
| | | caoRenSkill = caorenObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_CaorenProtect)
|
| | | if not caoRenSkill:
|
| | | continue
|
| | | passiveSkillID = caoRenSkill.GetEffect(0).GetEffectValue(0) # 防护成功后的触发技能ID,默认写在效果1的值
|
| | | GameWorld.DebugLogEx("曹仁防护后触发技能: caorenID=%s,protectID=%s,passiveSkillID=%s", caorenObj.GetID(), tagObj.GetID(), passiveSkillID)
|
| | | if passiveSkillID:
|
| | | OnUsePassiveSkill(turnFight, caorenObj, curObj, passiveSkillID, connSkill=useSkill)
|
| | | |
| | | triggerOne = False
|
| | | batType = useSkill.GetBatType()
|
| | | isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
|
| | | curBatLineup = None
|
| | | for tagObj in tagObjListAll:
|
| | | tagID = tagObj.GetID()
|
| | |
|
| | |
| | | if tagID in missObjIDList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeMiss, tagObj, connSkill=useSkill)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill)
|
| | | |
| | | # 免疫
|
| | | if tagID in immuneObjIDList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_ImmuneHurt, curObj, connSkill=useSkill)
|
| | |
|
| | | if tagID in effIgnoreObjIDList:
|
| | | continue
|
| | |
| | | # 掉血时
|
| | | if tagID in beHurtObjIDList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeHurt, curObj, connSkill=useSkill)
|
| | | #TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_HurtTag, tagObj, connSkill=useSkill) 暂时用不到先屏蔽
|
| | |
|
| | | # 受到任意效果时(除直接攻击外的任意效果,如buff、dot、治疗、额外怒技)
|
| | | if not isAttackDirect:
|
| | |
| | | if isExObj:
|
| | | continue
|
| | |
|
| | | isDotHurt = False
|
| | | # 直接攻击
|
| | | if isAttackDirect:
|
| | | if not triggerOne:
|
| | |
| | | elif not isAttackDirect:
|
| | | # 受到持续伤害
|
| | | if tagID in beHurtObjIDList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeDOTHurt, curObj, connSkill=useSkill)
|
| | | 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 isUseSkill:
|
| | |
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeParry, tagObj, connSkill=useSkill)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill)
|
| | |
|
| | | # 吸血
|
| | | if tagID in suckObjIDList:
|
| | | if not triggerOne:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuckHP, curObj, connSkill=useSkill)
|
| | | |
| | | # 连击
|
| | | if batType == ChConfig.TurnBattleType_Combo:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill)
|
| | |
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_AtkBack, tagObj, connSkill=useSkill)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAtkBack, curObj, connSkill=useSkill)
|
| | |
|
| | | |
| | | # 敌友方
|
| | | 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():
|
| | | lineupObj = batObjMgr.getBatObj(lineupObjID)
|
| | | if not lineupObj.IsAlive():
|
| | | continue
|
| | | |
| | | # 直接攻击
|
| | | if isAttackDirect:
|
| | | if not triggerOne:
|
| | | 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:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
|
| | | |
| | | # 追击
|
| | | elif batType == ChConfig.TurnBattleType_Pursue:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendPursue, tagObj, connSkill=useSkill, byFriendObj=curObj)
|
| | | |
| | | triggerOne = True # 设置已经触发过一次
|
| | |
|
| | | # 验证是否结算,最后处理
|
| | | if dieObjList:
|
| | | turnFight.checkOverByKilled()
|
| | |
|
| | | return
|
| | |
|
| | | def __dongbaiRevive(turnFight, batObj, useSkill):
|
| | | '''特殊处理董白复活: 董白死亡之后的时间,若有敌方单位阵亡,董白以50%血量复活
|
| | | '''
|
| | | faction = batObj.GetFaction()
|
| | | batFaction = turnFight.getBatFaction(ChConfig.Def_FactionA if faction == ChConfig.Def_FactionB else ChConfig.Def_FactionB)
|
| | | if not batFaction:
|
| | | return
|
| | | batLineup = batFaction.getBatlineup(1)
|
| | | if ChConfig.HeroID_Dongbai not in batLineup.heroObjIDDict:
|
| | | return
|
| | | dongbaiObj = BattleObj.GetBatObjMgr().getBatObj(batLineup.heroObjIDDict[ChConfig.HeroID_Dongbai])
|
| | | if not dongbaiObj or dongbaiObj.IsAlive():
|
| | | return
|
| | | skill = dongbaiObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_DongbaiRevive)
|
| | | if not skill:
|
| | | GameWorld.DebugLogEx("董白还还未学习特殊复活技能! %s", ChConfig.SkillID_DongbaiRevive)
|
| | | return
|
| | | enemyDeadCnt = dongbaiObj.GetDictByKey("EnemyDeadCnt") + 1
|
| | | dongbaiObj.SetDict("EnemyDeadCnt", enemyDeadCnt)
|
| | | GameWorld.DebugLogEx("董白记录自身死亡后的敌方阵亡单位数: %s" % enemyDeadCnt)
|
| | | needDeadCnt = skill.GetEffect(0).GetEffectValue(0) # 固定配置在效果1值
|
| | | if enemyDeadCnt < needDeadCnt:
|
| | | return
|
| | | dongbaiObj.SetDict("EnemyDeadCnt", 0)
|
| | | OnUseSkill(turnFight, dongbaiObj, skill, batType=ChConfig.TurnBattleType_Passive, bySkill=useSkill)
|
| | | return
|
| | |
|
| | | def __doCostZhanchui(turnFight, curBatObj, useSkill):
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def __doSkillUserAnger(turnFight, curBatObj, useSkill):
|
| | | def __doSkillUserAnger(turnFight, curBatObj, useSkill, **kwargs):
|
| | | ## 技能释放者怒气相关
|
| | | if SkillCommon.isAngerSkill(useSkill):
|
| | | curBatObj.SetXP(0)
|
| | | if "noUseXP" in kwargs:
|
| | | kwargs.pop("noUseXP")
|
| | | GameWorld.DebugLogEx("本次不消耗怒气")
|
| | | else:
|
| | | curBatObj.SetXP(0)
|
| | | elif SkillCommon.isTurnNormalSkill(useSkill) and useSkill.GetBatType() == ChConfig.TurnBattleType_Normal:
|
| | | addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 3)
|
| | | AddFightXP(curBatObj, addXP, "skillID:%s" % useSkill.GetSkillID())
|
| | |
| | | Sync_PropertyRefreshView(turnFight, gameObj, ChConfig.AttrID_XP, updXP, addXP, diffType=1, relatedSkillID=relatedSkillID)
|
| | | return
|
| | |
|
| | | def GetEnhanceXP(gameObj, addXP):
|
| | | def GetEnhanceXP(gameObj, addXP, useSkill=None):
|
| | | ## 获取提升后的xp值
|
| | | addPer = gameObj.GetBatAttrValue(ChConfig.AttrID_XPRecoverPer)
|
| | | # 其他强化、弱化
|
| | | if addPer == 0:
|
| | | return addXP
|
| | | if useSkill and useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PotentialSkill and useSkill.GetSkillValue() == 50:
|
| | | GameWorld.DebugLogEx("潜能初始50点暂时写死不受限: objID=%s,addXP=%s,skillID=%s", gameObj.GetID(), addXP, useSkill.GetSkillID())
|
| | | return addXP
|
| | | objID = gameObj.GetID()
|
| | | updAddXP = int(addXP * max(10000 + addPer, 0) / 10000.0)
|
| | |
| | | for tagObj in tagObjList:
|
| | | tagID = tagObj.GetID()
|
| | | if not tagObj.IsAlive():
|
| | | GameWorld.DebugLogEx(" 已被击杀不触发: tagID=%s", tagID)
|
| | | continue
|
| | | if enhanceSkillData.GetCurBuffState() == ChConfig.BatObjState_RebornLimit:
|
| | | GameWorld.DebugLogEx(" 禁止复活buff允许对死亡对象释放: tagID=%s", tagID)
|
| | | else:
|
| | | GameWorld.DebugLogEx(" 已被击杀不触发: tagID=%s", tagID)
|
| | | continue
|
| | | if tagID in effIgnoreObjIDList:
|
| | | GameWorld.DebugLogEx(" 闪避或免疫的不触发: tagID=%s", tagID)
|
| | | continue
|
| | |
| | | OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
|
| | | return
|
| | |
|
| | | def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, **kwargs):
|
| | | def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, batType=ChConfig.TurnBattleType_Passive, **kwargs):
|
| | | '''被动触发使用技能
|
| | | @param passiveSkill: 释放的被动技能 或 技能ID
|
| | | @param connSkill: 由什么技能引起的
|
| | |
| | | GameWorld.DebugLogEx(" 概率不触发: tagID=%s,happenRate=%s", tagID, happenRate)
|
| | | return
|
| | | passiveTagObjList = [tagObj]
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
|
| | | elif tagAim == ChConfig.SkillTagAim_MainSkillEx:
|
| | | if not connSkill:
|
| | | return
|
| | | passiveTagObjList = connSkill.GetTagObjList()
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
|
| | | elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
|
| | | if "byFriendObj" not in kwargs:
|
| | | return
|
| | | byFriendObj = kwargs.pop("byFriendObj") # 触发即移除,防止一直传递引发其他问题,如触发的技能再触发其他技能会被视为也是有byFriendObj
|
| | | passiveTagObjList = [byFriendObj]
|
| | | GameWorld.DebugLogEx("被动触发技能,针对来源友军! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s,byFriendID=%s", |
| | | effSkillID, effectID, passiveSkillID, bySkillID, byFriendObj.GetID())
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
|
| | | else:
|
| | | GameWorld.DebugLogEx("被动触发技能,重新锁定目标! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
|
| | |
|
| | | return isOK
|
| | |
|
| | | def CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, **kwargs):
|
| | | def CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, addBatDamPer=0, **kwargs):
|
| | | '''按公式计算伤害,默认按攻击计算
|
| | | '''
|
| | |
|
| | |
| | | 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)
|
| | |
| | | dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤
|
| | |
|
| | | aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
|
| | | aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
|
| | |
|
| | | aNormalSkillPer, dNormalSkillPerDef = 0, 0
|
| | | if isTurnNormalSkill:
|
| | |
| | | aDOTPer = atkObj.GetBatAttrValue(ChConfig.AttrID_DOTPer)
|
| | | dDOTPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_DOTPerDef)
|
| | | GameWorld.DebugLogEx("aDOTPer=%s,dDOTPerDef=%s", aDOTPer, dDOTPerDef)
|
| | | |
| | | if curSkill.GetCurBuffState() in ChConfig.BurnStateList:
|
| | | aDOTPer += atkObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPer)
|
| | | dDOTPerDef += defObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPerDef)
|
| | | GameWorld.DebugLogEx("是灼烧: aDOTPer=%s,dDOTPerDef=%s", aDOTPer, dDOTPerDef)
|
| | | |
| | | #aAddSkillPer = 0 # 技能增伤
|
| | | aBatDamPer, dBatDamPerDef = 0, 0 # 战斗增减伤
|
| | | dBatDamPerDef = 0 # 战斗增减伤
|
| | | aBatDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_BatDamPer)
|
| | | aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
|
| | | aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddBatDamPerByTagLostHP, curSkill)
|
| | | aBatDamPer += addBatDamPer
|
| | |
|
| | | # 物法增减伤
|
| | | if pmType == IPY_GameWorld.ghtMag: # 法伤
|
| | |
| | |
|
| | | hurtAtkPerMax = curSkill.GetHurtAtkPerMax() # 最大万分比,限制最终伤害不超过攻击力万分率
|
| | | if hurtAtkPerMax:
|
| | | hurtAtkPerMax += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddHurtAtkPerMax, curSkill)
|
| | | aAtk = atkObj.GetAtk()
|
| | | hurtValueMax = aAtk * hurtAtkPerMax / 10000.0
|
| | | hurtValue = min(hurtValue, hurtValueMax)
|
| | |
| | | return hurtValue, hurtTypes, immuneHurt
|
| | |
|
| | | hurtValue = int(hurtValue)
|
| | | if defObj.CheckInState(ChConfig.BatObjState_Wudi):
|
| | | if defObj.CheckInState(ChConfig.ImmuneHurtStateList):
|
| | | hurtTypes |= pow(2, ChConfig.HurtAtkType_Immune) # 添加免疫
|
| | | immuneHurt = hurtValue
|
| | | hurtValue = 0
|
| | |
| | | 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, hurtValue = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
|
| | | if ignoreShield:
|
| | | hurtTypes |= pow(2, ChConfig.HurtAtkType_IgnoreShield)
|
| | | |
| | | #伤害结构体
|
| | | defID = defObj.GetID()
|
| | | if isEx:
|
| | |
| | | # 曹仁的分担触发条件暂时程序内固定,有修改时程序同步修改
|
| | | # 曹仁: 我方英雄受到直接攻击时(受到群攻时选择血量最低的友方进行防护),曹仁有30%概率为其分担一半所受伤害,每成功分担一次,曹仁获得1层坚韧,使我方全体减伤提升5%,最多6层,曹仁死亡效果消失
|
| | | # 董白怒气 同命锁 对敌方攻击最高的1个目标造成攻击力450%物理伤害,并与其连接,使两人受到的任意伤害平摊(平摊伤害不会被再次平摊),持续2回合
|
| | | caorenSkillID = 1015070
|
| | | caorenSkillID = ChConfig.SkillID_CaorenProtect
|
| | | effHeroIDList = [ChConfig.HeroID_Zhenfu, ChConfig.HeroID_Caoren, ChConfig.HeroID_Dongbai] # 暂固定,有增加武将再同步修改
|
| | |
|
| | | isAve = False
|
| | |
| | |
|
| | | immuneHurt = immuneHurtDict.get(aveObjID)
|
| | | if immuneHurt == None:
|
| | | if aveObj.CheckInState(ChConfig.BatObjState_Wudi):
|
| | | if aveObj.CheckInState(ChConfig.ImmuneHurtStateList):
|
| | | immuneHurt = 0
|
| | | else:
|
| | | immuneHurt = -1 # 标记没有无敌
|
| | |
| | | @param hpCanNegative: 扣除后的生命是否允许负值
|
| | | @param immuneHurt: 免疫的伤害值
|
| | | @param isSkillSelfTag: 是否技能自身的直接目标,如平摊伤害目标、溅射伤害目标这种就不算直接目标
|
| | | @return: lostHP
|
| | | @return: lostHP, ignoreShield, hurtValue
|
| | | '''
|
| | |
|
| | | 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, hurtValue
|
| | |
|
| | | # 伤血上限保护
|
| | | lostHPProtect = TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_LostHPProtect, curSkill)
|
| | | if lostHPProtect > 0 and hurtValue > lostHPProtect:
|
| | | GameWorld.DebugLogEx(" 扣血时最大伤血保护: defID=%s,hurtValue=%s,lostHPProtect=%s", defObj.GetID(), hurtValue, lostHPProtect)
|
| | | hurtValue = lostHPProtect
|
| | | |
| | | atkID = atkObj.GetID()
|
| | | defID = defObj.GetID()
|
| | | skillID = curSkill.GetSkillID()
|
| | |
| | | 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, hurtValue
|
| | |
|
| | | def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
|
| | | '''计算反弹反弹伤害
|
| | |
| | | return
|
| | |
|
| | | GameWorld.DebugLogEx(" 反弹伤害=%s,%s/%s, damBackPer=%s", bounceHP, atkObj.GetHP(), atkObj.GetMaxHP(), damBackPer)
|
| | | bounceHP, _, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, bounceHP)
|
| | | bounceHP, _, immuneHurt = CalcHurtWithBuff(turnFight, defObj, atkObj, bounceHP)
|
| | | if bounceHP <= 0:
|
| | | GameWorld.DebugLogEx(" bounceHP=%s", bounceHP)
|
| | | return
|
| | | hurtObj.SetBounceHP(bounceHP)
|
| | | DoLostHP(turnFight, atkObj, defObj, bounceHP, curSkill, "Bounce", hpCanNegative=True, immuneHurt=immuneHurt) # 反弹后生命允许负值
|
| | | DoLostHP(turnFight, defObj, atkObj, bounceHP, curSkill, "Bounce", hpCanNegative=True, immuneHurt=immuneHurt) # 反弹后生命允许负值
|
| | | return
|
| | |
|
| | | def CalcSuckBlood(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):
|
| | | ''' 计算治疗值
|
| | | '''
|
| | |
|
| | |
| | | cureHPEx = eval(IpyGameDataPY.GetFuncCompileCfg("CureFormula", 1))
|
| | | cureHP += cureHPEx
|
| | | GameWorld.DebugLogEx(" 额外治疗值(%s): cureType=%s,baseValue=%s,skillPer=%s,cureHP=%s", cureHPEx, cureType, baseValue, skillPer, cureHP)
|
| | | |
| | | addCureMulti = TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddCureMultiBySkillType, curSkill)
|
| | | if addCureMulti:
|
| | | multiValue += addCureMulti / 100.0
|
| | | 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:
|
| | |
| | | hurtValue *= (10000 + FinalDamPer) / 10000.0
|
| | | GameWorld.DebugLogEx(" 增伤: hurtValue=%s,FinalDamPer=%s", hurtValue, FinalDamPer)
|
| | |
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | useSkill = poolMgr.acquire(BattleObj.PySkill, skillIpyData, atkID)
|
| | | useSkill = BattleObj.PySkill(skillIpyData, atkID)
|
| | | useSkill.SetTagObjList([defObj])
|
| | | useSkill.SetBatType(ChConfig.TurnBattleType_Dot)
|
| | |
|
| | |
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|
| | |
|
| | | useSkill.ResetUseRec()
|
| | | poolMgr.release(useSkill)
|
| | | return
|
| | |
|
| | | def Sync_TurnFightTag(turnFight, useTag, sign):
|
| | | ## 通知技能标签
|
| | | clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCTurnFightTag)
|
| | | clientPack = ChPyNetSendPack.tagSCTurnFightTag()
|
| | | clientPack.Tag = useTag
|
| | | clientPack.Len = len(clientPack.Tag)
|
| | | clientPack.Sign = sign
|
| | |
| | | ## 通知释放技能
|
| | | bySkill = useSkill.GetBySkill()
|
| | | relatedSkillID = bySkill.GetSkillID() if bySkill else 0
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkill)
|
| | | clientPack = ChPyNetSendPack.tagSCUseSkill()
|
| | | clientPack.ObjID = curBatObj.GetID()
|
| | | clientPack.PMType = GetPMType(curBatObj, useSkill)
|
| | | clientPack.BattleType = useSkill.GetBatType()
|
| | |
| | | # 技能的主要伤害
|
| | | clientPack.HurtList = []
|
| | | for hurtObj in useSkill.GetHurtObjList():
|
| | | hurt = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurt)
|
| | | hurt = ChPyNetSendPack.tagSCUseSkillHurt()
|
| | | hurt.ObjID = hurtObj.GetObjID()
|
| | | hurt.AttackTypes = hurtObj.GetHurtTypes()
|
| | | hurt.HurtHP = hurtObj.GetHurtHP() % ChConfig.Def_PerPointValue
|
| | |
| | | hurt.HurtListEx = []
|
| | | # 单个伤害的额外伤害,如弹射+平摊伤害
|
| | | for hurtObjEx in hurtObj.GetHurtObjListEx():
|
| | | hurtEx = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurtEx)
|
| | | hurtEx = ChPyNetSendPack.tagSCUseSkillHurtEx()
|
| | | hurtEx.ObjID = hurtObjEx.GetObjID()
|
| | | hurtEx.AttackTypes = hurtObjEx.GetHurtTypes()
|
| | | hurtEx.HurtHP = hurtObjEx.GetHurtHP() % ChConfig.Def_PerPointValue
|
| | |
| | | # 技能的额外伤害,如常规技能的平摊伤害
|
| | | clientPack.HurtListEx = []
|
| | | for hurtObjEx in useSkill.GetHurtObjListEx():
|
| | | hurtEx = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurtEx)
|
| | | hurtEx = ChPyNetSendPack.tagSCUseSkillHurtEx()
|
| | | hurtEx.ObjID = hurtObjEx.GetObjID()
|
| | | hurtEx.AttackTypes = hurtObjEx.GetHurtTypes()
|
| | | hurtEx.HurtHP = hurtObjEx.GetHurtHP() % ChConfig.Def_PerPointValue
|
| | |
| | | if not clientPack.HurtList:
|
| | | for tagObj in useSkill.GetTagObjList():
|
| | | tagID = tagObj.GetID()
|
| | | hurt = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurt)
|
| | | hurt = ChPyNetSendPack.tagSCUseSkillHurt()
|
| | | hurt.ObjID = tagID
|
| | | hurt.CurHP = tagObj.GetHP() % ChConfig.Def_PerPointValue
|
| | | hurt.CurHPEx = tagObj.GetHP() / ChConfig.Def_PerPointValue
|
| | |
| | | if attrID not in ChConfig.CDBRefresh_AttrIDDict:
|
| | | return
|
| | | refreshType, isBig = ChConfig.CDBRefresh_AttrIDDict[attrID]
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCObjPropertyRefreshView)
|
| | | clientPack = ChPyNetSendPack.tagSCObjPropertyRefreshView()
|
| | | clientPack.ObjID = curBatObj.GetID()
|
| | | clientPack.RefreshType = refreshType
|
| | | clientPack.AttackTypes = hurtTypes
|
| | |
| | |
|
| | | def Sync_HPRefresh(turnFight, curBatObj):
|
| | | hp, maxHP = curBatObj.GetHP(), curBatObj.GetMaxHP()
|
| | | clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCObjHPRefresh)
|
| | | clientPack = ChPyNetSendPack.tagSCObjHPRefresh()
|
| | | clientPack.ObjID = curBatObj.GetID()
|
| | | clientPack.HP = hp % ShareDefine.Def_PerPointValue
|
| | | clientPack.HPEx = hp / ShareDefine.Def_PerPointValue
|