From c35e176a3b05f745600c6e60f168313d2b9e7b30 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 17 九月 2025 12:00:19 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(司马懿技能;增加按层级结算持续buff效果5003;增加非按攻击力计算伤害支持;技能伤害增加可限制最大攻击力百分比上限配置;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py | 6 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 48 ++++++++------- PySysDB/PySysDBPY.h | 1 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py | 7 +- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py | 32 ++++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 80 ++++++++++++++++---------- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 5 + 7 files changed, 120 insertions(+), 59 deletions(-) diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index 0b8b31b..6d8c339 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -101,6 +101,7 @@ BYTE CalcType; //计算方式 WORD SkillPer; //技能万分比 DWORD SkillValue; //技能固定值 + DWORD HurtAtkPerMax; //最大万分比,限制最终伤害不超过攻击力万分率 WORD HappenRate; //释放或添加几率 DWORD EffectID1; //效果ID1 list EffectValues1; //效果值列表1 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py index efa0231..b11f819 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py @@ -280,6 +280,7 @@ def GetCalcType(self): return self._ipyData.GetCalcType() def GetSkillPer(self): return self._ipyData.GetSkillPer() def GetSkillValue(self): return self._ipyData.GetSkillValue() + def GetHurtAtkPerMax(self): return self._ipyData.GetHurtAtkPerMax() def GetHappenRate(self): return self._ipyData.GetHappenRate() # 触发概率 def GetEffect(self, index): return self._effList[index] if len(self._effList) > index else 0 def GetEffectCount(self): return len(self._effList) @@ -501,6 +502,7 @@ def GetCalcType(self): return self._skillData.GetCalcType() def GetSkillPer(self): return self._skillData.GetSkillPer() def GetSkillValue(self): return self._skillData.GetSkillValue() + def GetHurtAtkPerMax(self): return self._skillData.GetHurtAtkPerMax() def GetHappenRate(self): return self._skillData.GetHappenRate() # 触发概率 def GetEffect(self, index): return self._skillData.GetEffect(index) def GetEffectCount(self): return self._skillData.GetEffectCount() @@ -638,6 +640,7 @@ self._skillMgr = ObjPool.GetPoolMgr().acquire(SkillManager) self._buffMgr = ObjPool.GetPoolMgr().acquire(BuffManager, self) self._passiveEffMgr = ObjPool.GetPoolMgr().acquire(PassiveEffManager, self) + self._lastHurtValue = 0 # 统计 self.hurtStat = 0 # 输出统计 @@ -826,6 +829,9 @@ self._skillUseCntDict[skillID] = self._skillUseCntDict.get(skillID, 0) + 1 self._skillTurnUseCntDict[skillID] = self._skillTurnUseCntDict.get(skillID, 0) + 1 + def GetLastHurtValue(self): return self._lastHurtValue + def SetLastHurtValue(self, lastHurtValue): self._lastHurtValue = lastHurtValue + def StatHurtValue(self, hurtValue): ## 统计输出 self.hurtStat += hurtValue 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 80b2184..082ab50 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py @@ -265,7 +265,7 @@ @param turnNum: 第x回合 ''' self.timeline = timeline - GameWorld.DebugLog("时间节点更新: %s" % self.timeline) + GameWorld.DebugLog("[时间节点更新]: %s" % self.timeline) if isEmpty: # 空位置的节点可直接跳过 return timeline @@ -1167,7 +1167,7 @@ turnFight.syncState(FightState_Fighting) for faction, num in turnFight.actionSortList: - GameWorld.DebugLog("回合开始逻辑: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num)) + GameWorld.DebugLog("大回合开始逻辑: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num)) batFaction = turnFight.getBatFaction(faction) batLineup = batFaction.getBatlineup(num) batLineup.actionNum = 1 @@ -1258,7 +1258,7 @@ # 回合开始 for faction, num in turnFight.actionSortList: - GameWorld.DebugLog("回合开始逻辑: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num)) + GameWorld.DebugLog("大回合开始逻辑: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num)) batFaction = turnFight.getBatFaction(faction) batLineup = batFaction.getBatlineup(num) batLineup.actionNum = 1 @@ -1465,6 +1465,7 @@ if batObj.GetHP() <= 0: return + GameWorld.DebugLog("---[武将回合开始时] : curID=%s,curHP=%s/%s" % (batObj.GetID(), batObj.GetHP(), batObj.GetMaxHP())) TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_HeroTurnStart) return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py index 8fd7258..c21574c 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py @@ -1319,7 +1319,7 @@ Def_CalcTypeList = ( Def_Calc_Attack, # 攻击 0 Def_Calc_MaxHP, # 最大生命值 1 -Def_Calc_HurtValue, # 伤害值 2 +Def_Calc_LastHurt, # 最后一次伤害值 2 Def_Calc_TagMaxHP, # 目标最大生命值 3 ) = range(4) @@ -4278,7 +4278,8 @@ TriggerWay_BeAttackedDirect, # 受到直接攻击时 (非buff攻击)11 TriggerWay_ShieldBroken, # 承伤盾被击破时 12 TriggerWay_CurSkillEff, # 本技能/buff释放后,一般用于本技能/buff释放后触发,仅该技能释放后有效 13 -) = range(1, 1 + 13) +TriggerWay_CurSkillEffLst, # 本持续buff结算后额外触发效果,仅该持续buff结算后有效 14 +) = range(1, 1 + 14) # 被动触发有效来源 TriggerSrc_Skill = 1 # 身上技能有效 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index 830f953..3980af3 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -123,6 +123,7 @@ ("BYTE", "CalcType", 0), ("WORD", "SkillPer", 0), ("DWORD", "SkillValue", 0), + ("DWORD", "HurtAtkPerMax", 0), ("WORD", "HappenRate", 0), ("DWORD", "EffectID1", 0), ("list", "EffectValues1", 0), @@ -2694,29 +2695,30 @@ def GetCalcType(self): return self.attrTuple[13] # 计算方式 BYTE def GetSkillPer(self): return self.attrTuple[14] # 技能万分比 WORD def GetSkillValue(self): return self.attrTuple[15] # 技能固定值 DWORD - def GetHappenRate(self): return self.attrTuple[16] # 释放或添加几率 WORD - def GetEffectID1(self): return self.attrTuple[17] # 效果ID1 DWORD - def GetEffectValues1(self): return self.attrTuple[18] # 效果值列表1 list - def GetTriggerWay1(self): return self.attrTuple[19] # 触发方式 BYTE - def GetTriggerSrc1(self): return self.attrTuple[20] # 有效来源 BYTE - def GetEffectID2(self): return self.attrTuple[21] # 效果ID2 DWORD - def GetEffectValues2(self): return self.attrTuple[22] # 效果值列表2 list - def GetTriggerWay2(self): return self.attrTuple[23] # 触发方式 BYTE - def GetTriggerSrc2(self): return self.attrTuple[24] # 有效来源 BYTE - def GetEffectID3(self): return self.attrTuple[25] # 效果ID3 DWORD - def GetEffectValues3(self): return self.attrTuple[26] # 效果值列表3 list - def GetTriggerWay3(self): return self.attrTuple[27] # 触发方式 BYTE - def GetTriggerSrc3(self): return self.attrTuple[28] # 有效来源 BYTE - def GetCoolDownTime(self): return self.attrTuple[29] # 技能冷却时间 WORD - def GetIgnoreStates(self): return self.attrTuple[30] # 无视限制列表 list - def GetCurBuffState(self): return self.attrTuple[31] # Buff状态值 BYTE - def GetLastTime(self): return self.attrTuple[32] # 持续时间 WORD - def GetLayerCnt(self): return self.attrTuple[33] # Buff层数 BYTE - def GetLayerMax(self): return self.attrTuple[34] # 最大层数 BYTE - def GetBuffRepeat(self): return self.attrTuple[35] # Buff叠加规则 DWORD - def GetDieContinue(self): return self.attrTuple[36] # Buff死亡存在 DWORD - def GetFightPower(self): return self.attrTuple[37] # 技能战斗力 DWORD - def GetSkillMotionName(self): return self.attrTuple[38] # 技能动作名 char + def GetHurtAtkPerMax(self): return self.attrTuple[16] # 最大万分比,限制最终伤害不超过攻击力万分率 DWORD + def GetHappenRate(self): return self.attrTuple[17] # 释放或添加几率 WORD + def GetEffectID1(self): return self.attrTuple[18] # 效果ID1 DWORD + def GetEffectValues1(self): return self.attrTuple[19] # 效果值列表1 list + def GetTriggerWay1(self): return self.attrTuple[20] # 触发方式 BYTE + def GetTriggerSrc1(self): return self.attrTuple[21] # 有效来源 BYTE + def GetEffectID2(self): return self.attrTuple[22] # 效果ID2 DWORD + def GetEffectValues2(self): return self.attrTuple[23] # 效果值列表2 list + def GetTriggerWay2(self): return self.attrTuple[24] # 触发方式 BYTE + def GetTriggerSrc2(self): return self.attrTuple[25] # 有效来源 BYTE + def GetEffectID3(self): return self.attrTuple[26] # 效果ID3 DWORD + def GetEffectValues3(self): return self.attrTuple[27] # 效果值列表3 list + def GetTriggerWay3(self): return self.attrTuple[28] # 触发方式 BYTE + def GetTriggerSrc3(self): return self.attrTuple[29] # 有效来源 BYTE + def GetCoolDownTime(self): return self.attrTuple[30] # 技能冷却时间 WORD + def GetIgnoreStates(self): return self.attrTuple[31] # 无视限制列表 list + def GetCurBuffState(self): return self.attrTuple[32] # Buff状态值 BYTE + def GetLastTime(self): return self.attrTuple[33] # 持续时间 WORD + def GetLayerCnt(self): return self.attrTuple[34] # Buff层数 BYTE + def GetLayerMax(self): return self.attrTuple[35] # 最大层数 BYTE + def GetBuffRepeat(self): return self.attrTuple[36] # Buff叠加规则 DWORD + def GetDieContinue(self): return self.attrTuple[37] # Buff死亡存在 DWORD + def GetFightPower(self): return self.attrTuple[38] # 技能战斗力 DWORD + def GetSkillMotionName(self): return self.attrTuple[39] # 技能动作名 char # 武将表 class IPY_Hero(): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py new file mode 100644 index 0000000..5fc2e16 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/PassiveTrigger/PassiveEff_5003.py @@ -0,0 +1,32 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package Skill.PassiveTrigger.PassiveEff_5003 +# +# @todo:结算某持续buff层数效果(可以是攻击或治疗) +# @author hxp +# @date 2025-09-17 +# @version 1.0 +# +# 详细描述: 结算某持续buff层数效果(可以是攻击或治疗) +# +#------------------------------------------------------------------------------- +#"""Version = 2025-09-17 12:00""" +#------------------------------------------------------------------------------- + +import TurnBuff + +def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill): + #结算一次扣除1回合 + remainLayer = max(0, effBuff.GetLayer() - 1) + effBuff.SetLayer(remainLayer) + + TurnBuff.DoBuffProcess(turnFight, batObj, effBuff) + + if remainLayer <= 0: + TurnBuff.DoBuffDel(turnFight, batObj, effBuff) + else: + TurnBuff.SyncBuffRefresh(turnFight, batObj, effBuff) + + return True diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py index 1aea3dd..25b07f3 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py @@ -77,8 +77,8 @@ return bySkillID = bySkill.GetSkillID() if bySkill else 0 - GameWorld.DebugLog("使用技能: curID=%s,skillID=%s,tagCnt=%s,batType=%s,bySkillID=%s" - % (curBatObj.GetID(), skillID, len(tagObjList), batType, bySkillID)) + GameWorld.DebugLog("使用技能: curID=%s,skillID=%s,tagCnt=%s,batType=%s,bySkillID=%s,HP:%s/%s" + % (curBatObj.GetID(), skillID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP())) # 以下为技能可以使用的处理,之后的逻辑默认技能使用成功 poolMgr = ObjPool.GetPoolMgr() @@ -659,7 +659,7 @@ def DoBeAttackResult(turnFight, curObj, useSkill, isUseSkill=False): '''被攻击结果 @param curObj: 施法方或buff归属方 - @param isUseSkill: 是否是直接使用技能的攻击结果 + @param isUseSkill: 是否是直接使用技能的攻击结果,否则视为持续性的 ''' curID = curObj.GetID() @@ -736,8 +736,7 @@ FBLogic.OnPlayerLineupAttackResult(curPlayer, curObj, killObjList, useSkill, turnFight.mapID, turnFight.funcLineID) # 优先触发本技能额外效果,注:仅该技能释放后该技能的额外效果视为主技能的效果,优先级最高 - if isUseSkill: - __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList) + __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList, isUseSkill) # ========== 以下触发被动 ========== @@ -846,15 +845,20 @@ Sync_PropertyRefreshView(turnFight, gameObj, ChConfig.AttrID_XP, updXP, addXP, diffType=1, relatedSkillID=relatedSkillID) return -def __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList): +def __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList, isUseSkill): ## 执行本技能/buff释放后额外效果 for index in xrange(useSkill.GetEffectCount()): curEffect = useSkill.GetEffect(index) - if curEffect.GetTriggerWay() != ChConfig.TriggerWay_CurSkillEff: - continue - + triggerWay = curEffect.GetTriggerWay() + if isUseSkill: + if triggerWay != ChConfig.TriggerWay_CurSkillEff: + continue + else: + if triggerWay != ChConfig.TriggerWay_CurSkillEffLst: + continue + effID = curEffect.GetEffectID() - GameWorld.DebugLog("执行额外技能效果: %s, missObjIDList=%s" % (effID, missObjIDList)) + GameWorld.DebugLog("执行额外技能效果: %s, triggerWay=%s,missObjIDList=%s" % (effID, triggerWay, missObjIDList)) if effID == 5010: # 额外技能效果 __doUseEnhanceSkill(turnFight, curObj, useSkill, curEffect, missObjIDList) @@ -997,6 +1001,7 @@ hurtObj.SetLostHP(lostHP) hurtObj.SetCurHP(remainHP) defObj.SetHP(remainHP) + atkObj.SetLastHurtValue(hurtValue) GameWorld.DebugLog(" 伤血: atkID=%s,defID=%s,hurtValue=%s,realHurtHP=%s,lostHP=%s,%s/%s" % (atkID, defID, hurtValue, realHurtHP, lostHP, defObj.GetHP(), defObj.GetMaxHP())) TurnAttack.AddTurnObjHurtValue(atkObj, defObj, hurtValue, lostHP, skillID) @@ -1024,23 +1029,21 @@ atkID = atkObj.GetID() defID = defObj.GetID() + calcType = curSkill.GetCalcType() # 伤害计算方式 0-按攻击 isTurnNormalSkill = SkillCommon.isTurnNormalSkill(curSkill) isAngerSkill = SkillCommon.isAngerSkill(curSkill) isDot = ("damageoftime" in kwargs) angerOverflow = 0 # 怒气溢出值 - mustHit = False + mustHit = False # 是否必命中 if isAngerSkill: mustHit = True curXP = atkObj.GetXP() angerOverflow = max(atkObj.GetXP() - IpyGameDataPY.GetFuncCfg("AngerXP", 2), 0) GameWorld.DebugLog("XP必命中! curXP=%s,angerOverflow=%s" % (curXP, angerOverflow)) - if isDot: - mustHit = True - #命中公式 攻击方类型不同,公式不同 - if not mustHit: + if isTurnNormalSkill and not mustHit: aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # 抗闪避率 - 命中 dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_MissRate) # 闪避率 missNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnMissNum) @@ -1052,13 +1055,15 @@ hurtTypes = pow(2, ChConfig.HurtType_Normal) - #calcType = curSkill.GetCalcType() 目前暂时按攻击算伤害,之后可以扩展其他 - isSuperHit, isParry, isStun = False, False, False aSuperDamPer, dSuperDamPerDef = 0, 0 + # 暴击(dot除外) if not isDot: isSuperHit = CanSuperHit(turnFight, atkObj, defObj, curSkill) # 是否暴击 - isParry = (isTurnNormalSkill and CanParry(turnFight, atkObj, defObj, curSkill)) # 是否格挡,仅针对普攻 + + # 闪避、击晕、格挡 + if isTurnNormalSkill: + isParry = CanParry(turnFight, atkObj, defObj, curSkill) # 是否格挡 isStun = CanStun(turnFight, atkObj, defObj, curSkill) # 是否击晕 if isSuperHit: @@ -1078,10 +1083,10 @@ #参与运算的数值 #rand = random.random() #种子数 0~1 - aAtk = atkObj.GetBatAttrValue(ChConfig.AttrID_Atk) # 攻击方最大攻击 + aAtk = atkObj.GetAtk() # 攻击方最大攻击 dHP = defObj.GetHP() - dDef = 0 if ignoreDef else defObj.GetBatAttrValue(ChConfig.AttrID_Def) # 防守方防御力 + dDef = 0 if ignoreDef else defObj.GetDef() # 防守方防御力 aFinalDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPer) # 最终加成 dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # 最终减伤 @@ -1121,19 +1126,24 @@ aFinalDamPer /= 10000.0 dFinalDamPerDef /= 10000.0 - GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s,aAddSkillPer=%s" - % (atkID, defID, skillID, atkSkillPer, aAtk, dDef, dHP, hurtTypes, aAddSkillPer)) + if calcType != ChConfig.Def_Calc_Attack: + aAtk = GetCalcBaseValue(calcType, atkObj, defObj) + GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s,aAddSkillPer=%s" + % (atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, hurtTypes, aAddSkillPer)) # 持续性伤害 - if isDot: - hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1)) - GameWorld.DebugLog(" 持续技能伤害=%s" % (hurtValue)) - elif isTurnNormalSkill: + if isTurnNormalSkill: hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 1)) GameWorld.DebugLog(" 普攻技能伤害=%s" % (hurtValue)) elif isAngerSkill: hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 2)) GameWorld.DebugLog(" 怒气技能伤害=%s" % (hurtValue)) + elif isDot: + hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1)) + GameWorld.DebugLog(" 持续技能伤害=%s" % (hurtValue)) + elif calcType != ChConfig.Def_Calc_Attack: + hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 1)) + GameWorld.DebugLog(" 非按攻击力伤害=%s,calcType=%s,aAtk=%s" % (hurtValue, calcType, aAtk)) else: hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 4)) GameWorld.DebugLog(" 其他伤害=%s" % (hurtValue)) @@ -1147,6 +1157,13 @@ if multiValue and multiValue != 1: hurtValue = int(hurtValue * multiValue) GameWorld.DebugLog(" 伤害倍值: hurtValue=%s,multiValue=%s" % (hurtValue, multiValue)) + + hurtAtkPerMax = curSkill.GetHurtAtkPerMax() # 最大万分比,限制最终伤害不超过攻击力万分率 + if hurtAtkPerMax: + aAtk = atkObj.GetAtk() + hurtValueMax = aAtk * hurtAtkPerMax / 10000.0 + hurtValue = min(hurtValue, hurtValueMax) + GameWorld.DebugLog(" 伤害最高限制: hurtValue=%s,hurtAtkPerMax=%s,aAtk=%s" % (hurtValue, hurtAtkPerMax, aAtk)) hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后 return hurtValue, hurtTypes @@ -1340,8 +1357,8 @@ baseValue = curObj.GetAtk() elif calcType == ChConfig.Def_Calc_MaxHP: baseValue = curObj.GetMaxHP() - #elif cureType == ChConfig.Def_Calc_HurtValue: - # baseValue = GameObj.GetLastHurtValue(userObj) + elif calcType == ChConfig.Def_Calc_LastHurt: + baseValue = curObj.GetLastHurtValue() elif calcType == ChConfig.Def_Calc_TagMaxHP: baseValue = 0 if not tagObj else tagObj.GetMaxHP() return baseValue @@ -1361,6 +1378,7 @@ atkObj = buffOwner defObj = batObj + atkID = ownerID defID = defObj.GetID() tagObjList = [defObj] @@ -1371,8 +1389,8 @@ hurtObj = useSkill.AddHurtObj(defID) dHP = defObj.GetHP() - GameWorld.DebugLog("结算dot: defID=%s,buffID=%s,skillID=%s,ownerID=%s,hurtValue=%s,hurtTypes=%s,dHP=%s" - % (defID, buffID, skillID, ownerID, hurtValue, hurtTypes, dHP)) + GameWorld.DebugLog("结算dot: atkID=%s,defID=%s,buffID=%s,skillID=%s,ownerID=%s,hurtValue=%s,hurtTypes=%s,dHP=%s" + % (atkID, defID, buffID, skillID, ownerID, hurtValue, hurtTypes, dHP)) hurtValue, realHurtHP = CalcHurtHPWithBuff(turnFight, atkObj, defObj, useSkill, hurtValue) # dot的反弹、吸血待定 @@ -1380,7 +1398,7 @@ remainHP = max(0, dHP - realHurtHP) # 剩余血量 lostHP = dHP - remainHP # 实际掉血量 defObj.SetHP(remainHP) - + atkObj.SetLastHurtValue(hurtValue) GameWorld.DebugLog(" hurtValue=%s,realHurtHP=%s,lostHP=%s,%s/%s" % (hurtValue, realHurtHP, lostHP, defObj.GetHP(), defObj.GetMaxHP())) hurtObj.SetHurtTypes(hurtTypes) -- Gitblit v1.8.0