From 9ec66731c8a551035958aebe1fa974a140b99cf1 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 02 七月 2025 17:34:10 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(初版战斗,支持基础的三维属性战斗,支持简单的普攻技能、怒气技能、回血技能;主线章节关卡过关支持;阵容保存支持多阵容;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py | 148 ++++++++++++++++++++++-------------------------- 1 files changed, 68 insertions(+), 80 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py index 50c5d8a..25f8750 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py @@ -34,6 +34,7 @@ import GameObj import PassiveBuffEffMng import IpyGameDataPY +import TurnAttack #--------------------------------------------------------------------- #--------------------------------------------------------------------- @@ -573,7 +574,7 @@ lvSummonNPC = curPlayer.GetLV() summonNPC.SetLV(lvSummonNPC) summonNPC.SetCountry(curPlayer.GetCountry()) - summonNPC.SetDict(ChConfig.Def_NpcDictKey_CampType, curPlayer.GetFaction()) + GameObj.SetFaction(summonNPC, curPlayer.GetFaction()) summonNPC.GetNPCAngry().Init(ChConfig.Def_SummonNPC_Angry_Count) #设置召唤兽属性 SetSummonNPCProperty(curPlayer, summonNPC, curSkill) @@ -1225,21 +1226,17 @@ # @param addValue 添加值 # @return None # @remarks 函数详细说明. -def SkillAddHP(curObj, skillTypeID, addValue, isNotify=True): +def SkillAddHP(curObj, skillID, addValue, isNotify=True, srcObj=None): + if not srcObj: + srcObj = curObj curObjType = curObj.GetGameObjType() - #======================================================================= - # if curObj.GetMapID() in ChConfig.CanNotRecoverMapIDList and skillTypeID not in ChConfig.ForceRecoverSkillList: - # GameWorld.DebugLog("该地图无法使用技能恢复血量!") - # return - #======================================================================= if GameObj.GetPyPlayerState(curObj, ChConfig.Def_PlayerState_LimitAddHP): #GameWorld.DebugLog("当前禁疗状态下,无法恢复!") return - if addValue <= 0: - GameWorld.Log('###技能回复血量异常,数值错误 = %s,技能类型ID = %s' % (addValue , skillTypeID)) + GameWorld.Log('###技能回复血量异常,数值错误 = %s,技能ID = %s' % (addValue , skillID)) return curHP = GameObj.GetHP(curObj) @@ -1253,23 +1250,26 @@ return # 治疗加成 - curePer = PlayerControl.GetCurePer(curObj) if curObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue - addValue = int(addValue*curePer*1.0/ChConfig.Def_MaxRateValue) + #curePer = PlayerControl.GetCurePer(curObj) if curObjType == IPY_GameWorld.gotPlayer else ChConfig.Def_MaxRateValue + #addValue = int(addValue*curePer*1.0/ChConfig.Def_MaxRateValue) maxHP = GameObj.GetMaxHP(curObj) #血已最大值,不再恢复,跳出 - if curHP == maxHP: + if curHP >= maxHP: + GameWorld.DebugLog("满血不用回血,只通知回血表现!") #广播加血类型 if isNotify: - AttackCommon.ChangeHPView(curObj, curObj, skillTypeID, addValue, ChConfig.Def_HurtTYpe_Recovery) - return + AttackCommon.ChangeHPView(curObj, srcObj, skillID, addValue, ChConfig.Def_HurtTYpe_Recovery) + return addValue remainHP = min(curHP + addValue, maxHP) + cureHP = remainHP - curHP # 实际治疗量 + TurnAttack.AddTurnObjCureHP(curObj, srcObj, addValue, cureHP, skillID) #---玩家处理--- if curObjType == IPY_GameWorld.gotPlayer: - GameObj.SetHP(curObj, remainHP, not isNotify) + GameObj.SetHP(curObj, remainHP, False) # 先不通知 FBLogic.OnFBAddHP(curObj, addValue) #---NPC处理--- @@ -1279,15 +1279,12 @@ PetControl.SetPetHP(curObj, remainHP) #普通NPC回血 else: - GameObj.SetHP(curObj, remainHP) - if not isNotify: - #已广播的不重复 - curObj.Notify_HP() - + GameObj.SetHP(curObj, remainHP, False) # 先不通知 + #广播加血类型 if isNotify: - AttackCommon.ChangeHPView(curObj, curObj, skillTypeID, addValue, ChConfig.Def_HurtTYpe_Recovery) - + AttackCommon.ChangeHPView(curObj, srcObj, skillID, addValue, ChConfig.Def_HurtTYpe_Recovery) + return ## 直接扣血不走公式 @@ -1355,6 +1352,8 @@ else: # 已广播的不重复 GameObj.SetHP(curObj, remainHP, not view) + + lostHP = curObjHP_BeforeAttack - GameObj.GetHP(curObj) # 实际掉血量 AttackCommon.WriteHurtLog(buffOwner, curObj, curSkill, lostValue, hurtType, "持续掉血") if view: @@ -1408,10 +1407,12 @@ elif curObjType == IPY_GameWorld.gotNPC: AttackCommon.NPCAddObjInHurtList(attackerOwner, curObj, curObjHP_BeforeAttack, lostValue) + TurnAttack.AddTurnObjHurtValue(buffOwner, curObj, hurtType, lostValue, lostHP, curSkill) + #统一调用攻击结束动作 if isDoAttackResult: BaseAttack.DoLogic_AttackResult(buffOwner, curObj, None, tick) - return + return lostHP ## 检查增加淬毒buff # @param skillTypeID 使用的技能typeID @@ -1968,7 +1969,15 @@ if not curSkill: return ChConfig.Def_BattleRelationType_Comm #0通哟 1 PVP类型 2PVE类型 - return curSkill.GetHurtType() + return curSkill.GetHurtType() % 10 + +def isXPSkill(curSkill): + ## 是否xp怒气技能 + return curSkill and curSkill.GetXP() > 0 + +def isNormalAtkSkill(curSkill): + ## 是否普攻技能,区别与无技能的普通A一下,该普攻同样可以有各种技能效果,只是他属于普攻 + return curSkill and curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_NormalAttack ## 检查技能是否为被动技能, 用于控制不可释放技能 def isPassiveSkill(curSkill): @@ -2057,34 +2066,7 @@ # @param useSkill 使用的技能 # @return 基础治疗值 # @remarks 函数详细说明. -def GetCureBaseValue(attacker, useSkill): - return GetAttackerHurtValueByAtkType(attacker, AttackCommon.GetBattleType(attacker, useSkill)) - -## 获得基础伤害值(目前用于持续性技能的计算) -# @param attacker 攻击者 -# @param useSkill 使用的技能 -# @return 基础伤害值 -# @remarks 获得基础伤害值 -def GetHurtBaseValue(attacker, useSkill): - return GetAttackerHurtValueByAtkType(attacker, AttackCommon.GetBattleType(attacker, useSkill)) - -#--------------------------------------------------------------------- -## 通过攻击类型获得攻击方伤害值 -# @param attacker 攻击者 -# @param atkType 攻击类型(物理攻击、摩法攻击) -# @return 攻击方伤害值 -# @remarks 通过攻击类型获得攻击方伤害值 -def GetAttackerHurtValueByAtkType(attacker, atkType): - - return (attacker.GetMinAtk() + random.random() * (attacker.GetMaxAtk() - attacker.GetMinAtk())) - #=========================================================================== - # if atkType == IPY_GameWorld.ghtPhy: - # #(最小攻击 + rand()*( 最大攻击伤害-最小攻击伤害 ) - # return (attacker.GetMinAtk() + random.random() * (attacker.GetMaxAtk() - attacker.GetMinAtk())) - # - # #(最小剑气伤害 + rand()*( 最大剑气伤害-最小剑气伤害 ) - # return (attacker.GetMAtkMin() + random.random() * (attacker.GetMAtkMax() - attacker.GetMAtkMin())) - #=========================================================================== +def GetCureBaseValue(attacker, useSkill): return attacker.GetMaxAtk() #--------------------------------------------------------------------- ## 获得某技能管理器是否有特定技能 @@ -2202,19 +2184,6 @@ curePercent = 1.0 #治疗加成值 cureBaseValue = 0 #治疗基础值 - #passiveSkill = GetSkillFromOtherSkillByEffectID(userObj, curSkill, ChConfig.Def_Skill_Effect_PassiveSkillID) - - #该被动技能已学, 则处理被动影响的效果 - #=========================================================================== - # if passiveSkill != None and isPassiveSkill(passiveSkill): - # cureEffect = GetSkillEffectByEffectID(passiveSkill, ChConfig.Def_Skill_Effect_CureUpper) - # - # #计算治疗加成,按几率触发 - # if GameWorld.CanHappen(passiveSkill.GetHappenRate(), ChConfig.Def_MaxRateValue) \ - # and cureEffect != None: - # curePercent += cureEffect.GetEffectValue(0) / float(ChConfig.Def_MaxRateValue) - #=========================================================================== - #特殊技能的附加值 addExValue = 0 @@ -2233,27 +2202,46 @@ cureBaseValue = GameObj.GetLastHurtValue(userObj) elif cureType == ChConfig.Def_Cure_TagMaxHP: cureBaseValue = 0 if not tagObj else GameObj.GetMaxHP(tagObj) - - - #这边写死了效果1,基本已经定型 - #获得技能的计算参数值 - if cureType == ChConfig.Def_Cure_PHY: - # 根据敏捷,力量差值及效果系数计算恢复比例 - skillPer = max(0, userObj.GetPHY() - userObj.GetSTR()) / float(curSkill.GetEffect(0).GetEffectValue(0)) - GameWorld.DebugLog("英勇复苏: 敏=%s,力=%s,skillPer=%s" % (userObj.GetPHY(), userObj.GetSTR(), skillPer)) - else: - skillPer = curSkill.GetEffect(0).GetEffectValue(0) / float(ChConfig.Def_MaxRateValue) - #技能附加 + #elif cureType == ChConfig.Def_Cure_TagAtk: + # cureBaseValue = 0 if not tagObj else GetCureBaseValue(tagObj, curSkill) + #elif cureType == ChConfig.Def_Cure_LostHP: + # cureBaseValue = max(0, GameObj.GetMaxHP(userObj) - GameObj.GetHP(userObj)) + #elif cureType == ChConfig.Def_Cure_BeHurtValue: + # cureBaseValue = GameObj.GetLastBeHurtValue(userObj) + + skillPer = curSkill.GetEffect(0).GetEffectValue(0) + #技能附加固定值 skillValue = curSkill.GetEffect(0).GetEffectValue(1) - skillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(userObj, None, curSkill, ChConfig.TriggerType_AddHP)/float(ChConfig.Def_MaxRateValue) + skillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(userObj, None, curSkill, ChConfig.TriggerType_AddHP) + skillPer /= float(ChConfig.Def_MaxRateValue) + + # 回合制 + curePer = 0 # 治疗加成 + cureDefPer = 0 # 敌方的弱化治疗 + angerOverflow = 0 # 怒气溢出值 + if userObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightPosInfo): + if isXPSkill(curSkill): + angerOverflow = max(GameObj.GetXP(userObj) - IpyGameDataPY.GetFuncCfg("AngerXP", 2), 0) + #enemyObj = TurnAttack.GetEnemyObj(userObj) + #curePer += GameObj.GetCurePer(userObj) + #if enemyObj: + # cureDefPer += GameObj.GetCureDefPer(enemyObj) + + curePer /= float(ChConfig.Def_MaxRateValue) + cureDefPer /= float(ChConfig.Def_MaxRateValue) + + baseValue = max(0, cureBaseValue) # 防止基值被弱化为负值,在恢复比例也是负值的情况下负负得正导致可以恢复血量 + #公式计算治疗值 - cureHP = int((cureBaseValue * skillPer + skillValue + addExValue) * curePercent) + cureHP = eval(IpyGameDataPY.GetFuncCompileCfg("CureFormula", 1)) + #cureHP = (cureHP + skillValue + addExValue) * curePercent # 策划没有要求,但是支持的,先屏蔽 if not largeNum: cureHP = min(cureHP, ChConfig.Def_UpperLimit_DWord) + cureHP = max(1, int(cureHP)) # 保底1点 - #GameWorld.DebugLog("获取治疗值(%s):cureType=%s,cureBaseValue=%s,skillPer=%s,skillValue=%s" - # % (cureHP, cureType, cureBaseValue, skillPer, skillValue)) + GameWorld.DebugLog("获取治疗值(%s):skillID=%s,cureType=%s,baseValue=%s,skillPer=%s,curePer=%s,cureDefPer=%s,angerOverflow=%s" + % (cureHP, curSkill.GetSkillID(), cureType, baseValue, skillPer, curePer, cureDefPer, angerOverflow)) return cureHP -- Gitblit v1.8.0