#!/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
|