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