hxp
6 天以前 2b34924e06c0c36d77d9ccec4c4f10f1ebd16e84
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/TurnSkill.py
@@ -562,7 +562,7 @@
    DoBeAttackResult(turnFight, curBatObj, useSkill, True)
    return
def DoCombo(turnFight, curBatObj, useSkill):
def DoCombo(turnFight, atkObj, useSkill):
    '''
        格挡、反击、连击规则
        1. 所有武将或怪物均可能产生格挡,群攻时格挡一对一判断,均可能产生格挡
@@ -586,7 +586,7 @@
    
    tagFriendly = useSkill.GetTagFriendly()
    if tagFriendly:
        tagObj = GetRelativeObj(turnFight, curBatObj)
        tagObj = GetRelativeObj(turnFight, atkObj)
    else:
        tagObjList = useSkill.GetTagObjList()
        if not tagObjList:
@@ -596,18 +596,31 @@
        if atkBackSkill:
            # 可以反击,打断连击
            GameWorld.DebugLog("● %s 【反击】" % TurnAttack.GetObjName(tagObj))
            OnUseSkill(turnFight, tagObj, atkBackSkill, [curBatObj], ChConfig.TurnBattleType_AtkBack)
            OnUseSkill(turnFight, tagObj, atkBackSkill, [atkObj], ChConfig.TurnBattleType_AtkBack)
            return
        
    if not tagObj:
        return
    
    if CanCombo(curBatObj, tagObj):
        # 连击根据技能目标配置逻辑重新选择目标
        GameWorld.DebugLog("● %s 【连击】" % TurnAttack.GetObjName(curBatObj))
        DoHeroSpecialty(turnFight, curBatObj, ChConfig.HeroSpecialty_Combo, useSkill.GetSkillID())
        OnUseSkill(turnFight, curBatObj, useSkill, batType=ChConfig.TurnBattleType_Combo)
    comboNum = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum)
    aComboRate = atkObj.GetBatAttrValue(ChConfig.AttrID_ComboRate)
    aComboRate += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, tagObj, ChConfig.AttrID_ComboRate, useSkill)
    dComboRateDef = tagObj.GetBatAttrValue(ChConfig.AttrID_ComboRateDef)
    happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("ComboCfg", 1))
    if not GameWorld.CanHappen(happenRate):
        GameWorld.DebugLog("无法连击! atkID=%s,happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s"
                           % (atkObj.GetID(), happenRate, aComboRate, dComboRateDef, comboNum))
        return
    GameWorld.DebugLog("● %s 【连击】 happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s"
                       % (TurnAttack.GetObjName(atkObj), happenRate, aComboRate, dComboRateDef, comboNum))
    atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum + 1)
    # 连击特长
    DoHeroSpecialty(turnFight, atkObj, ChConfig.HeroSpecialty_Combo, useSkill.GetSkillID())
    # 连击根据技能目标配置逻辑重新选择目标
    OnUseSkill(turnFight, atkObj, useSkill, batType=ChConfig.TurnBattleType_Combo)
    return
def __getCanAtkBackSkill(useSkill, tagObj):
@@ -642,21 +655,6 @@
            GameWorld.DebugLog("可以反击! tagID=%s" % tagID)
            return useSkill
    return
def CanCombo(atkObj, defObj):
    ## 可否连击
    comboNum = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum)
    aComboRate = atkObj.GetBatAttrValue(ChConfig.AttrID_ComboRate)
    dComboRateDef = defObj.GetBatAttrValue(ChConfig.AttrID_ComboRateDef)
    happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("ComboCfg", 1))
    if GameWorld.CanHappen(happenRate):
        GameWorld.DebugLog("可以连击! atkID=%s,happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s"
                           % (atkObj.GetID(), happenRate, aComboRate, dComboRateDef, comboNum))
        atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum + 1)
        return True
    GameWorld.DebugLog("无法连击! atkID=%s,happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s"
                       % (atkObj.GetID(), happenRate, aComboRate, dComboRateDef, comboNum))
    return False
def DoBeAttackResult(turnFight, curObj, useSkill, isUseSkill=False):
    '''被攻击结果
@@ -880,9 +878,6 @@
    #    return
    enhanceSkillID = curEffect.GetEffectValue(0)
    checkInStateList = curEffect.GetEffectValue(1)
    if checkInStateList:
        if isinstance(checkInStateList, int):
            checkInStateList = [checkInStateList]
    GameWorld.DebugLog("额外触发的技能: enhanceSkillID=%s,checkInStateList=%s" % (enhanceSkillID, checkInStateList))
    tagObjList = useSkill.GetTagObjList()
    
@@ -905,12 +900,7 @@
                GameWorld.DebugLog("    闪避的不触发: tagID=%s" % (tagID))
                continue
            if checkInStateList:
                inState = False
                for state in checkInStateList:
                    if tagObj.IsInState(state):
                        inState = True
                        break
                if not inState:
                if not tagObj.CheckInState(checkInStateList):
                    GameWorld.DebugLog("    不在状态下不触发: tagID=%s not in state:%s" % (tagID, checkInStateList))
                    continue
            if enhanceRate and enhanceRate != ChConfig.Def_MaxRateValue and not GameWorld.CanHappen(enhanceRate, ChConfig.Def_MaxRateValue):
@@ -929,11 +919,8 @@
    if checkInStateList:
        inState = False
        for tagObj in tagObjList:
            for state in checkInStateList:
                if not state or tagObj.IsInState(state):
                    inState = True
                    break
            if inState:
            if tagObj.CheckInState(checkInStateList):
                inState = True
                break
        if not inState:
            GameWorld.DebugLog("    没有目标在状态下不触发: tagObj not in state:%s" % str(checkInStateList))
