#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Skill.TurnPassive
|
#
|
# @todo:»ØºÏ±»¶¯´¥·¢¹ÜÀí
|
# @author hxp
|
# @date 2025-8-11
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: »ØºÏ±»¶¯¹ÜÀí£¬Ö÷Òª±»¶¯´¥·¢µÄ¼¼ÄÜ¡¢buffµÈ¹ÜÀí
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2025-8-11 ÏÂÎç3:47:07"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import PassiveTrigger
|
import ChConfig
|
|
GameWorld.ImportAll("Script\\Skill\\", "PassiveTrigger")
|
|
def RefreshPassive(batObj):
|
''' ˢб»¶¯Ð§¹û£¬Ò»°ã¿ÉÄÜ´æÔÚÓÚ¼¼ÄÜ»òbuffÖÐ
|
'''
|
passiveEffMgr = batObj.GetPassiveEffManager()
|
skillEffInfo = passiveEffMgr.RefreshSkillPassiveEffect()
|
buffEffInfo = passiveEffMgr.RefreshBuffPassiveEffect()
|
skillEffInfo and GameWorld.DebugLog(" ±»¶¯¼¼ÄÜЧ¹û: %s" % skillEffInfo)
|
buffEffInfo and GameWorld.DebugLog(" ±»¶¯BuffЧ¹û: %s" % buffEffInfo)
|
return
|
|
def OnTriggerPassiveEffect(turnFight, batObj, triggerWay, tagObj=None, connSkill=None, connSkillTypeID=0):
|
''' ´¥·¢±»¶¯Ð§¹û£¬¿ÉÄÜ´¥·¢¼¼ÄÜ¡¢buff£¬Ðè¸ù¾ÝÓÅÏȼ¶´¥·¢
|
'''
|
passiveEffMgr = batObj.GetPassiveEffManager()
|
effInfoList = passiveEffMgr.GetPassiveEffByTrigger(triggerWay, connSkill, connSkillTypeID)
|
if not effInfoList:
|
return
|
# [["skill/buff", skillID/buffID, effIDList], ...]
|
tagID = tagObj.GetID() if tagObj else 0
|
GameWorld.DebugLog("´¥·¢±»¶¯: triggerWay=%s,objID=%s,tagID=%s,%s" % (triggerWay, batObj.GetID(), tagID, effInfoList))
|
for effInfo in effInfoList:
|
sign = effInfo[0]
|
if sign == "skill":
|
skillID, effIDList = effInfo[1:]
|
__doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill)
|
|
elif sign == "buff":
|
buffID, effIDList = effInfo[1:]
|
__doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill)
|
|
return
|
|
def __doTriggerPassiveEffectBySkill(turnFight, batObj, tagObj, triggerWay, skillID, effIDList, connSkill=None):
|
skillMgr = batObj.GetSkillManager()
|
effSkill = skillMgr.FindSkillByID(skillID)
|
if not effSkill and connSkill and connSkill.GetSkillID() == skillID:
|
effSkill = connSkill
|
if not effSkill:
|
return
|
|
for effID in effIDList:
|
curEffect = effSkill.GetEffectByID(effID, triggerWay)
|
if not curEffect:
|
continue
|
DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
|
|
return
|
|
def DoSkillEffectLogic(turnFight, batObj, tagObj, effSkill, curEffect, connSkill):
|
effID = curEffect.GetEffectID()
|
if not effID:
|
return
|
pyName = "PassiveEff_%s" % effID
|
callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoSkillEffectLogic"))
|
if not callFunc:
|
return
|
callFunc(turnFight, batObj, tagObj, effSkill, curEffect, connSkill)
|
return
|
|
def __doTriggerPassiveEffectByBuff(turnFight, batObj, tagObj, triggerWay, buffID, effIDList, connSkill=None):
|
buffMgr = batObj.GetBuffManager()
|
effBuff = buffMgr.GetBuff(buffID)
|
if not effBuff:
|
return
|
skillData = effBuff.GetSkillData()
|
|
for effID in effIDList:
|
curEffect = skillData.GetEffectByID(effID, triggerWay)
|
if not curEffect:
|
continue
|
DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
|
|
return
|
|
def DoBuffEffectLogic(turnFight, batObj, tagObj, effBuff, curEffect, connSkill):
|
effID = curEffect.GetEffectID()
|
if not effID:
|
return
|
pyName = "PassiveEff_%s" % effID
|
callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "DoBuffEffectLogic"))
|
if not callFunc:
|
return
|
callFunc(turnFight, batObj, tagObj, effBuff, curEffect, connSkill)
|
return
|
|
def GetTriggerEffectValue(turnFight, atkObj, defObj, calcEffID, connSkill=None):
|
''' »ñÈ¡´¥·¢±»¶¯µÄÖµ£¬Ò»°ãÓÃÓÚijÖÖÌõ¼þϲŻá²úÉúµÄÖµ£¬ÈçxxÇé¿öÏÂÊôÐԱ仯 »ò xxÇé¿öÏÂÊÇ·ñ·¢Éúʲô
|
@param calcEffID: ÐèҪͳ¼ÆµÄЧ¹ûID£¬¿ÉÒÔÊÇÊôÐÔID»òÕ߯äËû×Ô¶¨ÒåЧ¹ûID
|
@return: ´¥·¢µÄÖµ£¬0-ûÓд¥·¢»ò±¾Éí´¥·¢µÄֵΪ0£»·Ç0-´¥·¢µÄ¾ßÌåÖµ
|
'''
|
|
triggerWay = ChConfig.TriggerWay_CalcEffValue
|
passiveEffMgr = atkObj.GetPassiveEffManager()
|
effInfoList = passiveEffMgr.GetPassiveEffByTrigger("%s_%s" % (triggerWay, calcEffID), connSkill)
|
if not effInfoList:
|
return 0
|
|
curValue = 0
|
skillMgr = atkObj.GetSkillManager()
|
buffMgr = atkObj.GetBuffManager()
|
# [["skill/buff", skillID/buffID, effIDList], ...]
|
tagID = defObj.GetID() if defObj else 0
|
GameWorld.DebugLog("ͳ¼Æ±»¶¯Ð§¹ûÖµ: calcEffID=%s,objID=%s,tagID=%s,%s" % (calcEffID, atkObj.GetID(), tagID, effInfoList))
|
for effInfo in effInfoList:
|
sign = effInfo[0]
|
if sign == "skill":
|
skillID, effIDList = effInfo[1:]
|
effSkill = skillMgr.FindSkillByID(skillID)
|
if not effSkill and connSkill and connSkill.GetSkillID() == skillID:
|
effSkill = connSkill
|
elif sign == "buff":
|
buffID, effIDList = effInfo[1:]
|
effBuff = buffMgr.GetBuff(buffID)
|
if not effBuff:
|
continue
|
effSkill = effBuff.GetSkillData()
|
else:
|
continue
|
|
if not effSkill:
|
continue
|
|
for effID in effIDList:
|
effect = effSkill.GetEffectByID(effID, triggerWay)
|
if not effect:
|
continue
|
effID = effect.GetEffectID()
|
if not effID or effID != calcEffID:
|
continue
|
|
if effID in ChConfig.AttrIDList:
|
pyName = "PassiveEff_Attr"
|
else:
|
pyName = "PassiveEff_%s" % effID
|
|
callFunc = GameWorld.GetExecFunc(PassiveTrigger, "%s.%s" % (pyName, "GetHappenValue"))
|
if not callFunc:
|
continue
|
value = callFunc(atkObj, defObj, effect, effSkill)
|
if value is None:
|
continue
|
|
if effID in ChConfig.PassiveEffHappenValueList:
|
if value:
|
return value
|
elif effID in ChConfig.PassiveEffValueMaxList:
|
curValue = max(curValue, value) # È¡×î´óÖµ
|
elif effID in ChConfig.PassiveEffValueMinList:
|
if not curValue:
|
curValue = value
|
elif value > 0:
|
curValue = min(curValue, value) # È¡×îСֵ
|
else:
|
curValue += value
|
#if skillTypeID not in Def_PassiveSkillValueNoCD:
|
# if curSkill.GetCoolDownTime():
|
# SkillCommon.SetSkillRemainTime(curSkill, 0, tick, attacker)
|
|
return curValue
|
|