| | |
| | | if not skillID:
|
| | | return
|
| | |
|
| | | triggerWay = kwargs["triggerWay"] if "triggerWay" in kwargs else 0
|
| | | 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)
|
| | | 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:
|
| | |
| | | useSkill.SetBatType(batType)
|
| | | useSkill.SetBySkill(bySkill)
|
| | | useSkill.SetByBuff(byBuff)
|
| | | useSkill.SetByTriggerWay(triggerWay)
|
| | | useSkill.SetByTriggerWay(byTriggerWay)
|
| | |
|
| | | isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
|
| | | if isTurnNormalSkill:
|
| | |
| | | else:
|
| | | __doUseSkill(turnFight, curBatObj, useSkill)
|
| | |
|
| | | DoAttackResult(turnFight, curBatObj, useSkill)
|
| | | DoAttackResult(turnFight, curBatObj, useSkill, **kwargs)
|
| | |
|
| | | if useTag:
|
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|
| | |
| | |
|
| | | 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
|
| | |
| | | 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:
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def DoAttackResult(turnFight, curBatObj, useSkill):
|
| | | def DoAttackResult(turnFight, curBatObj, useSkill, **kwargs):
|
| | | '''执行攻击结果
|
| | | @param curBatObj: 施法方或buff归属方
|
| | | '''
|
| | |
| | | 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) # 先扣除再同步技能
|
| | |
|
| | | # 需先技能使用 - 前端按顺序优先表现技能释放内容,前端需要动作或有伤血则通知
|
| | |
| | | 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)
|
| | |
|
| | |
| | | triggerOne = False
|
| | | batType = useSkill.GetBatType()
|
| | | isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
|
| | | curBatLineup = None
|
| | | for tagObj in tagObjListAll:
|
| | | tagID = tagObj.GetID()
|
| | |
|
| | |
| | | # 掉血时
|
| | | 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:
|
| | |
| | | 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]:
|
| | | 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)
|
| | | |
| | | # 连击
|
| | | 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 # 设置已经触发过一次
|
| | |
|
| | | # 验证是否结算,最后处理
|
| | |
| | | return
|
| | | passiveTagObjList = connSkill.GetTagObjList()
|
| | | isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, 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=ChConfig.TurnBattleType_Passive, 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)
|
| | |
| | | aBatDamPer, dBatDamPerDef = 0, 0 # 战斗增减伤
|
| | | aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_BatDamPer, curSkill)
|
| | | aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddBatDamPerByTagLostHP, curSkill)
|
| | | aBatDamPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_AddBatDamPerByLayer, curSkill)
|
| | |
|
| | | # 物法增减伤
|
| | | if pmType == IPY_GameWorld.ghtMag: # 法伤
|
| | |
| | |
|
| | | 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)
|