| | |
| | | GameWorld.DebugLogEx("技能使用处于buff状态限制中! skillID=%s,buffStateGroups=%s,limitState=%s", skillID, buffStateGroups, limitState)
|
| | | return
|
| | |
|
| | | if CheckSkillUseCntLimit(curBatObj, useSkill):
|
| | | if CheckSkillUseCntLimit(turnFight, curBatObj, useSkill):
|
| | | return
|
| | |
|
| | | #没有指定目标,则按技能自身的目标逻辑
|
| | |
| | | if SkillCommon.IsBuff(useSkill):
|
| | | __doAddBuff(turnFight, curBatObj, useSkill, **kwargs)
|
| | | else:
|
| | | __doUseSkill(turnFight, curBatObj, useSkill)
|
| | | __doUseSkill(turnFight, curBatObj, useSkill, **kwargs)
|
| | |
|
| | | DoAttackResult(turnFight, curBatObj, useSkill, **kwargs)
|
| | |
|
| | |
| | | useSkill.ResetUseRec()
|
| | | return True
|
| | |
|
| | | def CheckSkillUseCntLimit(batObj, useSkill):
|
| | | def CheckSkillUseCntLimit(turnFight, batObj, useSkill):
|
| | | ## 检查技能使用次数是否受限
|
| | | # @return: 是否受限,None-没有受限效果,False-不受限,True-受限了
|
| | | if not hasattr(useSkill, "GetEffectByID"):
|
| | |
| | |
|
| | | skillID = useSkill.GetSkillID()
|
| | | if useCntLimit:
|
| | | useCntLimit += TurnPassive.GetTriggerEffectValue(turnFight, batObj, None, ChConfig.PassiveEff_AddSkillUseCntLimit, useSkill, LimitByTurnAll=1)
|
| | | useCnt = batObj.GetSkillUseCnt(skillID)
|
| | | if useCnt >= useCntLimit:
|
| | | GameWorld.DebugLogEx("技能每场战斗使用次数受限! skillID=%s,useCnt=%s >= %s", skillID, useCnt, useCntLimit)
|
| | | return True
|
| | |
|
| | | if turnUseCntLimit:
|
| | | turnUseCntLimit += TurnPassive.GetTriggerEffectValue(turnFight, batObj, None, ChConfig.PassiveEff_AddSkillUseCntLimit, useSkill, LimitByTurnPer=1)
|
| | | turnUseCnt = batObj.GetSkillTurnUseCnt(skillID)
|
| | | if turnUseCnt >= turnUseCntLimit:
|
| | | GameWorld.DebugLogEx("技能每大回合使用次数受限! skillID=%s,turnUseCnt=%s >= %s", skillID, turnUseCnt, turnUseCntLimit)
|
| | |
| | | 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:
|
| | | aimObjList.sort(key=lambda o:(o.GetHP()), reverse=True)
|
| | |
| | |
|
| | | return aimObjList
|
| | |
|
| | | def __getSameRowObjList(tagObj):
|
| | | ## 获取目标对应的同排对象列表,只算活着的
|
| | | |
| | | posNum = tagObj.GetPosNum()
|
| | | inRowNum = ChConfig.GetInRowNum(posNum)
|
| | | inColNum = ChConfig.GetInColNum(posNum)
|
| | | # 优先目标所在纵,为主目标
|
| | | colNumList = range(1, 1 + ChConfig.TurnFightCols)
|
| | | if inColNum in colNumList:
|
| | | colNumList.remove(inColNum)
|
| | | colNumList.insert(0, inColNum)
|
| | | |
| | | row = inRowNum # 目标玩家所在横排
|
| | | |
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | batLineup = tagObj.GetBatLineup()
|
| | | aimObjList = []
|
| | | for col in colNumList:
|
| | | pNum = (row - 1) * ChConfig.TurnFightCols + col
|
| | | if pNum not in batLineup.posObjIDDict:
|
| | | continue
|
| | | tagObjID = batLineup.posObjIDDict[pNum]
|
| | | tagBatObj = batObjMgr.getBatObj(tagObjID)
|
| | | if not tagBatObj.IsAlive():
|
| | | continue
|
| | | aimObjList.append(tagBatObj)
|
| | | |
| | | return aimObjList
|
| | |
|
| | | def __getSameColObjList(tagObj):
|
| | | ## 获取目标对应的同列对象列表,只算活着的
|
| | | |
| | | posNum = tagObj.GetPosNum()
|
| | | inRowNum = ChConfig.GetInRowNum(posNum)
|
| | | inColNum = ChConfig.GetInColNum(posNum)
|
| | | |
| | | rowNumList = range(1, 1 + ChConfig.TurnFightRows)
|
| | | if inRowNum in rowNumList:
|
| | | rowNumList.remove(inRowNum)
|
| | | rowNumList.insert(0, inRowNum)
|
| | | |
| | | col = inColNum # 目标玩家所在纵排
|
| | | |
| | | batObjMgr = BattleObj.GetBatObjMgr()
|
| | | batLineup = tagObj.GetBatLineup()
|
| | | aimObjList = []
|
| | | for row in range(1, 1 + ChConfig.TurnFightRows):
|
| | | pNum = (row - 1) * ChConfig.TurnFightCols + col
|
| | | if pNum not in batLineup.posObjIDDict:
|
| | | continue
|
| | | tagObjID = batLineup.posObjIDDict[pNum]
|
| | | tagBatObj = batObjMgr.getBatObj(tagObjID)
|
| | | if not tagBatObj.IsAlive():
|
| | | continue
|
| | | aimObjList.append(tagBatObj)
|
| | | |
| | | return aimObjList
|
| | |
|
| | | def GetRelativeObj(turnFight, curBatObj):
|
| | | '''获取对位目标,仅用于非技能目标的对位逻辑,如连击、弱疗等相对属性的判断,技能目标统一使用 GetSkillTags
|
| | | '''
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def __doUseSkill(turnFight, curBatObj, useSkill):
|
| | | def __doUseSkill(turnFight, curBatObj, useSkill, **kwargs):
|
| | |
|
| | | atkType = useSkill.GetAtkType()
|
| | | GameWorld.DebugLogEx("__doUseSkill: curID=%s,skillID=%s,atkType=%s", curBatObj.GetID(), useSkill.GetSkillID(), atkType)
|
| | |
| | |
|
| | | # 通用攻击
|
| | | if atkType == 1:
|
| | | SkillModule_1(turnFight, curBatObj, useSkill)
|
| | | SkillModule_1(turnFight, curBatObj, useSkill, **kwargs)
|
| | | # 治疗
|
| | | if atkType == 2:
|
| | | SkillModule_2(turnFight, curBatObj, useSkill)
|
| | |
| | | Sync_PropertyRefreshView(turnFight, curBatObj, ChConfig.AttrID_HP, updHP, diffValue, diffType, skillID, relatedSkillID, hurtTypes)
|
| | | return
|
| | |
|
| | | def SkillModule_1(turnFight, curBatObj, useSkill):
|
| | | def SkillModule_1(turnFight, curBatObj, useSkill, **kwargs):
|
| | | ## 通用攻击,单攻、群攻
|
| | |
|
| | | addPer = 0
|
| | |
| | | addPer = addPerMax
|
| | | GameWorld.DebugLogEx("司马懿特殊潜能技能额外增加比例: frozenCnt=%s,addPer=%s" % (frozenCnt, addPer))
|
| | |
|
| | | addBatDamPer = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddBatDamPerByLayer, useSkill)
|
| | | addBatDamPer = 0
|
| | | if "addBatDamPer" in kwargs:
|
| | | addBatDamPer += kwargs.pop("addBatDamPer", 0)
|
| | | addBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddBatDamPerByLayer, useSkill)
|
| | |
|
| | | # 计算伤害
|
| | | calcHurtResults = []
|
| | |
| | | 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
|
| | |
| | | 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
|
| | |
| | | # 统计击杀
|
| | | 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)
|
| | |
|
| | | # 统计伤血,可能单个技能对同一目标造成多次伤害
|
| | | 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 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:
|
| | | dieObjList.append(curObj)
|
| | | killer = bounceObjList[0] if bounceObjList else None
|
| | | TurnAttack.SetObjKilled(turnFight, curObj, killer)
|
| | | 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:
|
| | |
| | | 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)
|
| | |
|
| | | # 结算副本相关的攻击结果,仅主动发起玩家阵容武将触发
|
| | |
| | | # 己方单位死亡时
|
| | | else:
|
| | | 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,血量已经在技能中通知了
|
| | |
| | | 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)) # 是否直接攻击
|
| | |
| | | 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
|
| | |
|
| | |
| | | # 掉血时
|
| | | if tagID in beHurtObjIDList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeHurt, curObj, connSkill=useSkill)
|
| | | #TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_HurtTag, tagObj, connSkill=useSkill) 暂时用不到先屏蔽
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_HurtTag, tagObj, connSkill=useSkill)
|
| | |
|
| | | # 受到任意效果时(除直接攻击外的任意效果,如buff、dot、治疗、额外怒技)
|
| | | if not isAttackDirect:
|
| | |
| | | if tagID in parryObjIDList:
|
| | | 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:
|
| | |
| | | GameWorld.DebugLogEx("有击杀目标时该技能无效! enhanceSkillID=%s", enhanceSkillID)
|
| | | return
|
| | |
|
| | | if checkHeroSex:
|
| | | if TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_IgnoreSex, connSkillTypeID=enhanceSkillData.GetSkillTypeID(), connSkillID=enhanceSkillID):
|
| | | checkHeroSex = 0
|
| | | |
| | | # 继承主技能目标
|
| | | if enhanceSkillData.GetTagAim() == ChConfig.SkillTagAim_MainSkill:
|
| | | GameWorld.DebugLogEx("继承主技能目标! enhanceSkillID=%s", enhanceSkillID)
|
| | |
| | | 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: 由什么技能引起的
|
| | |
| | | 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
|
| | |
| | | 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=ChConfig.TurnBattleType_Passive, bySkill=connSkill, byBuff=connBuff, **kwargs)
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
|
| | | # 继承主技能目标同横排 11
|
| | | elif tagAim == ChConfig.SkillTagAim_MainSkillRow:
|
| | | if not tagObj:
|
| | | return
|
| | | GameWorld.DebugLogEx("被动触发技能,针对目标同排对象! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
|
| | | passiveTagObjList = __getSameRowObjList(tagObj)
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=batType, bySkill=connSkill, byBuff=connBuff, **kwargs)
|
| | | # 继承主技能目标同纵排 12
|
| | | elif tagAim == ChConfig.SkillTagAim_MainSkillCol:
|
| | | if not tagObj:
|
| | | return
|
| | | GameWorld.DebugLogEx("被动触发技能,针对目标同纵对象! effSkillID=%s,effectID=%s,passiveSkillID=%s,bySkillID=%s", effSkillID, effectID, passiveSkillID, bySkillID)
|
| | | passiveTagObjList = __getSameColObjList(tagObj)
|
| | | 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
|
| | |
|
| | |
| | | GameWorld.DebugLogEx(" 伤害最高限制: hurtValue=%s,hurtAtkPerMax=%s,aAtk=%s", hurtValue, hurtAtkPerMax, aAtk)
|
| | |
|
| | | # 均摊
|
| | | hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
|
| | | if hurtShareEff:
|
| | | if HaveShareEff(atkObj, curSkill):
|
| | | tagCnt = max(1, len(curSkill.GetTagObjList()))
|
| | | hurtValue = hurtValue / tagCnt
|
| | | GameWorld.DebugLogEx(" 目标均摊伤害: hurtValue=%s,tagCnt=%s", hurtValue, tagCnt)
|
| | |
|
| | | hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
|
| | | return hurtValue, hurtTypes
|
| | |
|
| | | def HaveShareEff(atkObj, curSkill):
|
| | | ## 玩家技能是否有分摊效果: 均摊伤害/治疗/承伤盾值
|
| | | hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
|
| | | if not hurtShareEff:
|
| | | return False
|
| | | needLearnSkillID = hurtShareEff.GetEffectValue(0)
|
| | | if needLearnSkillID:
|
| | | if not atkObj.GetSkillManager().FindSkillByID(needLearnSkillID):
|
| | | GameWorld.DebugLogEx("所需技能未学习,分摊效果不生效! skillID=%s,needLearnSkillID=%s", curSkill.GetSkillID(), needLearnSkillID)
|
| | | return False
|
| | | return True
|
| | |
|
| | | def GetAddSkillPer(turnFight, atkObj, defObj, curSkill):
|
| | | ## 获取额外增加的技能万分比
|
| | |
| | |
|
| | | def CanSuperHit(turnFight, atkObj, defObj, curSkill):
|
| | | if TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_MustSuperHit, curSkill):
|
| | | GameWorld.DebugLogEx("目标血量低于百分x时必定暴击: defID=%s,hp:%s/%s", defObj.GetID(), defObj.GetHP(), defObj.GetMaxHP())
|
| | | return True
|
| | |
|
| | | aSuperHitRate = atkObj.GetBatAttrValue(ChConfig.AttrID_SuperHitRate)
|
| | |
| | | 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
|
| | |
| | | # 曹仁的分担触发条件暂时程序内固定,有修改时程序同步修改
|
| | | # 曹仁: 我方英雄受到直接攻击时(受到群攻时选择血量最低的友方进行防护),曹仁有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
|
| | |
| | |
|
| | | immuneHurt = immuneHurtDict.get(aveObjID)
|
| | | if immuneHurt == None:
|
| | | if aveObj.CheckInState(ChConfig.BatObjState_Wudi):
|
| | | if aveObj.CheckInState(ChConfig.ImmuneHurtStateList):
|
| | | immuneHurt = 0
|
| | | else:
|
| | | immuneHurt = -1 # 标记没有无敌
|
| | |
| | | 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)
|
| | |
|
| | | hurtShareEff = curSkill.GetEffectByID(ChConfig.SkillEff_HurtShare)
|
| | | if hurtShareEff:
|
| | | if HaveShareEff(userObj, curSkill):
|
| | | tagCnt = max(1, len(curSkill.GetTagObjList()))
|
| | | cureHP = cureHP / tagCnt
|
| | | GameWorld.DebugLogEx(" 目标均摊治疗: cureHP=%s,tagCnt=%s", cureHP, tagCnt)
|