#!/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 SkillCommon
|
import TurnBuffs
|
import ObjPool
|
|
GameWorld.ImportAll("Script\\Skill\\", "TurnBuffs")
|
|
def OnAddBuff(turnFight, batObj, curSkill, buffOwner=None):
|
skillID = curSkill.GetSkillID()
|
bySkill = curSkill.GetBySkill()
|
relatedSkillID = bySkill.GetSkillID() if bySkill else 0
|
curID = batObj.GetID()
|
ownerID = buffOwner.GetID() if buffOwner else curID
|
GameWorld.DebugLog("OnAddBuff: curID=%s,skillID=%s,ownerID=%s,relatedSkillID=%s" % (curID, skillID, ownerID, relatedSkillID))
|
#¼ì²éÊÇ·ñ¼¸ÂÊ´¥·¢£¬¸½¼Ó¼¼ÄÜ¡¢±»¶¯´¥·¢µÄÍâ²ãÒѼì²é¹ý¸ÅÂÊ£¬²»Öظ´¼ì²é
|
if not (curSkill.GetIsEnhanceSkill() or SkillCommon.isPassiveTriggerSkill(curSkill)):
|
rate = curSkill.GetHappenRate()
|
if rate and rate != ChConfig.Def_MaxRateValue and not GameWorld.CanHappen(rate, ChConfig.Def_MaxRateValue):
|
GameWorld.DebugLog(" ¸ÅÂʲ»´¥·¢buff!")
|
return
|
|
skillTypeID = curSkill.GetSkillTypeID()
|
# Ïȼòµ¥×öÏÂÄܼÓÉϼ´¿É
|
buffMgr = batObj.GetBuffManager()
|
buffIDList = buffMgr.FindBuffIDBySkillTypeID(skillTypeID)
|
if buffIDList:
|
GameWorld.DebugLog(" ÒѾ´æÔÚ¸Ãbuff: skillTypeID=%s,buffIDList=%s" % (skillTypeID, buffIDList))
|
return True
|
|
buff = buffMgr.AddBuff(skillID)
|
if not buff:
|
GameWorld.DebugLog(" Ìí¼Óbuffʧ°Ü! skillID=%s" % skillID)
|
return False
|
GameWorld.DebugLog(" AddBuffOK. buffID=%s" % buff.GetBuffID())
|
buff.SetOwnerID(ownerID)
|
buff.SetRemainTime(curSkill.GetLastTime())
|
#buff.SetLayer()
|
SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID)
|
|
DoBuffAddOver(turnFight, batObj, curSkill, buff, buffOwner)
|
return True
|
|
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
|
|
def DoBuffAddOver(turnFight, batObj, curSkill, addBuff, buffOwner=None):
|
## buffÌí¼Ó³É¹¦ºó´¦Àí
|
|
isRefreshAttr = False # ÊÇ·ñË¢ÊôÐÔ
|
skillData = addBuff.GetSkillData()
|
# buffЧ¹û¼ÓÈë
|
for effectIndex in range(0, skillData.GetEffectCount()):
|
curEffect = skillData.GetEffect(effectIndex)
|
effectID = curEffect.GetEffectID()
|
if effectID == 0:
|
continue
|
|
if effectID in ChConfig.AttrIDList:
|
isRefreshAttr = True
|
|
callFunc = GameWorld.GetExecFunc(TurnBuffs, "Buff_%d.%s" % (effectID, "OnBuffAddOver"))
|
if callFunc:
|
GameWorld.DebugLog("OnBuffAddOver, objID=%s,buffID=%s,effectID=%s" % (batObj.GetID(), addBuff.GetBuffID(), effectID))
|
callFunc(turnFight, batObj, curSkill, addBuff, curEffect, buffOwner)
|
|
#±»¶¯´¥·¢µÄ
|
#triggerType = PassiveBuffEffMng.GetBuffTriggerTypeByEffectID(effectID)
|
#if triggerType == -1:
|
# continue
|
#passiveEff = PassiveBuffEffMng.GetPassiveEffManager().InitObjPassiveEff(curObj)
|
#passiveEff.AddBuffInfoByEffect(curEffect, skillID, onwerID, onwerType)
|
|
if isRefreshAttr:
|
RefreshBuffAttr(batObj)
|
|
return
|
|
def DoBuffDel(turnFight, batObj, curBuff):
|
## ɾ³ýbuff
|
|
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
|
|
callFunc = GameWorld.GetExecFunc(TurnBuffs, "Buff_%d.%s" % (effectID, "OnBuffDel"))
|
|
if callFunc:
|
callFunc(turnFight, batObj, curBuff, curEffect)
|
|
#passiveEff = PassiveBuffEffMng.GetPassiveEffManager().GetPassiveEff(curObj)
|
#if passiveEff:
|
# passiveEff.DelBuffInfo(skillData)
|
|
# ×îºóɾ³ýbuff¡¢Í¨Öª
|
buffMgr.DelBuff(buffID)
|
SyncBuffDel(turnFight, batObj, buffID)
|
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
|