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,17 +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))
        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):
@@ -615,8 +629,9 @@
        return
    
    tagID = tagObj.GetID()
    if tagObj.GetAtkDistType() != ChConfig.AtkDistType_Short:
        GameWorld.DebugLog("非近战不可反击! tagID=%s" % tagID)
    canAtkbackDictTypeList = IpyGameDataPY.GetFuncEvalCfg("ParryCfg", 2)
    if tagObj.GetAtkDistType() not in canAtkbackDictTypeList:
        GameWorld.DebugLog("该远近类型武将不可反击! tagID=%s,AtkDistType=%s not in %s" % (tagID, tagObj.GetAtkDistType(), canAtkbackDictTypeList))
        return
    
    canAtkBack = False
@@ -636,25 +651,10 @@
        useSkill = skillManager.GetSkillByIndex(index)
        if not useSkill:
            continue
        if useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_AtkbackSkill:
        if useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_TurnNormaSkill: # 使用普攻反击
            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):
    '''被攻击结果
@@ -702,6 +702,7 @@
        TurnAttack.SetObjKilled(turnFight, curObj)
        
    # 统计伤血,可能单个技能对同一目标造成多次伤害
    isSuperHit, isStun, isSuckHP = False, False, False
    missObjIDList = []
    for hurtObj in useSkill.GetHurtObjList():
        hurtObjID = hurtObj.GetObjID()
@@ -712,7 +713,23 @@
            __doSkillHurtAnger(tagObj, hurtObj.GetLostHP(), useSkill)
        if hurtObj.HaveHurtType(ChConfig.HurtType_Miss):
            missObjIDList.append(hurtObjID)
            DoHeroSpecialty(turnFight, tagObj, ChConfig.HeroSpecialty_Miss, relatedSkillID)
        if hurtObj.HaveHurtType(ChConfig.HurtType_Parry):
            DoHeroSpecialty(turnFight, tagObj, ChConfig.HeroSpecialty_Parry, relatedSkillID)
        if hurtObj.HaveHurtType(ChConfig.HurtType_SuperHit):
            isSuperHit = True
        if hurtObj.HaveHurtType(ChConfig.HurtType_Stun):
            isStun = True
        if hurtObj.GetSuckHP() > 0:
            isSuckHP = True
    # 群攻只触发一次特长
    if isSuperHit:
        DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuperHit, relatedSkillID)
    if isStun:
        DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_Stun, relatedSkillID)
    if isSuckHP:
        DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuckHP, relatedSkillID)
    # 结算副本相关的攻击结果,仅主动发起玩家阵容武将触发
    curPlayer = turnFight.curPlayer
    if curPlayer and curObj and curObj.GetOwnerID() == curPlayer.GetPlayerID():
@@ -784,7 +801,7 @@
    ## 技能释放者怒气相关
    if SkillCommon.isAngerSkill(useSkill):
        curBatObj.SetXP(0)
    elif SkillCommon.isTurnNormalSkill(useSkill):
    elif SkillCommon.isTurnNormalSkill(useSkill) and useSkill.GetBatType() == ChConfig.TurnBattleType_Normal:
        addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 3)
        AddTurnFightXP(curBatObj, addXP, "skillID:%s" % useSkill.GetSkillID())
    return
@@ -812,6 +829,21 @@
    updXP = curXP + addXP
    gameObj.SetXP(updXP)
    GameWorld.DebugLog("        更新XP: curID=%s,curXP=%s,addXP=%s,updXP=%s,reason=%s" % (gameObj.GetID(), curXP, addXP, updXP, reason))
    return
def DoHeroSpecialty(turnFight, gameObj, specialty, relatedSkillID=0):
    ## 执行武将特长
    if gameObj.GetSpecialty() != specialty:
        return
    specialtyAddXPDict = IpyGameDataPY.GetFuncEvalCfg("AngerXP", 5, {})
    if str(specialty) not in specialtyAddXPDict:
        return
    addXP = specialtyAddXPDict[str(specialty)]
    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 __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList):
@@ -846,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()
    
@@ -871,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):
@@ -895,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))
@@ -990,16 +1011,21 @@
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)
    isAtkbackSkill = SkillCommon.isAtkbackSkill(curSkill)
    isDot = ("damageoftime" in kwargs)
    angerOverflow = 0 # 怒气溢出值
    
@@ -1028,12 +1054,12 @@
    
    #calcType = curSkill.GetCalcType() 目前暂时按攻击算伤害,之后可以扩展其他
    
    isSuperHit, isParry = False, False
    isSuperHit, isParry, isStun = False, False, False
    aSuperDamPer, dSuperDamPerDef = 0, 0
    if not isDot:
        isSuperHit = CanSuperHit(atkObj, defObj) # 是否暴击
        isParry = (isTurnNormalSkill and CanParry(atkObj, defObj)) # 是否格挡,仅针对普攻
        CanStun(turnFight, atkObj, defObj, curSkill) # 是否击晕
        isSuperHit = CanSuperHit(turnFight, atkObj, defObj, curSkill) # 是否暴击
        isParry = (isTurnNormalSkill and CanParry(turnFight, atkObj, defObj, curSkill)) # 是否格挡,仅针对普攻
        isStun = CanStun(turnFight, atkObj, defObj, curSkill) # 是否击晕
        
    if isSuperHit:
        hurtTypes |= pow(2, ChConfig.HurtType_SuperHit)
@@ -1045,6 +1071,9 @@
        
    if ignoreDef:
        hurtTypes |= pow(2, ChConfig.HurtType_IgnoreDef)
    if isStun:
        hurtTypes |= pow(2, ChConfig.HurtType_Stun)
        
    #参与运算的数值
    #rand = random.random()                #种子数 0~1
@@ -1066,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)
@@ -1081,6 +1113,7 @@
    dNormalSkillPerDef /= 10000.0
    aAngerSkillPer /= 10000.0
    dAngerSkillPerDef /= 10000.0
    aAddSkillPer /= 10000.0
    aPMDamPer /= 10000.0
    dPMDamPerDef /= 10000.0
    aSuperDamPer /= 10000.0
@@ -1088,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:
@@ -1101,9 +1134,6 @@
    elif isAngerSkill:
        hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 2))
        GameWorld.DebugLog("    怒气技能伤害=%s" % (hurtValue))
    elif isAtkbackSkill:
        hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 3))
        GameWorld.DebugLog("    反击伤害=%s" % (hurtValue))
    else:
        hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 4))
        GameWorld.DebugLog("    其他伤害=%s" % (hurtValue))
@@ -1113,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):
@@ -1127,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):
@@ -1136,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)