From a9f55b1be431e71c9be021f7484c2e45e34b9586 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 22 十二月 2023 18:12:19 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(NPC战斗属性统一放到NPC扩展表;每回合开始处理减技能CD、buff持续时间、刷新buff,每回合等同于常规时间1秒;NPC支持击晕;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py   |    9 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py    |    5 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py      |   14 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py  |   44 +++++-----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py      |    9 +
 PySysDB/PySysDBPY.h                                                                       |    6 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AICommon.py |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py  |  106 ++++++++++++++++++++-----
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py            |   16 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py |    3 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py           |    2 
 11 files changed, 164 insertions(+), 53 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index dec8ab6..1fd6f88 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -614,6 +614,9 @@
 	BYTE		FightPowerLackAtkLimit;	//战力不足限制攻击
 	DWORD		SuppressFightPower;	//推荐/压制战力
 	DWORD		AtkSpeed;	//攻击速度
+	DWORD		MissRate;	//闪避概率
+	DWORD		MissDefRate;	//抗闪避概率
+	DWORD		SuperHitRate;	//暴击概率
 	DWORD		SuperHitRateReduce;	//抗暴击概率
 	DWORD		FaintRate;	//击晕概率
 	DWORD		FaintDefRate;	//抗击晕概率
@@ -880,7 +883,8 @@
 	WORD		_LineID;	//功能线路ID
 	DWORD		NPCID;	//NPCID
 	DWORD		SummerNPCID;	//召唤兽ID
-	list		AwardItemList;	//过关奖励列表,[[物品ID,个数,是否拍品], ...]
+	list		AwardItemListFirst;	//首次过关奖励列表[[物品ID,个数,是否拍品], ...]
+	list		AwardItemList;	//再次过关奖励列表[[物品ID,个数,是否拍品], ...]
 };
 
 //副本助战表
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
index 072738d..2472fe5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py
@@ -1697,40 +1697,42 @@
 
 # 属性击晕
 def AttackFaintRate(attacker, defender, curSkill, tick):
-    if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
-        return
+    #if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer:
+    #    return
     
     faintRate = GameObj.GetFaintRate(attacker)
     if not faintRate:
         #GameWorld.DebugLog("没有击晕概率!", attacker.GetID())
         return
     
-    if curSkill:
-        useSkillData = attacker.GetUseSkill()
-        # 非主动性技能不触发
-        if not useSkillData:
-            return
-        if useSkillData.GetSkillID() != curSkill.GetSkillID():
-            return
-        
-    if not defender:
-        useSkillTagID = attacker.GetUseSkillTagID()
-        useSkillTagType = attacker.GetUseSkillTagType()
-        defender = GameWorld.GetObj(useSkillTagID, useSkillTagType)
+    if attacker.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        if curSkill:
+            useSkillData = attacker.GetUseSkill()
+            # 非主动性技能不触发
+            if not useSkillData:
+                return
+            if useSkillData.GetSkillID() != curSkill.GetSkillID():
+                return
+            
         if not defender:
-            return
+            useSkillTagID = attacker.GetUseSkillTagID()
+            useSkillTagType = attacker.GetUseSkillTagType()
+            defender = GameWorld.GetObj(useSkillTagID, useSkillTagType)
+            
+    if not defender:
+        return
     
     if attacker.GetID() == defender.GetID():
         return
-
+    
     if GameObj.GetHP(defender) <= 0:
         return
-
-    tagFaintRate = GameObj.GetFaintDefRate(defender) if defender.GetGameObjType() == IPY_GameWorld.gotPlayer else 0
-
+    
+    tagFaintDefRate = GameObj.GetFaintDefRate(defender)
+    
     # 添加最高60%击晕效果
     maxRate = IpyGameDataPY.GetFuncCfg("PassiveSkillFaint", 1)
-    rate = min(max(faintRate - tagFaintRate, 0), maxRate)
+    rate = min(max(faintRate - tagFaintDefRate, 0), maxRate)
     if not GameWorld.CanHappen(rate):
         return
     
@@ -1742,7 +1744,7 @@
             GameWorld.DebugLog("击晕CD中! rate=%s,剩余tick=%s" % (rate, remainTick), attacker.GetID())
             return
         attacker.SetDict(ChConfig.Def_PlayerKey_AttrFaintCD, tick)
-        GameWorld.DebugLog("触发击晕! rate=%s" % rate, attacker.GetID())
+        GameWorld.DebugLog("触发击晕! rate=%s,tagID=%s" % (rate, defender.GetID()), attacker.GetID())
         
     SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick)
     return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
index d35b9d4..637078d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py
@@ -142,7 +142,7 @@
         
         # 回合开始: 做一些每回合重置逻辑或者某些根据回合触发的效果等
         for gameObj in fightObjList:
-            TurnFightObjPerTurnStart(gameObj, turnNum)
+            TurnFightObjPerTurnStart(gameObj, turnNum, tick)
             
         # 回合战斗: 轮流依次攻击
         for actNum, gameObj in enumerate(fightObjList, 1):
@@ -156,7 +156,7 @@
             tagObjID = tagGameObj.GetID()
             
             GameWorld.DebugLog("    行动: turnNum=%s,actNum=%s,faction=%s,objType=%s,objID=%s,tagObjType=%s,tagObjID=%s" 
-                               % (turnNum, actNum, faction, objType, objID, tagObjType, tagObjID), playerID)
+                               % (turnNum, actNum, faction, objType, objID, tagObjType, tagObjID))
             DoAttack(gameObj, tagGameObj, tick)
             
             playerDead = GameObj.GetHP(curPlayer) <= 0
@@ -199,8 +199,17 @@
     
     objType = gameObj.GetGameObjType()
     npcID = gameObj.GetNPCID() if objType == IPY_GameWorld.gotNPC else 0
-    GameWorld.DebugLog("    初始化实例: objID=%s,npcID=%s,faction=%s,atkSpeed=%s,HP=%s" 
-                       % (gameObj.GetID(), npcID, GameObj.GetFaction(gameObj), GameObj.GetAtkSpeed(gameObj), GameObj.GetHP(gameObj)))
+    GameWorld.DebugLog("初始化实例: objID=%s,npcID=%s,faction=%s,atkSpeed=%s,HP=%s,Atk=%s,Def=%s" 
+                       % (gameObj.GetID(), npcID, GameObj.GetFaction(gameObj), GameObj.GetAtkSpeed(gameObj), GameObj.GetHP(gameObj), gameObj.GetMaxAtk(), gameObj.GetDef()))
+    GameWorld.DebugLog("    闪命(%s,%s),闪避(%s,%s),暴击(%s,%s),击晕(%s,%s),连击(%s,%s),反击(%s,%s),吸血(%s,%s)" 
+                       % (gameObj.GetMiss(), gameObj.GetHit(),
+                          GameObj.GetMissRate(gameObj), GameObj.GetMissDefRate(gameObj),
+                          GameObj.GetSuperHitRate(gameObj), GameObj.GetSuperHitRateReduce(gameObj),
+                          GameObj.GetFaintRate(gameObj), GameObj.GetFaintDefRate(gameObj),
+                          GameObj.GetComboRate(gameObj), GameObj.GetComboDefRate(gameObj),
+                          GameObj.GetAtkBackRate(gameObj), GameObj.GetAtkBackDefRate(gameObj),
+                          GameObj.GetSuckHPPer(gameObj), GameObj.GetSuckHPDefPer(gameObj),
+                          ))
     
     # 重置技能CD、战斗buff
     if objType == IPY_GameWorld.gotPlayer:            
@@ -213,7 +222,7 @@
         pass
     return
 
-def TurnFightObjPerTurnStart(gameObj, turnNum):
+def TurnFightObjPerTurnStart(gameObj, turnNum, tick):
     ## 回合制战斗实例 - 每回合开始时处理
     if not gameObj:
         return
@@ -222,14 +231,52 @@
     # 重置连击、反击数
     gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, 0)
     gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, 0)
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrFaintCD, 0) # 击晕CD
     
     objType = gameObj.GetGameObjType()
