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