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/Attack/TurnAttack.py |  106 +++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 83 insertions(+), 23 deletions(-)

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):

--
Gitblit v1.8.0