#!/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 ObjPool GameWorld.ImportAll("Script\\Skill\\", "TurnBuffs") def GetAddBuffValue(turnFight, attacker, defender, curSkill): callFunc = GameWorld.GetExecFunc(TurnBuffs, "BuffAtkType_%d.%s" % (curSkill.GetAtkType(), "CalcBuffValue")) if not callFunc: return [] return callFunc(turnFight, attacker, defender, curSkill) def DoAddBuffBySkillID(turnFight, batObj, skillID, buffOwner=None, bySkill=None, afterLogic=False): ## ¸ù¾Ý¼¼ÄÜIDÌí¼Óbuff if not skillID: return skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID) if not skillIpyData: return tagObjList = [batObj] poolMgr = ObjPool.GetPoolMgr() useSkill = poolMgr.acquire(BattleObj.PySkill, skillIpyData) useSkill.SetTagObjList(tagObjList) OnAddBuff(turnFight, batObj, useSkill, buffOwner, bySkill, afterLogic) poolMgr.release(useSkill) return def OnAddBuff(turnFight, batObj, buffSkill, buffOwner=None, bySkill=None, afterLogic=False): 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() buffValueList = GetAddBuffValue(turnFight, buffOwner, batObj, buffSkill) GameWorld.DebugLog("OnAddBuff: curID=%s,skillID=%s,atkType=%s,buffValueList=%s,ownerID=%s,relatedSkillID=%s" % (curID, skillID, buffSkill.GetAtkType(), buffValueList, ownerID, relatedSkillID)) skillTypeID = buffSkill.GetSkillTypeID() # Ïȼòµ¥×öÏÂÄܼÓÉϼ´¿É buffMgr = batObj.GetBuffManager() buffList = buffMgr.FindBuffBySkillTypeID(skillTypeID) if buffList: # buff¶ÑµþÂß¼­£¬´ý´¦Àí£¬ÏÈÖ±½Ó֪ͨ for buff in buffList: if not buff: continue GameWorld.DebugLog(" ÒѾ­´æÔÚ¸Ãbuff: buffID=%s,skillTypeID=%s" % (buff.GetBuffID(), skillTypeID)) if afterLogic and bySkill: bySkill.AddAfterLogic(ChConfig.AfterLogic_AddBuff, [batObj, buff, buffOwner]) else: SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID) return True __AddNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill, afterLogic) return True def __AddNewBuff(turnFight, batObj, buffMgr, buffSkill, buffValueList, buffOwner, bySkill=None, afterLogic=False): skillID = buffSkill.GetSkillID() 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) curBuffState = buffSkill.GetCurBuffState() if curBuffState: buffMgr.AddBuffState(curBuffState, buffID) if afterLogic and bySkill: bySkill.AddAfterLogic(ChConfig.AfterLogic_AddBuff, [batObj, buff, buffOwner]) else: 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() != ChConfig.TriggerSrc_Skill: 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, relatedSkill=None, afterLogic=False, tagObj=None): '''ɾ³ýbuff @param relatedSkill: ¹ØÁªµÄ¼¼ÄÜ @param afterLogic: ÊÇ·ñÐèÒªÔÚ¹ØÁª¼¼ÄÜ´¦ÀíÍê±Ïºó²Å´¦Àíɾ³ýºóÐøÂß¼­£¬Èç֪ͨ£¬´¥·¢±»¶¯µÈ @param tagObj: ÓÉË­ÒýÆðµÄbuffɾ³ý ''' release = True 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() 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() != ChConfig.TriggerSrc_Skill: 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) curBuffState = skillData.GetCurBuffState() if curBuffState: buffMgr.DelBuffState(curBuffState, buffID) # ×îºóɾ³ýbuff¡¢Í¨Öª 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]) if isRefreshAttr: RefreshBuffAttr(batObj) return def DoBuffDelAfterLogicOver(turnFight, buffObjID, curBuff, relatedSkill): ## buffɾ³ýºóÐø´¦ÀíÂß¼­´¦ÀíÍê±Ï relatedSkillID = relatedSkill.GetSkillID() if relatedSkill else 0 SyncBuffDel(turnFight, buffObjID, curBuff.GetBuffID(), relatedSkillID) ObjPool.GetPoolMgr().release(curBuff) 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() clientPack.Value1 = curBuff.GetValue1() clientPack.Value2 = curBuff.GetValue2() clientPack.Value3 = curBuff.GetValue3() turnFight.addBatPack(clientPack) return def SyncBuffDel(turnFight, objID, buffID, relatedSkillID=0): clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCBuffDel) clientPack.ObjID = objID clientPack.BuffID = buffID clientPack.RelatedSkillID = relatedSkillID turnFight.addBatPack(clientPack) return