+    objID = gameObj.GetID()
+    GameWorld.DebugLog("ObjPerTurnStart: faction=%s,objType=%s,objID=%s,turnNum=%s,HP=%s" % (GameObj.GetFaction(gameObj), objType, objID, turnNum, GameObj.GetHP(gameObj)))
+    
+    # 每回合开始减技能CD
+    skillManager = gameObj.GetSkillManager()
+    for i in range(skillManager.GetSkillCount()):
+        skill = skillManager.GetSkillByIndex(i)
+        remainTime = skill.GetRemainTime()
+        if not remainTime:
+            continue
+        skillID = skill.GetSkillID()
+        updRemainTime = max(0, remainTime - ChConfig.Def_PerTurnTick)
+        skill.SetRemainTime(updRemainTime)
+        GameWorld.DebugLog("    skillID=%s,remainTime=%s,updRemainTime=%s" % (skillID, remainTime, updRemainTime))
+        
     if objType == IPY_GameWorld.gotPlayer:
-        pass
-    
+        gameObj.SetTickByType(ChConfig.TYPE_Player_Tick_Buff, 0)
+        gameObj.SetPersistBuffTick(0)
+        
+        #刷新玩家Buff
+        reFlashBuff = PlayerState.ProcessRefreshBuffState(gameObj, tick)
+        #刷新玩家场景buff效果
+        PlayerState.ProcessPlayerBuffEffect(gameObj, tick)
+        
+        attrBuffResult, actBuffResult = PlayerState.ProcessRefreshActionBuffState(gameObj, tick)
+        playerControl = PlayerControl.PlayerControl(gameObj)
+        if actBuffResult:
+            playerControl.RefreshPlayerActionState()
+            
+        #此处才是真正的刷新人物属性值,需刷属性逻辑应在此行前调用
+        if not playerControl.RefreshPlayerAttrStateEx():
+            if reFlashBuff or attrBuffResult:
+                playerControl.RefreshPlayerAttrByBuff()
+            # 只刷BUFF情况
+            playerControl.RefreshPlayerAttrByBuffEx() 
+            
     elif objType == IPY_GameWorld.gotNPC:
-        pass
-    
+        gameObj.SetTickByType(ChConfig.TYPE_NPC_Tick_Buff, 0)
+        gameObj.SetTickByType(ChConfig.TYPE_NPC_Tick_Buff_Timely, 0)
+        
+        npcControl = NPCCommon.NPCControl(gameObj)
+        npcControl.RefreshBuffState(tick)
+        
     return
 
 def TurnFightObjOverReset(gameObj):
@@ -270,14 +317,14 @@
     curID = curObj.GetID()
     tagID = tagObj.GetID()
     if curObj.GetGameObjType() == IPY_GameWorld.gotPlayer: 
-        atkRet = PlayerAttack(curObj, tagObj, tick)
+        atkOK = PlayerAttack(curObj, tagObj, tick)
     else:
-        atkRet = NPCAttack(curObj, tagObj, tick)
+        atkOK = NPCAttack(curObj, tagObj, tick)
         
     turnBattleType = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType)
     curObj.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 无论攻击成功与否都重置战斗类型
     
-    if not atkRet:
+    if not atkOK:
         return
     
     if turnBattleType == ChConfig.TurnBattleType_Combo:
@@ -289,7 +336,11 @@
         curObj.SetDict(ChConfig.Def_Obj_Dict_TurnAtkBackNum, atkBackNum)
         GameWorld.DebugLog("            反击: atkBackID=%s,atkBackNum=%s" % (curID, atkBackNum))
         
-    GameWorld.DebugLog("            curID-HP=(%s-%s),tagID-HP=(%s-%s)" % (curID, GameObj.GetHP(curObj), tagID, GameObj.GetHP(tagObj)))
+    curHP = GameObj.GetHP(curObj)
+    tagHP = GameObj.GetHP(tagObj)
+    GameWorld.DebugLog("            curID-HP=(%s-%s),tagID-HP=(%s-%s)" % (curID, curHP, tagID, tagHP))
+    if tagHP <= 0 or curHP <= 0:
+        return
     
     # 反击,反击可打断连击,所以优先判断
     if CanAtkBack(curObj, tagObj):
