| | |
| | |
|
| | | objID = curBatObj.GetID()
|
| | |
|
| | | if hasattr(useSkill, "GetRemainTime") and useSkill.GetRemainTime() > 0:
|
| | | GameWorld.DebugLog("技能CD中! skillID=%s,RemainTime=%s" % (skillID, useSkill.GetRemainTime()))
|
| | | return
|
| | | |
| | | buffStateGroups = useSkill.GetBuffStateLimit()
|
| | | if buffStateGroups:
|
| | | limitState = curBatObj.IsInBuffStateGroup(buffStateGroups)
|
| | |
| | |
|
| | | def IsNeedSyncSkill(useSkill):
|
| | | ## 使用需要同步B427使用技能
|
| | | return useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_CleanBuff]
|
| | | if useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk, ChConfig.Def_SkillType_Cure, ChConfig.Def_SkillType_CleanBuff]:
|
| | | return True
|
| | | if useSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_TurnNormaSkill, ChConfig.Def_SkillFuncType_AngerSkill]:
|
| | | return True
|
| | | return False
|
| | |
|
| | | def GetSkillTags(turnFight, curBatObj, useSkill):
|
| | | ## 获取技能目标
|
| | |
| | | else:
|
| | | diffType = 1
|
| | | tagXP = tagBatObj.GetXP()
|
| | | diffValue = calcValue
|
| | | diffValue = GetEnhanceXP(tagBatObj, calcValue)
|
| | | updValue = tagXP + diffValue
|
| | | tagBatObj.SetXP(updValue, False)
|
| | | GameWorld.DebugLog(" 加怒气: tagID=%s,diffValue=%s,tagXP=%s,updXP=%s" % (tagID, diffValue, tagXP, updValue))
|
| | |
| | | if curStealTotal > 0:
|
| | | diffType = 1
|
| | | curXP = curBatObj.GetXP()
|
| | | diffValue = curStealTotal
|
| | | diffValue = GetEnhanceXP(tagBatObj, curStealTotal)
|
| | | updValue = curXP + diffValue
|
| | | curBatObj.SetXP(updValue, False)
|
| | | GameWorld.DebugLog(" 加总怒气: curID=%s,curStealTotal=%s,curXP=%s,updXP=%s" % (curID, curStealTotal, curXP, updValue))
|
| | | GameWorld.DebugLog(" 加总怒气: curID=%s,curStealTotal=%s,curXP=%s,diffValue=%s,updXP=%s" % (curID, curStealTotal, curXP, diffValue, updValue))
|
| | | Sync_PropertyRefreshView(turnFight, curBatObj, attrID, updValue, diffValue, diffType, skillID, relatedSkillID)
|
| | |
|
| | | return
|
| | |
| | |
|
| | | # 统计击杀
|
| | | killObjList = [] # 击杀其他阵营目标列表
|
| | | dieObjList = [] # 死亡的单位列表
|
| | | for tagObj in useSkill.GetTagObjList():
|
| | | tagID = tagObj.GetID()
|
| | | if tagObj.IsAlive() and tagObj.GetHP() <= 0 and tagObj.GetFaction() != curObj.GetFaction():
|
| | | killObjList.append(tagObj)
|
| | | TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
|
| | | if tagObj.IsAlive() and tagObj.GetHP() <= 0:
|
| | | dieObjList.append(tagObj)
|
| | | if tagObj.GetFaction() != curObj.GetFaction():
|
| | | killObjList.append(tagObj)
|
| | | TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
|
| | | useSkill.SetKillObjList(killObjList)
|
| | | if curObj.IsAlive() and curObj.GetHP() <= 0:
|
| | | dieObjList.append(curObj)
|
| | | TurnAttack.SetObjKilled(turnFight, curObj)
|
| | |
|
| | | # 统计伤血,可能单个技能对同一目标造成多次伤害
|
| | |
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_KillOneObj, tagObj, connSkill=useSkill)
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_KillTagObj, tagObj, connSkill=useSkill)
|
| | |
|
| | | if dieObjList:
|
| | | for faction in [ChConfig.Def_FactionA, ChConfig.Def_FactionB]:
|
| | | batFaction = turnFight.getBatFaction(faction)
|
| | | for lineupNum in batFaction.lineupDict.keys():
|
| | | batLineup = batFaction.getBatlineup(lineupNum)
|
| | | for lineupObjID in batLineup.posObjIDDict.values():
|
| | | lineupObj = batObjMgr.getBatObj(lineupObjID)
|
| | | if not lineupObj.IsAlive():
|
| | | continue
|
| | | for dieObj in dieObjList:
|
| | | # 敌方单位死亡时
|
| | | if lineupObj.GetFaction() != dieObj.GetFaction():
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_EnemyDie, dieObj, connSkill=useSkill)
|
| | | # 己方单位死亡时
|
| | | else:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, lineupObj, ChConfig.TriggerWay_FriendDie, dieObj, connSkill=useSkill)
|
| | | |
| | | triggerOne = False
|
| | | batType = useSkill.GetBatType()
|
| | | isAttackDirect = (isUseSkill and not SkillCommon.IsBuff(useSkill) and useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk])
|
| | |
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAttackedDirect, curObj, connSkill=useSkill)
|
| | | else:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAnyEffect, curObj, connSkill=useSkill)
|
| | | |
| | | # 受到持续伤害
|
| | | if tagID in beHurtObjIDList:
|
| | | TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeDOTHurt, curObj, connSkill=useSkill)
|
| | | |
| | | # 使用技能后
|
| | | if isUseSkill:
|
| | | if not triggerOne:
|
| | |
| | | if posNum <= 0:
|
| | | #非主战单位不加
|
| | | return
|
| | | addXP = GetEnhanceXP(gameObj, addXP)
|
| | | curXP = gameObj.GetXP()
|
| | | updXP = curXP + addXP
|
| | | gameObj.SetXP(updXP)
|
| | |
| | | if str(specialty) not in specialtyAddXPDict:
|
| | | return
|
| | | addXP = specialtyAddXPDict[str(specialty)]
|
| | | addXP = GetEnhanceXP(gameObj, addXP)
|
| | | curXP = gameObj.GetXP()
|
| | | updXP = curXP + addXP
|
| | | gameObj.SetXP(updXP, False)
|
| | | GameWorld.DebugLog(" 特长加XP: curID=%s,curXP=%s,addXP=%s,updXP=%s,特性=%s" % (gameObj.GetID(), curXP, addXP, updXP, specialty))
|
| | | Sync_PropertyRefreshView(turnFight, gameObj, ChConfig.AttrID_XP, updXP, addXP, diffType=1, relatedSkillID=relatedSkillID)
|
| | | return
|
| | |
|
| | | def GetEnhanceXP(gameObj, addXP):
|
| | | ## 获取提升后的xp值
|
| | | addPer = gameObj.GetBatAttrValue(ChConfig.AttrID_XPRecoverPer)
|
| | | # 其他强化、弱化
|
| | | if addPer == 0:
|
| | | return addXP
|
| | | objID = gameObj.GetID()
|
| | | updAddXP = int(addXP * max(10000 + addPer, 0) / 10000.0)
|
| | | GameWorld.DebugLog("怒气恢复提升: objID=%s,addXP=%s,addPer=%s,updAddXP=%s" % (objID, addXP, addPer, updAddXP))
|
| | | return updAddXP
|
| | |
|
| | | def __DoCurSkillEff(turnFight, curObj, useSkill, effIgnoreObjIDList, isUseSkill):
|
| | | ## 执行本技能/buff释放后额外效果
|
| | |
| | |
|
| | | killObjList = useSkill.GetKillObjList()
|
| | | if killObjList:
|
| | | invalidSkillID = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_SkillInvalid, useSkill, |
| | | invalidSkillID = TurnPassive.GetTriggerEffectValue(turnFight, curBatObj, None, ChConfig.PassiveEff_SkillInvalid, useSkill,
|
| | | triggerWay=ChConfig.TriggerWay_KillOneObj)
|
| | | if invalidSkillID and invalidSkillID == enhanceSkillID:
|
| | | GameWorld.DebugLog("有击杀目标时该技能无效! enhanceSkillID=%s" % enhanceSkillID)
|
| | |
| | | #GameWorld.DebugLog("###被动触发技能不触发自身,防止死循环! effSkillID=%s,effectID=%s,passiveSkillID=%s" % (effSkillID, effectID, passiveSkillID))
|
| | | return
|
| | |
|
| | | if hasattr(passiveSkill, "GetRemainTime") and passiveSkill.GetRemainTime() > 0:
|
| | | #GameWorld.DebugLog("被动触发技能CD中! skillID=%s,RemainTime=%s" % (passiveSkillID, passiveSkill.GetRemainTime()))
|
| | | return
|
| | | |
| | | isOK = False
|
| | | # 继承主技能目标
|
| | | if passiveSkill.GetTagAim() == ChConfig.SkillTagAim_MainSkill:
|
| | |
| | | '''计算伤害,默认按攻击计算
|
| | | '''
|
| | |
|
| | | mapID = turnFight.mapID
|
| | | skillID = curSkill.GetSkillID()
|
| | | pmType = GetPMType(atkObj, curSkill)
|
| | | ignoreDef = IsIgnoreDef(curSkill)
|
| | |
| | | if batType == ChConfig.TurnBattleType_Pursue:
|
| | | aPursueDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_PursueDamPer)
|
| | |
|
| | | aArenaDamPer, dArenaDamPerDef = 0, 0 # 竞技增伤、竞技减伤
|
| | | if mapID == ChConfig.Def_FBMapID_ArenaBattle:
|
| | | aArenaDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_ArenaDamPer)
|
| | | dArenaDamPerDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ArenaDamPerDef)
|
| | | |
| | | # 所有万分率参数统一除10000.0
|
| | | atkSkillPer /= 10000.0
|
| | | aNormalSkillPer /= 10000.0
|
| | |
| | | dFinalDamPerDef /= 10000.0
|
| | | aComboDamPer /= 10000.0
|
| | | aPursueDamPer /= 10000.0
|
| | | aArenaDamPer /= 10000.0
|
| | | dArenaDamPerDef /= 10000.0
|
| | |
|
| | | if calcType != ChConfig.Def_Calc_Attack:
|
| | | aAtk = GetCalcBaseValue(calcType, atkObj, defObj, curSkill)
|
| | |
| | | elif calcType == ChConfig.Def_Calc_HarmSelfHP:
|
| | | baseValue = curObj.GetHarmSelfHP()
|
| | | GameWorld.DebugLog("根据自残值: %s" % baseValue)
|
| | | elif calcType == ChConfig.Def_Calc_AtkedSkillHurtHP:
|
| | | bySkill = curSkill.GetBySkill()
|
| | | bySkillID = 0
|
| | | if bySkill:
|
| | | bySkillID = bySkill.GetSkillID()
|
| | | curID = curObj.GetID()
|
| | | for hurtObj in bySkill.GetHurtObjList():
|
| | | if curID == hurtObj.GetObjID():
|
| | | baseValue += hurtObj.GetHurtHP()
|
| | | GameWorld.DebugLog("根据最后受击技能伤害: %s,bySkillID=%s" % (baseValue, bySkillID))
|
| | |
|
| | | return baseValue
|
| | |
|
| | |
| | | clientPack.RelatedSkillID = relatedSkillID
|
| | | turnFight.addBatPack(clientPack)
|
| | | return
|
| | |
|
| | | def Sync_HPRefresh(turnFight, curBatObj):
|
| | | hp, maxHP = curBatObj.GetHP(), curBatObj.GetMaxHP()
|
| | | clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCObjHPRefresh)
|
| | | clientPack.ObjID = curBatObj.GetID()
|
| | | clientPack.HP = hp % ShareDefine.Def_PerPointValue
|
| | | clientPack.HPEx = hp / ShareDefine.Def_PerPointValue
|
| | | clientPack.MaxHP = maxHP % ShareDefine.Def_PerPointValue
|
| | | clientPack.MaxHPEx = maxHP / ShareDefine.Def_PerPointValue
|
| | | turnFight.addBatPack(clientPack)
|
| | | return
|
| | | |