| | |
| | | import PlayerControl
|
| | | import NPCCommon
|
| | | import SkillCommon
|
| | | import EffGetSet
|
| | | import FBLogic
|
| | | import ReadChConfig
|
| | | import PetControl
|
| | |
| | | import ChNPC
|
| | | import BossHurtMng
|
| | | import NPCHurtMgr
|
| | | import ChNetSendPack
|
| | | import TurnAttack
|
| | |
|
| | | import datetime
|
| | | import math
|
| | |
| | | AddHurtValue(defender, attacker.GetPlayerID(), ChConfig.Def_NPCHurtTypePlayer, 1)
|
| | | return
|
| | |
|
| | | ## 被攻击者被动buff触发
|
| | | # @param curTagPlayer 被攻击者
|
| | | # @param tick 当前时间
|
| | | # @param isSuperHit 暴击
|
| | | # @return None
|
| | | # @remarks 函数详细说明.
|
| | | def DefenderSpringBuff(curTagPlayer, tick, isSuperHit=False):
|
| | | return
|
| | | |
| | | #---------------------------------------------------------------------
|
| | |
|
| | | def GetBattleRelationType(attacker, defender):
|
| | |
| | | # @return 攻击类型 如 IPY_GameWorld.ghtPhy
|
| | | # @remarks 获取攻击类型
|
| | | def GetBattleType(attack, attackUseSkill):
|
| | | # GetHurtType用法改成 pvp pve标识
|
| | | return IPY_GameWorld.ghtPhy
|
| | | # #---技能攻击, 读表获取攻击类型---
|
| | | # if attackUseSkill != None:
|
| | | # return attackUseSkill.GetHurtType()
|
| | | #
|
| | | # #---普通攻击---
|
| | | #
|
| | | # #玩家算普通攻击
|
| | | # if attack.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | # return IPY_GameWorld.ghtPhy
|
| | | #
|
| | | # #NPC读表取
|
| | | # return attack.GetHurtType()
|
| | |
|
| | | ## 输入基础数值,返回增强后的值 - 技能加强
|
| | | # @param value 基础值
|
| | | # @param skill 技能
|
| | | # @return 增强后的值
|
| | | # @remarks 函数详细说明.
|
| | | def GetEnhanceValue(value, skill):
|
| | | per = skill.GetEffect(0).GetEffectValue(0)
|
| | | eff = skill.GetEffect(0).GetEffectValue(1)
|
| | | #GameWorld.Log("被动 -> 自身属性,技能ID = %s,技能增强 = %s,附加 = %s , 基础值 = %s"%(skill.GetSkillName(),per,eff,value))
|
| | | return max(value * per / ChConfig.Def_MaxRateValue + eff , 1)
|
| | |
|
| | | ## 输入基础数值,返回增强后的值 (LV)- 效果加强
|
| | | # @param value 基础值
|
| | | # @param eff 效果
|
| | | # @return 增强后的值
|
| | | # @remarks 函数详细说明.
|
| | | def GetEnhanceValue_Eff(value, eff):
|
| | | per = eff.GetEffectValue(0)
|
| | | eff = eff.GetEffectValue(1)
|
| | | #GameWorld.Log("value = %s,per = %s,erf = %s"%(value,per,eff))
|
| | | return max(value * per / ChConfig.Def_MaxRateValue + eff , 1)
|
| | |
|
| | | ## 输入基础效果值,(玩家索引) -> 技能增强
|
| | | # @param curPlayer 当前玩家
|
| | | # @param curEffect 当前效果
|
| | | # @return 增强后的值
|
| | | # @remarks 函数详细说明.
|
| | | def GetEnhanceIndexValue_Eff(curPlayer, curEffect):
|
| | | index = curEffect.GetEffectValue(0)
|
| | | skillPer = curEffect.GetEffectValue(1)
|
| | | effect = curEffect.GetEffectValue(2)
|
| | | maxValue = EffGetSet.GetValueByEffIndex(curPlayer, index)
|
| | | #GameWorld.Log("-----%s,%s,%s,%s"%(index,skillPer,effect,maxValue))
|
| | | # GetHurtType 个位数用法改成 pvp pve标识,十位数-物攻法攻 IPY_GameWorld.ghtPhy = 1
|
| | | #---技能攻击, 读表获取攻击类型---
|
| | | if attackUseSkill != None:
|
| | | ght = attackUseSkill.GetHurtType() / 10
|
| | | if ght == IPY_GameWorld.ghtMag: # 做配置兼容用,优先验证法伤,否则默认物伤
|
| | | return IPY_GameWorld.ghtMag
|
| | | return IPY_GameWorld.ghtPhy
|
| | |
|
| | | if maxValue == None:
|
| | | return 0
|
| | | #---普通攻击---
|
| | |
|
| | | #玩家算普通攻击
|
| | | if attack.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | return IPY_GameWorld.ghtPhy
|
| | |
|
| | | return max(maxValue * skillPer / ChConfig.Def_MaxRateValue + effect , 1)
|
| | | #NPC读表取
|
| | | return attack.GetHurtType()
|
| | |
|
| | | def GetAtkDistType(curObj):
|
| | | ## 获取是近战还是远程,默认近战
|
| | | if curObj.GetGameObjType() != IPY_GameWorld.gotNPC:
|
| | | return ChConfig.AtkDistType_Short
|
| | | |
| | | playerID = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_LineupPlayerID)
|
| | | if not playerID:
|
| | | return ChConfig.AtkDistType_Short
|
| | | |
| | | heroID = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_HeroID)
|
| | | if heroID:
|
| | | heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID)
|
| | | if heroIpyData:
|
| | | return heroIpyData.GetAtkDistType()
|
| | | |
| | | npcID = curObj.GetNPCID()
|
| | | npcDataEx = NPCCommon.GetNPCDataEx(npcID)
|
| | | if npcDataEx:
|
| | | return npcDataEx.GetAtkDistType()
|
| | | |
| | | return ChConfig.AtkDistType_Short
|
| | |
|
| | | #--------------------------------------------------------------------------
|
| | | ## 设置玩家进入战斗状态
|
| | | # @param defender 当前玩家(被攻击了)
|
| | |
| | | # @return True or False
|
| | | # @remarks 函数详细说明.
|
| | | def CheckNPCAttackDist(curNPC, curTag, skill):
|
| | | #获取距离
|
| | | dist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(),
|
| | | curTag.GetPosX(), curTag.GetPosY())
|
| | | #普通攻击
|
| | | if skill == None:
|
| | | if dist > curNPC.GetAtkDist():
|
| | | return
|
| | | #技能攻击
|
| | | elif dist > skill.GetAtkDist():
|
| | | return
|
| | | |
| | | #卡牌暂不限制
|
| | | return True
|
| | | # #获取距离
|
| | | # dist = GameWorld.GetDist(curNPC.GetPosX(), curNPC.GetPosY(),
|
| | | # curTag.GetPosX(), curTag.GetPosY())
|
| | | # #普通攻击
|
| | | # if skill == None:
|
| | | # if dist > curNPC.GetAtkDist():
|
| | | # return
|
| | | # #技能攻击
|
| | | # elif dist > skill.GetAtkDist():
|
| | | # return
|
| | | # |
| | | # return True
|
| | |
|
| | | ## 检查被攻击后,特殊Buff消失
|
| | | # @param curTagPlayer 被攻击方
|
| | |
| | | hurtType = ChConfig.Def_HurtType_Normal
|
| | | # 伤害类型结果信息, 默认值{伤害类型:[是否触发, 伤害计算值, 触发时防守方的伤害减免值], ...}
|
| | | hurtTypeResultDict = {
|
| | | ChConfig.Def_HurtType_LuckyHit:[False, 0, 0],
|
| | | #ChConfig.Def_HurtType_LuckyHit:[False, 0, 0],
|
| | | ChConfig.Def_HurtType_SuperHit:[False, 0, 0],
|
| | | ChConfig.Def_HurtType_Parry:[False, 0, 0],
|
| | | ChConfig.Def_HurtType_Zhuxian:[False, 0, 0],
|
| | | ChConfig.Def_HurtType_DeadlyHit:[False, 0, 0],
|
| | | #ChConfig.Def_HurtType_Zhuxian:[False, 0, 0],
|
| | | #ChConfig.Def_HurtType_DeadlyHit:[False, 0, 0],
|
| | | ChConfig.Def_HurtType_ThumpHit:[False, 0, 0],
|
| | | }
|
| | |
|
| | | calcTypeList = []
|
| | | if atkObjType == IPY_GameWorld.gotPlayer:
|
| | | calcTypeList += [ChConfig.Def_HurtType_LuckyHit, ChConfig.Def_HurtType_SuperHit, |
| | | ChConfig.Def_HurtType_Zhuxian, ChConfig.Def_HurtType_DeadlyHit,
|
| | | ChConfig.Def_HurtType_ThumpHit]
|
| | | if defObjType == IPY_GameWorld.gotPlayer:
|
| | | calcTypeList += [ChConfig.Def_HurtType_Parry]
|
| | | # 暂时只计算玩家
|
| | | #calcTypeList = []
|
| | | #if atkObjType == IPY_GameWorld.gotPlayer:
|
| | | # calcTypeList += [ChConfig.Def_HurtType_LuckyHit, ChConfig.Def_HurtType_SuperHit, |
| | | # ChConfig.Def_HurtType_Zhuxian, ChConfig.Def_HurtType_DeadlyHit,
|
| | | # ChConfig.Def_HurtType_ThumpHit]
|
| | | #if defObjType == IPY_GameWorld.gotPlayer:
|
| | | # calcTypeList += [ChConfig.Def_HurtType_Parry]
|
| | | calcTypeList = [ChConfig.Def_HurtType_SuperHit, ChConfig.Def_HurtType_Parry]
|
| | | if not calcTypeList:
|
| | | return hurtType, hurtTypeResultDict
|
| | |
|
| | | # 优先级列表, 互斥列表
|
| | | priorityList, mutexList = ReadChConfig.GetEvalChConfig("CalcHurtTypeInfo")
|
| | | # 优先级列表
|
| | | priorityList = [ChConfig.Def_HurtType_Parry, ChConfig.Def_HurtType_SuperHit]
|
| | | mutexList = [] # 互斥列表
|
| | | happenFunc = {
|
| | | ChConfig.Def_HurtType_LuckyHit:__HurtTypeHappen_LuckyHit,
|
| | | #ChConfig.Def_HurtType_LuckyHit:__HurtTypeHappen_LuckyHit,
|
| | | ChConfig.Def_HurtType_SuperHit:__HurtTypeHappen_SuperHit,
|
| | | ChConfig.Def_HurtType_Parry:__HurtTypeHappen_Parry,
|
| | | #ChConfig.Def_HurtType_Zhuxian:__HurtTypeHappen_Zhuxian,
|
| | | ChConfig.Def_HurtType_DeadlyHit:__HurtTypeHappen_Deadly,
|
| | | ChConfig.Def_HurtType_ThumpHit:__HurtTypeHappen_ThumpHit,
|
| | | #ChConfig.Def_HurtType_DeadlyHit:__HurtTypeHappen_Deadly,
|
| | | #ChConfig.Def_HurtType_ThumpHit:__HurtTypeHappen_ThumpHit,
|
| | | }
|
| | |
|
| | | hadCheckList = [] # 已经处理过的伤害类型列表
|
| | |
| | |
|
| | | return hurtType, hurtTypeResultDict
|
| | |
|
| | |
|
| | | def __HurtTypeHappen_LuckyHit(atkObj, defObj, happenState, curSkill):
|
| | | ''' 判断伤害类型是否发生 - 会心一击
|
| | | @return: 是否触发, 触发时伤害计算固定值, 触发时防守方的伤害减免固定值
|
| | | '''
|
| | | if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_LuckyHit):
|
| | | return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReduce(defObj)
|
| | | |
| | | aLuckyHitRate = atkObj.GetLuckyHitRate()
|
| | | dLuckyHitRateReduce = PlayerControl.GetLuckyHitRateReduce(defObj)
|
| | | |
| | |
|
| | | atkLuckyHitRate = eval(ReadChConfig.GetChConfig("CalcLuckyHitRate"))
|
| | | if atkLuckyHitRate <= 0:
|
| | | return
|
| | | if GameWorld.CanHappen(atkLuckyHitRate):
|
| | | return True, atkObj.GetLuckyHitVal(), PlayerControl.GetLuckyHitReduce(defObj)
|
| | | return
|
| | |
|
| | | def __HurtTypeHappen_SuperHit(atkObj, defObj, happenState, curSkill):
|
| | | ''' 判断伤害类型是否发生 - 暴击
|
| | | @return: 是否触发, 触发时伤害计算固定值, 触发时防守方的伤害减免固定值
|
| | | '''
|
| | |
|
| | | if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_SuperHit):
|
| | | return True, atkObj.GetSuperHit(), PlayerControl.GetSuperHitReduce(defObj)
|
| | | return True, atkObj.GetSuperHit(), GameObj.GetSuperHitReduce(defObj)
|
| | |
|
| | | aSuperHitRate = atkObj.GetSuperHitRate()
|
| | | dSuperHitRateReduce = PlayerControl.GetSuperHitRateReduce(defObj)
|
| | | dSuperHitRateReduce = GameObj.GetSuperHitRateReduce(defObj)
|
| | | superHitRate = eval(ReadChConfig.GetChConfig("CalcSuperHitRate"))
|
| | | superHitRate += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill,
|
| | | ChConfig.TriggerType_Buff_AddSuperHitRate)
|
| | |
| | | if superHitRate <= 0:
|
| | | return
|
| | | if GameWorld.CanHappen(superHitRate):
|
| | | return True, atkObj.GetSuperHit(), PlayerControl.GetSuperHitReduce(defObj)
|
| | | return True, atkObj.GetSuperHit(), GameObj.GetSuperHitReduce(defObj)
|
| | | return
|
| | |
|
| | | def __HurtTypeHappen_Parry(atkObj, defObj, happenState, curSkill):
|
| | | ''' 判断伤害类型是否发生 - 防守方抵御
|
| | | @return: 是否触发, 触发时伤害计算值, 触发时防守方的伤害减免值
|
| | | '''
|
| | | chanceDefPer = PlayerControl.GetDamChanceDef(defObj)
|
| | | if not chanceDefPer:
|
| | | return
|
| | | if GameWorld.CanHappen(ChConfig.Def_ChanceDefRate):
|
| | | return True, 0, chanceDefPer
|
| | | return
|
| | |
|
| | | #def __HurtTypeHappen_Zhuxian(atkObj, defObj, happenState, curSkill):
|
| | | # """诛仙一击"""
|
| | | # rate = PlayerControl.GetZhuXianRate(atkObj)
|
| | | # if not rate:
|
| | | # chanceDefPer = PlayerControl.GetDamChanceDef(defObj)
|
| | | # if not chanceDefPer:
|
| | | # return
|
| | | # |
| | | # if GameWorld.CanHappen(rate):
|
| | | # return True, PlayerControl.GetZhuXianHurtPer(atkObj), 0
|
| | | # return
|
| | | # if GameWorld.CanHappen(ChConfig.Def_ChanceDefRate):
|
| | | # return True, 0, chanceDefPer
|
| | | return
|
| | |
|
| | | # 致命一击
|
| | | def __HurtTypeHappen_Deadly(atkObj, defObj, happenState, curSkill):
|
| | |
| | | def __HurtTypeHappen_ThumpHit(atkObj, defObj, happenState, curSkill):
|
| | |
|
| | | if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_ThumpHit):
|
| | | return True, int(atkObj.GetSuperHit()*1.5), PlayerControl.GetSuperHitReduce(defObj)
|
| | | return True, int(atkObj.GetSuperHit()*1.5), GameObj.GetSuperHitReduce(defObj)
|
| | |
|
| | | thumpHitRate = 0
|
| | | thumpHitRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill,
|
| | |
| | | if thumpHitRate <= 0:
|
| | | return
|
| | | if GameWorld.CanHappen(thumpHitRate):
|
| | | return True, atkObj.GetSuperHit()*2, PlayerControl.GetSuperHitReduce(defObj)
|
| | | return True, atkObj.GetSuperHit()*2, GameObj.GetSuperHitReduce(defObj)
|
| | | return
|
| | |
|
| | |
|
| | |
| | | if defObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | reducePer = SkillCommon.GetSkillReducePerByID(defObj, skillTypeID)
|
| | |
|
| | | #根据防守方职业 计算攻击方伤害加成
|
| | | if defObj.GetJob() in [ShareDefine.PlayerJob_Warrior, ShareDefine.PlayerJob_Knight]:
|
| | | addPer += PlayerControl.GetJobAHurtAddPer(atkObj)
|
| | | elif defObj.GetJob() in [ShareDefine.PlayerJob_Wizard, ShareDefine.PlayerJob_ForceUser]:
|
| | | addPer += PlayerControl.GetJobBHurtAddPer(atkObj)
|
| | | elif defObj.GetJob() in [ShareDefine.PlayerJob_Assassin, ShareDefine.PlayerJob_BowMaster]:
|
| | | addPer += PlayerControl.GetJobCHurtAddPer(atkObj)
|
| | | |
| | | #根据攻击方职业 计算防守方伤害减免
|
| | | if atkObj.GetJob() in [ShareDefine.PlayerJob_Warrior, ShareDefine.PlayerJob_Knight]:
|
| | | reducePer += PlayerControl.GetJobAAtkReducePer(defObj)
|
| | | elif atkObj.GetJob() in [ShareDefine.PlayerJob_Wizard, ShareDefine.PlayerJob_ForceUser]:
|
| | | reducePer += PlayerControl.GetJobBAtkReducePer(defObj)
|
| | | elif atkObj.GetJob() in [ShareDefine.PlayerJob_Assassin, ShareDefine.PlayerJob_BowMaster]:
|
| | | reducePer += PlayerControl.GetJobCAtkReducePer(defObj)
|
| | | # #根据防守方职业 计算攻击方伤害加成
|
| | | # if defObj.GetJob() in [ShareDefine.PlayerJob_Warrior, ShareDefine.PlayerJob_Knight]:
|
| | | # addPer += PlayerControl.GetJobAHurtAddPer(atkObj)
|
| | | # elif defObj.GetJob() in [ShareDefine.PlayerJob_Wizard, ShareDefine.PlayerJob_ForceUser]:
|
| | | # addPer += PlayerControl.GetJobBHurtAddPer(atkObj)
|
| | | # elif defObj.GetJob() in [ShareDefine.PlayerJob_Assassin, ShareDefine.PlayerJob_BowMaster]:
|
| | | # addPer += PlayerControl.GetJobCHurtAddPer(atkObj)
|
| | | # |
| | | # #根据攻击方职业 计算防守方伤害减免
|
| | | # if atkObj.GetJob() in [ShareDefine.PlayerJob_Warrior, ShareDefine.PlayerJob_Knight]:
|
| | | # reducePer += PlayerControl.GetJobAAtkReducePer(defObj)
|
| | | # elif atkObj.GetJob() in [ShareDefine.PlayerJob_Wizard, ShareDefine.PlayerJob_ForceUser]:
|
| | | # reducePer += PlayerControl.GetJobBAtkReducePer(defObj)
|
| | | # elif atkObj.GetJob() in [ShareDefine.PlayerJob_Assassin, ShareDefine.PlayerJob_BowMaster]:
|
| | | # reducePer += PlayerControl.GetJobCAtkReducePer(defObj)
|
| | |
|
| | | if addPer or reducePer:
|
| | | addSkillPer = addPer - reducePer
|
| | |
| | |
|
| | | # 攻击时防守方神兵护盾的处理
|
| | | def CalcAtkProDef(atkObj, defObj, hurtValue, curSkill, tick):
|
| | | if defObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return hurtValue
|
| | | |
| | | if not CheckIsPlayerOnwer(atkObj):
|
| | | return hurtValue
|
| | |
|
| | | curProDef = PlayerControl.GetProDef(defObj)
|
| | | if not curProDef:
|
| | | return hurtValue
|
| | | |
| | | absortValue = min(PlayerControl.GetProDefAbsorb(defObj)*hurtValue/ChConfig.Def_MaxRateValue, curProDef)
|
| | | |
| | | PlayerControl.SetProDef(defObj, curProDef - absortValue)
|
| | | |
| | | # 被动技能触发
|
| | | defObj.SetDict(ChConfig.Def_PlayerKey_GodWeaponBeforeProDef, curProDef)
|
| | | PassiveBuffEffMng.OnPassiveSkillTrigger(defObj, atkObj, None, ChConfig.TriggerType_ProDefValue, tick)
|
| | | return hurtValue - absortValue
|
| | | return hurtValue
|
| | | # if defObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | # return hurtValue
|
| | | # |
| | | # if not CheckIsPlayerOnwer(atkObj):
|
| | | # return hurtValue
|
| | | #
|
| | | # curProDef = PlayerControl.GetProDef(defObj)
|
| | | # if not curProDef:
|
| | | # return hurtValue
|
| | | # |
| | | # absortValue = min(PlayerControl.GetProDefAbsorb(defObj)*hurtValue/ChConfig.Def_MaxRateValue, curProDef)
|
| | | # |
| | | # PlayerControl.SetProDef(defObj, curProDef - absortValue)
|
| | | # |
| | | # # 被动技能触发
|
| | | # defObj.SetDict(ChConfig.Def_PlayerKey_GodWeaponBeforeProDef, curProDef)
|
| | | # PassiveBuffEffMng.OnPassiveSkillTrigger(defObj, atkObj, None, ChConfig.TriggerType_ProDefValue, tick)
|
| | | # return hurtValue - absortValue
|
| | |
|
| | |
|
| | | # 设置玩家一次主动型攻击中的第一个防御者
|
| | |
| | | return
|
| | |
|
| | | if curSkill and curSkill.GetFuncType() not in [ChConfig.Def_SkillFuncType_FbSkill,
|
| | | ChConfig.Def_SkillFuncType_NormalAttack]:
|
| | | ChConfig.Def_SkillFuncType_TurnNormaSkill]:
|
| | | return
|
| | |
|
| | | if attacker.GetDictByKey(ChConfig.Def_PlayerKey_FirstDefender):
|
| | |
| | | fightPowerMax = ipyData.GetFightPowerMax()
|
| | | everyFightPower = ipyData.GetEveryFightPower()
|
| | | everyFightPowerLostHPEx = ipyData.GetEveryFightPowerLostHPEx()
|
| | | if fightPowerMinByLV and fightPowerMin:
|
| | | npcLV = NPCCommon.GetNPCLV(curNPC)
|
| | | playerCurLVIpyData = PlayerControl.GetPlayerLVIpyData(npcLV)
|
| | | if not playerCurLVIpyData:
|
| | | return
|
| | | ReFightPower = playerCurLVIpyData.GetReFightPower() # 战斗力
|
| | | reRate = ReFightPower / float(fightPowerMin)
|
| | | #GameWorld.DebugLog("标准战力需要取等级表: fightPowerMin=%s,fightPowerMax=%s,everyFightPower=%s,npcLV=%s,ReFightPower=%s,reRate=%s" |
| | | # % (fightPowerMin, fightPowerMax, everyFightPower, npcLV, ReFightPower, reRate))
|
| | | fightPowerMin = ReFightPower
|
| | | fightPowerMax = int(fightPowerMax * reRate)
|
| | | everyFightPower = int(everyFightPower * reRate)
|
| | | #GameWorld.DebugLog("按比例更新战力值信息: fightPowerMin=%s,fightPowerMax=%s,everyFightPower=%s" |
| | | # % (fightPowerMin, fightPowerMax, everyFightPower))
|
| | | #if fightPowerMinByLV and fightPowerMin:
|
| | | # npcLV = NPCCommon.GetNPCLV(curNPC)
|
| | | # playerCurLVIpyData = PlayerControl.GetPlayerLVIpyData(npcLV)
|
| | | # if not playerCurLVIpyData:
|
| | | # return
|
| | | # ReFightPower = playerCurLVIpyData.GetReFightPower() # 战斗力
|
| | | # reRate = ReFightPower / float(fightPowerMin)
|
| | | # #GameWorld.DebugLog("标准战力需要取等级表: fightPowerMin=%s,fightPowerMax=%s,everyFightPower=%s,npcLV=%s,ReFightPower=%s,reRate=%s" |
| | | # # % (fightPowerMin, fightPowerMax, everyFightPower, npcLV, ReFightPower, reRate))
|
| | | # fightPowerMin = ReFightPower
|
| | | # fightPowerMax = int(fightPowerMax * reRate)
|
| | | # everyFightPower = int(everyFightPower * reRate)
|
| | | # #GameWorld.DebugLog("按比例更新战力值信息: fightPowerMin=%s,fightPowerMax=%s,everyFightPower=%s" |
| | | # # % (fightPowerMin, fightPowerMax, everyFightPower))
|
| | |
|
| | | effFightPower = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_TimeLostHPFightPower) \
|
| | | + curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_TimeLostHPFightPowerEx) * ChConfig.Def_PerPointValue
|
| | |
| | | # 计算攻击伤害
|
| | | # maxHurt参数用于模拟计算最大伤害,防范客户端攻击伤害过高
|
| | | def CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, tick, happenState=None, **atkwargs):
|
| | | # 翻滚闪避特殊处理
|
| | | if tick - defObj.GetDictByKey(ChConfig.Def_PlayerKey_SomersaultTime) < 500:
|
| | | return 0, ChConfig.Def_HurtType_Miss
|
| | |
|
| | | multiValue = 1 # 伤害倍值
|
| | | summonAtkPer = 1 # 召唤继承提高基础攻击力,取表
|
| | |
| | |
|
| | | atkObjType = atkObj.GetGameObjType()
|
| | | defObjType = defObj.GetGameObjType()
|
| | |
|
| | | aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType) # 获取境界
|
| | | if defObjType == IPY_GameWorld.gotNPC and ChConfig.IsGameBoss(defObj) and dRealmLV > aRealmLV:
|
| | | aRealmIpyData = IpyGameDataPY.GetIpyGameDataNotLog("Realm", aRealmLV)
|
| | | dRealmIpyData = IpyGameDataPY.GetIpyGameDataNotLog("Realm", dRealmLV)
|
| | | aRealmLVLarge = aRealmIpyData.GetLvLarge() if aRealmIpyData else 0
|
| | | dRealmLVLarge = dRealmIpyData.GetLvLarge() if dRealmIpyData else 0
|
| | | if dRealmLVLarge > aRealmLVLarge:
|
| | | if atkObjType == IPY_GameWorld.gotPlayer:
|
| | | GameWorld.DebugLog("BossRealmHint%s-%s"%(dRealmLV, aRealmLV))
|
| | | PlayerControl.NotifyCode(atkObj, 'BossRealmHint', [dRealmLVLarge])
|
| | | |
| | | # 攻击高境界的BOSS 伤害固定为1
|
| | | return 1, ChConfig.Def_HurtType_Normal
|
| | | |
| | | |
| | | atkType = GetBattleType(atkObj, curSkill)
|
| | | happenState = happenState if happenState else SkillShell.GetHappenState(curSkill)
|
| | | happenState += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HappenState)
|
| | |
|
| | | aLV = atkObj.GetLV() # 攻击方等级
|
| | | dLV = defObj.GetLV() # 防守方等级
|
| | |
|
| | | aHit = atkObj.GetHit()
|
| | | if curSkill and atkObjType == IPY_GameWorld.gotPlayer and curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_NormalAttack:
|
| | | aHit = aHit*IpyGameDataPY.GetFuncCfg("FightHappenRate", 2)
|
| | | |
| | | aHitSuccessRate = PlayerControl.GetHitSucessRate(atkObj) if atkObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue
|
| | | aHitSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HitSuccess)
|
| | | dMiss = defObj.GetMiss()
|
| | | |
| | | atkID = atkObj.GetID()
|
| | | defID = defObj.GetID()
|
| | | #aLV = atkObj.GetLV() # 攻击方等级
|
| | | #dLV = defObj.GetLV() # 防守方等级
|
| | | |
| | | aHit = GameObj.GetMissDefRate(atkObj)#atkObj.GetHit() # 抗闪避率 - 命中
|
| | | #aHitSuccessRate = PlayerControl.GetHitSucessRate(atkObj) if atkObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue
|
| | | #aHitSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_HitSuccess)
|
| | | dMiss = GameObj.GetMissRate(defObj)#defObj.GetMiss()
|
| | | dMiss += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissPer)
|
| | | dMissSuccessRate = PlayerControl.GetMissSucessRate(defObj) if defObjType == IPY_GameWorld.gotPlayer else 0
|
| | | dMissSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissSuccessPer)
|
| | | #dMissSuccessRate = PlayerControl.GetMissSucessRate(defObj) if defObjType == IPY_GameWorld.gotPlayer else 0
|
| | | #dMissSuccessRate += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_MissSuccessPer)
|
| | | skillID = curSkill.GetSkillID() if curSkill else 0
|
| | |
|
| | | |
| | | atkIsBoss = 0 # 攻击方是否boss
|
| | | suppressValueLV = 0 # 等级最终压制值, 由压制规则及相关参数计算得出,可作为伤害公式计算参数使用
|
| | | suppressValueFP = 0 # 战力最终压制值, 由压制规则及相关参数计算得出,可作为伤害公式计算参数使用
|
| | | suppressLV, suppressFightPower = 0, 0 # 压制等级差、战力差
|
| | | suppressReMaxHP = 0 # NPC压制等级生命值, 等级表中NPC等级对应的数据, 压制等级差大于0时才有值
|
| | | suppressNPCFightPower = 0 # 压制NPC战力
|
| | | fbFightPower, fbBaseHurt = 0, 0 # 副本战力, 副本保底伤害
|
| | | #当攻击方为NPC,防守方为玩家时,计算压制等级 及 压制战力
|
| | | if atkObjType == IPY_GameWorld.gotNPC and defObjType == IPY_GameWorld.gotPlayer:
|
| | | |
| | | if curSkill and curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_RealmSuppress:
|
| | | # 境界压制技能不对高等级境界玩家产生攻击
|
| | | aRealmLV, dRealmLV = GetPVERealmLVs(atkObj, defObj, atkObjType, defObjType)
|
| | | if aRealmLV <= dRealmLV:
|
| | | return 0, ChConfig.Def_HurtType_Immune # 免疫
|
| | | |
| | | atkIsBoss = 1 if ChConfig.IsGameBoss(atkObj) else 0
|
| | | if NPCCommon.GetIsLVSuppress(atkObj):
|
| | | suppressLV = max(0, aLV - dLV)
|
| | | if suppressLV:
|
| | | suppressLVIpyData = PlayerControl.GetPlayerLVIpyData(aLV)
|
| | | suppressReMaxHP = 0 if not suppressLVIpyData else suppressLVIpyData.GetReMaxHP()
|
| | | suppressNPCFightPower = NPCCommon.GetSuppressFightPower(atkObj)
|
| | | if suppressNPCFightPower:
|
| | | suppressFightPower = max(0, suppressNPCFightPower - PlayerControl.GetFightPower(defObj))
|
| | | |
| | | mustHit = False
|
| | | helpBattleFormatKey = ""
|
| | | if atkObjType == IPY_GameWorld.gotNPC and atkObj.GetType() == ChConfig.ntHelpBattleRobot:
|
| | | mustHit = True
|
| | | suppressNPCFightPower = NPCCommon.GetSuppressFightPower(atkObj)
|
| | | fbFightPower = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBFightPower)
|
| | | fbBaseHurt = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBBaseHurt)
|
| | | helpBattleFormatKey = "HelpRobot_Atk"
|
| | | if defObjType == IPY_GameWorld.gotNPC and defObj.GetType() == ChConfig.ntHelpBattleRobot:
|
| | | mustHit = True
|
| | | suppressNPCFightPower = NPCCommon.GetSuppressFightPower(defObj)
|
| | | fbFightPower = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBFightPower)
|
| | | fbBaseHurt = GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.FBPD_HelpBattleFBBaseHurt)
|
| | | helpBattleFormatKey = "HelpRobot_Def"
|
| | | |
| | | #命中公式 攻击方类型不同,公式不同
|
| | | hitFormula = ReadChConfig.GetChConfig('CalcCanHit')
|
| | | angerOverflow = 0 # 怒气溢出值
|
| | |
|
| | | turnFightPosInfo = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightPosInfo)
|
| | | mustHit = False
|
| | | if SkillCommon.isAngerSkill(curSkill):
|
| | | mustHit = True
|
| | | GameWorld.DebugLog(" XP必命中")
|
| | | angerOverflow = max(GameObj.GetXP(atkObj) - IpyGameDataPY.GetFuncCfg("AngerXP", 2), 0)
|
| | | |
| | | if not mustHit:
|
| | | if IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_HitOn):
|
| | | mustHit = True
|
| | | GameWorld.DebugLog(" 技能必命中: skillID=%s" % skillID)
|
| | | |
| | | pow = math.pow
|
| | | #命中公式 攻击方类型不同,公式不同
|
| | | if not mustHit and not PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill,
|
| | | ChConfig.TriggerType_Buff_MustBeHit):
|
| | | # 技能对指定BOSS无效果的返回MISS
|
| | | if defObjType == IPY_GameWorld.gotNPC and defObj.GetIsBoss() not in ChConfig.Def_SkillAttack_NPCIsBoss \
|
| | | and SkillCommon.GetSkillBattleType(curSkill) == ChConfig.Def_BattleRelationType_CommNoBoss and SkillShell.IsNPCSkillResist(defObj):
|
| | | return 0, ChConfig.Def_HurtType_Miss
|
| | | #if defObjType == IPY_GameWorld.gotNPC and defObj.GetIsBoss() not in ChConfig.Def_SkillAttack_NPCIsBoss \
|
| | | #and SkillCommon.GetSkillBattleType(curSkill) == ChConfig.Def_BattleRelationType_CommNoBoss and SkillShell.IsNPCSkillResist(defObj):
|
| | | # return 0, ChConfig.Def_HurtType_Miss
|
| | |
|
| | | #攻击方处于嘲讽,防守方处于免疫嘲讽者攻击则miss
|
| | | if GameObj.GetPyPlayerState(atkObj, ChConfig.Def_PlayerState_Sneer) and \
|
| | | GameObj.GetPyPlayerState(defObj, ChConfig.Def_PlayerState_MissSneerAtk):
|
| | | #if GameObj.GetPyPlayerState(atkObj, ChConfig.Def_PlayerState_Sneer) and \
|
| | | #GameObj.GetPyPlayerState(defObj, ChConfig.Def_PlayerState_MissSneerAtk):
|
| | | # return 0, ChConfig.Def_HurtType_Miss
|
| | | |
| | | missNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnMissNum)
|
| | | missRate = eval(IpyGameDataPY.GetFuncCompileCfg("MissCfg", 1))
|
| | | if GameWorld.CanHappen(missRate):
|
| | | return 0, ChConfig.Def_HurtType_Miss
|
| | |
|
| | | #添加是否必命中
|
| | | if not IsHappenStateByType(happenState, ChConfig.Def_Skill_HappenState_HitOn) \
|
| | | and eval(hitFormula) < 0:
|
| | | return 0, ChConfig.Def_HurtType_Miss
|
| | | |
| | |
|
| | | hurtType, hurtTypeResultDict = CalcHurtTypeResult(atkObj, defObj, atkObjType, defObjType, happenState, curSkill)
|
| | | #GameWorld.DebugLog("GetHurtHP hurtType=%s, hurtTypeResultDict=%s" % (hurtType, hurtTypeResultDict))
|
| | | isLuckyHit, aLuckyHit, dLuckyHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_LuckyHit] # 幸运一击
|
| | |
|
| | | # 重击和暴击互斥,并且使用同一个参数
|
| | | isSuperHit, aSuperHit, dSuperHitReduce = hurtTypeResultDict[ChConfig.Def_HurtType_ThumpHit]
|
| | |
| | | aSuperHit = aSuperHit*(thumpPer + ChConfig.Def_MaxRateValue)/ChConfig.Def_MaxRateValue
|
| | |
|
| | | dDamChanceDef = hurtTypeResultDict[ChConfig.Def_HurtType_Parry][2] # 抵御, 大于0代表触发抵御效果
|
| | | isZhuxianHit, aZhuxianHurtPer, dZhuxianReducePer = hurtTypeResultDict[ChConfig.Def_HurtType_Zhuxian] # 诛仙一击
|
| | | isDeadlyHit, deadlyHitMultiValue, _ = hurtTypeResultDict[ChConfig.Def_HurtType_DeadlyHit] # 致命一击
|
| | |
|
| | | #isZhuxianHit, aZhuxianHurtPer, dZhuxianReducePer = hurtTypeResultDict[ChConfig.Def_HurtType_Zhuxian] # 诛仙一击
|
| | | #isDeadlyHit, deadlyHitMultiValue, _ = hurtTypeResultDict[ChConfig.Def_HurtType_DeadlyHit] # 致命一击
|
| | | |
| | | if PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_OneDamage):
|
| | | return 1, hurtType
|
| | | |
| | | wReFightPower = 0
|
| | | worldLV = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
|
| | | if worldLV:
|
| | | wLVIpyData = PlayerControl.GetPlayerLVIpyData(worldLV)
|
| | | wReFightPower = 0 if not wLVIpyData else wLVIpyData.GetReFightPower() # 当前世界等级参考战力
|
| | |
|
| | | # 改变技能伤害
|
| | | atkSkillPer, atkSkillValue = ChangeSkillHurt(atkObj, defObj, curSkill, atkSkillPer, atkSkillValue)
|
| | | atkSkillPer = ChangeSkillHurtPer(atkObj, defObj, curSkill, atkSkillPer)
|
| | |
|
| | | # --- 新增普通攻击的数值和技能攻击的数值,根据类型各自计算
|
| | | if atkObjType == IPY_GameWorld.gotPlayer:
|
| | | if not curSkill or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_NormalAttack:
|
| | | atkSkillPer += PlayerControl.GetNormalHurtPer(atkObj)
|
| | | atkSkillValue += PlayerControl.GetNormalHurt(atkObj)
|
| | | elif curSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbSkill, ChConfig.Def_SkillFuncType_FbPassiveSkill]:
|
| | | atkSkillPer += PlayerControl.GetFabaoHurtPer(atkObj)
|
| | | atkSkillValue += PlayerControl.GetFabaoHurt(atkObj)
|
| | | #if atkObjType == IPY_GameWorld.gotPlayer:
|
| | | # if not curSkill or curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_TurnNormaSkill:
|
| | | # atkSkillPer += PlayerControl.GetNormalHurtPer(atkObj)
|
| | | # atkSkillValue += PlayerControl.GetNormalHurt(atkObj)
|
| | | # elif curSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbSkill, ChConfig.Def_SkillFuncType_FbPassiveSkill]:
|
| | | # atkSkillPer += PlayerControl.GetFabaoHurtPer(atkObj)
|
| | | # atkSkillValue += PlayerControl.GetFabaoHurt(atkObj)
|
| | |
|
| | | atkSkillValue += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SkillValue)
|
| | | atkSkillValue += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_SkillValue)
|
| | |
| | | PassiveBuffEffMng.OnPassiveBuffTrigger(atkObj, defObj, curSkill, ChConfig.TriggerType_SuperHitSubLayer, tick)
|
| | | elif hurtType == ChConfig.Def_HurtType_ThumpHit:
|
| | | atkSkillValue += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_ThumpSkillValue)
|
| | |
|
| | | if isLuckyHit:
|
| | | # 会心一击时增加会心伤害固定值 |
| | | aLuckyHit += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_LuckyHit)
|
| | | aLuckyHit -= PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(defObj, atkObj, curSkill, ChConfig.TriggerType_BeLuckyHitSubPer)
|
| | | aLuckyHit = max(aLuckyHit, 0)
|
| | | |
| | | |
| | | #参与运算的数值
|
| | | rand = random.random() #种子数 0~1
|
| | |
|
| | | #------- 攻击方
|
| | | aMinAtk = atkObj.GetMinAtk() * summonAtkPer # 攻击方最小攻击
|
| | | aMaxAtk = atkObj.GetMaxAtk() * summonAtkPer # 攻击方最大攻击
|
| | | #aMinAtk = atkObj.GetMinAtk() * summonAtkPer # 攻击方最小攻击
|
| | | aAtk = atkObj.GetMaxAtk() * summonAtkPer # 攻击方最大攻击
|
| | |
|
| | | aIceAtk = atkObj.GetIceAtk() # 冰攻, 元素真伤, 玩家及NPC通用
|
| | | aIceAtk += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddIceAtk)
|
| | | #------- 防守方
|
| | | dMinAtk = defObj.GetMinAtk() # 防守方最小攻击
|
| | | dMaxAtk = defObj.GetMaxAtk() # 防守方最大攻击
|
| | | #dMinAtk = defObj.GetMinAtk() # 防守方最小攻击
|
| | | #dAtk = defObj.GetMaxAtk() # 防守方最大攻击
|
| | | dDef = defObj.GetDef() # 防守方防御力
|
| | | dHP = GameObj.GetHP(defObj) # 防守方当前血量
|
| | | dMaxHP = GameObj.GetMaxHP(defObj) # 防守方最大血量
|
| | | #dHP = GameObj.GetHP(defObj) # 防守方当前血量
|
| | | #dMaxHP = GameObj.GetMaxHP(defObj) # 防守方最大血量
|
| | | dIceDef = defObj.GetIceDef() # 冰防, 元素真防, 玩家及NPC通用
|
| | |
|
| | | # 攻击方
|
| | | aNormalAtkPer = 0
|
| | | aFinalHurtPer = GameObj.GetFinalHurtPer(atkObj) # 最外层伤害加成, 可能为负值
|
| | | aFinalHurtPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalPer)
|
| | | if atkObjType == IPY_GameWorld.gotPlayer:
|
| | | aIgnoreDefRate = atkObj.GetIgnoreDefRate() # 无视防御比率
|
| | | aSkillAtkRate = atkObj.GetSkillAtkRate() # 技能攻击力加成
|
| | | aDamagePVP = PlayerControl.GetDamagePVP(atkObj) # PVP固定伤害
|
| | | aDamagePVE = PlayerControl.GetDamagePVE(atkObj) # PVE固定伤害
|
| | | aDamagePVP = 0 #PlayerControl.GetDamagePVP(atkObj) # PVP固定伤害
|
| | | aDamagePVE = 0 #PlayerControl.GetDamagePVE(atkObj) # PVE固定伤害
|
| | |
|
| | | aNPCHurtAddPer = PlayerControl.GetNPCHurtAddPer(atkObj) # PVE伤害加成
|
| | | aDamagePerPVP = PlayerControl.GetDamagePerPVP(atkObj) # 外层PVP伤害加成
|
| | | aNPCHurtAddPer = 0 #PlayerControl.GetNPCHurtAddPer(atkObj) # PVE伤害加成
|
| | | aDamagePerPVP = 0 #PlayerControl.GetDamagePerPVP(atkObj) # 外层PVP伤害加成
|
| | | aDamagePerPVP += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AddPVPDamagePer)
|
| | | aFinalHurtPer = PlayerControl.GetFinalHurtPer(atkObj) # 最外层伤害加成, 可能为负值
|
| | | aFinalHurtPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalPer)
|
| | |
|
| | | aFinalHurt = PlayerControl.GetFinalHurt(atkObj) # 最终固定伤害
|
| | | aFinalHurt = 0#PlayerControl.GetFinalHurt(atkObj) # 最终固定伤害
|
| | | # 被动增加最终伤害
|
| | | aFinalHurt += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalValue)
|
| | | aFinalHurt += PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_AttackAddFinalValue)
|
| | |
|
| | | aOnlyFinalHurt = PlayerControl.GetOnlyFinalHurt(atkObj) # 额外固定伤害
|
| | | aOnlyFinalHurt = 0 #PlayerControl.GetOnlyFinalHurt(atkObj) # 额外固定伤害
|
| | | aFightPower = PlayerControl.GetFightPower(atkObj)
|
| | | |
| | | |
| | | |
| | | else:
|
| | | aIgnoreDefRate = 0 # 无视防御比率
|
| | | aFinalHurtPer = GameObj.GetPetDamPer(atkObj) # 最外层伤害加成, 可能为负值
|
| | | aSkillAtkRate = NPCCommon.GetSkillAtkRate(atkObj) # 技能攻击力加成
|
| | | if atkObjType == IPY_GameWorld.gotNPC and atkObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet:
|
| | | aSkillAtkRate += atkObj.GetSkillAtkRate()
|
| | |
| | | aDamagePVP = 0 # PVP固定伤害
|
| | | aDamagePVE = 0 # PVE固定伤害
|
| | | aFinalHurt = NPCCommon.GetFinalHurt(atkObj) # 最终固定伤害
|
| | | aOnlyFinalHurt = 0 # 额外固定伤害
|
| | | aFightPower = NPCCommon.GetSuppressFightPower(atkObj)
|
| | |
|
| | | #防守方的类型
|
| | | dNormalAtkDefPer = 0
|
| | | dFinalHurtReducePer = GameObj.GetFinalHurtReducePer(defObj)
|
| | | dFinalHurtReducePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, curSkill, ChConfig.TriggerType_dFinalHurtReducePer)
|
| | | if defObjType == IPY_GameWorld.gotPlayer:
|
| | | dIgnoreDefRateReduce = PlayerControl.GetIgnoreDefRateReduce(defObj) # 无视防御比率抗性
|
| | | dSkillAtkRateReduce = PlayerControl.GetSkillAtkRateReduce(defObj) # 技能攻击力减少
|
| | | dDamagePVPReduce = PlayerControl.GetDamagePVPReduce(defObj) # PVP固定减伤
|
| | | dIgnoreDefRateReduce = 0 #PlayerControl.GetIgnoreDefRateReduce(defObj) # 无视防御比率抗性
|
| | | dSkillAtkRateReduce = 0 #PlayerControl.GetSkillAtkRateReduce(defObj) # 技能攻击力减少
|
| | | dDamagePVPReduce = 0 #PlayerControl.GetDamagePVPReduce(defObj) # PVP固定减伤
|
| | | #dDamReduce += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_DamageReduce)
|
| | | dDamagePerPVPReduce = PlayerControl.GetDamagePerPVPReduce(defObj) # 外层PVP减伤
|
| | | dDamagePerPVPReduce = 0 #PlayerControl.GetDamagePerPVPReduce(defObj) # 外层PVP减伤
|
| | | dDamagePerPVPReduce += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, None, ChConfig.TriggerType_DamageReducePVP)
|
| | | dFinalHurtReduce = PlayerControl.GetFinalHurtReduce(defObj) # 最终固定伤害减少
|
| | | dBeHurtPer = PlayerControl.GetBeHurtPer(defObj) # 加深受到伤害百分比
|
| | | dFinalHurtReduce = 0 #PlayerControl.GetFinalHurtReduce(defObj) # 最终固定伤害减少
|
| | | dBeHurtPer = 0#PlayerControl.GetBeHurtPer(defObj) # 加深受到伤害百分比
|
| | | dFightPower = PlayerControl.GetFightPower(defObj)
|
| | | dFinalHurtReducePer = PlayerControl.GetFinalHurtReducePer(defObj)
|
| | | dFinalHurtReducePer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(defObj, atkObj, curSkill, ChConfig.TriggerType_dFinalHurtReducePer)
|
| | |
|
| | | else:
|
| | | dIgnoreDefRateReduce = 0 # 无视防御比率抗性
|
| | |
| | | dFinalHurtReduce = 0 # 最终固定伤害减少
|
| | | dBeHurtPer = 0
|
| | | dFightPower = NPCCommon.GetSuppressFightPower(defObj)
|
| | | dFinalHurtReducePer = 0 # 最终伤害减少百分比 默认0
|
| | |
|
| | | #攻击字典 { 攻击类型 : '公式' }
|
| | | mapID = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
|
| | | hurtDist = ReadChConfig.GetEvalChConfig('CalcAttackValue')
|
| | |
|
| | | if suppressLV:
|
| | | suppressFormulaKeyLV = "SuppressValueLV_%s" % (atkIsBoss)
|
| | | if suppressFormulaKeyLV in hurtDist:
|
| | | suppressLVFormula = hurtDist[suppressFormulaKeyLV]
|
| | | suppressValueLV = eval(FormulaControl.GetCompileFormula(suppressFormulaKeyLV, suppressLVFormula))
|
| | | |
| | | if suppressFightPower:
|
| | | suppressFormulaKeyFP = "SuppressValueFP_%s" % (atkIsBoss)
|
| | | if suppressFormulaKeyFP in hurtDist:
|
| | | suppressFPFormula = hurtDist[suppressFormulaKeyFP]
|
| | | suppressValueFP = eval(FormulaControl.GetCompileFormula(suppressFormulaKeyFP, suppressFPFormula))
|
| | | aPMHurtPer = 0 # 物法增伤
|
| | | dPMHurtReduce = 0 # 物法减伤
|
| | | if atkType == IPY_GameWorld.ghtMag: # 法伤
|
| | | pass
|
| | | else: # 物伤
|
| | | pass
|
| | |
|
| | | # 境界压制规则
|
| | | # 1. 其中一方无境界等级则无效, 如普通NPC
|
| | | # 2. 宠物和召唤兽(如水元素)有效, 取主人
|
| | | # 3. 玩家地境界低于BOSS则伤害固定为1 (在函数入口处已处理)
|
| | | # 4. 其他情况统一境界压制 境界差*2%
|
| | | if aRealmLV == 0 or dRealmLV == 0:
|
| | | SuppressValueRealmRate = 10000
|
| | | else:
|
| | | suppressRealmRateMapKey = "SuppressValueRealm_%s" % mapID
|
| | | if suppressRealmRateMapKey not in hurtDist:
|
| | | suppressRealmRateMapKey = "SuppressValueRealm"
|
| | | SuppressValueRealmRate = int(eval(FormulaControl.GetCompileFormula(suppressRealmRateMapKey, hurtDist[suppressRealmRateMapKey])))
|
| | | |
| | | # 骑宠争夺最终伤害衰减
|
| | | if defObjType == IPY_GameWorld.gotNPC and FamilyRobBoss.IsHorsePetRobBoss(defObj.GetNPCID()):
|
| | | ownerPlayer, npcObjType = GetAttackPlayer(atkObj)
|
| | | |
| | | if ownerPlayer:
|
| | | findBuff = SkillCommon.FindBuffByID(ownerPlayer, ChConfig.Def_SkillID_HorsePetRobBossKillCntBuff)[0]
|
| | | if findBuff:
|
| | | reduceFinalHurtPer = findBuff.GetSkill().GetEffect(0).GetEffectValue(0)
|
| | | aFinalHurtPer -= reduceFinalHurtPer
|
| | | # 所有万分率参数统一除10000.0
|
| | | atkSkillPer /= 10000.0
|
| | | aNormalAtkPer /= 10000.0
|
| | | dNormalAtkDefPer /= 10000.0
|
| | | aFinalHurtPer /= 10000.0
|
| | | dFinalHurtReducePer /= 10000.0
|
| | |
|
| | | # 仙盟boss最终伤害加成
|
| | | if atkObjType == IPY_GameWorld.gotPlayer and mapID == ChConfig.Def_FBMapID_FamilyBossMap:
|
| | | aFinalHurtPer += PlayerControl.GetFamilyBossHurtPer(atkObj)
|
| | | |
| | | if atkObjType == IPY_GameWorld.gotPlayer and defObjType == IPY_GameWorld.gotNPC and ChConfig.IsGameBoss(defObj):
|
| | | killBossCntLimitDict = IpyGameDataPY.GetFuncEvalCfg('KillBossCntLimit') |
| | | limitIndex = GameWorld.GetDictValueByKey(killBossCntLimitDict, defObj.GetNPCID())
|
| | | if limitIndex != None:
|
| | | aFinalHurtPer += PlayerControl.GetBossFinalHurtPer(atkObj)
|
| | | |
| | | atkStateMark = GetObjAtkStateMark(atkObj)
|
| | | defStateMark = GetObjAtkStateMark(defObj)
|
| | | hurtFormulaKey = "%sV%s_%s" % (atkStateMark, defStateMark, atkType)
|
| | | #PVP PVE 之后再扩展
|
| | | #atkStateMark = GetObjAtkStateMark(atkObj)
|
| | | #defStateMark = GetObjAtkStateMark(defObj)
|
| | |
|
| | | suppressLVGroup = 0 # NPC压制等级组编号
|
| | | mapHurtKey = "%s_%s" % (hurtFormulaKey, mapID)
|
| | | if mapHurtKey in hurtDist:
|
| | | hurtFormulaKey = mapHurtKey
|
| | | elif atkStateMark == "E" and defStateMark == "P":
|
| | | suppressLVGroup = NPCCommon.GetIsLVSuppress(atkObj)
|
| | | elif atkStateMark == "P" and defStateMark == "E":
|
| | | suppressLVGroup = NPCCommon.GetIsLVSuppress(defObj)
|
| | | |
| | | if suppressLVGroup:
|
| | | suppressLVHurtKey = "%s_%s" % (hurtFormulaKey, suppressLVGroup)
|
| | | if suppressLVHurtKey in hurtDist:
|
| | | hurtFormulaKey = suppressLVHurtKey
|
| | | GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,aAtk=%s,dDef=%s,dHP=%s" |
| | | % (atkID, defID, skillID, atkSkillPer, aAtk, dDef, GameObj.GetHP(defObj)))
|
| | |
|
| | | # 助战机器人特殊伤血key
|
| | | if helpBattleFormatKey:
|
| | | hurtFormulaKey = helpBattleFormatKey
|
| | | |
| | | if hurtFormulaKey not in hurtDist:
|
| | | GameWorld.ErrLog("CalcAttackValue.txt 伤害公式未配置, key=%s" % (hurtFormulaKey))
|
| | | return 0, ChConfig.Def_HurtType_Miss
|
| | | |
| | | if atkwargs.get('hurtFormulaKey', None):
|
| | | # 指定公式
|
| | | if "hurtFormulaKey" in atkwargs:
|
| | | aBurnValue = atkwargs.get('burnValue', 0)
|
| | | aBurnPer = atkwargs.get('burnPer', 0)
|
| | | hurtFormulaKey = atkwargs.get('hurtFormulaKey', None)
|
| | |
|
| | | hurtFormula = hurtDist[hurtFormulaKey]
|
| | | |
| | | hurtValue = int(eval(FormulaControl.GetCompileFormula(hurtFormulaKey, hurtFormula)))
|
| | | if isDeadlyHit:
|
| | | hurtValue *= deadlyHitMultiValue
|
| | | |
| | | if atkObjType == IPY_GameWorld.gotPlayer and defObjType == IPY_GameWorld.gotNPC and mapID == ChConfig.Def_FBMapID_CrossBattlefield:
|
| | | multiValue = FBLogic.GetFBPlayerHurtNPCMultiValue(atkObj, defObj)
|
| | | #if hurtFormulaKey == "Burn":
|
| | | # pass
|
| | | #else:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
|
| | | elif not curSkill:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 3))
|
| | | GameWorld.DebugLog(" 普攻伤害=%s" % (hurtValue))
|
| | | elif SkillCommon.isTurnNormalSkill(curSkill):
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 1))
|
| | | GameWorld.DebugLog(" 普攻技能伤害=%s" % (hurtValue))
|
| | | elif SkillCommon.isAngerSkill(curSkill):
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 2))
|
| | | GameWorld.DebugLog(" 怒气技能伤害=%s" % (hurtValue))
|
| | | else:
|
| | | hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 4))
|
| | | GameWorld.DebugLog(" 其他伤害=%s" % (hurtValue))
|
| | |
|
| | | if multiValue != 1:
|
| | | hurtValue = int(hurtValue * multiValue)
|
| | | |
| | | #hurtValue = min(max(hurtValue, 0), ChConfig.Def_UpperLimit_DWord)
|
| | | hurtValue = int(hurtValue)
|
| | |
|
| | | if hurtType == ChConfig.Def_HurtType_Normal and atkSkillPerYinji > 0:
|
| | | return hurtValue, ChConfig.Def_HurtType_Yinji
|
| | | elif hurtType == ChConfig.Def_HurtType_Normal and SuppressValueRealmRate > 10000:
|
| | | # 存在压制
|
| | | return hurtValue, ChConfig.Def_HurtType_RealmSupress
|
| | |
|
| | | return hurtValue, hurtType
|
| | |
|
| | |
| | | atkObj.SetDict(ChConfig.Def_PlayerKey_LastHurtNPCObjID, defObj.GetID())
|
| | | else:
|
| | | defObj.SetDict(ChConfig.Def_PlayerKey_LastAttackerObjID, atkObj.GetID())
|
| | | |
| | | TurnAttack.AddTurnObjHurtValue(atkObj, defObj, resultHurtType.HurtType, resultHurtType.RealHurtHP, resultHurtType.LostHP, curSkill)
|
| | | |
| | | #if resultHurtType.RealHurtHP:
|
| | | # PassiveBuffEffMng.OnPassiveSkillTrigger(defObj, atkObj, None, ChConfig.TriggerType_BeHurt, tick)
|
| | | |
| | | return
|
| | |
|
| | |
|
| | |
| | | return "P"
|
| | |
|
| | | if objType == IPY_GameWorld.gotNPC:
|
| | | if obj.GetDictByKey(ChConfig.Def_Obj_Dict_LineupPlayerID):
|
| | | return "P"
|
| | | if obj.GetType() == ChConfig.ntRobot:
|
| | | return "Robot"
|
| | | if obj.GetType() == ChConfig.ntHelpBattleRobot:
|
| | |
| | | suckHP += atkObj.GetKillBackHP()
|
| | |
|
| | | # 攻击吸血
|
| | | atkBackHP = PlayerControl.GetAtkBackHPPer(atkObj)
|
| | | if defObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | #PVP 攻击回血
|
| | | atkBackHP += PlayerControl.GetPVPAtkBackHP(atkObj)
|
| | | atkBackHP = 0 #PlayerControl.GetAtkBackHPPer(atkObj)
|
| | | #if defObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | # #PVP 攻击回血
|
| | | # atkBackHP += PlayerControl.GetPVPAtkBackHP(atkObj)
|
| | | # 百分比吸血
|
| | | atkBackHPPer = PassiveBuffEffMng.GetValueByPassiveBuffTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
|
| | | atkBackHPPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, defObj, curSkill, ChConfig.TriggerType_Buff_SuckBloodPer)
|
| | |
| | | GameObj.SetHP(atkObj, min(GameObj.GetMaxHP(atkObj), GameObj.GetHP(atkObj) + suckHP), False)
|
| | |
|
| | | ChangeHPView(atkObj, None, 0, suckHP, ChConfig.Def_HurtTYpe_Recovery)
|
| | | return
|
| | |
|
| | | ## 攻击者回蓝逻辑
|
| | | # @param atkObj 攻击者
|
| | | # @param defObj 防守者
|
| | | # @return None
|
| | | def CalcSuckMagic(atkObj, defObj, hurtValue):
|
| | |
|
| | | if atkObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return
|
| | | |
| | | tick = GameWorld.GetGameWorld().GetTick()
|
| | | if tick - atkObj.GetTickByType(ChConfig.TYPE_Player_Tick_SuckMagic) \
|
| | | < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_SuckMagic]:
|
| | | return
|
| | | |
| | | atkObj.SetTickByType(ChConfig.TYPE_Player_Tick_SuckMagic, tick)
|
| | | |
| | | suckMP = 0
|
| | | |
| | | # 杀怪回蓝
|
| | | if defObj.GetGameObjType() == IPY_GameWorld.gotNPC and GameObj.GetHP(defObj) <= 0:
|
| | | suckMP += atkObj.GetKillBackMP()
|
| | | |
| | | # 攻击吸蓝
|
| | | atkBackMPPer = PlayerControl.GetAtkBackMPPer(atkObj)
|
| | | if atkBackMPPer > 0:
|
| | | suckMP += int(hurtValue * atkBackMPPer / float(ChConfig.Def_MaxRateValue))
|
| | | |
| | | if suckMP <= 0:
|
| | | return
|
| | | |
| | | atkObj.SetMP(min(atkObj.GetMaxMP(), atkObj.GetMP() + suckMP))
|
| | | return
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | if GameObj.GetHP(curObjDetel) > 0:
|
| | | return
|
| | |
|
| | | if TurnAttack.SetTurnObjKilled(curObjDetel, atkObj):
|
| | | return
|
| | | |
| | | #---玩家处理---
|
| | | if curObjDetel.GetGameObjType() == IPY_GameWorld.gotPlayer:
|
| | | playerControl = PlayerControl.PlayerControl(curObjDetel)
|
| | |
| | | return
|
| | |
|
| | | attackLV = curPlayer.GetLV() # 攻击者等级
|
| | | attackPrestige = PlayerControl.GetPrestige(curPlayer) # 攻击者威望
|
| | | attackPrestige = 0 #PlayerControl.GetPrestige(curPlayer) # 攻击者威望
|
| | | attackNotoriety = curPlayer.GetInfamyValue() # 攻击者恶名值
|
| | | attackPkValue = curPlayer.GetPKValue() # 攻击者pk值
|
| | | attackFightPower = PlayerControl.GetFightPower(curPlayer) # 攻击者战斗力
|
| | |
|
| | | defendLV = defender.GetLV() # 防守者等级
|
| | | defendPrestige = PlayerControl.GetPrestige(defender) # 防守者威望
|
| | | defendPrestige = 0 #PlayerControl.GetPrestige(defender) # 防守者威望
|
| | | defendNotoriety = defender.GetInfamyValue() # 防守者恶名值
|
| | | defendPkValue = defender.GetPKValue() # 防守者pk值
|
| | | defendFightPower = PlayerControl.GetFightPower(defender) # 防守者战斗力
|
| | |
| | | srcID, srcType = 0, 0
|
| | | if srcObj:
|
| | | srcID, srcType = srcObj.GetID(), srcObj.GetGameObjType()
|
| | | turnFight = TurnAttack.GetTurnFightMgr().getNPCTurnFight(curObj.GetID())
|
| | | if turnFight:
|
| | | clientPack = ChNetSendPack.tagObjPropertyRefreshView()
|
| | | clientPack.ObjID = curObj.GetID()
|
| | | clientPack.ObjType = curObj.GetGameObjType()
|
| | | clientPack.SkillID = skillID
|
| | | clientPack.DiffValue = changeHP % ShareDefine.Def_PerPointValue
|
| | | clientPack.DiffValueEx = changeHP / ShareDefine.Def_PerPointValue
|
| | | clientPack.AttackType = changType
|
| | | clientPack.SrcObjID = srcID
|
| | | clientPack.SrcObjType = srcType
|
| | | clientPack.HP = curObj.GetHP()
|
| | | clientPack.HPEx = curObj.GetHPEx()
|
| | | turnFight.addBatPack(clientPack)
|
| | | return
|
| | | curObj.ChangeHPView(skillID, changeHP % ShareDefine.Def_PerPointValue, changeHP / ShareDefine.Def_PerPointValue,
|
| | | changType, srcID, srcType, curObj.GetHP(), curObj.GetHPEx())
|
| | | return |