From e59a91e461c1bc03d0012f0a1403e0b97351fb4a Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 26 十二月 2025 16:38:45 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(甄宓技能,除了最后一个觉醒技能;目标细分增加10-血量百分比最低;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py | 298 ++++++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 231 insertions(+), 67 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 c77146a..8fd79b3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -59,13 +59,14 @@
if not skillID:
return
- triggerWay = kwargs["triggerWay"] if "triggerWay" in kwargs else 0
+ skillType = useSkill.GetSkillType()
+ byTriggerWay = kwargs["byTriggerWay"] if "byTriggerWay" in kwargs else 0 # 不使用参数名 triggerWay, 防止传递过程中参数混乱
if not curBatObj.IsAlive():
- if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive and useSkill.GetTagAim() == ChConfig.SkillTagAim_Self:
- GameWorld.DebugLogEx("死亡时使用复活自己的技能! skillID=%s", skillID)
+ if skillType == ChConfig.Def_SkillType_Revive:
+ GameWorld.DebugLogEx("死亡时使用复活技能! skillID=%s", skillID)
else:
- if triggerWay in ChConfig.DeadCanTriggerWayList:
- GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,triggerWay=%s", skillID, triggerWay)
+ if byTriggerWay in ChConfig.DeadCanTriggerWayList:
+ GameWorld.DebugLogEx("死亡可触发的方式触发技能可释放! skillID=%s,byTriggerWay=%s", skillID, byTriggerWay)
elif batType == ChConfig.TurnBattleType_Enhance:
GameWorld.DebugLogEx("死亡状态额外技能不限制,主技能能放的话也就能放! skillID=%s", skillID)
else:
@@ -103,10 +104,16 @@
if not tagObjList and isRemove:
return
+ if tagObjList and skillType == ChConfig.Def_SkillType_Revive:
+ for tagObj in tagObjList[::-1]:
+ if tagObj.CheckInState(ChConfig.BatObjState_RebornLimit):
+ GameWorld.DebugLogEx(" 目标被禁止复活不处理! tagID=%s", tagObj.GetID())
+ tagObjList.remove(tagObj)
+
if not tagObjList:
# 可扩展其他目标选择,如复活技能没有死亡单位时则使用另外的效果
GameWorld.DebugLogEx("找不到技能目标! skillID=%s,mapID=%s,funcLineID=%s", skillID, turnFight.mapID, turnFight.funcLineID, turnFight.getReqPlayerID())
- if useSkill.GetSkillType() == ChConfig.Def_SkillType_Revive:
+ if skillType == ChConfig.Def_SkillType_Revive and not isinstance(useSkill, IpyGameDataPY.IPY_Skill):
otherEff = useSkill.GetEffectByID(ChConfig.SkillEff_ReviveNoUse)
if otherEff:
otherSkillID = otherEff.GetEffectValue(0)
@@ -126,12 +133,13 @@
# 子技能怒气溢出值也有效,所以子技能不处理
curXP = curBatObj.GetXP()
- if batType == ChConfig.TurnBattleType_Enhance:
- pass
- elif SkillCommon.isAngerSkill(useSkill):
+ if SkillCommon.isAngerSkill(useSkill):
maxXP = IpyGameDataPY.GetFuncCfg("AngerXP", 2)
angerOverflow = max(curXP - maxXP, 0)
curBatObj.SetAngerOverflow(angerOverflow)
+ GameWorld.DebugLogEx("怒气溢出值: curXP=%s/%s,angerOverflow=%s", curXP, maxXP, angerOverflow)
+ elif batType == ChConfig.TurnBattleType_Enhance:
+ pass
else:
curBatObj.SetAngerOverflow(0)
angerOverflow = curBatObj.GetAngerOverflow()
@@ -150,7 +158,7 @@
useSkill.SetBatType(batType)
useSkill.SetBySkill(bySkill)
useSkill.SetByBuff(byBuff)
- useSkill.SetByTriggerWay(triggerWay)
+ useSkill.SetByTriggerWay(byTriggerWay)
isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
if isTurnNormalSkill:
@@ -179,7 +187,7 @@
else:
__doUseSkill(turnFight, curBatObj, useSkill)
- DoAttackResult(turnFight, curBatObj, useSkill)
+ DoAttackResult(turnFight, curBatObj, useSkill, **kwargs)
if useTag:
Sync_TurnFightTag(turnFight, useTag, 1)
@@ -195,7 +203,7 @@
def CheckSkillUseCntLimit(batObj, useSkill):
## 检查技能使用次数是否受限
- # @return: 是否受限
+ # @return: 是否受限,None-没有受限效果,False-不受限,True-受限了
if not hasattr(useSkill, "GetEffectByID"):
return
effect = useSkill.GetEffectByID(ChConfig.SkillEff_SkillUseCntLimit)
@@ -217,11 +225,12 @@
GameWorld.DebugLogEx("技能每大回合使用次数受限! skillID=%s,turnUseCnt=%s >= %s", skillID, turnUseCnt, turnUseCntLimit)
return True
- return
+ return False
def IsNeedSyncSkill(useSkill):
## 使用需要同步B427使用技能
- if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_Revive, ChConfig.Def_SkillType_CleanBuff]:
+ if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_Revive, ChConfig.Def_SkillType_CleanBuff,
+ ChConfig.Def_SkillType_AtkEx]:
return True
if useSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_TurnNormaSkill, ChConfig.Def_SkillFuncType_AngerSkill]:
return True
@@ -402,6 +411,13 @@
tagBatObj = batObjMgr.getBatObj(tagObjID)
if not __skillTagFilter(curBatObj, tagBatObj, tagAffect, isNoSelf):
continue
+
+ if tagAim == ChConfig.SkillTagAim_Male:
+ if tagBatObj.GetSex() != ChConfig.BatObjSex_Male:
+ continue
+ elif tagAim == ChConfig.SkillTagAim_Female:
+ if tagBatObj.GetSex() != ChConfig.BatObjSex_Female:
+ continue
aimObjList.append(tagBatObj)
# 目标细分
@@ -409,6 +425,11 @@
if tagAffect == ChConfig.SkillTagAffect_HPLowest:
aimObjList.sort(key=lambda o:(o.GetHP()), reverse=False)
#GameWorld.DebugLogEx("血量最低排序: %s", [[o.GetID(), o.GetHP(), o.GetMaxHP()] for o in aimObjList])
+
+ # 血量百分比最低
+ elif tagAffect == ChConfig.SkillTagAffect_HPPerLowest:
+ aimObjList.sort(key=lambda o:(o.GetHP() / float(o.GetMaxHP())), reverse=False)
+ #GameWorld.DebugLogEx("血量百分比最低排序: %s", [[o.GetID(), o.GetHP(), o.GetMaxHP(), o.GetHP() / float(o.GetMaxHP())] for o in aimObjList])
# 血量最高
elif tagAffect == ChConfig.SkillTagAffect_HPHighest:
@@ -442,6 +463,14 @@
for aimObj in aimObjList[::-1]:
if not aimObj.CheckInState(ChConfig.BatObjState_PoisonCure):
aimObjList.remove(aimObj)
+
+ # 仅流血目标
+ elif tagAffect == ChConfig.SkillTagAffect_Bleeding:
+ atkBackTagFrist = False
+ for aimObj in aimObjList[::-1]:
+ if not aimObj.CheckInState(ChConfig.BatObjState_Bleeding):
+ aimObjList.remove(aimObj)
+
else:
# 范围目标超过个数,则随机取
if tagCount and len(aimObjList) > tagCount:
@@ -732,9 +761,13 @@
return
harmPer = harmEff.GetEffectValue(0) # 自残百分比
noEnoughDo = harmEff.GetEffectValue(1) # 不足时扣除方式 0-不扣;1-自杀;2-扣剩1点
+ calcType = harmEff.GetEffectValue(2) # 计算方式:0-按最大血量;1-按当前血量
curHP = curBatObj.GetHP()
maxHP = curBatObj.GetMaxHP()
- harmHP = int(maxHP * harmPer / 100.0)
+ if calcType == 1:
+ harmHP = int(curHP * harmPer / 100.0)
+ else:
+ harmHP = int(maxHP * harmPer / 100.0)
lostHP = harmHP
if curHP <= harmHP:
if noEnoughDo == 0:
@@ -744,8 +777,8 @@
updHP = max(curHP - lostHP, 0)
curBatObj.SetHP(updHP, False)
- GameWorld.DebugLogEx("使用技能时自残: curHP=%s/%s,harmPer=%s,harmHP=%s,lostHP=%s,updHP=%s,noEnoughDo=%s",
- curHP, maxHP, harmPer, harmHP, lostHP, updHP, noEnoughDo)
+ GameWorld.DebugLogEx("使用技能时自残: curHP=%s/%s,harmPer=%s,harmHP=%s,lostHP=%s,updHP=%s,noEnoughDo=%s,calcType=%s",
+ curHP, maxHP, harmPer, harmHP, lostHP, updHP, noEnoughDo, calcType)
curBatObj.SetHarmSelfHP(harmHP) # 无视实际扣血量,直接更新
@@ -772,22 +805,24 @@
addPer = addPerMax
GameWorld.DebugLogEx("司马懿特殊潜能技能额外增加比例: frozenCnt=%s,addPer=%s" % (frozenCnt, addPer))
+ addBatDamPer = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddBatDamPerByLayer, useSkill)
+
# 计算伤害
calcHurtResults = []
for tagBatObj in useSkill.GetTagObjList():
- hurtValue, hurtTypes, immuneHurt = __calcSkillHurt(turnFight, curBatObj, tagBatObj, useSkill, addPer)
+ hurtValue, hurtTypes, immuneHurt = __calcSkillHurt(turnFight, curBatObj, tagBatObj, useSkill, addPer, addBatDamPer)
calcHurtResults.append([tagBatObj, hurtValue, hurtTypes, immuneHurt])
DoSkillHurtHP(turnFight, curBatObj, useSkill, calcHurtResults)
return
-def __calcSkillHurt(turnFight, atkObj, defObj, curSkill, addPer=0):
+def __calcSkillHurt(turnFight, atkObj, defObj, curSkill, addPer=0, addBatDamPer=0):
## 计算技能伤害,只计算值,不做实际处理
# @param addPer: 外部指定增加的比例
# @return: hurtValue, hurtTypes, immuneHurt
atkSkillPer = curSkill.GetSkillPer() + addPer
atkSkillValue = curSkill.GetSkillValue()
- hurtValue, hurtTypes = CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer)
+ hurtValue, hurtTypes = CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, addBatDamPer)
hurtValue, hurtTypes, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, hurtValue, hurtTypes)
return hurtValue, hurtTypes, immuneHurt
@@ -802,7 +837,7 @@
tagID = tagObj.GetID()
if tagID == ChConfig.HeroID_Caoren:
continue
- if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
+ if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
continue
if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
caorenProtectObj = tagObj
@@ -880,7 +915,7 @@
continue
if tagID == ChConfig.HeroID_Caoren:
continue
- if tagObj.CheckInState(ChConfig.BatObjState_Wudi):
+ if tagObj.CheckInState(ChConfig.ImmuneHurtStateList):
continue
if not caorenProtectObj or tagObj.GetHP() < caorenProtectObj.GetHP():
caorenProtectObj = tagObj
@@ -1106,7 +1141,7 @@
else:
diffType = 1
tagXP = tagBatObj.GetXP()
- diffValue = GetEnhanceXP(tagBatObj, calcValue)
+ diffValue = GetEnhanceXP(tagBatObj, calcValue, useSkill)
updValue = tagXP + diffValue
tagBatObj.SetXP(updValue, False)
GameWorld.DebugLogEx(" 加怒气: tagID=%s,diffValue=%s,tagXP=%s,updXP=%s", tagID, diffValue, tagXP, updValue)
@@ -1123,7 +1158,7 @@
return
-def DoAttackResult(turnFight, curBatObj, useSkill):
+def DoAttackResult(turnFight, curBatObj, useSkill, **kwargs):
'''执行攻击结果
@param curBatObj: 施法方或buff归属方
'''
@@ -1140,13 +1175,21 @@
if useSkill.GetCoolDownTime():
useSkill.SetRemainTime(useSkill.GetCoolDownTime())
+ if "byEffSkill" in kwargs:
+ byEffSkill = kwargs["byEffSkill"]
+ cdTime = byEffSkill.GetCoolDownTime()
+ if cdTime:
+ if hasattr(byEffSkill, "GetRemainTime"):
+ byEffSkill.SetRemainTime(cdTime)
+ GameWorld.DebugLogEx("提前设置效果技能触发后CD,防止嵌套循环触发! effSkillID=%s,cdTime=%s", byEffSkill.GetSkillID(), cdTime)
+
__doCostZhanchui(turnFight, curBatObj, useSkill) # 先扣除再同步技能
# 需先技能使用 - 前端按顺序优先表现技能释放内容,前端需要动作或有伤血则通知
if IsNeedSyncSkill(useSkill):
Sync_UseSkill(turnFight, curBatObj, useSkill)
- __doSkillUserAnger(turnFight, curBatObj, useSkill)
+ __doSkillUserAnger(turnFight, curBatObj, useSkill, **kwargs)
DoBeAttackResult(turnFight, curBatObj, useSkill)
return
@@ -1273,13 +1316,14 @@
return useSkill
return
-def DoBeAttackResult(turnFight, curObj, useSkill, curBuff=None):
+def DoBeAttackResult(turnFight, curObj, useSkill, timeBuff=None):
'''被攻击结果
@param curObj: 施法方或buff归属方
+ @param timeBuff: 持续结算的buff,如持续攻击、持续治疗等
'''
- #curID = curObj.GetID()
- isUseSkill = False if curBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
+ curID = curObj.GetID()
+ isUseSkill = False if timeBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
isAngerSkill = SkillCommon.isAngerSkill(useSkill)
@@ -1309,34 +1353,43 @@
# 统计击杀
killObjList = [] # 击杀其他阵营目标列表
dieObjList = [] # 死亡的单位列表,包含友方单位或自己
+ nodeadObjList = [] # 不死的单位列表
tagObjList = useSkill.GetTagObjList() # 主要目标列表
tagObjListEx = useSkill.GetTagObjListEx() # 额外目标列表
tagObjListAll = tagObjList + tagObjListEx
for tagObj in tagObjListAll:
tagID = tagObj.GetID()
if tagObj.IsAlive() and tagObj.GetHP() <= 0:
- dieObjList.append(tagObj)
- if tagObj.GetFaction() != curObj.GetFaction():
- killObjList.append(tagObj)
- TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
+ if tagObj.CanNoDead():
+ tagObj.SetHP(1, True) # 触发不死,保留1点血量
+ nodeadObjList.append(tagObj)
+ else:
+ dieObjList.append(tagObj)
+ if tagObj.GetFaction() != curObj.GetFaction():
+ killObjList.append(tagObj)
+ TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
useSkill.SetKillObjList(killObjList)
- # 判断自己,因为反弹、平摊伤害的原因,有可能自己干死自己
- if curObj.IsAlive() and curObj.GetHP() <= 0:
- dieObjList.append(curObj)
- TurnAttack.SetObjKilled(turnFight, curObj)
-
+
# 统计伤血,可能单个技能对同一目标造成多次伤害
totalHurtValue = 0
- isSuckHP = False
+ suckObjIDList = [] # 吸血的对象ID列表
missObjIDList, immuneObjIDList = [], [] # 闪避、免疫对象ID列表
stunObjIDList, superHitObjIDList, parryObjIDList = [], [], []
beHurtObjIDList = [] # 受伤的对象ID列表
reviveObjList = [] # 复活的对象列表
+ bounceObjList = [] # 有反弹的对象列表
+ caorenProtectList = [] # 有被曹仁防护的对象列表
for hurtObj in useSkill.GetHurtObjListAll():
hurtObjID = hurtObj.GetObjID()
tagObj = batObjMgr.getBatObj(hurtObjID)
if not tagObj:
continue
+
+ bounceHP = hurtObj.GetBounceHP()
+ if bounceHP:
+ if tagObj not in bounceObjList:
+ bounceObjList.append(tagObj)
+
if hurtObj.HaveHurtType(ChConfig.HurtAtkType_Hurt) and not hurtObj.HaveHurtType(ChConfig.HurtAtkType_Immune) \
and (isTurnNormalSkill or isAngerSkill) and tagObj.IsAlive():
__doSkillHurtAnger(tagObj, hurtObj.GetLostHP(), useSkill)
@@ -1373,9 +1426,24 @@
if hurtObjID not in stunObjIDList:
stunObjIDList.append(hurtObjID)
- if hurtObj.GetSuckHP() > 0:
- isSuckHP = True
-
+ if hurtObj.HaveHurtType(ChConfig.HurtAtkType_CaorenProtect):
+ if tagObj not in caorenProtectList:
+ caorenProtectList.append(tagObj)
+
+ if hurtObj.GetSuckHP() > 0 and not hurtObj.HaveHurtType(ChConfig.HurtAtkType_PoisonCureSuck):
+ if hurtObjID not in suckObjIDList:
+ suckObjIDList.append(hurtObjID)
+
+ # 判断自己死亡,因为反弹、平摊伤害的原因,有可能自己干死自己
+ if curObj.IsAlive() and curObj.GetHP() <= 0:
+ if curObj.CanNoDead():
+ curObj.SetHP(1, True) # 触发不死,保留1点血量
+ nodeadObjList.append(curObj)
+ else:
+ dieObjList.append(curObj)
+ killer = bounceObjList[0] if bounceObjList else None
+ TurnAttack.SetObjKilled(turnFight, curObj, killer)
+
# 记录最后一次总伤害,有伤害目标才记录
if totalHurtValue:
curObj.SetLastHurtValue(totalHurtValue)
@@ -1385,7 +1453,7 @@
DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuperHit, relatedSkillID)
if stunObjIDList:
DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_Stun, relatedSkillID)
- if isSuckHP:
+ if suckObjIDList:
DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuckHP, relatedSkillID)
# 结算副本相关的攻击结果,仅主动发起玩家阵容武将触发
@@ -1431,11 +1499,15 @@
for dieObj in dieObjList:
# 敌方单位死亡时
if lineupObj.GetFaction() != dieObj.GetFaction():
- TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill, byKiller=curObj)
# 己方单位死亡时
else:
- TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill)
-
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill, byFriendObj=dieObj)
+
+ # 触发不死
+ for tagObj in nodeadObjList:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_NoDead, curObj, connSkill=useSkill)
+
# 复活时
for tagObj in reviveObjList:
# 同步最新的怒气及buff,血量已经在技能中通知了
@@ -1444,9 +1516,24 @@
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Revive, curObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_InBattlefield, curObj, connSkill=useSkill)
+ # 曹仁防护触发,暂写死
+ for tagObj in caorenProtectList:
+ tagBatLineup = tagObj.GetBatLineup()
+ caorenObj = tagBatLineup.getHeroObj(ChConfig.HeroID_Caoren) # 获取被防护目标阵容的曹仁
+ if not caorenObj or not caorenObj.IsAlive():
+ continue
+ caoRenSkill = caorenObj.GetSkillManager().FindSkillByID(ChConfig.SkillID_CaorenProtect)
+ if not caoRenSkill:
+ continue
+ passiveSkillID = caoRenSkill.GetEffect(0).GetEffectValue(0) # 防护成功后的触发技能ID,默认写在效果1的值
+ GameWorld.DebugLogEx("曹仁防护后触发技能: caorenID=%s,protectID=%s,passiveSkillID=%s", caorenObj.GetID(), tagObj.GetID(), passiveSkillID)
+ if passiveSkillID:
+ OnUsePassiveSkill(turnFight, caorenObj, curObj, passiveSkillID, connSkill=useSkill)
+
triggerOne = False
batType = useSkill.GetBatType()
isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
+ curBatLineup = None
for tagObj in tagObjListAll:
tagID = tagObj.GetID()
@@ -1454,6 +1541,10 @@
if tagID in missObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeMiss, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Miss, curObj, connSkill=useSkill)
+
+ # 免疫
+ if tagID in immuneObjIDList:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_ImmuneHurt, curObj, connSkill=useSkill)
if tagID in effIgnoreObjIDList:
continue
@@ -1463,6 +1554,7 @@
# 掉血时
if tagID in beHurtObjIDList:
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeHurt, curObj, connSkill=useSkill)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_HurtTag, tagObj, connSkill=useSkill)
# 受到任意效果时(除直接攻击外的任意效果,如buff、dot、治疗、额外怒技)
if not isAttackDirect:
@@ -1472,6 +1564,7 @@
if isExObj:
continue
+ isDotHurt = False
# 直接攻击
if isAttackDirect:
if not triggerOne:
@@ -1482,7 +1575,9 @@
elif not isAttackDirect:
# 受到持续伤害
if tagID in beHurtObjIDList:
- TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeDOTHurt, curObj, connSkill=useSkill)
+ isDotHurt = True
+ TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_DOTHurt, tagObj, connSkill=useSkill, connBuff=timeBuff)
+ TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeDOTHurt, curObj, connSkill=useSkill, connBuff=timeBuff)
# 使用技能后
if isUseSkill:
@@ -1505,6 +1600,12 @@
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_BeParry, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_Parry, curObj, connSkill=useSkill)
+ # 吸血
+ 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 batType == ChConfig.TurnBattleType_Combo:
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_Combo, tagObj, connSkill=useSkill)
@@ -1518,6 +1619,35 @@
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_AtkBack, tagObj, connSkill=useSkill)
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAtkBack, curObj, connSkill=useSkill)
+
+ # 敌友方
+ 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():
+ lineupObj = batObjMgr.getBatObj(lineupObjID)
+ if not lineupObj.IsAlive():
+ continue
+
+ # 直接攻击
+ if isAttackDirect:
+ if not triggerOne:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOne, tagObj, connSkill=useSkill, byFriendObj=curObj)
+ if curID != lineupObj.GetID():
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendAttackOverDirectOneNoSelf, tagObj, connSkill=useSkill, byFriendObj=curObj)
+ # 持续伤害
+ elif isDotHurt:
+ if not triggerOne:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDotHurt, tagObj, connSkill=useSkill, byFriendObj=curObj)
+
+ # 连击
+ if batType == ChConfig.TurnBattleType_Combo:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendCombo, tagObj, connSkill=useSkill, byFriendObj=curObj)
+
+ # 追击
+ elif batType == ChConfig.TurnBattleType_Pursue:
+ TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendPursue, tagObj, connSkill=useSkill, byFriendObj=curObj)
+
triggerOne = True # 设置已经触发过一次
# 验证是否结算,最后处理
@@ -1590,10 +1720,14 @@
return
-def __doSkillUserAnger(turnFight, curBatObj, useSkill):
+def __doSkillUserAnger(turnFight, curBatObj, useSkill, **kwargs):
## 技能释放者怒气相关
if SkillCommon.isAngerSkill(useSkill):
- curBatObj.SetXP(0)
+ if "noUseXP" in kwargs:
+ kwargs.pop("noUseXP")
+ GameWorld.DebugLogEx("本次不消耗怒气")
+ else:
+ curBatObj.SetXP(0)
elif SkillCommon.isTurnNormalSkill(useSkill) and useSkill.GetBatType() == ChConfig.TurnBattleType_Normal:
addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 3)
AddFightXP(curBatObj, addXP, "skillID:%s" % useSkill.GetSkillID())
@@ -1643,11 +1777,14 @@
Sync_PropertyRefreshView(turnFight, gameObj, ChConfig.AttrID_XP, updXP, addXP, diffType=1, relatedSkillID=relatedSkillID)
return
-def GetEnhanceXP(gameObj, addXP):
+def GetEnhanceXP(gameObj, addXP, useSkill=None):
## 获取提升后的xp值
addPer = gameObj.GetBatAttrValue(ChConfig.AttrID_XPRecoverPer)
# 其他强化、弱化
if addPer == 0:
+ return addXP
+ if useSkill and useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_PotentialSkill and useSkill.GetSkillValue() == 50:
+ GameWorld.DebugLogEx("潜能初始50点暂时写死不受限: objID=%s,addXP=%s,skillID=%s", gameObj.GetID(), addXP, useSkill.GetSkillID())
return addXP
objID = gameObj.GetID()
updAddXP = int(addXP * max(10000 + addPer, 0) / 10000.0)
@@ -1718,8 +1855,11 @@
for tagObj in tagObjList:
tagID = tagObj.GetID()
if not tagObj.IsAlive():
- GameWorld.DebugLogEx(" 已被击杀不触发: tagID=%s", tagID)
- continue
+ if enhanceSkillData.GetCurBuffState() == ChConfig.BatObjState_RebornLimit:
+ GameWorld.DebugLogEx(" 禁止复活buff允许对死亡对象释放: tagID=%s", tagID)
+ else:
+ GameWorld.DebugLogEx(" 已被击杀不触发: tagID=%s", tagID)
+ continue
if tagID in effIgnoreObjIDList:
GameWorld.DebugLogEx(" 闪避或免疫的不触发: tagID=%s", tagID)
continue
@@ -1770,7 +1910,7 @@
OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
return
-def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, **kwargs):
+def OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0, connBuff=None, batType=ChConfig.TurnBattleType_Passive, **kwargs):
'''被动触发使用技能
@param passiveSkill: 释放的被动技能 或 技能ID
@param connSkill: 由什么技能引起的
@@ -1820,19 +1960,27 @@
GameWorld.DebugLogEx(" 概率不触发: tagID=%s,happenRate=%s", tagID, happenRate)
return
passiveTagObjList = [tagObj]
- isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+ isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
elif tagAim == ChConfig.SkillTagAim_MainSkillEx:
if not connSkill:
return
passiveTagObjList = connSkill.GetTagObjList()
- isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+ isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
+ elif tagAim == ChConfig.SkillTagAim_MainSkillFriend:
+ if "byFriendObj" not in kwargs:
+ return
+ byFriendObj = kwargs.pop("byFriendObj") # 触发即移除,防止一直传递引发其他问题,如触发的技能再触发其他技能会被视为也是有byFriendObj
+ passiveTagObjList = [byFriendObj]
+ GameWorld.DebugLogEx("被动触发技能,针对来源友军! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s,byFriendID=%s",
+ effSkillID, effectID, passiveSkillID, bySkillID, byFriendObj.GetID())
+ isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
else:
GameWorld.DebugLogEx("被动触发技能,重新锁定目标! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
- isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
+ isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
return isOK
-def CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, **kwargs):
+def CalcFormatHurt(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, addBatDamPer=0, **kwargs):
'''按公式计算伤害,默认按攻击计算
'''
@@ -1942,11 +2090,17 @@
aDOTPer = atkObj.GetBatAttrValue(ChConfig.AttrID_DOTPer)
dDOTPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_DOTPerDef)
GameWorld.DebugLogEx("aDOTPer=%s,dDOTPerDef=%s", aDOTPer, dDOTPerDef)
-
+ if curSkill.GetCurBuffState() in ChConfig.BurnStateList:
+ aDOTPer += atkObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPer)
+ dDOTPerDef += defObj.GetBatAttrValue(ChConfig.AttrID_DOTBurnPerDef)
+ GameWorld.DebugLogEx("是灼烧: aDOTPer=%s,dDOTPerDef=%s", aDOTPer, dDOTPerDef)
+
#aAddSkillPer = 0 # 技能增伤
- aBatDamPer, dBatDamPerDef = 0, 0 # 战斗增减伤
+ dBatDamPerDef = 0 # 战斗增减伤
+ aBatDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_BatDamPer)
aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddBatDamPerByTagLostHP, curSkill)
+ aBatDamPer += addBatDamPer
# 物法增减伤
if pmType == IPY_GameWorld.ghtMag: # 法伤
@@ -2045,6 +2199,7 @@
hurtAtkPerMax = curSkill.GetHurtAtkPerMax() # 最大万分比,限制最终伤害不超过攻击力万分率
if hurtAtkPerMax:
+ hurtAtkPerMax += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddHurtAtkPerMax, curSkill)
aAtk = atkObj.GetAtk()
hurtValueMax = aAtk * hurtAtkPerMax / 10000.0
hurtValue = min(hurtValue, hurtValueMax)
@@ -2134,7 +2289,7 @@
return hurtValue, hurtTypes, immuneHurt
hurtValue = int(hurtValue)
- if defObj.CheckInState(ChConfig.BatObjState_Wudi):
+ if defObj.CheckInState(ChConfig.ImmuneHurtStateList):
hurtTypes |= pow(2, ChConfig.HurtAtkType_Immune) # 添加免疫
immuneHurt = hurtValue
hurtValue = 0
@@ -2164,7 +2319,7 @@
defObj, hurtValue, hurtTypes, immuneHurt = hurtInfo[:4]
isEx = hurtInfo[4] if len(hurtInfo) > 4 else 0 # 是否是额外目标
- lostHP, ignoreShield = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
+ lostHP, ignoreShield, hurtValue = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
if ignoreShield:
hurtTypes |= pow(2, ChConfig.HurtAtkType_IgnoreShield)
@@ -2305,7 +2460,7 @@
# 曹仁的分担触发条件暂时程序内固定,有修改时程序同步修改
# 曹仁: 我方英雄受到直接攻击时(受到群攻时选择血量最低的友方进行防护),曹仁有30%概率为其分担一半所受伤害,每成功分担一次,曹仁获得1层坚韧,使我方全体减伤提升5%,最多6层,曹仁死亡效果消失
# 董白怒气 同命锁 对敌方攻击最高的1个目标造成攻击力450%物理伤害,并与其连接,使两人受到的任意伤害平摊(平摊伤害不会被再次平摊),持续2回合
- caorenSkillID = 1015070
+ caorenSkillID = ChConfig.SkillID_CaorenProtect
effHeroIDList = [ChConfig.HeroID_Zhenfu, ChConfig.HeroID_Caoren, ChConfig.HeroID_Dongbai] # 暂固定,有增加武将再同步修改
isAve = False
@@ -2418,7 +2573,7 @@
immuneHurt = immuneHurtDict.get(aveObjID)
if immuneHurt == None:
- if aveObj.CheckInState(ChConfig.BatObjState_Wudi):
+ if aveObj.CheckInState(ChConfig.ImmuneHurtStateList):
immuneHurt = 0
else:
immuneHurt = -1 # 标记没有无敌
@@ -2454,7 +2609,7 @@
@param hpCanNegative: 扣除后的生命是否允许负值
@param immuneHurt: 免疫的伤害值
@param isSkillSelfTag: 是否技能自身的直接目标,如平摊伤害目标、溅射伤害目标这种就不算直接目标
- @return: lostHP, ignoreShield
+ @return: lostHP, ignoreShield, hurtValue
'''
ignoreShield = None
@@ -2472,8 +2627,14 @@
defObj.GetID(), buff.GetBuffID(), buffSkillID, buffValue, immuneHurt, updBuffValue, lostType)
if hurtValue <= 0:
- return 0, ignoreShield
+ return 0, ignoreShield, hurtValue
+ # 伤血上限保护
+ lostHPProtect = TurnPassive.GetTriggerEffectValue(turnFight, defObj, atkObj, ChConfig.PassiveEff_LostHPProtect, curSkill)
+ if lostHPProtect > 0 and hurtValue > lostHPProtect:
+ GameWorld.DebugLogEx(" 扣血时最大伤血保护: defID=%s,hurtValue=%s,lostHPProtect=%s", defObj.GetID(), hurtValue, lostHPProtect)
+ hurtValue = lostHPProtect
+
atkID = atkObj.GetID()
defID = defObj.GetID()
skillID = curSkill.GetSkillID()
@@ -2539,7 +2700,7 @@
GameWorld.DebugLogEx(" 扣血: atkID=%s,defID=%s,hurtValue=%s,lostType=%s,lostHP=%s,dHP=%s,updHP=%s/%s",
atkID, defID, hurtValue, lostType, lostHP, dHP, defObj.GetHP(), defObj.GetMaxHP())
TurnAttack.AddTurnObjHurtValue(atkObj, defObj, hurtValue, lostHP, skillID, lostType)
- return lostHP, ignoreShield
+ return lostHP, ignoreShield, hurtValue
def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
'''计算反弹反弹伤害
@@ -2561,12 +2722,12 @@
return
GameWorld.DebugLogEx(" 反弹伤害=%s,%s/%s, damBackPer=%s", bounceHP, atkObj.GetHP(), atkObj.GetMaxHP(), damBackPer)
- bounceHP, _, immuneHurt = CalcHurtWithBuff(turnFight, atkObj, defObj, bounceHP)
+ bounceHP, _, immuneHurt = CalcHurtWithBuff(turnFight, defObj, atkObj, bounceHP)
if bounceHP <= 0:
GameWorld.DebugLogEx(" bounceHP=%s", bounceHP)
return
hurtObj.SetBounceHP(bounceHP)
- DoLostHP(turnFight, atkObj, defObj, bounceHP, curSkill, "Bounce", hpCanNegative=True, immuneHurt=immuneHurt) # 反弹后生命允许负值
+ DoLostHP(turnFight, defObj, atkObj, bounceHP, curSkill, "Bounce", hpCanNegative=True, immuneHurt=immuneHurt) # 反弹后生命允许负值
return
def CalcSuckBlood(turnFight, atkObj, defObj, hurtObj, curSkill):
@@ -2664,6 +2825,9 @@
cureHP += cureHPEx
GameWorld.DebugLogEx(" 额外治疗值(%s): cureType=%s,baseValue=%s,skillPer=%s,cureHP=%s", cureHPEx, cureType, baseValue, skillPer, cureHP)
+ addCureMulti = TurnPassive.GetTriggerEffectValue(turnFight, userObj, tagObj, ChConfig.PassiveEff_AddCureMultiBySkillType, curSkill)
+ if addCureMulti:
+ multiValue += addCureMulti / 100.0
if multiValue and multiValue != 1:
cureHP = int(cureHP * multiValue)
GameWorld.DebugLogEx(" 治疗倍值: cureHP=%s,multiValue=%s", cureHP, multiValue)
--
Gitblit v1.8.0