| | |
| | | ght = useSkill.GetHurtType() % 10
|
| | | if ght == IPY_GameWorld.ghtMag: # 做配置兼容用,优先验证法伤,否则默认物伤
|
| | | return IPY_GameWorld.ghtMag
|
| | | if ght == 3: # 由触发的技能决定
|
| | | bySkill = useSkill.GetBySkill()
|
| | | if bySkill:
|
| | | #GameWorld.DebugLogEx("物法类型取触发的技能: useSkillID=%s,bySkillID=%s", useSkill.GetSkillID(), bySkill.GetSkillID())
|
| | | return GetPMType(batObj, bySkill)
|
| | | return IPY_GameWorld.ghtPhy
|
| | |
|
| | | def IsIgnoreDef(useSkill):
|
| | |
| | | return
|
| | |
|
| | | skillType = useSkill.GetSkillType()
|
| | | byBatObj = kwargs.pop("byBatObj", None)
|
| | | if useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_MinggeSkill:
|
| | | if useSkill.GetSkillType() in ChConfig.Def_HurtSkill_List:
|
| | | if not byBatObj:
|
| | | return
|
| | | GameWorld.DebugLogEx("命格攻击类技能施法方算触发者! mgObjID=%s,byObjID=%s,skillID=%s", curBatObj.GetID(), byBatObj.GetID(), skillID)
|
| | | curBatObj = byBatObj
|
| | | else:
|
| | | # 因为命格攻击类技能修改了施法者,后续如果有子技能触发会变成还是变更后的施法者,导致命格全体buff可能存在多个施法来源,可能导致bug
|
| | | batLineup = curBatObj.GetTFBatLineup()
|
| | | curBatObj = batLineup.getMinggeObj()
|
| | | GameWorld.DebugLogEx("命格非攻击类技能强制施法者为命格自己! mgObjID=%s,skillID=%s", curBatObj.GetID(), skillID)
|
| | | |
| | | byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
|
| | | if not curBatObj.IsAlive():
|
| | | if skillType == ChConfig.Def_SkillType_Revive:
|
| | |
| | | useSkill.SetBatType(batType)
|
| | | useSkill.SetBySkill(bySkill)
|
| | | useSkill.SetByBuff(byBuff)
|
| | | # 注:理论上原先的 byFriendObj 都可以直接用这个,但是旧的代码先不修改了,后续的累计敌军、友军之类的触发可以统一使用 byBatObj
|
| | | useSkill.SetByBatObj(kwargs.pop("byBatObj", None))
|
| | | useSkill.SetByTriggerWay(byTriggerWay)
|
| | |
|
| | | isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
|
| | |
| | | row = inRowNum # 目标玩家所在横排
|
| | |
|
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | batLineup = tagObj.GetBatLineup()
|
| | | batLineup = tagObj.GetTFBatLineup()
|
| | | aimObjList = []
|
| | | for col in colNumList:
|
| | | pNum = (row - 1) * ChConfig.TurnFightCols + col
|
| | |
| | | col = inColNum # 目标玩家所在纵排
|
| | |
|
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | batLineup = tagObj.GetBatLineup()
|
| | | batLineup = tagObj.GetTFBatLineup()
|
| | | aimObjList = []
|
| | | for row in range(1, 1 + ChConfig.TurnFightRows):
|
| | | pNum = (row - 1) * ChConfig.TurnFightCols + col
|
| | |
| | |
|
| | | # 曹仁防护触发,暂写死
|
| | | for tagObj in caorenProtectList:
|
| | | tagBatLineup = tagObj.GetBatLineup()
|
| | | tagBatLineup = tagObj.GetTFBatLineup()
|
| | | caorenObj = tagBatLineup.getHeroObj(ChConfig.HeroID_Caoren) # 获取被防护目标阵容的曹仁
|
| | | if not caorenObj or not caorenObj.IsAlive():
|
| | | continue
|
| | |
| | | triggerOne = False
|
| | | batType = useSkill.GetBatType()
|
| | | isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
|
| | | curBatLineup = None
|
| | | curBatLineup = curObj.GetTFBatLineup()
|
| | | curMGObj = curBatLineup.getMinggeObj()
|
| | | for tagObj in tagObjListAll:
|
| | | tagID = tagObj.GetID()
|
| | |
|
| | |
| | | # 追击
|
| | | elif batType == ChConfig.TurnBattleType_Pursue:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Pursue, tagObj, connSkill=useSkill)
|
| | | if isAttackDirect:
|
| | | if curMGObj:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_PursueAtk, tagObj, connSkill=useSkill, byBatObj=curObj)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
|
| | | # 反击
|
| | | elif batType == ChConfig.TurnBattleType_AtkBack:
|
| | |
| | |
|
| | | # 敌友方
|
| | | 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():
|
| | |
| | | '''按公式计算伤害,默认按攻击计算
|
| | | '''
|
| | |
|
| | | #mapID = turnFight.mapID
|
| | | skillID = curSkill.GetSkillID()
|
| | | #mapID = turnFight.mapID
|
| | | pmType = GetPMType(atkObj, curSkill)
|
| | | ignoreDef = IsIgnoreDef(curSkill)
|
| | | batType = curSkill.GetBatType()
|
| | |
| | | mustHit = True
|
| | |
|
| | | angerOverflow = atkObj.GetAngerOverflow() # 怒气溢出值
|
| | | if isAngerSkill:
|
| | | curXP = atkObj.GetXP()
|
| | | GameWorld.DebugLogEx("怒技攻击! curXP=%s,angerOverflow=%s", curXP, angerOverflow)
|
| | | |
| | | |
| | | #命中公式 攻击方类型不同,公式不同
|
| | | if not mustHit and not curSkill.GetEffectByID(ChConfig.SkillEff_MustHit) and not defObj.IsInControlledHard():
|
| | | aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # 抗闪避率 - 命中
|
| | |
| | | aSuperDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SuperDamPer, curSkill)
|
| | |
|
| | | dSuperDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPerDef)
|
| | | GameWorld.DebugLogEx("aSuperDamPer=%s,dSuperDamPerDef=%s", aSuperDamPer, dSuperDamPerDef)
|
| | |
|
| | | if isParry:
|
| | | hurtTypes |= pow(2, ChConfig.HurtAtkType_Parry)
|
| | |
| | | aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
|
| | | aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
|
| | |
|
| | | #招架 - 无视攻击方最终增伤百分比
|
| | | dZhaojia = defObj.GetBatAttrValue(ChConfig.AttrID_Zhaojia)
|
| | | aZhaojiaDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ZhaojiaDef)
|
| | | if dZhaojia > aZhaojiaDef:
|
| | | perMoreValue, perReduce = IpyGameDataPY.GetFuncEvalCfg("ZhaojiaCfg", 1) # 每高与对方抗贯穿x值无视y%最终减伤
|
| | | reducePer = (dZhaojia - aZhaojiaDef) / float(perMoreValue) * perReduce
|
| | | reduceMin, reduceMax = IpyGameDataPY.GetFuncEvalCfg("ZhaojiaCfg", 2) # 最小无视百分比|最大无视百分比
|
| | | if reducePer >= reduceMin and GameWorld.CanHappen(IpyGameDataPY.GetFuncCfg("ZhaojiaCfg", 3)):
|
| | | reducePer = min(reducePer, reduceMax)
|
| | | hurtTypes |= pow(2, ChConfig.HurtAtkType_Zhaojia)
|
| | | aFinalDamPer = int(aFinalDamPer * (100 - reducePer) / 100.0) # 按百分比减少
|
| | | GameWorld.DebugLogEx("dZhaojia=%s,aZhaojiaDef=%s,reducePer=%s,aFinalDamPer=%s", dZhaojia, aZhaojiaDef, reducePer, aFinalDamPer)
|
| | | |
| | | #贯穿 - 无视防守方最终减伤百分比
|
| | | aGuanchuan = atkObj.GetBatAttrValue(ChConfig.AttrID_Guanchuan)
|
| | | dGuanchuanDef = defObj.GetBatAttrValue(ChConfig.AttrID_GuanchuanDef)
|
| | | if aGuanchuan > dGuanchuanDef:
|
| | | perMoreValue, perReduce = IpyGameDataPY.GetFuncEvalCfg("GuanchuanCfg", 1) # 每高与对方抗贯穿x值无视y%最终减伤
|
| | | reducePer = (aGuanchuan - dGuanchuanDef) / float(perMoreValue) * perReduce
|
| | | reduceMin, reduceMax = IpyGameDataPY.GetFuncEvalCfg("GuanchuanCfg", 2) # 最小无视百分比|最大无视百分比
|
| | | if reducePer >= reduceMin and GameWorld.CanHappen(IpyGameDataPY.GetFuncCfg("GuanchuanCfg", 3)):
|
| | | reducePer = min(reducePer, reduceMax)
|
| | | hurtTypes |= pow(2, ChConfig.HurtAtkType_Guanchuan)
|
| | | dFinalDamPerDef = int(dFinalDamPerDef * (100 - reducePer) / 100.0) # 按百分比减少
|
| | | GameWorld.DebugLogEx("aGuanchuan=%s,dGuanchuanDef=%s,reducePer=%s,dFinalDamPerDef=%s", aGuanchuan, dGuanchuanDef, reducePer, dFinalDamPerDef) |
| | | |
| | | aNormalSkillPer, dNormalSkillPerDef = 0, 0
|
| | | if isTurnNormalSkill:
|
| | | aNormalSkillPer = atkObj.GetBatAttrValue(ChConfig.AttrID_NormalSkillPer) # 普技增伤
|
| | |
| | | if turnFight.isPVP() > 0:
|
| | | aPVPDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_PVPDamPer)
|
| | | dPVPDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_PVPDamPerDef)
|
| | | GameWorld.DebugLogEx("PVP aPVPDamPer=%s,dPVPDamPerDef=%s", aPVPDamPer, dPVPDamPerDef)
|
| | |
|
| | | # 所有万分率参数统一除10000.0
|
| | | atkSkillPer /= 10000.0
|
| | |
| | |
|
| | | if calcType != ChConfig.Def_Calc_Attack:
|
| | | aAtk = GetCalcBaseValue(calcType, atkObj, defObj, curSkill)
|
| | | GameWorld.DebugLogEx("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s/%s,hurtTypes=%s,aBatDamPer=%s,aFinalDamPer=%s", |
| | | atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, dMaxHP, hurtTypes, aBatDamPer, aFinalDamPer)
|
| | | #GameWorld.DebugLogEx("aCountry=%s,dCountry=%s,aCountryDamPer=%s,dCountryDamPerDef=%s", aCountry, dCountry, aCountryDamPer, dCountryDamPerDef)
|
| | | |
| | | GameWorld.DebugLogEx("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s/%s,hurtTypes=%s,aBatDamPer=%s,dBatDamPerDef=%s,aFinalDamPer=%s,dFinalDamPerDef=%s", |
| | | atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, dMaxHP, hurtTypes, aBatDamPer, dBatDamPerDef, aFinalDamPer, dFinalDamPerDef)
|
| | | if isSuperHit:
|
| | | GameWorld.DebugLogEx(" 暴击 aSuperDamPer=%s,dSuperDamPerDef=%s", aSuperDamPer, dSuperDamPerDef)
|
| | | if aPMDamPer or dPMDamPerDef:
|
| | | GameWorld.DebugLogEx(" 物法 aPMDamPer=%s,dPMDamPerDef=%s,pmType=%s", aPMDamPer, dPMDamPerDef, pmType)
|
| | | if aComboDamPer or dComboDamPerDef:
|
| | | GameWorld.DebugLogEx(" 连击 aComboDamPer=%s,dComboDamPerDef=%s", aComboDamPer, dComboDamPerDef)
|
| | | if aPursueDamPer or dPursueDamPerDef:
|
| | | GameWorld.DebugLogEx(" 追击 aPursueDamPer=%s,dPursueDamPerDef=%s", aPursueDamPer, dPursueDamPerDef)
|
| | | if aPVPDamPer or dPVPDamPerDef:
|
| | | GameWorld.DebugLogEx(" PVP aPVPDamPer=%s,dPVPDamPerDef=%s", aPVPDamPer, dPVPDamPerDef)
|
| | | if aCountryDamPer or dCountryDamPerDef:
|
| | | GameWorld.DebugLogEx(" 国家 aCountry=%s,dCountry=%s,aCountryDamPer=%s,dCountryDamPerDef=%s", aCountry, dCountry, aCountryDamPer, dCountryDamPerDef)
|
| | | |
| | | if isTurnNormalSkill:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 1))
|
| | | GameWorld.DebugLogEx(" 普攻技能伤害=%s,aNormalSkillPer=%s,dNormalSkillPerDef=%s", hurtValue, aNormalSkillPer, dNormalSkillPerDef)
|
| | | elif isAngerSkill:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 2))
|
| | | GameWorld.DebugLogEx(" 怒气技能伤害=%s,aAngerSkillPer=%s,dAngerSkillPerDef=%s", hurtValue, aAngerSkillPer, dAngerSkillPerDef)
|
| | | GameWorld.DebugLogEx(" 怒气技能伤害=%s,aAngerSkillPer=%s,dAngerSkillPerDef=%s,angerOverflow=%s,curXP=%s", hurtValue, aAngerSkillPer, dAngerSkillPerDef, angerOverflow, atkObj.GetXP())
|
| | | elif isDot:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
|
| | | GameWorld.DebugLogEx(" 持续技能伤害=%s" % (hurtValue))
|
| | | GameWorld.DebugLogEx(" 持续技能伤害=%s,aDOTPer=%s,dDOTPerDef=%s", hurtValue, aDOTPer, dDOTPerDef)
|
| | | elif calcType == ChConfig.Def_Calc_ByBuffValue:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 2))
|
| | | GameWorld.DebugLogEx(" 按最后一次buff值计算伤害=%s,calcType=%s,LastHurt=%s", hurtValue, calcType, aAtk)
|
| | |
| | | for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamBackShield):
|
| | | damBackPer += buff.GetValue1()
|
| | | connSkillTypeID = buff.GetSkillTypeID()
|
| | | damBackPer += TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_AddSkillPerByBuffLayer, connSkillTypeID=connSkillTypeID)
|
| | | damBackPer += TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_AddDamBackPerByBuffLayer, connSkillTypeID=connSkillTypeID)
|
| | |
|
| | | if damBackPer <= 0:
|
| | | return
|