| | |
| | | DoBeAttackResult(turnFight, curBatObj, useSkill, True)
|
| | | return
|
| | |
|
| | | def DoCombo(turnFight, curBatObj, useSkill):
|
| | | def DoCombo(turnFight, atkObj, useSkill):
|
| | | '''
|
| | | 格挡、反击、连击规则
|
| | | 1. 所有武将或怪物均可能产生格挡,群攻时格挡一对一判断,均可能产生格挡
|
| | |
| | |
|
| | | tagFriendly = useSkill.GetTagFriendly()
|
| | | if tagFriendly:
|
| | | tagObj = GetRelativeObj(turnFight, curBatObj)
|
| | | tagObj = GetRelativeObj(turnFight, atkObj)
|
| | | else:
|
| | | tagObjList = useSkill.GetTagObjList()
|
| | | if not tagObjList:
|
| | |
| | | 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):
|
| | |
| | | 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):
|
| | | '''被攻击结果
|
| | |
| | | # 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()
|
| | |
|
| | |
| | | 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):
|
| | |
| | | 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))
|
| | |
| | | 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)
|
| | |
| | | dNormalSkillPerDef /= 10000.0
|
| | | aAngerSkillPer /= 10000.0
|
| | | dAngerSkillPerDef /= 10000.0
|
| | | aAddSkillPer /= 10000.0
|
| | | aPMDamPer /= 10000.0
|
| | | dPMDamPerDef /= 10000.0
|
| | | aSuperDamPer /= 10000.0
|
| | |
| | | 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:
|
| | |
| | |
|
| | | 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):
|