From 585920f6469cc24091ada7882c329d45142fd35f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 22 一月 2026 20:14:02 +0800
Subject: [PATCH] 423 【内政】命格系统-服务端(推演增加A814回包;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 273 +++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 215 insertions(+), 58 deletions(-)
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 4276c3f..3636b76 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -38,6 +38,11 @@
ght = useSkill.GetHurtType() % 10
if ght == IPY_GameWorld.ghtMag: # 做配置兼容用,优先验证法伤,否则默认物伤
return IPY_GameWorld.ghtMag
+ if ght == 3: # 由触发的技能决定
+ bySkill = useSkill.GetBySkill()
+ if bySkill:
+ #GameWorld.DebugLogEx("物法类型取触发的技能: useSkillID=%s,bySkillID=%s", useSkill.GetSkillID(), bySkill.GetSkillID())
+ return GetPMType(batObj, bySkill)
return IPY_GameWorld.ghtPhy
def IsIgnoreDef(useSkill):
@@ -60,6 +65,19 @@
return
skillType = useSkill.GetSkillType()
+ byBatObj = kwargs.pop("byBatObj", None)
+ if useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_MinggeSkill:
+ if useSkill.GetSkillType() in ChConfig.Def_HurtSkill_List:
+ if not byBatObj:
+ return
+ GameWorld.DebugLogEx("命格攻击类技能施法方算触发者! mgObjID=%s,byObjID=%s,skillID=%s", curBatObj.GetID(), byBatObj.GetID(), skillID)
+ curBatObj = byBatObj
+ else:
+ # 因为命格攻击类技能修改了施法者,后续如果有子技能触发会变成还是变更后的施法者,导致命格全体buff可能存在多个施法来源,可能导致bug
+ batLineup = curBatObj.GetTFBatLineup()
+ curBatObj = batLineup.getMinggeObj()
+ GameWorld.DebugLogEx("命格非攻击类技能强制施法者为命格自己! mgObjID=%s,skillID=%s", curBatObj.GetID(), skillID)
+
byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
if not curBatObj.IsAlive():
if skillType == ChConfig.Def_SkillType_Revive:
@@ -145,8 +163,8 @@
angerOverflow = curBatObj.GetAngerOverflow()
bySkillID = bySkill.GetSkillID() if bySkill else 0
- GameWorld.DebugLogEx("◆使用技能: curID=%s,skillID=%s,tagCnt=%s,batType=%s,bySkillID=%s,HP:%s/%s,angerOverflow=%s,curXP=%s,oneActionUseCnt=%s",
- objID, skillID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
+ GameWorld.DebugLogEx("◆使用技能: skillID=%s,curID=%s,tagCnt=%s,batType=%s,bySkillID=%s,HP:%s/%s,angerOverflow=%s,curXP=%s,oneActionUseCnt=%s",
+ skillID, objID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
# 以下为技能可以使用的处理,之后的逻辑默认技能使用成功
if isinstance(useSkill, IpyGameDataPY.IPY_Skill):
@@ -158,6 +176,8 @@
useSkill.SetBatType(batType)
useSkill.SetBySkill(bySkill)
useSkill.SetByBuff(byBuff)
+ # 注:理论上原先的 byFriendObj 都可以直接用这个,但是旧的代码先不修改了,后续的累计敌军、友军之类的触发可以统一使用 byBatObj
+ useSkill.SetByBatObj(kwargs.pop("byBatObj", None))
useSkill.SetByTriggerWay(byTriggerWay)
isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
@@ -378,13 +398,14 @@
colNumList.insert(0, specInColNum)
GameWorld.DebugLogEx("纵排: colNumList=%s,specObjID-PosNum=%s-%s", colNumList, specObjID, specObjPosNum)
+ posObjIDDict = batLineup.getPosObjIDDict()
for col in colNumList:
for row in range(1, 1 + ChConfig.TurnFightRows):
pNum = (row - 1) * ChConfig.TurnFightCols + col
#GameWorld.DebugLogEx(" col=%s,row=%s,pNum=%s", col, row, pNum)
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
continue
@@ -403,13 +424,14 @@
GameWorld.DebugLogEx("全部: colNumList=%s,specObjID-PosNum=%s-%s", colNumList, specObjID, specObjPosNum)
# 按前排优先原则
+ posObjIDDict = batLineup.getPosObjIDDict()
for row in range(1, 1 + ChConfig.TurnFightRows):
for col in colNumList:
pNum = (row - 1) * ChConfig.TurnFightCols + col
#GameWorld.DebugLogEx(" col=%s,row=%s,pNum=%s", col, row, pNum)
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
continue
@@ -541,7 +563,7 @@
batObjMgr = BattleObj.GetBatObjMgr()
for num in lineupNumList:
batLineup = batFaction.getBatlineup(num)
- for tagID in batLineup.posObjIDDict.values():
+ for tagID in batLineup.getBatHeroObjIDList():
tagObj = batObjMgr.getBatObj(tagID)
if tagObj.IsAlive() and tagObj.CheckInState(checkInStates):
return lineupNum, changeTagSet
@@ -577,13 +599,14 @@
GameWorld.DebugLogEx("前后排: rowNumList=%s,colNumList=%s,specObjID-PosNum=%s-%s", rowNumList, colNumList, specObjID, specObjPosNum)
aimObjList = []
+ posObjIDDict = batLineup.getPosObjIDDict()
for row in rowNumList:
for col in colNumList:
pNum = (row - 1) * ChConfig.TurnFightCols + col
#GameWorld.DebugLogEx(" row=%s,col=%s,pNum=%s", row, col, pNum)
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
continue
@@ -608,13 +631,14 @@
row = inRowNum # 目标玩家所在横排
batObjMgr = BattleObj.GetBatObjMgr()
- batLineup = tagObj.GetBatLineup()
+ batLineup = tagObj.GetTFBatLineup()
aimObjList = []
+ posObjIDDict = batLineup.getPosObjIDDict()
for col in colNumList:
pNum = (row - 1) * ChConfig.TurnFightCols + col
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not tagBatObj.IsAlive():
continue
@@ -637,13 +661,14 @@
col = inColNum # 目标玩家所在纵排
batObjMgr = BattleObj.GetBatObjMgr()
- batLineup = tagObj.GetBatLineup()
+ batLineup = tagObj.GetTFBatLineup()
aimObjList = []
+ posObjIDDict = batLineup.getPosObjIDDict()
for row in range(1, 1 + ChConfig.TurnFightRows):
pNum = (row - 1) * ChConfig.TurnFightCols + col
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not tagBatObj.IsAlive():
continue
@@ -695,12 +720,13 @@
colNumList.insert(0, inColNum)
# 按前排优先原则
+ posObjIDDict = batLineup.getPosObjIDDict()
for row in range(ChConfig.TurnFightRows):
for col in colNumList:
pNum = row * ChConfig.TurnFightCols + col
- if pNum not in batLineup.posObjIDDict:
+ if pNum not in posObjIDDict:
continue
- tagObjID = batLineup.posObjIDDict[pNum]
+ tagObjID = posObjIDDict[pNum]
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf=True):
continue
@@ -1395,6 +1421,8 @@
# 优先处理afterLogic,可再预先汇总一些会触发被动的信息
relatedSkillID = useSkill.GetSkillID()
delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
+ beControlledHardDict = {} # 受控目标 {objID:buff, ...}
+ beDotBuffDict = {} # 被添加dot的目标 {objID:buff, ...}
afterLogicList = useSkill.GetAfterLogicList()
for logicType, logicData in afterLogicList:
if logicType == ChConfig.AfterLogic_DelBuff:
@@ -1413,6 +1441,15 @@
buff = logicData[1]
TurnBuff.SyncBuffRefresh(turnFight, buffObj, buff, relatedSkillID)
+ # 统计添加buff需要触发的被动
+ elif logicType == ChConfig.AfterLogic_TriggerAddBuff:
+ triggerType, batObj, buff, buffOwner = logicData
+ if buffOwner.GetID() == curID:
+ if triggerType == ChConfig.TriggerWay_BeControlledHard:
+ beControlledHardDict[batObj.GetID()] = buff
+ elif triggerType == ChConfig.TriggerWay_AddDOTBuff:
+ beDotBuffDict[batObj.GetID()] = buff
+
# 统计击杀
killObjList = [] # 击杀其他阵营目标列表
dieObjList = [] # 死亡的单位列表,包含友方单位或自己
@@ -1532,6 +1569,10 @@
# ========== 以下触发被动 ==========
+ curBatLineup = curObj.GetTFBatLineup()
+ curMGObj = curBatLineup.getMinggeObj()
+ mgTriggerWayList = [] # 命格本次技能已触发方式列表,命格固定只触发一次
+
# buff消失后置处理的被动,优先处理,如破盾,区别于被动方式 ChConfig.TriggerWay_BuffDel(立即触发)
for buffObjID, buff, tagObjID, afterTriggerData in delBuffAfterEffList:
triggerWay, effInfoList = afterTriggerData
@@ -1555,7 +1596,7 @@
batFaction = turnFight.getBatFaction(faction)
for lineupNum in batFaction.lineupDict.keys():
batLineup = batFaction.getBatlineup(lineupNum)
- for lineupObjID in batLineup.posObjIDDict.values():
+ for lineupObjID in batLineup.getBatHeroObjIDList():
lineupObj = batObjMgr.getBatObj(lineupObjID)
if not lineupObj.IsAlive():
continue
@@ -1578,10 +1619,13 @@
TurnBuff.DoBuffByRevive(turnFight, tagObj)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Revive, curObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_InBattlefield, curObj, connSkill=useSkill)
+ if reviveObjList and curMGObj:
+ tagObj = reviveObjList[0]
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Revive, tagObj, connSkill=useSkill, byFriendObj=curObj)
# 曹仁防护触发,暂写死
for tagObj in caorenProtectList:
- tagBatLineup = tagObj.GetBatLineup()
+ tagBatLineup = tagObj.GetTFBatLineup()
caorenObj = tagBatLineup.getHeroObj(ChConfig.HeroID_Caoren) # 获取被防护目标阵容的曹仁
if not caorenObj or not caorenObj.IsAlive():
continue
@@ -1596,7 +1640,6 @@
triggerOne = False
batType = useSkill.GetBatType()
isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
- curBatLineup = None
for tagObj in tagObjListAll:
tagID = tagObj.GetID()
@@ -1604,7 +1647,11 @@
if tagID in missObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeMiss, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill)
-
+ tagMGObj = tagObj.GetTFBatLineup().getMinggeObj()
+ if tagMGObj and ChConfig.TriggerWay_Miss not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Miss)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagMGObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill, byBatObj=tagObj)
+
# 免疫
if tagID in immuneObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_ImmuneHurt, curObj, connSkill=useSkill)
@@ -1652,30 +1699,65 @@
if tagID in stunObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeStun, curObj, connSkill=useSkill)
+ if curMGObj and ChConfig.TriggerWay_Stun not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Stun)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Stun, tagObj, connSkill=useSkill, byBatObj=curObj)
+
+ # 控制
+ if tagID in beControlledHardDict:
+ buff = beControlledHardDict[tagID]
+ if buff.GetCurBuffState() == ChConfig.BatObjState_Frozen:
+ if curMGObj and ChConfig.TriggerWay_Frozen not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Frozen)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Frozen, tagObj, connSkill=useSkill, byBatObj=curObj)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeControlledHard, curObj, connSkill=useSkill, connBuff=buff)
+ # 附加dot
+ if tagID in beDotBuffDict:
+ if curMGObj and ChConfig.TriggerWay_AddDOTBuff not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_AddDOTBuff)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_AddDOTBuff, tagObj, connSkill=useSkill, byBatObj=curObj)
+
# 暴击
if tagID in superHitObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuperHit, curObj, connSkill=useSkill)
-
+ if curMGObj and ChConfig.TriggerWay_SuperHit not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_SuperHit)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_SuperHit, tagObj, connSkill=useSkill, byBatObj=curObj)
+
# 格挡
if tagID in parryObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeParry, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill)
-
+ tagMGObj = tagObj.GetTFBatLineup().getMinggeObj()
+ if tagMGObj and ChConfig.TriggerWay_Parry not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Parry)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagMGObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill, byBatObj=tagObj)
+
# 吸血
if tagID in suckObjIDList:
if not triggerOne:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeSuckHP, curObj, connSkill=useSkill)
-
+ if curMGObj and ChConfig.TriggerWay_SuckHPOne not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_SuckHPOne)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_SuckHPOne, tagObj, connSkill=useSkill, byBatObj=curObj)
+
# 连击
if batType == ChConfig.TurnBattleType_Combo:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeCombo, curObj, connSkill=useSkill)
+ if curMGObj and ChConfig.TriggerWay_Combo not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_Combo)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill, byBatObj=curObj)
# 追击
elif batType == ChConfig.TurnBattleType_Pursue:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Pursue, tagObj, connSkill=useSkill)
+ if isAttackDirect:
+ if curMGObj and ChConfig.TriggerWay_PursueAtk not in mgTriggerWayList:
+ mgTriggerWayList.append(ChConfig.TriggerWay_PursueAtk)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curMGObj, ChConfig.TriggerWay_PursueAtk, tagObj, connSkill=useSkill, byBatObj=curObj)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BePursue, curObj, connSkill=useSkill)
# 反击
elif batType == ChConfig.TurnBattleType_AtkBack:
@@ -1684,10 +1766,8 @@
# 敌友方
- if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt:
- if not curBatLineup:
- curBatLineup = curObj.GetBatLineup()
- for lineupObjID in curBatLineup.posObjIDDict.values():
+ if isAttackDirect or batType in [ChConfig.TurnBattleType_Combo, ChConfig.TurnBattleType_Pursue] or isDotHurt or tagID in beControlledHardDict:
+ for lineupObjID in curBatLineup.getBatHeroObjIDList():
lineupObj = batObjMgr.getBatObj(lineupObjID)
if not lineupObj.IsAlive():
continue
@@ -1703,6 +1783,10 @@
if not triggerOne:
TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
+ # 敌方被控时
+ if tagID in beControlledHardDict and lineupObj.GetFaction() != tagObj.GetFaction():
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyBeControlledHard, tagObj, connSkill=useSkill)
+
# 连击
if batType == ChConfig.TurnBattleType_Combo:
TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
@@ -1727,9 +1811,7 @@
if not batFaction:
return
batLineup = batFaction.getBatlineup(1)
- if ChConfig.HeroID_Dongbai not in batLineup.heroObjIDDict:
- return
- dongbaiObj = BattleObj.GetBatObjMgr().getBatObj(batLineup.heroObjIDDict[ChConfig.HeroID_Dongbai])
+ dongbaiObj = batLineup.getHeroObj(ChConfig.HeroID_Dongbai)
if not dongbaiObj or dongbaiObj.IsAlive():
return
skill = dongbaiObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_DongbaiRevive)
@@ -1985,7 +2067,7 @@
@param effectID: 被动效果ID
注:可能由A引起触发B技能的效果释放技能C
'''
- if not passiveSkill:
+ if not passiveSkill or not batObj:
return
if isinstance(passiveSkill, int):
passiveSkillID = passiveSkill
@@ -2065,8 +2147,8 @@
'''按公式计算伤害,默认按攻击计算
'''
- #mapID = turnFight.mapID
skillID = curSkill.GetSkillID()
+ #mapID = turnFight.mapID
pmType = GetPMType(atkObj, curSkill)
ignoreDef = IsIgnoreDef(curSkill)
batType = curSkill.GetBatType()
@@ -2086,26 +2168,31 @@
isAngerSkill = SkillCommon.isAngerSkill(curSkill)
isDot = ("damageoftime" in kwargs)
- mustHit = False # 是否必命中
- if not isTurnNormalSkill: # 仅普攻判断是否闪避
- mustHit = True
-
- angerOverflow = atkObj.GetAngerOverflow() # 怒气溢出值
- if isAngerSkill:
- curXP = atkObj.GetXP()
- GameWorld.DebugLogEx("怒技攻击! curXP=%s,angerOverflow=%s", curXP, angerOverflow)
-
- #命中公式 攻击方类型不同,公式不同
- if not mustHit and not curSkill.GetEffectByID(ChConfig.SkillEff_MustHit) and not defObj.IsInControlledHard():
+ # 常规闪避 - 仅针对普攻
+ if isTurnNormalSkill and not curSkill.GetEffectByID(ChConfig.SkillEff_MustHit) and not defObj.IsInControlledHard():
aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # 抗闪避率 - 命中
dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_MissRate) # 闪避率
missNum = curSkill.GetTagMissNum(defID)
missRate = eval(IpyGameDataPY.GetFuncCompileCfg("MissCfg", 1))
if GameWorld.CanHappen(missRate):
GameWorld.DebugLogEx("闪避了! missRate=%s,dMissRate=%s,aMissRateDef=%s,missNum=%s", missRate, dMissRate, aMissRateDef, missNum)
- curSkill.SetTagMissNum(defID, missRate + 1)
+ curSkill.SetTagMissNum(defID, missNum + 1)
return 0, pow(2, ChConfig.HurtAtkType_Miss)
+ # 绝对闪避 - 除dot外的所有技能,因为绝对闪避不触发常规闪避的被动,所以在常规闪避后判断
+ if not isDot:
+ aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRateDef)
+ dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_AbsoluteMissRate)
+ missNum = curSkill.GetTagMissNum(defID)
+ if dMissRate > 0:
+ missRate = eval(IpyGameDataPY.GetFuncCompileCfg("MissCfg", 1))
+ if GameWorld.CanHappen(missRate):
+ GameWorld.DebugLogEx("绝对闪避了! missRate=%s,dAbsoluteMissRate=%s,aAbsoluteMissRateDef=%s,missNum=%s", missRate, dMissRate, aMissRateDef, missNum)
+ curSkill.SetTagMissNum(defID, missNum + 1)
+ return 0, pow(2, ChConfig.HurtAtkType_AbsoluteMiss)
+
+ angerOverflow = atkObj.GetAngerOverflow() # 怒气溢出值
+
hurtTypes = pow(2, ChConfig.HurtAtkType_Hurt)
isSuperHit, isParry, isStun = False, False, False
@@ -2126,7 +2213,6 @@
aSuperDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SuperDamPer, curSkill)
dSuperDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPerDef)
- GameWorld.DebugLogEx("aSuperDamPer=%s,dSuperDamPerDef=%s", aSuperDamPer, dSuperDamPerDef)
if isParry:
hurtTypes |= pow(2, ChConfig.HurtAtkType_Parry)
@@ -2154,6 +2240,32 @@
aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddFinalDamPer, curSkill)
aFinalDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_FinalDamPer, curSkill)
+ #招架 - 无视攻击方最终增伤百分比
+ dZhaojia = defObj.GetBatAttrValue(ChConfig.AttrID_Zhaojia)
+ aZhaojiaDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ZhaojiaDef)
+ if dZhaojia > aZhaojiaDef:
+ perMoreValue, perReduce = IpyGameDataPY.GetFuncEvalCfg("ZhaojiaCfg", 1) # 每高与对方抗贯穿x值无视y%最终减伤
+ reducePer = (dZhaojia - aZhaojiaDef) / float(perMoreValue) * perReduce
+ reduceMin, reduceMax = IpyGameDataPY.GetFuncEvalCfg("ZhaojiaCfg", 2) # 最小无视百分比|最大无视百分比
+ if reducePer >= reduceMin and GameWorld.CanHappen(IpyGameDataPY.GetFuncCfg("ZhaojiaCfg", 3)):
+ reducePer = min(reducePer, reduceMax)
+ hurtTypes |= pow(2, ChConfig.HurtAtkType_Zhaojia)
+ aFinalDamPer = int(aFinalDamPer * (100 - reducePer) / 100.0) # 按百分比减少
+ GameWorld.DebugLogEx("dZhaojia=%s,aZhaojiaDef=%s,reducePer=%s,aFinalDamPer=%s", dZhaojia, aZhaojiaDef, reducePer, aFinalDamPer)
+
+ #贯穿 - 无视防守方最终减伤百分比
+ aGuanchuan = atkObj.GetBatAttrValue(ChConfig.AttrID_Guanchuan)
+ dGuanchuanDef = defObj.GetBatAttrValue(ChConfig.AttrID_GuanchuanDef)
+ if aGuanchuan > dGuanchuanDef:
+ perMoreValue, perReduce = IpyGameDataPY.GetFuncEvalCfg("GuanchuanCfg", 1) # 每高与对方抗贯穿x值无视y%最终减伤
+ reducePer = (aGuanchuan - dGuanchuanDef) / float(perMoreValue) * perReduce
+ reduceMin, reduceMax = IpyGameDataPY.GetFuncEvalCfg("GuanchuanCfg", 2) # 最小无视百分比|最大无视百分比
+ if reducePer >= reduceMin and GameWorld.CanHappen(IpyGameDataPY.GetFuncCfg("GuanchuanCfg", 3)):
+ reducePer = min(reducePer, reduceMax)
+ hurtTypes |= pow(2, ChConfig.HurtAtkType_Guanchuan)
+ dFinalDamPerDef = int(dFinalDamPerDef * (100 - reducePer) / 100.0) # 按百分比减少
+ GameWorld.DebugLogEx("aGuanchuan=%s,dGuanchuanDef=%s,reducePer=%s,dFinalDamPerDef=%s", aGuanchuan, dGuanchuanDef, reducePer, dFinalDamPerDef)
+
aNormalSkillPer, dNormalSkillPerDef = 0, 0
if isTurnNormalSkill:
aNormalSkillPer = atkObj.GetBatAttrValue(ChConfig.AttrID_NormalSkillPer) # 普技增伤
@@ -2216,7 +2328,6 @@
if turnFight.isPVP() > 0:
aPVPDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_PVPDamPer)
dPVPDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_PVPDamPerDef)
- GameWorld.DebugLogEx("PVP aPVPDamPer=%s,dPVPDamPerDef=%s", aPVPDamPer, dPVPDamPerDef)
# 所有万分率参数统一除10000.0
atkSkillPer /= 10000.0
@@ -2245,19 +2356,30 @@
if calcType != ChConfig.Def_Calc_Attack:
aAtk = GetCalcBaseValue(calcType, atkObj, defObj, curSkill)
- GameWorld.DebugLogEx("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s/%s,hurtTypes=%s,aBatDamPer=%s,aFinalDamPer=%s",
- atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, dMaxHP, hurtTypes, aBatDamPer, aFinalDamPer)
- #GameWorld.DebugLogEx("aCountry=%s,dCountry=%s,aCountryDamPer=%s,dCountryDamPerDef=%s", aCountry, dCountry, aCountryDamPer, dCountryDamPerDef)
-
+ GameWorld.DebugLogEx("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s/%s,hurtTypes=%s,aBatDamPer=%s,dBatDamPerDef=%s,aFinalDamPer=%s,dFinalDamPerDef=%s",
+ atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, dMaxHP, hurtTypes, aBatDamPer, dBatDamPerDef, aFinalDamPer, dFinalDamPerDef)
+ if isSuperHit:
+ GameWorld.DebugLogEx(" 暴击 aSuperDamPer=%s,dSuperDamPerDef=%s", aSuperDamPer, dSuperDamPerDef)
+ if aPMDamPer or dPMDamPerDef:
+ GameWorld.DebugLogEx(" 物法 aPMDamPer=%s,dPMDamPerDef=%s,pmType=%s", aPMDamPer, dPMDamPerDef, pmType)
+ if aComboDamPer or dComboDamPerDef:
+ GameWorld.DebugLogEx(" 连击 aComboDamPer=%s,dComboDamPerDef=%s", aComboDamPer, dComboDamPerDef)
+ if aPursueDamPer or dPursueDamPerDef:
+ GameWorld.DebugLogEx(" 追击 aPursueDamPer=%s,dPursueDamPerDef=%s", aPursueDamPer, dPursueDamPerDef)
+ if aPVPDamPer or dPVPDamPerDef:
+ GameWorld.DebugLogEx(" PVP aPVPDamPer=%s,dPVPDamPerDef=%s", aPVPDamPer, dPVPDamPerDef)
+ if aCountryDamPer or dCountryDamPerDef:
+ GameWorld.DebugLogEx(" 国家 aCountry=%s,dCountry=%s,aCountryDamPer=%s,dCountryDamPerDef=%s", aCountry, dCountry, aCountryDamPer, dCountryDamPerDef)
+
if isTurnNormalSkill:
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 1))
GameWorld.DebugLogEx(" 普攻技能伤害=%s,aNormalSkillPer=%s,dNormalSkillPerDef=%s", hurtValue, aNormalSkillPer, dNormalSkillPerDef)
elif isAngerSkill:
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 2))
- GameWorld.DebugLogEx(" 怒气技能伤害=%s,aAngerSkillPer=%s,dAngerSkillPerDef=%s", hurtValue, aAngerSkillPer, dAngerSkillPerDef)
+ GameWorld.DebugLogEx(" 怒气技能伤害=%s,aAngerSkillPer=%s,dAngerSkillPerDef=%s,angerOverflow=%s,curXP=%s", hurtValue, aAngerSkillPer, dAngerSkillPerDef, angerOverflow, atkObj.GetXP())
elif isDot:
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
- GameWorld.DebugLogEx(" 持续技能伤害=%s" % (hurtValue))
+ GameWorld.DebugLogEx(" 持续技能伤害=%s,aDOTPer=%s,dDOTPerDef=%s", hurtValue, aDOTPer, dDOTPerDef)
elif calcType == ChConfig.Def_Calc_ByBuffValue:
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 2))
GameWorld.DebugLogEx(" 按最后一次buff值计算伤害=%s,calcType=%s,LastHurt=%s", hurtValue, calcType, aAtk)
@@ -2564,12 +2686,10 @@
faction, lineupNum, hurtValueDict, immuneHurtDict)
# 按优先级顺序处理拥有分摊效果的武将
for effHeroID in effHeroIDList:
- if effHeroID not in batLineup.heroObjIDDict:
- continue
- objID = batLineup.heroObjIDDict[effHeroID]
- batObj = batObjMgr.getBatObj(objID)
+ batObj = batLineup.getHeroObj(effHeroID)
if not batObj or not batObj.IsAlive():
continue
+ objID = batObj.GetID()
buffMgr = batObj.GetBuffManager()
inHurt = objID in hurtValueDict # 光环里的人员是否有受伤
@@ -2803,7 +2923,7 @@
damBackPer = 0
buffMgr = defObj.GetBuffManager()
for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamBackShield):
- damBackPer += buff.GetValue1()
+ damBackPer += buff.GetValue1() * max(1, buff.GetLayer())
connSkillTypeID = buff.GetSkillTypeID()
damBackPer += TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_AddDamBackPerByBuffLayer, connSkillTypeID=connSkillTypeID)
@@ -3027,6 +3147,43 @@
useSkill.ResetUseRec()
return
+def DoHurtExAtk(turnFight, atkObj, defObj, hurtValue, skillID, hurtTypes=0):
+ ## 额外结算指定伤害
+ skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
+ if not skillIpyData:
+ return
+
+ atkID = atkObj.GetID()
+ defID = defObj.GetID()
+
+ # 结算需要同步标签
+ useTag = "Skill_%s_%s_Dot_%s" % (atkID, skillID, atkObj.GetIncrementValue()) # 复用dot的标签
+ Sync_TurnFightTag(turnFight, useTag, 0)
+
+ dHP = defObj.GetHP()
+ dMaxHP = defObj.GetMaxHP()
+ GameWorld.DebugLogEx("额外结算指定伤害: atkID=%s,defID=%s,skillID=%s,hurtValue=%s,,dHP=%s/%s",
+ atkID, defID, skillID, hurtValue, dHP, dMaxHP)
+
+ useSkill = BattleObj.PySkill(skillIpyData, atkID)
+ useSkill.SetTagObjList([defObj])
+ useSkill.SetBatType(ChConfig.TurnBattleType_Dot) # 要修改表现的话等前端同步修改
+
+ hurtTypes |= pow(2, ChConfig.HurtAtkType_Hurt) # 确保有基础的伤害类型
+ hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
+ calcHurtResults = [[defObj, hurtValue, hurtTypes, immuneHurt]]
+ DoSkillHurtHP(turnFight, atkObj, useSkill, calcHurtResults, "HurtExAtk")
+
+ Sync_UseSkill(turnFight, atkObj, useSkill)
+
+ DoBeAttackResult(turnFight, atkObj, useSkill)
+
+ # 通知结束标签
+ Sync_TurnFightTag(turnFight, useTag, 1)
+
+ useSkill.ResetUseRec()
+ return True
+
def Sync_TurnFightTag(turnFight, useTag, sign):
## 通知技能标签
clientPack = ChPyNetSendPack.tagSCTurnFightTag()
--
Gitblit v1.8.0