#!/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 TurnBuffs import ObjPool GameWorld.ImportAll("Script\\Skill\\", "TurnBuffs") def GetAddBuffValue(attacker, defender, curSkill): callFunc = GameWorld.GetExecFunc(TurnBuffs, "BuffAtkType_%d.%s" % (curSkill.GetAtkType(), "CalcBuffValue")) if not callFunc: return [] return callFunc(attacker, defender, curSkill) def OnAddBuff(turnFight, batObj, buffSkill, buffOwner=None): skillID = buffSkill.GetSkillID() bySkill = buffSkill.GetBySkill() relatedSkillID = bySkill.GetSkillID() if bySkill else 0 curID = batObj.GetID() if not buffOwner: buffOwner = batObj ownerID = buffOwner.GetID() buffValueList = GetAddBuffValue(buffOwner, batObj, buffSkill) GameWorld.DebugLog("OnAddBuff: curID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s,buffValueList=%s" % (curID, skillID, ownerID, relatedSkillID, buffValueList)) skillTypeID = buffSkill.GetSkillTypeID() # Ïȼòµ¥×öÏÂÄܼÓÉϼ´¿É buffMgr = batObj.GetBuffManager() buffIDList = buffMgr.FindBuffIDBySkillTypeID(skillTypeID) if buffIDList: GameWorld.DebugLog(" ÒѾ­´æÔÚ¸Ãbuff: skillTypeID=%s,buffIDList=%s" % (skillTypeID, buffIDList)) # buff¶ÑµþÂß¼­ return True __AddNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner) return True def __AddNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner): skillID = buffSkill.GetSkillID() bySkill = buffSkill.GetBySkill() relatedSkillID = bySkill.GetSkillID() if bySkill else 0 curID = batObj.GetID() ownerID = buffOwner.GetID() buff = buffMgr.AddBuff(skillID) if not buff: GameWorld.DebugLog(" Ìí¼Óbuffʧ°Ü! skillID=%s" % skillID, curID) return False buffID = buff.GetBuffID() GameWorld.DebugLog(" AddBuffOK. buffID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s,timeline=%s" % (buffID, skillID, ownerID, relatedSkillID, turnFight.getTimeline()), curID) buff.SetOwnerID(ownerID) buff.SetCalcTime(turnFight.getTimeline()) buff.SetRemainTime(buffSkill.GetLastTime()) buff.SetLayer(buffSkill.GetLayerCnt()) buff.SetBuffValueList(buffValueList) buffStates = buffSkill.GetBuffStates() for buffState in buffStates: buffMgr.AddBuffState(buffState, buffID) isNotify = True if isNotify: SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID) DoBuffAddOver(turnFight, batObj, buffSkill, buff, buffOwner) return def DoBuffAddOver(turnFight, batObj, buffSkill, addBuff, buffOwner): ## buffÌí¼Ó³É¹¦ºó´¦Àí isRefreshAttr = False # ÊÇ·ñË¢ÊôÐÔ #atkType = buffSkill.GetAtkType() #if atkType: # callFunc = GameWorld.GetExecFunc(TurnBuffs, "BuffAtkType_%d.%s" % (atkType, "OnBuffAddOver")) # if callFunc: # callFunc(turnFight, batObj, buffSkill, addBuff, buffOwner) passiveEffMgr = batObj.GetPassiveEffManager() # buffЧ¹û¼ÓÈë for effectIndex in range(0, buffSkill.GetEffectCount()): curEffect = buffSkill.GetEffect(effectIndex) effectID = curEffect.GetEffectID() if effectID == 0: continue if curEffect.GetTriggerWay(): if curEffect.GetTriggerSrc() == 2: passiveEffMgr.AddBuffPassiveEffect(addBuff, buffSkill, curEffect) elif effectID in ChConfig.AttrIDList: isRefreshAttr = True else: callFunc = GameWorld.GetExecFunc(TurnBuffs, "Buff_%d.%s" % (effectID, "OnBuffAddOver")) if callFunc: callFunc(turnFight, batObj, buffSkill, addBuff, curEffect, buffOwner) if isRefreshAttr: RefreshBuffAttr(batObj) return def DoBuffDel(turnFight, batObj, curBuff): ## ɾ³ýbuff isRefreshAttr = False # ÊÇ·ñË¢ÊôÐÔ haveBuffPassiveEff = False buffMgr = batObj.GetBuffManager() buffID = curBuff.GetBuffID() skillData = curBuff.GetSkillData() #buffÏûʧµÄ´¥·¢ for effectIndex in range(0, skillData.GetEffectCount()): curEffect = skillData.GetEffect(effectIndex) effectID = curEffect.GetEffectID() if not effectID: continue if curEffect.GetTriggerWay(): if curEffect.GetTriggerSrc() == 2: haveBuffPassiveEff = True elif effectID in ChConfig.AttrIDList: isRefreshAttr = True else: callFunc = GameWorld.GetExecFunc(TurnBuffs, "Buff_%d.%s" % (effectID, "OnBuffDel")) if callFunc: callFunc(turnFight, batObj, curBuff, curEffect) if haveBuffPassiveEff: batObj.GetPassiveEffManager().DelBuffPassiveEffect(buffID) buffStates = skillData.GetBuffStates() for buffState in buffStates: buffMgr.DelBuffState(buffState, buffID) # ×îºóɾ³ýbuff¡¢Í¨Öª buffMgr.DelBuff(buffID) SyncBuffDel(turnFight, batObj, buffID) if isRefreshAttr: RefreshBuffAttr(batObj) return def DoBuffProcess(turnFight, batObj, curBuff): skillData = curBuff.GetSkillData() callFunc = GameWorld.GetExecFunc(TurnBuffs, "BuffAtkType_%d.%s" % (skillData.GetAtkType(), "DoBuffProcess")) if callFunc: callFunc(turnFight, batObj, curBuff) return def RefreshBuffAttr(batObj): ''' Ë¢ÐÂbuffÊôÐÔ£¬Èç¹ûÓÐÉæ¼°µ½buffÊôÐÔ±ä¸üµÄ£¬Ö»ÄÜÈ«²¿buffÖØÐÂË¢ ''' objID = batObj.GetID() befHP = batObj.GetHP() befMaxHP = batObj.GetMaxHP() batAttrDict = batObj.ResetBattleEffect() GameWorld.DebugLog("RefreshBuffAttr ID:%s,atk=%s,def=%s,hp=%s/%s,batAttrDict=%s" % (objID, batObj.GetAtk(), batObj.GetDef(), befHP, befMaxHP, batAttrDict)) # buff buffAttrDict = {} # buffÊôÐÔ {attrID:value, } value¿ÉÄÜÊǸºÖµ buffMgr = batObj.GetBuffManager() for index in range(buffMgr.GetBuffCount()): buff = buffMgr.GetBuffByIndex(index) skillData = buff.GetSkillData() for eIndex in range(skillData.GetEffectCount()): effect = skillData.GetEffect(eIndex) effID = effect.GetEffectID() if effID not in ChConfig.AttrIDList: continue attrID = effID attrValue = effect.GetEffectValue(0) calcType = effect.GetEffectValue(1) if calcType == 2: # ¼õÉÙ£¬ÆäËûĬÈÏÔö¼Ó attrValue = -attrValue buffAttrDict[attrID] = buffAttrDict.get(attrID, 0) + attrValue GameWorld.DebugLog(" __addBuffAttr buffAttrDict=%s" % buffAttrDict) objID = batObj.GetID() # ÏȼÆËã°Ù·Ö±È¼Ó³É»ò½µµÍµÄ perIDList = ChConfig.AttrPerDict.values() for attrID, attrPerID in ChConfig.AttrPerDict.items(): if attrPerID not in buffAttrDict: continue attrPerValue = buffAttrDict[attrPerID] # ¿ÉÄÜÊǸºÖµ attrValue = batObj.GetBatAttrValue(attrID, False) if attrValue <= 0: continue updValue = int(attrValue * (10000 + attrPerValue) / 10000.0) updValue = max(0, updValue) # ×î¶à¼õµ½0£¬×î´óÎÞÉÏÏÞ batObj.SetBatAttrValue(attrID, updValue) GameWorld.DebugLog(" attrID=%s(PerID:%s),attrValue=%s(PerValue:%s),updValue=%s" % (attrID, attrPerID, attrValue, attrPerValue, updValue)) # ÔÙÀۼӷǰٷֱȵĹ̶¨Öµ for attrID, addValue in buffAttrDict.items(): if attrID in perIDList: continue attrValue = batObj.GetBatAttrValue(attrID, False) updValue = max(0, attrValue + addValue) # ×î¶à¼õµ½0£¬×î´óÎÞÉÏÏÞ batObj.SetBatAttrValue(attrID, updValue) GameWorld.DebugLog(" attrID=%s,attrValue=%s,addValue=%s,updValue=%s" % (attrID, attrValue, addValue, updValue)) aftHP = batObj.GetHP() aftMaxHP = batObj.GetMaxHP() if aftMaxHP != befMaxHP: batObj.SetMaxHP(aftMaxHP, True) if befHP and aftMaxHP > befMaxHP: aftHP += (aftMaxHP - befMaxHP) batObj.SetHP(aftHP, True) GameWorld.DebugLog(" befHP=%s/%s, aftHP=%s/%s" % (befHP, befMaxHP, aftHP, aftMaxHP)) GameWorld.DebugLog(" ×îÖÕÊôÐÔ ID:%s,atk=%s,def=%s,hp=%s/%s" % (objID, batObj.GetAtk(), batObj.GetDef(), aftHP, aftMaxHP)) return def SyncBuffRefresh(turnFight, curBatObj, curBuff, relatedSkillID=0): clientPack = ObjPool.GetPoolMgr().acquire(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() turnFight.addBatPack(clientPack) return def SyncBuffDel(turnFight, curBatObj, buffID, relatedSkillID=0): clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCBuffDel) clientPack.ObjID = curBatObj.GetID() clientPack.BuffID = buffID clientPack.RelatedSkillID = relatedSkillID turnFight.addBatPack(clientPack) return