| | |
| | | import TurnPassive
|
| | | import TurnAttack
|
| | | import TurnBuff
|
| | | import ObjPool
|
| | | import FBLogic
|
| | |
|
| | | import random
|
| | |
| | | objID, skillID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP(), angerOverflow, curXP, oneActionUseCnt)
|
| | | # 以下为技能可以使用的处理,之后的逻辑默认技能使用成功
|
| | |
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | usePoolSkill = False
|
| | | if isinstance(useSkill, IpyGameDataPY.IPY_Skill):
|
| | | usePoolSkill = True
|
| | | # 统一使用 BattleObj.PySkill
|
| | | useSkill = poolMgr.acquire(BattleObj.PySkill, useSkill, objID)
|
| | | useSkill = BattleObj.PySkill(useSkill, objID)
|
| | |
|
| | | useSkill.ResetUseRec()
|
| | | useSkill.SetTagObjList(tagObjList)
|
| | |
| | |
|
| | | # 最后重置、回收对象
|
| | | useSkill.ResetUseRec()
|
| | | if usePoolSkill:
|
| | | poolMgr.release(useSkill)
|
| | | return True
|
| | |
|
| | | def CheckSkillUseCntLimit(batObj, useSkill):
|
| | |
| | | # hurtValue *= (10000 + FinalDamPer) / 10000.0
|
| | | # GameWorld.DebugLogEx(" 增伤: hurtValue=%s,FinalDamPer=%s", hurtValue, FinalDamPer)
|
| | |
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | useSkill = poolMgr.acquire(BattleObj.PySkill, skillIpyData, atkID)
|
| | | useSkill = BattleObj.PySkill(skillIpyData, atkID)
|
| | | useSkill.SetTagObjList([defObj])
|
| | | useSkill.SetBatType(ChConfig.TurnBattleType_Cot)
|
| | |
|
| | |
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|
| | |
|
| | | useSkill.ResetUseRec()
|
| | | poolMgr.release(useSkill)
|
| | | return
|
| | |
|
| | | def SkillModule_6(turnFight, curBatObj, useSkill, opType):
|
| | |
| | |
|
| | | # 优先处理afterLogic,可再预先汇总一些会触发被动的信息
|
| | | relatedSkillID = useSkill.GetSkillID()
|
| | | shieldBrokenList = [] # 记录盾破
|
| | | delBuffAfterEffList = [] # buff消失后要触发的被动,一般用于后置处理的逻辑
|
| | | afterLogicList = useSkill.GetAfterLogicList()
|
| | | for logicType, logicData in afterLogicList:
|
| | | if logicType == ChConfig.AfterLogic_DelBuff:
|
| | | buffObjID, buff, tagObjID = logicData
|
| | | buffSkillData = buff.GetSkillData()
|
| | | buffSkillTypeID = buffSkillData.GetSkillTypeID()
|
| | | buffObjID, buff, tagObjID, afterTriggerData = logicData
|
| | | TurnBuff.DoBuffDelAfterLogicOver(turnFight, buffObjID, buff, useSkill)
|
| | | if SkillCommon.isDamageShieldSkill(buffSkillData):
|
| | | shieldBrokenList.append([buffObjID, tagObjID, buffSkillTypeID])
|
| | | if afterTriggerData:
|
| | | delBuffAfterEffList.append([buffObjID, buff, tagObjID, afterTriggerData])
|
| | |
|
| | | elif logicType == ChConfig.AfterLogic_AddBuff:
|
| | | batObj = logicData[0]
|
| | |
| | |
|
| | | # ========== 以下触发被动 ==========
|
| | |
|
| | | # 破盾时
|
| | | for buffObjID, tagObjID, buffSkillTypeID in shieldBrokenList:
|
| | | # buff消失后置处理的被动,优先处理,如破盾,区别于被动方式 ChConfig.TriggerWay_BuffDel(立即触发)
|
| | | for buffObjID, buff, tagObjID, afterTriggerData in delBuffAfterEffList:
|
| | | triggerWay, effInfoList = afterTriggerData
|
| | | buffObj = batObjMgr.getBatObj(buffObjID)
|
| | | tagObj = batObjMgr.getBatObj(tagObjID)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, buffObj, ChConfig.TriggerWay_ShieldBroken, tagObj, connSkillTypeID=buffSkillTypeID)
|
| | | tagObj = batObjMgr.getBatObj(tagObjID) # 导致该buff消失的目标
|
| | | GameWorld.DebugLogEx("buff消失后置处理的被动: buffObjID=%s,tagObjID=%s,triggerWay=%s,%s", buffObjID, tagObjID, triggerWay, effInfoList)
|
| | | TurnPassive.OnTriggerPassiveEffList(turnFight, buffObj, triggerWay, tagObj, effInfoList, connSkill=useSkill, connBuff=buff)
|
| | |
|
| | | # 有击杀时
|
| | | for index, tagObj in enumerate(killObjList):
|
| | |
| | | batType = curSkill.GetBatType()
|
| | |
|
| | | changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtType, curSkill)
|
| | | if not changeHurtType:
|
| | | changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtTypeByBuff, curSkill)
|
| | | if changeHurtType == 1:
|
| | | ignoreDef = True
|
| | | GameWorld.DebugLogEx("强制变更本次伤害为无视防御! skillID=%s", skillID)
|
| | |
| | | defObj, hurtValue, hurtTypes, immuneHurt = hurtInfo[:4]
|
| | | isEx = hurtInfo[4] if len(hurtInfo) > 4 else 0 # 是否是额外目标
|
| | |
|
| | | lostHP = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
|
| | | |
| | | lostHP, ignoreShield = DoLostHP(turnFight, atkObj, defObj, hurtValue, curSkill, lostType, hpCanNegative=True, immuneHurt=immuneHurt)
|
| | | if ignoreShield:
|
| | | hurtTypes |= pow(2, ChConfig.HurtAtkType_IgnoreShield)
|
| | | |
| | | #伤害结构体
|
| | | defID = defObj.GetID()
|
| | | if isEx:
|
| | |
| | | @param hpCanNegative: 扣除后的生命是否允许负值
|
| | | @param immuneHurt: 免疫的伤害值
|
| | | @param isSkillSelfTag: 是否技能自身的直接目标,如平摊伤害目标、溅射伤害目标这种就不算直接目标
|
| | | @return: lostHP
|
| | | @return: lostHP, ignoreShield
|
| | | '''
|
| | |
|
| | | ignoreShield = None
|
| | | if immuneHurt > 0:
|
| | | buffMgr = defObj.GetBuffManager()
|
| | | wudiBuffList = buffMgr.FindBuffListByState(ChConfig.BatObjState_Wudi)
|
| | |
| | | defObj.GetID(), buff.GetBuffID(), buffSkillID, buffValue, immuneHurt, updBuffValue, lostType)
|
| | |
|
| | | if hurtValue <= 0:
|
| | | return 0
|
| | | return 0, ignoreShield
|
| | |
|
| | | atkID = atkObj.GetID()
|
| | | defID = defObj.GetID()
|
| | |
| | | shieldBuffList = []
|
| | | buffMgr = defObj.GetBuffManager()
|
| | | for buff in buffMgr.FindBuffListByState(ChConfig.BatObjState_DamShield):
|
| | | if ignoreShield == None:
|
| | | if TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_IgnoreShield, curSkill):
|
| | | ignoreShield = True # 无视承伤盾
|
| | | break
|
| | | ignoreShield = False
|
| | | skillData = buff.GetSkillData()
|
| | | remainTime = buff.GetRemainTime() # 剩余回合
|
| | | if not skillData.GetLastTime():
|
| | |
| | | shieldHurtValue -= decShieldValue # 承伤值
|
| | | if decShieldValue >= buffValue:
|
| | | GameWorld.DebugLogEx(" 删除盾: buffID=%s,剩余盾伤=%s", buffID, shieldHurtValue)
|
| | | TurnBuff.DoBuffDel(turnFight, defObj, buff, relatedSkill=curSkill, afterLogic=True, tagObj=atkObj)
|
| | | #盾破时buff会被删除,导致绑定在该buff上的被动效果同步被清除,后续就无法触发盾破后被动,固先取出来
|
| | | effInfoList = defObj.GetPassiveEffManager().GetPassiveEffByTrigger(ChConfig.TriggerWay_ShieldBroken, connSkillTypeID=buffSkillID)
|
| | | TurnBuff.DoBuffDel(turnFight, defObj, buff, relatedSkill=curSkill, afterLogic=True, tagObj=atkObj, afterTriggerData=[ChConfig.TriggerWay_ShieldBroken, effInfoList])
|
| | | else:
|
| | | updShieldValue = buffValue - decShieldValue
|
| | | GameWorld.DebugLogEx(" 更新盾: updShieldValue=%s,剩余盾伤=%s", updShieldValue, shieldHurtValue)
|
| | |
| | | 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
|
| | | return lostHP, ignoreShield
|
| | |
|
| | | def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
|
| | | '''计算反弹反弹伤害
|
| | |
| | | hurtValue *= (10000 + FinalDamPer) / 10000.0
|
| | | GameWorld.DebugLogEx(" 增伤: hurtValue=%s,FinalDamPer=%s", hurtValue, FinalDamPer)
|
| | |
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | useSkill = poolMgr.acquire(BattleObj.PySkill, skillIpyData, atkID)
|
| | | useSkill = BattleObj.PySkill(skillIpyData, atkID)
|
| | | useSkill.SetTagObjList([defObj])
|
| | | useSkill.SetBatType(ChConfig.TurnBattleType_Dot)
|
| | |
|
| | |
| | | Sync_TurnFightTag(turnFight, useTag, 1)
|
| | |
|
| | | useSkill.ResetUseRec()
|
| | | poolMgr.release(useSkill)
|
| | | return
|
| | |
|
| | | def Sync_TurnFightTag(turnFight, useTag, sign):
|
| | | ## 通知技能标签
|
| | | clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCTurnFightTag)
|
| | | clientPack = ChPyNetSendPack.tagSCTurnFightTag()
|
| | | clientPack.Tag = useTag
|
| | | clientPack.Len = len(clientPack.Tag)
|
| | | clientPack.Sign = sign
|
| | |
| | | ## 通知释放技能
|
| | | bySkill = useSkill.GetBySkill()
|
| | | relatedSkillID = bySkill.GetSkillID() if bySkill else 0
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkill)
|
| | | clientPack = ChPyNetSendPack.tagSCUseSkill()
|
| | | clientPack.ObjID = curBatObj.GetID()
|
| | | clientPack.PMType = GetPMType(curBatObj, useSkill)
|
| | | clientPack.BattleType = useSkill.GetBatType()
|
| | |
| | | # 技能的主要伤害
|
| | | clientPack.HurtList = []
|
| | | for hurtObj in useSkill.GetHurtObjList():
|
| | | hurt = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurt)
|
| | | hurt = ChPyNetSendPack.tagSCUseSkillHurt()
|
| | | hurt.ObjID = hurtObj.GetObjID()
|
| | | hurt.AttackTypes = hurtObj.GetHurtTypes()
|
| | | hurt.HurtHP = hurtObj.GetHurtHP() % ChConfig.Def_PerPointValue
|
| | |
| | | hurt.HurtListEx = []
|
| | | # 单个伤害的额外伤害,如弹射+平摊伤害
|
| | | for hurtObjEx in hurtObj.GetHurtObjListEx():
|
| | | hurtEx = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurtEx)
|
| | | hurtEx = ChPyNetSendPack.tagSCUseSkillHurtEx()
|
| | | hurtEx.ObjID = hurtObjEx.GetObjID()
|
| | | hurtEx.AttackTypes = hurtObjEx.GetHurtTypes()
|
| | | hurtEx.HurtHP = hurtObjEx.GetHurtHP() % ChConfig.Def_PerPointValue
|
| | |
| | | # 技能的额外伤害,如常规技能的平摊伤害
|
| | | clientPack.HurtListEx = []
|
| | | for hurtObjEx in useSkill.GetHurtObjListEx():
|
| | | hurtEx = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurtEx)
|
| | | hurtEx = ChPyNetSendPack.tagSCUseSkillHurtEx()
|
| | | hurtEx.ObjID = hurtObjEx.GetObjID()
|
| | | hurtEx.AttackTypes = hurtObjEx.GetHurtTypes()
|
| | | hurtEx.HurtHP = hurtObjEx.GetHurtHP() % ChConfig.Def_PerPointValue
|
| | |
| | | if not clientPack.HurtList:
|
| | | for tagObj in useSkill.GetTagObjList():
|
| | | tagID = tagObj.GetID()
|
| | | hurt = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurt)
|
| | | hurt = ChPyNetSendPack.tagSCUseSkillHurt()
|
| | | hurt.ObjID = tagID
|
| | | hurt.CurHP = tagObj.GetHP() % ChConfig.Def_PerPointValue
|
| | | hurt.CurHPEx = tagObj.GetHP() / ChConfig.Def_PerPointValue
|
| | |
| | | if attrID not in ChConfig.CDBRefresh_AttrIDDict:
|
| | | return
|
| | | refreshType, isBig = ChConfig.CDBRefresh_AttrIDDict[attrID]
|
| | | poolMgr = ObjPool.GetPoolMgr()
|
| | | clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCObjPropertyRefreshView)
|
| | | clientPack = ChPyNetSendPack.tagSCObjPropertyRefreshView()
|
| | | clientPack.ObjID = curBatObj.GetID()
|
| | | clientPack.RefreshType = refreshType
|
| | | clientPack.AttackTypes = hurtTypes
|
| | |
| | |
|
| | | def Sync_HPRefresh(turnFight, curBatObj):
|
| | | hp, maxHP = curBatObj.GetHP(), curBatObj.GetMaxHP()
|
| | | clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCObjHPRefresh)
|
| | | clientPack = ChPyNetSendPack.tagSCObjHPRefresh()
|
| | | clientPack.ObjID = curBatObj.GetID()
|
| | | clientPack.HP = hp % ShareDefine.Def_PerPointValue
|
| | | clientPack.HPEx = hp / ShareDefine.Def_PerPointValue
|