#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Skill.TurnBuff
|
#
|
# @todo:»ØºÏÕ½¶·buff
|
# @author hxp
|
# @date 2025-08-06
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: »ØºÏÕ½¶·buff
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2025-08-06 18:30"""
|
#-------------------------------------------------------------------------------
|
|
import ChConfig
|
import GameWorld
|
import ChPyNetSendPack
|
import IpyGameDataPY
|
import TurnBuffs
|
import BattleObj
|
import TurnPassive
|
|
GameWorld.ImportAll("Script\\Skill\\", "TurnBuffs")
|
|
def GetAddBuffValue(turnFight, attacker, defender, curSkill):
|
if not curSkill.GetAtkType():
|
return []
|
callFunc = GameWorld.GetExecFunc(TurnBuffs, "BuffAtkType_%d.%s" % (curSkill.GetAtkType(), "CalcBuffValue"))
|
if not callFunc:
|
return []
|
ret = callFunc(turnFight, attacker, defender, curSkill)
|
if ret == None:
|
return []
|
return ret
|
|
def CopyBuff(turnFight, curBatObj, curBuff, tagBuff, bySkill=None, isNewAdd=False, refreshTimeLayer=True):
|
'''¿½±´buffÊý¾Ý£¬²»º¬Ä¿±êbuffID¡¢¹éÊô£¬²¢Ë¢ÐÂʱ¼ä
|
@param refreshTimeLayer: Ë¢ÐÂÊ£Óàʱ¼ä¡¢²ã¼¶
|
'''
|
skillData = curBuff.GetSkillData()
|
curBuff.SetAddTiming(curBatObj.GetTiming())
|
if refreshTimeLayer:
|
curBuff.SetRemainTime(max(tagBuff.GetRemainTime(), skillData.GetLastTime()))
|
curBuff.SetLayer(max(tagBuff.GetLayer(), skillData.GetLayerMax()))
|
else:
|
curBuff.SetRemainTime(tagBuff.GetRemainTime())
|
curBuff.SetLayer(tagBuff.GetLayer())
|
curBuff.SetValue1(tagBuff.GetValue1())
|
curBuff.SetValue2(tagBuff.GetValue2())
|
curBuff.SetValue3(tagBuff.GetValue3())
|
curBuff.SetIsCopy(1)
|
GameWorld.DebugLogEx(" ¿½±´buff: curBuffID=%s,tagBuffID=%s,Remain=%s,Layer=%s,Value=%s",
|
curBuff.GetBuffID(), tagBuff.GetBuffID(), curBuff.GetRemainTime(), curBuff.GetLayer(),
|
[curBuff.GetValue1(), curBuff.GetValue2(), curBuff.GetValue3()])
|
relatedSkillID = bySkill.GetSkillID() if bySkill else 0
|
SyncBuffRefresh(turnFight, curBatObj, curBuff, relatedSkillID, isNewAdd)
|
return
|
|
def DoAddBuffBySkillID(turnFight, batObj, skillID, buffOwner=None, bySkill=None, afterLogic=False, isSync=True, setLayerCnt=0):
|
## ¸ù¾Ý¼¼ÄÜIDÌí¼Óbuff
|
if not skillID:
|
return
|
skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
|
if not skillIpyData:
|
return
|
ownerID = buffOwner.GetID() if buffOwner else 0
|
tagObjList = [batObj]
|
useSkill = BattleObj.PySkill(skillIpyData, ownerID)
|
useSkill.SetTagObjList(tagObjList)
|
|
addBuff = OnAddBuff(turnFight, batObj, useSkill, buffOwner, bySkill, afterLogic, isSync=isSync, setLayerCnt=setLayerCnt)
|
|
return addBuff
|
|
def OnAddBuff(turnFight, batObj, buffSkill, buffOwner=None, bySkill=None, afterLogic=False, isSync=True, **kwargs):
|
skillID = buffSkill.GetSkillID()
|
bySkill = buffSkill.GetBySkill() if not bySkill else bySkill
|
relatedSkillID = bySkill.GetSkillID() if bySkill else 0
|
curID = batObj.GetID()
|
if not buffOwner:
|
buffOwner = batObj
|
ownerID = buffOwner.GetID()
|
|
skillType = buffSkill.GetSkillType()
|
#ÎÞµÐÃâÒß³ÖÐø¼õÒæbuff¡¢¿ØÖÆÀàbuff
|
if skillType in [ChConfig.Def_SkillType_LstDepBuff, ChConfig.Def_SkillType_Action] \
|
and batObj.CheckInState(ChConfig.BatObjState_Wudi):
|
GameWorld.DebugLogEx("ÎÞµÐ״̬ÏÂÃâÒ߸Ãbuff: curID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s", curID, skillID, ownerID, relatedSkillID)
|
return
|
|
#±»¶¯´¥·¢ÃâÒß¿ØÖÆbuff
|
if skillType == ChConfig.Def_SkillType_Action:
|
if TurnPassive.GetTriggerEffectValue(turnFight, batObj, buffOwner, ChConfig.PassiveEff_ImmuneControlBuff, buffSkill):
|
GameWorld.DebugLogEx("ѪÁ¿µÍÓÚ°Ù·ÖxʱÃâÒß¿ØÖÆbuff: curID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s,hp:%s/%s",
|
curID, skillID, ownerID, relatedSkillID, batObj.GetHP(), batObj.GetMaxHP())
|
return
|
|
#¹â»·¼¼ÄÜ£¬Ä¬ÈÏÊ©·¨ÕßÉíÉÏÒ²±ØÐëÓУ¬Ê±³¤ÓëÊ©·¨ÕßÉíÉϵÄͬ²½
|
haloSrcBuff = None # ¹âÔ´buff
|
if skillType == ChConfig.Def_SkillType_Halo and ownerID != curID:
|
haloSrcBuff = buffOwner.GetBuffManager().FindBuffBySkillID(skillID, ownerID)
|
if not haloSrcBuff:
|
GameWorld.ErrLog("Ìí¼Ó¹â»·¼¼ÄÜʱÕÒ²»µ½¹âÔ´! skillID=%s,ownerID=%s" % (skillID, ownerID))
|
return
|
|
buffValueList = GetAddBuffValue(turnFight, buffOwner, batObj, buffSkill)
|
|
skillTypeID = buffSkill.GetSkillTypeID()
|
buffRepeat = buffSkill.GetBuffRepeat()
|
setLayerCnt = kwargs.get("setLayerCnt", 0)
|
if setLayerCnt > 0:
|
addLayerCnt = setLayerCnt
|
GameWorld.DebugLogEx("Íⲿֱ½ÓÖ¸¶¨Ìí¼ÓµÄbuff²ã¼¶: setLayerCnt=%s", setLayerCnt)
|
else:
|
addLayerCnt = buffSkill.GetLayerCnt()
|
addLayerEff = buffSkill.GetEffectByID(ChConfig.PassiveEff_AddBuffLayerByWeight)
|
if addLayerEff:
|
# ¿ÉÖ¸¶¨À´Ô´¼¼Äܼ¼ÄܲÅÉúЧ£¬²»Ö¸¶¨µÄ»°Ä¬ÈÏÉúЧ
|
if not addLayerEff.GetTriggerSrc() or addLayerEff.GetTriggerSrc() == relatedSkillID:
|
addLayerCnt = GameWorld.GetResultByWeightList(addLayerEff.GetEffectValues(), addLayerCnt)
|
addLayerCnt += TurnPassive.GetTriggerEffectValue(turnFight, buffOwner, batObj, ChConfig.PassiveEff_AddBuffLayer, buffSkill)
|
maxLayerCnt = buffSkill.GetLayerMax()
|
if maxLayerCnt:
|
maxLayerCnt += TurnPassive.GetTriggerEffectValue(turnFight, buffOwner, batObj, ChConfig.PassiveEff_AddBuffLayerMax, buffSkill)
|
|
GameWorld.DebugLogEx("OnAddBuff: curID=%s,skillID=%s,atkType=%s,buffValueList=%s,addLayerCnt=%s/%s,ownerID=%s,relatedSkillID=%s",
|
curID, skillID, buffSkill.GetAtkType(), buffValueList, addLayerCnt, maxLayerCnt, ownerID, relatedSkillID)
|
#buffÖØ¸´»ñµÃʱµÄµþ¼Ó¹æÔò
|
#ÒÔϹæÔòĬÈÏÕë¶ÔµÄÊÇÏàͬʩ·¨Õߣ¬¼´ÏàͬÀ´Ô´µÄ´¦Àí
|
#Èç¹ûÓÐÕë¶Ô²»Í¬Ê©·¨ÕߵĹæÔò»á˵Ã÷
|
#0 ¸²¸Ç£ºÖØÖÃÊ£Óà»ØºÏ£¬Ð§¹û¸²¸Ç
|
#1 ÑÓ³¤»ØºÏ
|
#2
|
#3 µþ¼Ó²ã¼¶
|
#4 ¶ÀÁ¢£º»ØºÏ¡¢Ð§¹û¶ÀÁ¢¼ÆËã
|
#5 Ψһ£¬Ç¿ÖƸ²¸Ç²»Í¬À´Ô´Í¬×´Ì¬buff£¬Èç³°·í״̬
|
|
buffMgr = batObj.GetBuffManager()
|
|
if buffRepeat == 4: # 4 ¶ÀÁ¢£º»ØºÏ¡¢Ð§¹û¶ÀÁ¢¼ÆËã
|
# Èç¹ûÓÐÏÞÖÆ×î´ó²ãÊý£¬´ïµ½ÉÏÏÞʱÈç¹ûÓÐеIJãÊý½øÀ´£¬¾ÍÌæ»»µô³ÖÐøÊ±¼ä×î¶ÌµÄ£¬Ö»ËãÏàͬÀ´Ô´
|
if maxLayerCnt:
|
buffList = buffMgr.FindBuffListBySkillTypeID(skillTypeID)
|
if len(buffList) >= maxLayerCnt:
|
delBuff = None
|
for buff in buffList:
|
if not buff:
|
continue
|
if buff.GetOwnerID() != ownerID:
|
continue
|
if not delBuff or delBuff.GetRemainTime() < buff.GetRemainTime():
|
delBuff = buff
|
if delBuff:
|
GameWorld.DebugLogEx("ɾ³ý¶ÀÁ¢²ã¼¶¶àÓàbuff: buffID=%s,ownerID=%s,remainTime=%s", delBuff.GetBuffID(), ownerID, delBuff.GetRemainTime())
|
DoBuffDel(turnFight, batObj, delBuff, bySkill, afterLogic, buffOwner)
|
|
elif buffRepeat == 5: # 5 Ψһ£¬Ç¿ÖƸ²¸Ç²»Í¬À´Ô´Í¬×´Ì¬buff£¬Èç³°·í״̬
|
buffState = buffSkill.GetCurBuffState()
|
for index in range(buffMgr.GetBuffCount())[::-1]:
|
buff = buffMgr.GetBuffByIndex(index)
|
skillData = buff.GetSkillData()
|
if buffState and skillData.GetCurBuffState() != buffState:
|
continue
|
# ɾ³ýÏàͬ״̬µÄbuff
|
DoBuffDel(turnFight, batObj, buff, bySkill, afterLogic, buffOwner)
|
else:
|
buffList = buffMgr.FindBuffListBySkillTypeID(skillTypeID)
|
for buff in buffList:
|
if not buff:
|
continue
|
if buff.GetOwnerID() != ownerID:
|
continue
|
buffID = buff.GetBuffID()
|
nowLayerCnt = buff.GetLayer()
|
GameWorld.DebugLogEx(" ÒѾ´æÔÚ¸Ãbuff: buffID=%s,skillTypeID=%s,ownerID=%s,buffRepeat=%s", buffID, skillTypeID, ownerID, buffRepeat)
|
|
updLayerCnt = addLayerCnt
|
if buffRepeat == 3: # µþ¼Ó²ã¼¶
|
updLayerCnt = nowLayerCnt + addLayerCnt
|
if maxLayerCnt and updLayerCnt > maxLayerCnt:
|
updLayerCnt = maxLayerCnt
|
GameWorld.DebugLogEx(" µþ¼Ó²ã¼¶: nowLayerCnt=%s,addLayerCnt=%s,updLayerCnt=%s,maxLayerCnt=%s", nowLayerCnt, addLayerCnt, updLayerCnt, maxLayerCnt)
|
else:
|
GameWorld.DebugLogEx(" ĬÈϸ²¸Ç")
|
|
# ÖØÖûغϡ¢CD¡¢ÖµµÈ
|
buff.SetAddTiming(batObj.GetTiming())
|
buff.SetRemainTime(buffSkill.GetLastTime())
|
buff.SetLayer(updLayerCnt)
|
buff.SetBuffValueList(buffValueList)
|
buff.ResetEffectValueEx()
|
if afterLogic and bySkill:
|
bySkill.AddAfterLogic(ChConfig.AfterLogic_AddBuff, [batObj, buff, buffOwner])
|
elif isSync:
|
SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID, isNewAdd=True)
|
|
RefreshBuffEffect(turnFight, batObj, buff, buffSkill, buffOwner, refreshType=2)
|
return buff
|
|
newBuff = __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill, afterLogic, setLayerCnt=addLayerCnt, isSync=isSync)
|
if skillType == ChConfig.Def_SkillType_Halo and newBuff:
|
__addHaloBuffEffObjID(curID, newBuff, skillID, ownerID, haloSrcBuff)
|
return newBuff
|
|
def __addNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill=None, afterLogic=False, setLayerCnt=0, isSync=True):
|
curID = batObj.GetID()
|
skillID = buffSkill.GetSkillID()
|
buff = buffMgr.AddBuff(skillID)
|
if not buff:
|
GameWorld.DebugLogEx(" Ìí¼Óbuffʧ°Ü! skillID=%s", skillID, curID)
|
return
|
relatedSkillID = bySkill.GetSkillID() if bySkill else 0
|
ownerID = buffOwner.GetID()
|
buffID = buff.GetBuffID()
|
timing = batObj.GetTiming()
|
|
GameWorld.DebugLogEx(" __addNewBuff. buffID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s,timing=%s",
|
buffID, skillID, ownerID, relatedSkillID, timing, curID)
|
buff.SetAddTiming(timing) # Î佫µ±Ç°ÔÚʲôʱ»ú¾ÍÉèÖÃΪʲôʱ»ú
|
buff.SetOwnerID(ownerID)
|
buff.SetRemainTime(buffSkill.GetLastTime())
|
buff.SetLayer(setLayerCnt)
|
buff.SetBuffValueList(buffValueList)
|
curBuffState = buffSkill.GetCurBuffState()
|
if curBuffState:
|
buffMgr.AddBuffState(curBuffState, buffID)
|
|
if afterLogic and bySkill:
|
bySkill.AddAfterLogic(ChConfig.AfterLogic_AddBuff, [batObj, buff, buffOwner])
|
elif isSync:
|
SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID, isNewAdd=True)
|
|
RefreshBuffEffect(turnFight, batObj, buff, buffSkill, buffOwner, refreshType=1)
|
return buff
|
|
def RefreshBuffEffect(turnFight, batObj, curBuff, buffSkill=None, buffOwner=None, refreshType=0):
|
## Ë¢ÐÂbuffЧ¹û
|
# @param buffSkill: Ìí¼Ó¸Ãbuffʱ¶ÔÓ¦µÄbuff¼¼ÄÜID£¬¿ÉÄÜΪNone£¬Èç·ÇÌí¼ÓʱµÄË¢ÐÂ
|
# @param refreshType: 0-ÆÕͨˢУ»1-ÐÂÌí¼ÓˢУ»2-¸²¸ÇË¢ÐÂ
|
|
isRefreshAttr = False # ÊÇ·ñË¢ÊôÐÔ
|
|
skillData = curBuff.GetSkillData()
|
passiveEffMgr = batObj.GetPassiveEffManager()
|
# buffЧ¹û¼ÓÈë
|
for effectIndex in range(0, skillData.GetEffectCount()):
|
curEffect = skillData.GetEffect(effectIndex)
|
effectID = curEffect.GetEffectID()
|
if effectID == 0:
|
continue
|
|
if curEffect.GetTriggerWay():
|
if refreshType == 1 and curEffect.GetTriggerBuffEnable():
|
passiveEffMgr.AddBuffPassiveEffect(curBuff, skillData, curEffect)
|
|
elif effectID in ChConfig.AttrIDList:
|
isRefreshAttr = True
|
|
if refreshType and buffSkill and buffOwner:
|
TurnPassive.OnTriggerPassiveEffect(turnFight, buffOwner, ChConfig.TriggerWay_BuffAddByOwner, connSkill=buffSkill, connBuff=curBuff)
|
|
if isRefreshAttr:
|
RefreshBuffAttr(batObj)
|
|
if refreshType in [1, 2] and skillData.GetCurBuffState() == ChConfig.BatObjState_Frozen:
|
__smyRecordEnemyFrozen(turnFight, batObj, curBuff)
|
return
|
|
def __smyRecordEnemyFrozen(turnFight, batObj, curBuff):
|
'''ÌØÊâ´¦Àí˾Âíܲ¼Ç¼µÐ·½±ù¶³£¬±È½ÏÌØÊ⣬ʹÓó¡¾°±È½ÏרÓã¬Ö±½Óд£¬¼õÉÙÿ´ÎbuffµÄ´¥·¢±»¶¯±éÀú´ÎÊý
|
DZÄÜID 1012050
|
˾Âíܲ´æ»îʱ£¬¼Ç¼µÐ·½±»±ù¶³´ÎÊý£¬Ë¾ÂíܲËÀÍöºó£¬¶ÔµÐ·½·µ»¹¹¥»÷Á¦100%µÄÉ˺¦£¬µÐ·½Ã¿±»±ù¶³Ò»´Î£¬É˺¦ÌáÉý100%£¬×î¶àÌáÉýÖÁ1000%£¬±¾´ÎÉ˺¦Óɵз½ËùÓÐÈ˾ù̯¡££¨Á½¸öÒ»ÆðËÀËãÎÒ·½Ê¤Àû£©
|
'''
|
faction = batObj.GetFaction()
|
smyFaction = ChConfig.Def_FactionA if faction == ChConfig.Def_FactionB else ChConfig.Def_FactionB
|
batFaction = turnFight.getBatFaction(smyFaction)
|
if not batFaction:
|
return
|
batLineup = batFaction.getBatlineup(1)
|
if ChConfig.HeroID_Simayi not in batLineup.heroObjIDDict:
|
return
|
smyObjID = batLineup.heroObjIDDict[ChConfig.HeroID_Simayi]
|
smyObj = BattleObj.GetBatObjMgr().getBatObj(smyObjID)
|
if not smyObj or not smyObj.IsAlive():
|
return
|
smySkillID = ChConfig.SkillID_SmyFanzhao
|
smySkill = smyObj.GetSkillManager().FindSkillByID(smySkillID)
|
if not smySkill:
|
GameWorld.DebugLogEx("˾Âíܲ»¹Ã»ÓмǼµÐ·½±»±ù¶³´ÎÊýµÄDZÄÜ: %s" % smySkillID)
|
return
|
frozenCnt = smyObj.GetDictByKey("EnemyFrozen") + 1
|
smyObj.SetDict("EnemyFrozen", frozenCnt)
|
GameWorld.DebugLogEx("˾Âíܲ¼Ç¼µÐ·½±»±ù¶³´ÎÊý: %s" % frozenCnt)
|
return
|
|
def __addHaloBuffEffObjID(curID, newBuff, skillID, ownerID, haloSrcBuff):
|
## Ìí¼Ó¹â»·buffÓÐЧµÄÄ¿±êID£¬Ìí¼Ó¹â»·buffʱÌí¼Ó£¬²»ÒƳý£¬ÓɹâÔ´¹ÜÀíÒÆ³ý£¨¹âÔ´Î佫ËÀÍöʱɾ³ý£©
|
if curID == ownerID:
|
newBuff.AddHaloObjID(curID) # ¹âÔ´Ö±½ÓÌí¼ÓÄ¿±ê
|
return
|
haloSrcBuff.AddHaloObjID(curID) # ¹âÔ´ÏÈÌí¼ÓÐÂÄ¿±ê
|
haloObjIDList = haloSrcBuff.GetHaloObjIDList()
|
newBuff.SetHaloObjIDList(haloObjIDList) # ÐÂbuffÖ±½Óͬ²½ÉèÖÃΪ¹âÔ´ÓÐЧĿ±ê
|
|
batObjMgr = BattleObj.GetBatObjMgr()
|
for haloObjID in haloObjIDList:
|
if haloObjID in [ownerID, curID]:
|
continue
|
haloObj = batObjMgr.getBatObj(haloObjID)
|
if not haloObj:
|
continue
|
haloBuff = haloObj.GetBuffManager().FindBuffBySkillID(skillID, ownerID)
|
if not haloBuff:
|
continue
|
haloBuff.SetHaloObjIDList(haloObjIDList) # ³ý¹âÔ´¼°Ð¼ÓÈëµÄÖ±½Óͬ²½×îеÄÓÐЧĿ±ê
|
return
|
|
def SetBuffRemainTime(turnFight, batObj, curBuff, remainTime):
|
if remainTime <= 0:
|
DoBuffDel(turnFight, batObj, curBuff)
|
return
|
|
buffObjID = batObj.GetID()
|
ownerID = curBuff.GetOwnerID()
|
skillData = curBuff.GetSkillData()
|
skillID = skillData.GetSkillID()
|
skillType = skillData.GetSkillType()
|
|
curBuff.SetRemainTime(remainTime)
|
SyncBuffRefresh(turnFight, batObj, curBuff)
|
|
if skillType == ChConfig.Def_SkillType_Halo and ownerID == buffObjID:
|
haloObjIDList = curBuff.GetHaloObjIDList()
|
GameWorld.DebugLogEx("¹â»·buff»ØºÏ±ä¸üͬ²½ÆäËûÓÐЧĿ±ê¸Ã¹â»·: skillID=%s,ownerID=%s,haloObjIDList=%s", skillID, ownerID, haloObjIDList)
|
batObjMgr = BattleObj.GetBatObjMgr()
|
for haloObjID in haloObjIDList:
|
if haloObjID == buffObjID:
|
continue
|
haloObj = batObjMgr.getBatObj(haloObjID)
|
if not haloObj:
|
continue
|
haloBuff = haloObj.GetBuffManager().FindBuffBySkillID(skillID, ownerID)
|
if not haloBuff:
|
continue
|
haloBuff.SetRemainTime(remainTime)
|
SyncBuffRefresh(turnFight, haloObj, haloBuff)
|
|
return
|
|
def DoBuffLayerChange(turnFight, batObj, curBuff, updLayer, relatedSkill=None):
|
## buff²ã¼¶±ä¸ü
|
if updLayer > 0:
|
curBuff.SetLayer(updLayer)
|
relatedSkillID = relatedSkill.GetSkillID() if relatedSkill else 0
|
SyncBuffRefresh(turnFight, batObj, curBuff, relatedSkillID)
|
RefreshBuffEffect(turnFight, batObj, curBuff)
|
return
|
DoBuffDel(turnFight, batObj, curBuff, relatedSkill)
|
return
|
|
def DoBuffDel(turnFight, batObj, curBuff, relatedSkill=None, afterLogic=False, tagObj=None, noRefreshAttr=False, isSync=True, afterTriggerData=None):
|
'''ɾ³ýbuff
|
@param relatedSkill: ¹ØÁªµÄ¼¼ÄÜ
|
@param afterLogic: ÊÇ·ñÐèÒªÔÚ¹ØÁª¼¼ÄÜ´¦ÀíÍê±Ïºó²Å´¦Àíɾ³ýºóÐøÂß¼£¬Èç֪ͨ£¬´¥·¢±»¶¯µÈ
|
@param tagObj: ÓÉËÒýÆðµÄbuffɾ³ý
|
@param noRefreshAttr: ²»Ë¢ÐÂÊôÐÔ
|
@return: isRefreshAttr ÊÇ·ñÐèҪˢÊôÐÔ£¬Èç¹ûÉèÖÃÁË noRefreshAttr£¬ÔòÒªÔÚÍâ²ãË¢ÊôÐÔ
|
@return: afterTriggerData afterLogicΪTrueʱ£¬¸½´øµÄ±»¶¯´¥·¢Êý¾Ý£¬ÒòΪbuff±»É¾³ýºó¸Ãbuff×Ô´øµÄ±»¶¯Ð§¹ûÒ²»á±»É¾³ý£¬ËùÒÔÏÈ»º´æ¹©ºóÐø´¦Àí
|
'''
|
|
release = True # ÊÍ·ÅbuffʵÀý
|
#isSync = True
|
relatedSkillID = relatedSkill.GetSkillID() if relatedSkill else 0
|
if afterLogic and relatedSkill:
|
release = False
|
isSync = False
|
|
isRefreshAttr = False # ÊÇ·ñË¢ÊôÐÔ
|
haveBuffPassiveEff = False
|
|
buffObjID = batObj.GetID()
|
buffMgr = batObj.GetBuffManager()
|
buffID = curBuff.GetBuffID()
|
ownerID = curBuff.GetOwnerID()
|
skillData = curBuff.GetSkillData()
|
skillID = skillData.GetSkillID()
|
skillType = skillData.GetSkillType()
|
|
# ÏÈɾ³ýbuffÔÙ´¥·¢ÆäËûÄÚÈÝ£¬·ÀÖ¹µ±Ç°ÒªÉ¾³ýµÄbuffÓ°ÏìºóÐø´¥·¢µÄÄÚÈÝ£¬ÈçÎÞµÐbuffµÈ£¬ÀíÂÛÉÏ´¥·¢µÄºóÐøÄÚÈÝÎÞµÐbuff²»Ó¦¸ÃÔÙÉúЧ
|
curBuffState = skillData.GetCurBuffState()
|
if curBuffState:
|
buffMgr.DelBuffState(curBuffState, buffID)
|
|
buffMgr.DelBuff(buffID, release)
|
if isSync:
|
SyncBuffDel(turnFight, buffObjID, buffID, relatedSkillID)
|
if afterLogic and relatedSkill:
|
tagObjID = tagObj.GetID() if tagObj else buffObjID
|
relatedSkill.AddAfterLogic(ChConfig.AfterLogic_DelBuff, [buffObjID, curBuff, tagObjID, afterTriggerData])
|
|
#buffÏûʧµÄ´¥·¢
|
for effectIndex in range(0, skillData.GetEffectCount()):
|
curEffect = skillData.GetEffect(effectIndex)
|
effectID = curEffect.GetEffectID()
|
|
if not effectID:
|
continue
|
|
triggerWay = curEffect.GetTriggerWay()
|
if triggerWay:
|
if triggerWay == ChConfig.TriggerWay_BuffDel:
|
TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BuffDel, connBuff=curBuff)
|
|
if curEffect.GetTriggerBuffEnable():
|
haveBuffPassiveEff = True
|
|
elif effectID in ChConfig.AttrIDList:
|
isRefreshAttr = True
|
|
if haveBuffPassiveEff:
|
batObj.GetPassiveEffManager().DelBuffPassiveEffect(buffID)
|
|
if isRefreshAttr and not noRefreshAttr:
|
RefreshBuffAttr(batObj)
|
|
if skillType == ChConfig.Def_SkillType_Halo and ownerID == buffObjID:
|
haloObjIDList = curBuff.GetHaloObjIDList()
|
GameWorld.DebugLogEx("¹â»·buffɾ³ýͬ²½É¾³ýÆäËûÓÐЧĿ±ê¸Ã¹â»·: skillID=%s,ownerID=%s,haloObjIDList=%s", skillID, ownerID, haloObjIDList)
|
batObjMgr = BattleObj.GetBatObjMgr()
|
for haloObjID in haloObjIDList:
|
if haloObjID == buffObjID:
|
continue
|
haloObj = batObjMgr.getBatObj(haloObjID)
|
if not haloObj:
|
continue
|
haloBuff = haloObj.GetBuffManager().FindBuffBySkillID(skillID, ownerID)
|
if not haloBuff:
|
continue
|
DoBuffDel(turnFight, haloObj, haloBuff, relatedSkill, afterLogic, tagObj)
|
return isRefreshAttr
|
|
def DoBuffDelAfterLogicOver(turnFight, buffObjID, curBuff, relatedSkill):
|
## buffɾ³ýºóÐø´¦ÀíÂß¼´¦ÀíÍê±Ï
|
relatedSkillID = relatedSkill.GetSkillID() if relatedSkill else 0
|
SyncBuffDel(turnFight, buffObjID, curBuff.GetBuffID(), relatedSkillID)
|
return
|
|
def DoBuffProcess(turnFight, batObj, curBuff, **kwargs):
|
skillData = curBuff.GetSkillData()
|
if not skillData.GetAtkType():
|
return
|
callFunc = GameWorld.GetExecFunc(TurnBuffs, "BuffAtkType_%d.%s" % (skillData.GetAtkType(), "DoBuffProcess"))
|
if callFunc:
|
callFunc(turnFight, batObj, curBuff, **kwargs)
|
return
|
|
def DoBuffByDead(turnFight, batObj):
|
## ËÀÍö´¦Àíbuff
|
isRefreshAttr = False
|
objID = batObj.GetID()
|
buffMgr = batObj.GetBuffManager()
|
for index in range(buffMgr.GetBuffCount())[::-1]:
|
buff = buffMgr.GetBuffByIndex(index)
|
buffID = buff.GetBuffID()
|
skillID = buff.GetSkillID()
|
if buff.GetBuffRetain()&pow(2, ChConfig.BuffRetainType_Dead):
|
GameWorld.DebugLogEx("ËÀÍö²»Çå³ýµÄbuff: objID=%s,buffID=%s,skillID=%s", objID, buffID, skillID)
|
continue
|
if DoBuffDel(turnFight, batObj, buff, noRefreshAttr=True, isSync=False): # ¿É²»Í¨Öª£¬Ç°¶ËĬÈ϶¼Çå³ý£¬¸´»îºóÖØÐÂͬ²½
|
isRefreshAttr = True
|
|
if isRefreshAttr:
|
RefreshBuffAttr(batObj)
|
|
return
|
|
def DoBuffByRevive(turnFight, batObj):
|
## ¸´»î´¦Àíbuff
|
|
isRefreshAttr = False
|
objID = batObj.GetID()
|
buffMgr = batObj.GetBuffManager()
|
for index in range(buffMgr.GetBuffCount()):
|
buff = buffMgr.GetBuffByIndex(index)
|
buffID = buff.GetBuffID()
|
skillID = buff.GetSkillID()
|
if buff.GetBuffRetain()&pow(2, ChConfig.BuffRetainType_Revive):
|
GameWorld.DebugLogEx("¸´»î²»Çå³ýµÄbuff: objID=%s,buffID=%s,skillID=%s", objID, buffID, skillID)
|
SyncBuffRefresh(turnFight, batObj, buff, isNewAdd=True) # ¸´»îʱ»¹´æÔÚµÄbuff֪ͨǰ¶ËÊÓΪÐÂÌí¼ÓµÄ
|
continue
|
if DoBuffDel(turnFight, batObj, buff, noRefreshAttr=True, isSync=False): # ¸´»î¿É²»Í¨ÖªÉ¾³ýµÄbuff
|
isRefreshAttr = True
|
|
if isRefreshAttr:
|
RefreshBuffAttr(batObj)
|
|
# ÖØÐÂÌí¼Ó±¾ÕóÓªÓÐЧ¹â»·
|
batObjMgr = BattleObj.GetBatObjMgr()
|
batLineup = batObj.GetBatLineup()
|
for tagObjID in batLineup.posObjIDDict.values():
|
tagObj = batObjMgr.getBatObj(tagObjID)
|
if not tagObj.IsAlive():
|
continue
|
tagBuffMgr = tagObj.GetBuffManager()
|
for index in range(tagBuffMgr.GetBuffCount()):
|
buff = tagBuffMgr.GetBuffByIndex(index)
|
haloObjIDList = buff.GetHaloObjIDList()
|
if not haloObjIDList or objID not in haloObjIDList:
|
continue
|
if buff.GetOwnerID() != tagObjID:
|
# ·Ç¹âÔ´
|
continue
|
haloSkillID = buff.GetSkillID()
|
GameWorld.DebugLogEx("¸´»îºóÖØÐÂÌí¼Ó±¾ÕóÓª¹â»·: objID=%s,ownerID=%s,haloSkillID=%s", objID, tagObjID, haloSkillID)
|
haloSkill = tagObj.GetSkillManager().FindSkillByID(haloSkillID)
|
if not haloSkill:
|
continue
|
OnAddBuff(turnFight, batObj, haloSkill, buffOwner=tagObj)
|
|
# ¹âÔ´ÖØÐÂÌí¼ÓÓÐЧ¹â»·£¬¸ù¾Ý¹âÔ´ÊÇ·ñ»¹ÓÐЧ¹æÔòÓÅ»¯£¬´ý´¦Àí
|
return
|
|
def RefreshBuffAttr(batObj, isInit=False):
|
''' Ë¢ÐÂbuffÊôÐÔ£¬Èç¹ûÓÐÉæ¼°µ½buffÊôÐÔ±ä¸üµÄ£¬Ö»ÄÜÈ«²¿buffÖØÐÂË¢
|
'''
|
|
objID = batObj.GetID()
|
befHP = batObj.GetHP()
|
befMaxHP = batObj.GetMaxHP()
|
|
batAttrDict = batObj.ResetBattleEffect()
|
|
GameWorld.DebugLogEx("RefreshBuffAttr ID:%s,atk=%s,def=%s,hp=%s/%s,batAttrDict=%s",
|
objID, batObj.GetAtk(), batObj.GetDef(), befHP, befMaxHP, batAttrDict)
|
|
skbufAttrDict = {}
|
|
# ÊôÐÔ¼¼ÄÜ
|
skillAttrDict = {}
|
skillManager = batObj.GetSkillManager()
|
for index in range(0, skillManager.GetSkillCount()):
|
curSkill = skillManager.GetSkillByIndex(index)
|
if not curSkill:
|
continue
|
for eIndex in range(curSkill.GetEffectCount()):
|
effect = curSkill.GetEffect(eIndex)
|
effID = effect.GetEffectID()
|
if effID not in ChConfig.AttrIDList:
|
continue
|
if effect.GetTriggerSrc() not in [ChConfig.TriggerSrc_Skill]:
|
# ¼¼ÄÜÊôÐÔ½ö¼¼ÄÜʱÓÐЧ
|
continue
|
attrID = effID
|
attrValue = effect.GetEffectValue(0)
|
calcType = effect.GetEffectValue(1)
|
if calcType == 2: # ¼õÉÙ£¬ÆäËûĬÈÏÔö¼Ó
|
attrValue = -attrValue
|
skillAttrDict[attrID] = skillAttrDict.get(attrID, 0) + attrValue
|
skbufAttrDict[attrID] = skbufAttrDict.get(attrID, 0) + attrValue
|
skillAttrDict and GameWorld.DebugLogEx(" skillAttrDict=%s", skillAttrDict)
|
|
# buff
|
buffsAttrDict = {} # buffÊôÐÔ {attrID:value, } value¿ÉÄÜÊǸºÖµ
|
buffMgr = batObj.GetBuffManager()
|
for index in range(buffMgr.GetBuffCount()):
|
buff = buffMgr.GetBuffByIndex(index)
|
layer = max(1, buff.GetLayer())
|
skillData = buff.GetSkillData()
|
|
effExDict = buff.GetEffectExDict()
|
for effID, effValueEx in effExDict.items():
|
if effID not in ChConfig.AttrIDList:
|
continue
|
attrID = effID
|
attrValue = effValueEx * layer
|
buffsAttrDict[attrID] = buffsAttrDict.get(attrID, 0) + attrValue
|
skbufAttrDict[attrID] = skbufAttrDict.get(attrID, 0) + attrValue
|
|
for eIndex in range(skillData.GetEffectCount()):
|
effect = skillData.GetEffect(eIndex)
|
effID = effect.GetEffectID()
|
if effID not in ChConfig.AttrIDList:
|
continue
|
if not (not effect.GetTriggerSrc() or effect.GetTriggerBuffEnable()):
|
# buffʱ£¬²»ÅäĬÈÏÓÐЧ£¬»ò½öbuffÓÐЧ
|
continue
|
attrID = effID
|
attrValue = effect.GetEffectValue(0) * layer
|
calcType = effect.GetEffectValue(1)
|
if calcType == 2: # ¼õÉÙ£¬ÆäËûĬÈÏÔö¼Ó
|
attrValue = -attrValue
|
buffsAttrDict[attrID] = buffsAttrDict.get(attrID, 0) + attrValue
|
skbufAttrDict[attrID] = skbufAttrDict.get(attrID, 0) + attrValue
|
|
buffsAttrDict and GameWorld.DebugLogEx(" buffsAttrDict=%s", buffsAttrDict)
|
GameWorld.DebugLogEx(" skbufAttrDict=%s", skbufAttrDict)
|
|
objID = batObj.GetID()
|
# ÏȼÆËã°Ù·Ö±È¼Ó³É»ò½µµÍµÄ
|
perIDList = ChConfig.AttrPerDict.values()
|
for attrID, attrPerID in ChConfig.AttrPerDict.items():
|
if attrPerID not in skbufAttrDict:
|
continue
|
attrPerValue = skbufAttrDict[attrPerID] # ¿ÉÄÜÊǸºÖµ
|
attrValue = batObj.GetBatAttrValue(attrID, False)
|
if attrValue <= 0:
|
continue
|
updValue = attrValue * (10000 + attrPerValue) / 10000.0
|
#updValue = max(0, updValue) # ×î¶à¼õµ½0£¬×î´óÎÞÉÏÏÞ
|
batObj.SetBatAttrValue(attrID, updValue)
|
GameWorld.DebugLogEx(" attrID=%s(PerID:%s),attrValue=%s(PerValue:%s),updValue=%s", attrID, attrPerID, attrValue, attrPerValue, updValue)
|
|
# ÔÙÀۼӷǰٷֱȵĹ̶¨Öµ
|
for attrID, addValue in skbufAttrDict.items():
|
if attrID in perIDList:
|
continue
|
attrValue = batObj.GetBatAttrValue(attrID, False)
|
updValue = attrValue + addValue
|
#updValue = max(0, attrValue + addValue) # ×î¶à¼õµ½0£¬×î´óÎÞÉÏÏÞ
|
batObj.SetBatAttrValue(attrID, updValue)
|
GameWorld.DebugLogEx(" attrID=%s,attrValue=%s,addValue=%s,updValue=%s", attrID, attrValue, addValue, updValue)
|
|
aftHP = batObj.GetHP()
|
aftMaxHP = batObj.GetMaxHP()
|
if aftMaxHP != befMaxHP:
|
isNotify = not isInit
|
batObj.SetMaxHP(aftMaxHP, isNotify)
|
if befHP and aftMaxHP > befMaxHP:
|
aftHP += (aftMaxHP - befMaxHP)
|
batObj.SetHP(aftHP, isNotify)
|
GameWorld.DebugLogEx(" befHP=%s/%s, aftHP=%s/%s", befHP, befMaxHP, aftHP, aftMaxHP)
|
GameWorld.DebugLogEx(" ×îÖÕÊôÐÔ ID:%s,atk=%s,def=%s,hp=%s/%s,%s", objID, batObj.GetAtk(), batObj.GetDef(), aftHP, aftMaxHP, batObj.GetBatAttrDict())
|
return
|
|
def SyncBuffRefresh(turnFight, curBatObj, curBuff, relatedSkillID=0, isNewAdd=False):
|
## @param curBatObj: ¸ÃbuffµÄ³ÖÓÐÕߣ¬¼´ÔÚËÉíÉÏ
|
clientPack = ChPyNetSendPack.tagSCBuffRefresh()
|
clientPack.ObjID = curBatObj.GetID()
|
clientPack.BuffID = curBuff.GetBuffID()
|
clientPack.SkillID = curBuff.GetSkillID()
|
clientPack.RelatedSkillID = relatedSkillID
|
clientPack.LastTime = curBuff.GetRemainTime()
|
clientPack.Layer = curBuff.GetLayer()
|
clientPack.OwnerID = curBuff.GetOwnerID()
|
clientPack.Value1 = curBuff.GetValue1()
|
clientPack.Value2 = curBuff.GetValue2()
|
clientPack.Value3 = curBuff.GetValue3()
|
clientPack.IsAdd = 1 if isNewAdd else 0
|
turnFight.addBatPack(clientPack)
|
return
|
|
def SyncBuffDel(turnFight, objID, buffID, relatedSkillID=0):
|
clientPack = ChPyNetSendPack.tagSCBuffDel()
|
clientPack.ObjID = objID
|
clientPack.BuffID = buffID
|
clientPack.RelatedSkillID = relatedSkillID
|
turnFight.addBatPack(clientPack)
|
return
|