| | |
| | | # 灼烧/玄火目标优先
|
| | | elif tagAffect == ChConfig.SkillTagAffect_Burn:
|
| | | atkBackTagFrist = False
|
| | | relativeObj = __GetRelativeObjDefault(batObjMgr, curBatObj, posNum, batLineup)
|
| | | sortObjList = [] # 优先灼烧目标,再对位
|
| | | for aimObj in aimObjList:
|
| | | sortValue = 0
|
| | | buffMgr = aimObj.GetBuffManager()
|
| | | if buffMgr.FindBuffListByState(ChConfig.BatObjState_Burn) or buffMgr.FindBuffListByState(ChConfig.BatObjState_BurnPlus):
|
| | | sortValue = 2
|
| | | elif relativeObj and relativeObj.GetID() == aimObj.GetID():
|
| | | sortValue = 1
|
| | | sortObjList.append([sortValue, aimObj])
|
| | | sortObjList.sort(reverse=True)
|
| | | aimObjList = [s[1] for s in sortObjList]
|
| | | aimObjList = __getBuffStateFirst(batObjMgr, curBatObj, posNum, batLineup, aimObjList, [ChConfig.BatObjState_Burn, ChConfig.BatObjState_BurnPlus])
|
| | | |
| | | # 承伤盾目标优先
|
| | | elif tagAffect == ChConfig.SkillTagAffect_DamShield:
|
| | | atkBackTagFrist = False
|
| | | aimObjList = __getBuffStateFirst(batObjMgr, curBatObj, posNum, batLineup, aimObjList, [ChConfig.BatObjState_DamShield])
|
| | |
|
| | | # 仅焚血(毒奶)目标
|
| | | elif tagAffect == ChConfig.SkillTagAffect_PoisonCure:
|
| | |
| | | aimObjList = aimObjList[:tagCount]
|
| | |
|
| | | return aimObjList
|
| | |
|
| | | def __getBuffStateFirst(batObjMgr, curBatObj, posNum, batLineup, aimObjList, checkStateList):
|
| | | ## 获取处于xxbuff状态优先,然后再对位目标
|
| | | relativeObj = __GetRelativeObjDefault(batObjMgr, curBatObj, posNum, batLineup)
|
| | | sortObjList = [] # 优先灼烧目标,再对位
|
| | | for aimObj in aimObjList:
|
| | | sortValue = 0
|
| | | if aimObj.CheckInState(checkStateList):
|
| | | sortValue = 2
|
| | | elif relativeObj and relativeObj.GetID() == aimObj.GetID():
|
| | | sortValue = 1
|
| | | sortObjList.append([sortValue, aimObj])
|
| | | sortObjList.sort(reverse=True)
|
| | | return [s[1] for s in sortObjList]
|
| | |
|
| | | def CheckChangeTagEff(turnFight, curBatObj, useSkill):
|
| | | ## 技能自身设定强制修改目标,目前暂定优先级最高,无视软控
|
| | |
| | | atkType = useSkill.GetAtkType()
|
| | | GameWorld.DebugLog("__doUseSkill: curID=%s,skillID=%s,atkType=%s" % (curBatObj.GetID(), useSkill.GetSkillID(), atkType))
|
| | |
|
| | | __doStealBuff(turnFight, curBatObj, useSkill)
|
| | | __doHarmSelf(turnFight, curBatObj, useSkill)
|
| | |
|
| | | # 通用攻击
|
| | |
| | | elif atkType == 9:
|
| | | SkillModule_9(turnFight, curBatObj, useSkill)
|
| | |
|
| | | return
|
| | |
|
| | | def __doStealBuff(turnFight, curBatObj, useSkill):
|
| | | ## 施法前偷取buff
|
| | | stealEff = useSkill.GetEffectByID(ChConfig.SkillEff_UseSkillStealBuff)
|
| | | if not stealEff:
|
| | | return
|
| | | buffState = stealEff.GetEffectValue(0) # buff״̬
|
| | | stealCnt = stealEff.GetEffectValue(1) # 偷取个数 0-全部;>0-个数
|
| | | isAll = True if stealCnt == 0 else False
|
| | | |
| | | for tagObj in useSkill.GetTagObjList():
|
| | | if not isAll and stealCnt <= 0:
|
| | | break
|
| | | tagBuffList = tagObj.GetBuffManager().FindBuffListByState(buffState)
|
| | | if not tagBuffList:
|
| | | continue
|
| | | |
| | | if not isAll and len(tagBuffList) > stealCnt:
|
| | | random.shuffle(tagBuffList) # 随机
|
| | | |
| | | for tagBuff in tagBuffList:
|
| | | skillID = tagBuff.GetSkillID()
|
| | | buffOwner = curBatObj
|
| | | GameWorld.DebugLog("使用技能前偷取buff: tagID=%s,tagBuffID=%s,buffSkillID=%s" % (tagObj.GetID(), tagBuff.GetBuffID(), skillID))
|
| | | addBuff = TurnBuff.DoAddBuffBySkillID(turnFight, curBatObj, skillID, buffOwner, useSkill, isSync=False)
|
| | | if not addBuff:
|
| | | continue
|
| | | stealCnt -= 1
|
| | | TurnBuff.CopyBuff(turnFight, curBatObj, addBuff, tagBuff, useSkill, True, refreshTimeLayer=False)
|
| | | TurnBuff.DoBuffDel(turnFight, tagObj, tagBuff, relatedSkill=useSkill)
|
| | | |
| | | return
|
| | |
|
| | | def __doHarmSelf(turnFight, curBatObj, useSkill):
|
| | |
| | |
|
| | | Sync_UseSkill(turnFight, atkObj, useSkill)
|
| | |
|
| | | DoBeAttackResult(turnFight, atkObj, useSkill)
|
| | | DoBeAttackResult(turnFight, atkObj, useSkill, curBuff)
|
| | |
|
| | | # 通知结束标签
|
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|
| | |
| | | __doCostZhanchui(turnFight, curBatObj, useSkill)
|
| | | __doSkillUserAnger(turnFight, curBatObj, useSkill)
|
| | |
|
| | | DoBeAttackResult(turnFight, curBatObj, useSkill, True)
|
| | | DoBeAttackResult(turnFight, curBatObj, useSkill)
|
| | | return
|
| | |
|
| | | def DoCombo(turnFight, atkObj, useSkill):
|
| | |
| | | return useSkill
|
| | | return
|
| | |
|
| | | def DoBeAttackResult(turnFight, curObj, useSkill, isUseSkill=False):
|
| | | def DoBeAttackResult(turnFight, curObj, useSkill, curBuff=None):
|
| | | '''被攻击结果
|
| | | @param curObj: 施法方或buff归属方
|
| | | @param isUseSkill: 是否是直接使用技能的攻击结果,否则视为持续性的
|
| | | '''
|
| | |
|
| | | #curID = curObj.GetID()
|
| | | isUseSkill = False if curBuff else True # buff的视为持续性的,否则为直接使用技能的攻击结果
|
| | | isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
|
| | | isAngerSkill = SkillCommon.isAngerSkill(useSkill)
|
| | |
|
| | |
| | | enhanceSkillID = curEffect.GetEffectValue(0)
|
| | | checkInStateList = curEffect.GetEffectValue(1)
|
| | | checkHeroJob = curEffect.GetEffectValue(2)
|
| | | GameWorld.DebugLog("额外触发的技能: enhanceSkillID=%s,checkInStateList=%s,checkHeroJob=%s" % (enhanceSkillID, checkInStateList, checkHeroJob))
|
| | | checkHeroSex = curEffect.GetEffectValue(3)
|
| | | GameWorld.DebugLog("额外触发的技能: enhanceSkillID=%s,checkInStateList=%s,checkHeroJob=%s,checkHeroSex=%s" % (enhanceSkillID, checkInStateList, checkHeroJob, checkHeroSex))
|
| | | tagObjList = useSkill.GetTagObjList()
|
| | |
|
| | | enhanceSkillData = IpyGameDataPY.GetIpyGameData("Skill", enhanceSkillID)
|
| | |
| | | GameWorld.DebugLog("继承主技能目标! enhanceSkillID=%s" % enhanceSkillID)
|
| | | # 额外触发的技能直接在外层检查概率,如果都没有触发则不需要再处理
|
| | | enhanceRate = enhanceSkillData.GetHappenRate()
|
| | | enhanceRate += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillRate, connSkillTypeID=enhanceSkillData.GetSkillTypeID())
|
| | | enhanceRate += TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_AddSkillRate, connSkillTypeID=enhanceSkillData.GetSkillTypeID(), connSkillID=enhanceSkillID)
|
| | | enchanceTagObjList = []
|
| | | for tagObj in tagObjList:
|
| | | tagID = tagObj.GetID()
|
| | |
| | | if checkHeroJob and checkHeroJob != tagObj.GetJob():
|
| | | GameWorld.DebugLog(" 非目标职业不触发: tagID=%s,job=%s != %s" % (tagID, tagObj.GetJob(), checkHeroJob))
|
| | | continue
|
| | | if checkHeroSex and checkHeroSex != tagObj.GetSex():
|
| | | GameWorld.DebugLog(" 非目标性别不触发: tagID=%s,sex=%s != %s" % (tagID, tagObj.GetSex(), checkHeroSex))
|
| | | continue
|
| | | if enhanceRate and enhanceRate != ChConfig.Def_MaxRateValue and not GameWorld.CanHappen(enhanceRate, ChConfig.Def_MaxRateValue):
|
| | | GameWorld.DebugLog(" 概率不触发: tagID=%s,enhanceRate=%s" % (tagID, enhanceRate))
|
| | | continue
|
| | |
| | |
|
| | | # 只执行一次,防止群攻时额外触发多次
|
| | | GameWorld.DebugLog("重新锁定目标! enhanceSkillID=%s" % enhanceSkillID)
|
| | | if checkInStateList or checkHeroJob:
|
| | | inState, haveJob = False, False
|
| | | if checkInStateList or checkHeroJob or checkHeroSex:
|
| | | inState, haveJob, haveSex = False, False, False
|
| | | for tagObj in tagObjList:
|
| | | tagID = tagObj.GetID()
|
| | | if tagID in effIgnoreObjIDList:
|
| | |
| | | inState = True
|
| | | if not haveJob and checkHeroJob and checkHeroJob == tagObj.GetJob():
|
| | | haveJob = True
|
| | | if not haveSex and checkHeroSex and checkHeroSex == tagObj.GetSex():
|
| | | haveSex = True
|
| | | if checkInStateList and not inState:
|
| | | GameWorld.DebugLog(" 没有命中目标在状态下不触发: tagObj not in state:%s" % str(checkInStateList))
|
| | | return
|
| | | if checkHeroJob and not haveJob:
|
| | | GameWorld.DebugLog(" 没有命中目标为目标职业不触发: checkHeroJob=%s" % checkHeroJob)
|
| | | return
|
| | | if checkHeroSex and not haveSex:
|
| | | GameWorld.DebugLog(" 没有命中目标为目标性别不触发: checkHeroSex=%s" % checkHeroSex)
|
| | | return
|
| | | OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
|
| | | return
|
| | |
| | |
|
| | | Sync_UseSkill(turnFight, atkObj, useSkill)
|
| | |
|
| | | DoBeAttackResult(turnFight, atkObj, useSkill)
|
| | | DoBeAttackResult(turnFight, atkObj, useSkill, curBuff)
|
| | |
|
| | | # 通知结束标签
|
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|