| | |
| | | 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):
|
| | |
| | | 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:
|
| | |
| | | if buffOwner.GetID() == curID:
|
| | | if triggerType == ChConfig.TriggerWay_BeControlledHard:
|
| | | beControlledHardDict[batObj.GetID()] = buff
|
| | | elif triggerType == ChConfig.TriggerWay_AddDOTBuff:
|
| | | beDotBuffDict[batObj.GetID()] = buff
|
| | |
|
| | | # 统计击杀
|
| | | killObjList = [] # 击杀其他阵营目标列表
|
| | |
| | |
|
| | | # ========== 以下触发被动 ==========
|
| | |
|
| | | curBatLineup = curObj.GetTFBatLineup()
|
| | | curMGObj = curBatLineup.getMinggeObj()
|
| | | mgTriggerWayList = [] # 命格本次技能已触发方式列表,命格固定只触发一次
|
| | | |
| | | # buff消失后置处理的被动,优先处理,如破盾,区别于被动方式 ChConfig.TriggerWay_BuffDel(立即触发)
|
| | | for buffObjID, buff, tagObjID, afterTriggerData in delBuffAfterEffList:
|
| | | triggerWay, effInfoList = afterTriggerData
|
| | |
| | | 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:
|
| | |
| | | triggerOne = False
|
| | | batType = useSkill.GetBatType()
|
| | | isAttackDirect = (isUseSkill and SkillCommon.isAttackDirectSkill(useSkill)) # 是否直接攻击
|
| | | curBatLineup = curObj.GetTFBatLineup()
|
| | | curMGObj = curBatLineup.getMinggeObj()
|
| | | for tagObj in tagObjListAll:
|
| | | tagID = tagObj.GetID()
|
| | |
|
| | |
| | | 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)
|
| | |
| | | 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:
|
| | | 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:
|
| | | 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)
|
| | | # 反击
|
| | |
| | | @param effectID: 被动效果ID
|
| | | 注:可能由A引起触发B技能的效果释放技能C
|
| | | '''
|
| | | if not passiveSkill:
|
| | | if not passiveSkill or not batObj:
|
| | | return
|
| | | if isinstance(passiveSkill, int):
|
| | | passiveSkillID = passiveSkill
|
| | |
| | | isAngerSkill = SkillCommon.isAngerSkill(curSkill)
|
| | | isDot = ("damageoftime" in kwargs)
|
| | |
|
| | | mustHit = False # 是否必命中
|
| | | if not isTurnNormalSkill: # 仅普攻判断是否闪避
|
| | | mustHit = True
|
| | | |
| | | angerOverflow = atkObj.GetAngerOverflow() # 怒气溢出值
|
| | | |
| | | #命中公式 攻击方类型不同,公式不同
|
| | | 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
|
| | |
| | | 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)
|
| | |
|
| | |
| | | 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()
|