@@ -355,18 +406,18 @@
     if not curObj:
         return
     tagDist = 0
-    atkRet = AICommon.DoAutoUseSkill(curObj, tagObj, tagDist, tick)
+    atkOK = AICommon.DoAutoUseSkill(curObj, tagObj, tagDist, tick)
     #---优先释放技能---
-    if not atkRet:
+    if not atkOK:
         #普通攻击
-        atkRet = BaseAttack.Attack(curObj, tagObj, None, tick)
-        if atkRet:
-            GameWorld.DebugLog("        NPC普通攻击: curID=%s,tagID=%s,atkRet=%s" % (curObj.GetID(), tagObj.GetID(), atkRet))
+        atkOK = BaseAttack.Attack(curObj, tagObj, None, tick)
+        if atkOK:
+            GameWorld.DebugLog("        NPC普通攻击: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK))
         else:
-            GameWorld.DebugLog("        NPC攻击失败: curID=%s,tagID=%s,atkRet=%s" % (curObj.GetID(), tagObj.GetID(), atkRet))
+            GameWorld.DebugLog("        NPC攻击失败: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK))
     else:
-        GameWorld.DebugLog("        NPC技能攻击: curID=%s,tagID=%s,atkRet=%s" % (curObj.GetID(), tagObj.GetID(), atkRet))
-    return atkRet
+        GameWorld.DebugLog("        NPC技能攻击: curID=%s,tagID=%s,atkOK=%s" % (curObj.GetID(), tagObj.GetID(), atkOK))
+    return atkOK
 
 def PlayerAttack(curPlayer, tagObj, tick):
     ## 玩家攻击, 参考技能使用 #def UseSkillEx(index, clientData, tick):
@@ -408,14 +459,23 @@
         curPlayer.SetUseSkill(curSkill.GetSkillData())
         useSkillData = curPlayer.GetUseSkill()
         if not PlayerState.__DoClientUseSkillEx(curPlayer, useSkillData, tick):
-            GameWorld.DebugLog("        技能攻击失败%s" % skillID, playerID)
+            GameWorld.DebugLog("        玩家技能攻击失败: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
             continue
         useSkillResult = True
-        GameWorld.DebugLog("        技能攻击成功%s" % skillID, playerID)
+        GameWorld.DebugLog("        玩家技能攻击成功: playerID=%s,tagID=%s,skillID=%s" % (playerID, tagObjID, skillID))
         
         break
     
     curPlayer.ClearUseSkillRec()
+    
+    if not useSkillResult:
+        #普通攻击
+        atkOK = BaseAttack.Attack(curPlayer, tagObj, None, tick)
+        if atkOK:
+            useSkillResult = True
+            GameWorld.DebugLog("        玩家普通攻击: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
+        else:
+            GameWorld.DebugLog("        玩家攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK))
     return useSkillResult
 
 def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index e0774f0..2862e46 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3062,6 +3062,8 @@
 TurnBattleType_AtkBack, # 反击
 ) = range(3)
 
+Def_PerTurnTick = 1000 # 每回合等同于常规tick时长
+
 #---Obj字典-------
 Def_Obj_Dict_Faction = 'Faction' # 所属阵营
 Def_Obj_Dict_TurnFightNum = 'TurnFightNum' # 回合制战斗当前轮次
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
index 7866691..02f8398 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
@@ -204,7 +204,21 @@
         gameObj.SetDict(ChConfig.AttrName_AtkSpeed, value)
     return
 
-#---暴击概率---- 都是用 gameObj.GetSuperHitRate() gameObj.SetSuperHitRate()
+def GetMissRate(gameObj): return gameObj.GetMiss()
+def SetMissRate(gameObj, value):
+    ## 闪避概率
+    gameObj.SetMiss(value)
+    return
+def GetMissDefRate(gameObj): return gameObj.GetHit()
+def SetMissDefRate(gameObj, value):
+    ## 抗闪避率 = 命中
+    gameObj.SetHit(value)
+    return
+def GetSuperHitRate(gameObj): return gameObj.GetSuperHitRate()
+def SetSuperHitRate(gameObj, value):
+    ## 暴击概率
+    gameObj.SetSuperHitRate(value)
+    return
 def GetSuperHitRateReduce(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_SuperHitRateReduce)
 def SetSuperHitRateReduce(gameObj, value): 
     ## 抗暴击概率
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index a9deca2..671978d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -500,6 +500,9 @@
                         ("BYTE", "FightPowerLackAtkLimit", 0),
                         ("DWORD", "SuppressFightPower", 0),
                         ("DWORD", "AtkSpeed", 0),
+                        ("DWORD", "MissRate", 0),
+                        ("DWORD", "MissDefRate", 0),
+                        ("DWORD", "SuperHitRate", 0),
                         ("DWORD", "SuperHitRateReduce", 0),
                         ("DWORD", "FaintRate", 0),
                         ("DWORD", "FaintDefRate", 0),
@@ -723,6 +726,7 @@
                         ("WORD", "LineID", 1),
                         ("DWORD", "NPCID", 0),
                         ("DWORD", "SummerNPCID", 0),
+                        ("list", "AwardItemListFirst", 0),
                         ("list", "AwardItemList", 0),
                         ),
 
@@ -3240,6 +3244,9 @@
         self.FightPowerLackAtkLimit = 0
         self.SuppressFightPower = 0
         self.AtkSpeed = 0
+        self.MissRate = 0
+        self.MissDefRate = 0
+        self.SuperHitRate = 0
         self.SuperHitRateReduce = 0
         self.FaintRate = 0
         self.FaintDefRate = 0
@@ -3255,6 +3262,9 @@
     def GetFightPowerLackAtkLimit(self): return self.FightPowerLackAtkLimit # 战力不足限制攻击
     def GetSuppressFightPower(self): return self.SuppressFightPower # 推荐/压制战力
     def GetAtkSpeed(self): return self.AtkSpeed # 攻击速度
+    def GetMissRate(self): return self.MissRate # 闪避概率
+    def GetMissDefRate(self): return self.MissDefRate # 抗闪避概率
+    def GetSuperHitRate(self): return self.SuperHitRate # 暴击概率
     def GetSuperHitRateReduce(self): return self.SuperHitRateReduce # 抗暴击概率
     def GetFaintRate(self): return self.FaintRate # 击晕概率
     def GetFaintDefRate(self): return self.FaintDefRate # 抗击晕概率
@@ -3700,6 +3710,7 @@
         self.LineID = 0
         self.NPCID = 0
         self.SummerNPCID = 0
+        self.AwardItemListFirst = []
         self.AwardItemList = []
         return
         
@@ -3707,7 +3718,8 @@
     def GetLineID(self): return self.LineID # 功能线路ID
     def GetNPCID(self): return self.NPCID # NPCID
     def GetSummerNPCID(self): return self.SummerNPCID # 召唤兽ID
-    def GetAwardItemList(self): return self.AwardItemList # 过关奖励列表,[[物品ID,个数,是否拍品], ...]
+    def GetAwardItemListFirst(self): return self.AwardItemListFirst # 首次过关奖励列表[[物品ID,个数,是否拍品], ...]
+    def GetAwardItemList(self): return self.AwardItemList # 再次过关奖励列表[[物品ID,个数,是否拍品], ...]
 
 # 副本助战表
 class IPY_FBHelpBattle():
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AICommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AICommon.py
index 27250ba..790207b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AICommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCAI/AICommon.py
@@ -523,8 +523,9 @@
     #GameWorld.DebugLog('技能使用顺序 = useSkillList%s' % str(useSkillList), curNPC.GetID())
     
     for useCnt, index, useSkill in useSkillList:
+        skillID = useSkill.GetSkillID()
         if DoNPCUseSkill(curNPC, curTag, useSkill, tagDist, tick):
-            return True
+            return skillID
         
     #无技能可以释放
     return False
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 2f74743..8105c44 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -4094,6 +4094,9 @@
         npcDataEx = GetNPCDataEx(curNPC.GetNPCID())
         if npcDataEx:
             GameObj.SetAtkSpeed(curNPC, npcDataEx.GetAtkSpeed())
+            GameObj.SetMissRate(curNPC, npcDataEx.GetMissRate())
+            GameObj.SetMissDefRate(curNPC, npcDataEx.GetMissDefRate())
+            GameObj.SetSuperHitRate(curNPC, npcDataEx.GetSuperHitRate())
             GameObj.SetSuperHitRateReduce(curNPC, npcDataEx.GetSuperHitRateReduce())
             GameObj.SetFaintRate(curNPC, npcDataEx.GetFaintRate())
             GameObj.SetFaintDefRate(curNPC, npcDataEx.GetFaintDefRate())
@@ -4143,11 +4146,11 @@
         curNPC.SetMaxAtk(PropDict["MaxAtk"])
         curNPC.SetDef(PropDict["Def"])
         GameObj.SetMaxHP(curNPC, PropDict["MaxHP"])
-        curNPC.SetHit(PropDict["Hit"])
-        curNPC.SetMiss(PropDict["Miss"])
         GameObj.SetAtkSpeed(curNPC, PropDict.get("AtkSpeed", 0))
         
-        curNPC.SetSuperHitRate(PropDict["SuperHitRate"])
+        GameObj.SetMissRate(curNPC, PropDict["Miss"])
+        GameObj.SetMissDefRate(curNPC, PropDict["Hit"])
+        GameObj.SetSuperHitRate(curNPC, PropDict["SuperHitRate"])
         GameObj.SetSuperHitRateReduce(curNPC, PropDict["SuperHitRateReduce"])
         GameObj.SetFaintRate(curNPC, PropDict["FaintRate"])
         GameObj.SetFaintDefRate(curNPC, PropDict["FaintDefRate"])
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
index dc13eee..1c37662 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCHurtManager.py
@@ -725,6 +725,9 @@
     
     def __GetIsInRefreshPoint(self, curPosX, curPosY, refreshPoint):
         if not refreshPoint:
+            curNPC = self.curNPC
+            if curNPC.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightNum):
+                return True
             if self.logDetail:
                 GameWorld.Log("        not refreshPoint=%s" % refreshPoint, self.npcID, self.lineID)
             return False
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
index 6e637b2..1a2e190 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/BuffSkill.py
@@ -645,6 +645,7 @@
     
     index = 0
     isPlayerTJG = (curObj.GetGameObjType() == IPY_GameWorld.gotPlayer and PlayerTJG.GetIsTJG(curObj))
+    turnNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightNum) # 回合编号,大于0同时也代表回合制中
     
     skillIDListInDelBuff = []   # buff消失中需要处理添加buff,外层处理避免错乱
     
@@ -668,6 +669,10 @@
             continue
         
         remainTime = curBuffRemainTime - ( tick - curBuff.GetCalcStartTick() )
+        if turnNum > 0:
+            remainTime -= ChConfig.Def_PerTurnTick
+            GameWorld.DebugLog("    刷新buff时间: objID=%s,skillID=%s,remainTime=%s,turnNum=%s" % (curObj.GetID(), curSkill.GetSkillID(), remainTime, turnNum))
+            
         #还有剩余时间
         if remainTime > 0:
             curBuff.SetCalcStartTick( tick ) 
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
index 932035a..9d5fe12 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -2423,6 +2423,8 @@
     if not buffStateCount:
         return
     
+    turnNum = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightNum) # 回合编号,大于0同时也代表回合制中
+    
     #buff持续效果
     for i in range(0, buffStateCount):
         curBuff = buffState.GetBuff(i)
@@ -2440,8 +2442,11 @@
         processBuffTick = GetProcessBuffTick(curBuffSkill, curObj)
         
         #---验证触发间隔TICK---
-        if tick - curBuff.GetProcessInterval() <= processBuffTick:
-            continue
+        if turnNum > 0:
+            GameWorld.DebugLog("    buffProcess: objID=%s,skillID=%s,turnNum=%s" % (curObj.GetID(), curBuffSkill.GetSkillID(), turnNum))
+        else:
+            if tick - curBuff.GetProcessInterval() <= processBuffTick:
+                continue
         curBuff.SetProcessInterval(tick)
         
         

--
Gitblit v1.8.0