@@ -1024,13 +1011,19 @@
def CalcHurtHP(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, **kwargs):
    '''计算伤害,默认按攻击计算
    '''
    skillID = curSkill.GetSkillID()
    pmType = GetPMType(atkObj, curSkill)
    ignoreDef = IsIgnoreDef(curSkill)
    
    changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtType, curSkill)
    if changeHurtType == 1:
        ignoreDef = True
        GameWorld.DebugLog("强制变更本次伤害为无视防御! skillID=%s" % skillID)
    atkID = atkObj.GetID()
    defID = defObj.GetID()
    
    skillID = curSkill.GetSkillID()
    isTurnNormalSkill = SkillCommon.isTurnNormalSkill(curSkill)
    isAngerSkill = SkillCommon.isAngerSkill(curSkill)
    isDot = ("damageoftime" in kwargs)
@@ -1064,8 +1057,8 @@
    isSuperHit, isParry, isStun = False, False, False
    aSuperDamPer, dSuperDamPerDef = 0, 0
    if not isDot:
        isSuperHit = CanSuperHit(atkObj, defObj) # 是否暴击
        isParry = (isTurnNormalSkill and CanParry(atkObj, defObj)) # 是否格挡,仅针对普攻
        isSuperHit = CanSuperHit(turnFight, atkObj, defObj, curSkill) # 是否暴击
        isParry = (isTurnNormalSkill and CanParry(turnFight, atkObj, defObj, curSkill)) # 是否格挡,仅针对普攻
        isStun = CanStun(turnFight, atkObj, defObj, curSkill) # 是否击晕
        
    if isSuperHit:
@@ -1102,7 +1095,10 @@
    if isAngerSkill:
        aAngerSkillPer = atkObj.GetBatAttrValue(ChConfig.AttrID_AngerSkillPer) # 普技增伤
        dAngerSkillPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_AngerSkillPerDef) # 普技减伤
    aAddSkillPer = 0 # 技能增伤
    aAddSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SkillPer, curSkill)
    # 物法增减伤
    if pmType == IPY_GameWorld.ghtMag: # 法伤
        aPMDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_MagDamPer)
@@ -1117,6 +1113,7 @@
    dNormalSkillPerDef /= 10000.0
    aAngerSkillPer /= 10000.0
    dAngerSkillPerDef /= 10000.0
    aAddSkillPer /= 10000.0
    aPMDamPer /= 10000.0
    dPMDamPerDef /= 10000.0
    aSuperDamPer /= 10000.0
@@ -1124,8 +1121,8 @@
    aFinalDamPer /= 10000.0
    dFinalDamPerDef /= 10000.0
    
    GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s"
                       % (atkID, defID, skillID, atkSkillPer, aAtk, dDef, dHP, hurtTypes))
    GameWorld.DebugLog("伤血计算: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s,aAddSkillPer=%s"
                       % (atkID, defID, skillID, atkSkillPer, aAtk, dDef, dHP, hurtTypes, aAddSkillPer))
    
    # 持续性伤害
    if isDot:
@@ -1146,11 +1143,17 @@
        hurtValue = hurtValue * (1 - parryReduceRatio)
        GameWorld.DebugLog("    格挡后伤害=%s,parryReduceRatio=%s" % (hurtValue, parryReduceRatio))
        
    hurtValue = max(1, int(hurtValue)) # 负值、保底防范
    multiValue = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtMulti, curSkill)
    if multiValue and multiValue != 1:
        hurtValue = int(hurtValue * multiValue)
        GameWorld.DebugLog("    伤害倍值: hurtValue=%s,multiValue=%s" % (hurtValue, multiValue))
    hurtValue = max(1, int(hurtValue)) # 负值、保底防范,放最后
    return hurtValue, hurtTypes
def CanSuperHit(atkObj, defObj):
def CanSuperHit(turnFight, atkObj, defObj, curSkill):
    aSuperHitRate = atkObj.GetBatAttrValue(ChConfig.AttrID_SuperHitRate)
    aSuperHitRate += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SuperHitRate, curSkill)
    dSuperHitRateDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuperHitRateDef)
    happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("SuperHitCfg", 1))
    if GameWorld.CanHappen(happenRate):
@@ -1160,6 +1163,7 @@
def CanStun(turnFight, atkObj, defObj, curSkill):
    aStunRate = atkObj.GetBatAttrValue(ChConfig.AttrID_StunRate)
    aStunRate += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_StunRate, curSkill)
    dStunRateDef = defObj.GetBatAttrValue(ChConfig.AttrID_StunRateDef)
    happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("StunCfg", 1))
    if not GameWorld.CanHappen(happenRate):
@@ -1169,10 +1173,19 @@
    TurnBuff.DoAddBuffBySkillID(turnFight, defObj, stunSkillID, atkObj, curSkill, afterLogic=True)
    return True
def CanParry(atkObj, defObj):
def CanParry(turnFight, atkObj, defObj, curSkill):
    if defObj.IsInControlled():
        #被控制无法格挡
        return False
    # 格挡印记
    buffMgr = defObj.GetBuffManager()
    parryYJBuff = buffMgr.FindBuffByState(ChConfig.BatObjState_ParryYJ)
    if parryYJBuff and parryYJBuff.GetLayer():
        GameWorld.DebugLog("格挡印记格挡了: buffID=%s,buffLayer=%s" % (parryYJBuff.GetBuffID(), parryYJBuff.GetLayer()))
        TurnBuff.DecBuffLayer(turnFight, defObj, parryYJBuff, 1, curSkill.GetSkillID())
        return True
    aParryRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ParryRateDef)
    dParryRate = defObj.GetBatAttrValue(ChConfig.AttrID_ParryRate)
    parryNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnParryNum)