From fd3137f3c58f6fb5f53c0bfc38c55c74e7709f72 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 04 八月 2025 15:07:05 +0800
Subject: [PATCH] 121 【武将】武将系统-服务端(阵容通知B124)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py |  706 ++++++++++++++++++++++------------------------------------
 1 files changed, 269 insertions(+), 437 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
index 5dd3c73..4f4bdcb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/AttackLogic/AttackCommon.py
@@ -31,7 +31,6 @@
 import PlayerControl
 import NPCCommon
 import SkillCommon
-import EffGetSet
 import FBLogic
 import ReadChConfig
 import PetControl
@@ -55,6 +54,8 @@
 import ChNPC
 import BossHurtMng
 import NPCHurtMgr
+import ChNetSendPack
+import TurnAttack
 
 import datetime
 import math
@@ -372,15 +373,6 @@
     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):
@@ -429,59 +421,45 @@
 #  @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 当前玩家(被攻击了)
@@ -1145,18 +1123,20 @@
 #  @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 被攻击方
@@ -1285,34 +1265,35 @@
     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 = [] # 已经处理过的伤害类型列表
@@ -1350,35 +1331,16 @@
             
     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)
@@ -1387,29 +1349,19 @@
     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):
@@ -1422,7 +1374,7 @@
 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, 
@@ -1432,7 +1384,7 @@
     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
 
 
@@ -1454,21 +1406,21 @@
     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
@@ -1591,24 +1543,25 @@
     
 # 攻击时防守方神兵护盾的处理
 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
 
 
 # 设置玩家一次主动型攻击中的第一个防御者
@@ -1617,7 +1570,7 @@
         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):
@@ -1788,20 +1741,20 @@
     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
@@ -1965,9 +1918,6 @@
 # 计算攻击伤害
 # 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    # 召唤继承提高基础攻击力,取表
@@ -1985,106 +1935,61 @@
         
     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] 
@@ -2104,30 +2009,24 @@
         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)
@@ -2149,56 +2048,47 @@
         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()
@@ -2208,21 +2098,23 @@
         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    # 无视防御比率抗性
@@ -2232,108 +2124,55 @@
         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
 
@@ -2400,6 +2239,12 @@
             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
 
 
@@ -2410,6 +2255,8 @@
         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:
@@ -2559,10 +2406,10 @@
         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)
@@ -2583,39 +2430,6 @@
     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
 
 #---------------------------------------------------------------------
@@ -2894,6 +2708,9 @@
     if GameObj.GetHP(curObjDetel) > 0:
         return
     
+    if TurnAttack.SetTurnObjKilled(curObjDetel, atkObj):
+        return
+        
     #---玩家处理---
     if curObjDetel.GetGameObjType() == IPY_GameWorld.gotPlayer:
         playerControl = PlayerControl.PlayerControl(curObjDetel)
@@ -2926,13 +2743,13 @@
         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) # 防守者战斗力
@@ -2970,6 +2787,21 @@
     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
\ No newline at end of file

--
Gitblit v1.8.0