#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Skill.TurnSkill
|
#
|
# @todo:»ØºÏÕ½¶·¼¼ÄÜ
|
# @author hxp
|
# @date 2025-08-06
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: »ØºÏÕ½¶·¼¼ÄÜ
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2025-08-06 18:30"""
|
#-------------------------------------------------------------------------------
|
|
import ChConfig
|
import GameWorld
|
import BattleObj
|
import SkillCommon
|
import IpyGameDataPY
|
import IPY_GameWorld
|
import ChPyNetSendPack
|
import PlayerControl
|
import ShareDefine
|
import TurnAttack
|
import TurnBuff
|
import ObjPool
|
import FBLogic
|
|
import random
|
|
def GetPMType(batObj, useSkill):
|
## »ñÈ¡Îï·¨É˺¦ÀàÐÍ
|
# GetHurtType ¸öλÊýÓ÷¨¸Ä³É pvp pve±êʶ£¬Ê®Î»Êý-Îï¹¥·¨¹¥ IPY_GameWorld.ghtPhy = 1
|
#---¼¼Äܹ¥»÷, ¶Á±í»ñÈ¡¹¥»÷ÀàÐÍ---
|
ght = useSkill.GetHurtType() % 10
|
if ght == IPY_GameWorld.ghtMag: # ×öÅäÖüæÈÝÓã¬ÓÅÏÈÑéÖ¤·¨ÉË£¬·ñÔòĬÈÏÎïÉË
|
return IPY_GameWorld.ghtMag
|
return IPY_GameWorld.ghtPhy
|
|
def IsIgnoreDef(useSkill):
|
## ÊÇ·ñÎÞÊÓ·ÀÓù
|
return useSkill.GetHurtType() / 10 == 1 # 2ÎªÕæÉË£¬´ýÀ©Õ¹
|
|
def OnUseSkill(turnFight, curBatObj, useSkill, tagObjList=None, batType=ChConfig.TurnBattleType_Normal, bySkill=None, isEnhanceSkill=False):
|
'''ʹÓü¼ÄÜͨÓÃÈë¿Ú
|
@param useSkill: ʹÓõļ¼ÄÜ£¬×¢Òâ²¢²»Ò»¶¨ÊÇÉíÉϵļ¼ÄÜ£¬¿ÉÄÜÖ»ÊÇ SkillData ±íÊý¾Ý
|
@param bySkill: ÓÉÄĸö¼¼ÄܶîÍâ´¥·¢µÄ£¬±ÈÈ總¼Ó´¥·¢µÄ¼¼ÄÜ»ò±»¶¯¼¼Äܾù¿ÉÄÜÓÉij¸ö¼¼ÄÜ´¥·¢
|
@param isEnhanceSkill: ÊÇ·ñ¸½¼Ó´¥·¢µÄ¼¼ÄÜ£¬¼´Ö÷¼¼ÄܵÄEnhanceSkillList×Ö¶ÎÖеļ¼ÄÜ
|
@return: ÊÇ·ñ³É¹¦
|
'''
|
if not useSkill:
|
return
|
|
skillID = useSkill.GetSkillID()
|
if not skillID:
|
return
|
|
#ûÓÐÖ¸¶¨Ä¿±ê£¬Ôò°´¼¼ÄÜ×ÔÉíµÄÄ¿±êÂß¼
|
if not tagObjList:
|
tagAim = useSkill.GetTagAim()
|
tagFriendly = useSkill.GetTagFriendly()
|
tagAffect = useSkill.GetTagAffect()
|
tagCount = useSkill.GetTagCount()
|
tagObjList = GetSkillTags(turnFight, curBatObj, tagAim, tagFriendly, tagAffect, tagCount)
|
|
bySkillID = bySkill.GetSkillID() if bySkill else 0
|
GameWorld.DebugLog("ʹÓü¼ÄÜ: curID=%s,skillID=%s,tagCnt=%s,batType=%s,bySkillID=%s,isEnhanceSkill=%s"
|
% (curBatObj.GetID(), skillID, len(tagObjList), batType, bySkillID, isEnhanceSkill))
|
if not tagObjList:
|
# ¿ÉÀ©Õ¹ÆäËûÄ¿±êÑ¡Ôñ£¬È縴»î¼¼ÄÜûÓÐËÀÍöµ¥Î»Ê±ÔòʹÓÃÁíÍâµÄЧ¹û
|
return
|
|
# ÒÔÏÂΪ¼¼ÄÜ¿ÉÒÔʹÓõĴ¦Àí£¬Ö®ºóµÄÂ߼ĬÈϼ¼ÄÜʹÓóɹ¦
|
|
poolMgr = ObjPool.GetPoolMgr()
|
usePoolSkill = False
|
if isinstance(useSkill, IpyGameDataPY.IPY_Skill):
|
usePoolSkill = True
|
# ͳһʹÓà BattleObj.PySkill
|
useSkill = poolMgr.acquire(BattleObj.PySkill, useSkill)
|
|
useSkill.SetTagObjList(tagObjList)
|
useSkill.SetBatType(batType)
|
useSkill.SetBySkill(bySkill)
|
useSkill.SetIsEnhanceSkill(isEnhanceSkill)
|
useSkill.ClearHurtObj()
|
|
curBatObj.ClearSkillTempAttr()
|
for tagObj in tagObjList:
|
tagObj.ClearSkillTempAttr()
|
|
objID = curBatObj.GetID()
|
useTag = ""
|
if not isEnhanceSkill:
|
# ÒòΪ¿ÉÄÜ´¥·¢Á¬»÷£¬ËùÒÔ±ê¼ÇÐè´øÉÏÀÛ¼ÆÊ¹Óü¼ÄÜ´ÎÊý£¬È·±£Î¨Ò»
|
useTag = "Skill_%s_%s_%s" % (objID, skillID, curBatObj.GetSkillUseCnt(skillID) + 1)
|
clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCTurnFightTag)
|
clientPack.Tag = useTag
|
clientPack.Len = len(clientPack.Tag)
|
clientPack.Sign = 0
|
turnFight.addBatPack(clientPack)
|
|
#Õâ¸ö¼¼ÄÜÊÇBuff
|
if SkillCommon.IsBuff(useSkill):
|
__doAddBuff(turnFight, curBatObj, useSkill)
|
else:
|
__doUseSkill(turnFight, curBatObj, useSkill)
|
|
if useTag:
|
clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCTurnFightTag)
|
clientPack.Tag = useTag
|
clientPack.Len = len(clientPack.Tag)
|
clientPack.Sign = 1
|
turnFight.addBatPack(clientPack)
|
|
# ×îºóÖØÖᢻØÊÕ¶ÔÏó
|
useSkill.SetTagObjList([])
|
useSkill.SetBySkill(None) # ÐèÖØÖ㬷ÀÖ¹±»Îó»ØÊÕ
|
useSkill.SetIsEnhanceSkill(False)
|
useSkill.ClearHurtObj()
|
if usePoolSkill:
|
poolMgr.release(useSkill)
|
return True
|
|
def GetSkillTags(turnFight, curBatObj, tagAim, tagFriendly, tagAffect, tagCount):
|
## »ñÈ¡¼¼ÄÜÄ¿±ê
|
curFaction = curBatObj.GetFaction()
|
|
# ×Ô¼º£¬Ö±½Ó·µ»Ø
|
if tagAim == ChConfig.SkillTagAim_Self:
|
return [curBatObj]
|
|
if tagFriendly:
|
tagFaction = curFaction
|
else:
|
tagFaction = ChConfig.Def_FactionB if curFaction == ChConfig.Def_FactionA else ChConfig.Def_FactionA
|
|
batObjMgr = BattleObj.GetBatObjMgr()
|
lineupNum = curBatObj.GetLineupNum()
|
posNum = curBatObj.GetPosNum()
|
|
batFaction = turnFight.getBatFaction(tagFaction)
|
if tagFaction == curFaction:
|
lineupNumList = [lineupNum] # ÓÑ·½ÔÝʱ½öÏÞÖÆ×Ô¼ºÕóÈÝ
|
else:
|
lineupNumList = [lineupNum] # µÐ·½ÓÅÏȶÔλÕóÈÝ£¬ÔÙÆäËûÕóÈÝ
|
for tagNum in batFaction.lineupDict.keys():
|
if tagNum not in lineupNumList:
|
lineupNumList.append(tagNum)
|
|
aimObjList = [] # ÏÈɸѡ³ö·¶Î§Ä¿±ê
|
for num in lineupNumList:
|
batLineup = batFaction.getBatlineup(num)
|
|
# ¶Ôλ
|
if tagAim == ChConfig.SkillTagAim_Relative:
|
posNumList = [posNum] # ÓÅÏȶÔλλÖã¬ÔÙÆäËûλÖð´Ë³Ðò±éÀú
|
pNumList = batLineup.posObjIDDict.keys()
|
pNumList.sort()
|
for pNum in pNumList:
|
if pNum > 0 and pNum not in posNumList:
|
posNumList.append(pNum)
|
for pNum in posNumList:
|
if pNum not in batLineup.posObjIDDict:
|
continue
|
tagObjID = batLineup.posObjIDDict[pNum]
|
tagBatObj = batObjMgr.getBatObj(tagObjID)
|
if not __skillTagFilter(tagBatObj, tagAffect):
|
continue
|
aimObjList.append(tagBatObj) # ¶ÔλµÄĬÈÏֻѡ1¸ö
|
break
|
|
# ǰÅÅ
|
elif tagAim == ChConfig.SkillTagAim_FrontRow:
|
# ÓÅÏÈǰÅÅ£¬Èç¹ûûÓÐÔòºóÅÅÒàÊÇǰÅÅ
|
for pNumList in [[1, 2, 3], [4, 5, 6]]:
|
hasObj = False
|
for pNum in pNumList:
|
if pNum not in batLineup.posObjIDDict:
|
continue
|
tagObjID = batLineup.posObjIDDict[pNum]
|
tagBatObj = batObjMgr.getBatObj(tagObjID)
|
if not __skillTagFilter(tagBatObj, tagAffect):
|
continue
|
hasObj = True
|
aimObjList.append(tagBatObj)
|
if hasObj:
|
break
|
|
# ºóÅÅ
|
elif tagAim == ChConfig.SkillTagAim_BackRow:
|
# ÓÅÏȺóÅÅ£¬Èç¹ûûÓÐÔòǰÅÅÒàÊǺóÅÅ
|
for pNumList in [[4, 5, 6], [1, 2, 3]]:
|
hasObj = False
|
for pNum in pNumList:
|
if pNum not in batLineup.posObjIDDict:
|
continue
|
tagObjID = batLineup.posObjIDDict[pNum]
|
tagBatObj = batObjMgr.getBatObj(tagObjID)
|
if not __skillTagFilter(tagBatObj, tagAffect):
|
continue
|
hasObj = True
|
aimObjList.append(tagBatObj)
|
if hasObj:
|
break
|
|
# ÊúÅÅ/×ÝÅÅ
|
elif tagAim == ChConfig.SkillTagAim_Vertical:
|
verticalNumList = [[1, 4], [2, 5], [3, 6]]
|
for pNumList in verticalNumList:
|
# ÓÅÏȶÔλÅÅ
|
if posNum in pNumList:
|
verticalNumList.remove(pNumList)
|
verticalNumList.insert(0, pNumList)
|
break
|
for pNumList in verticalNumList:
|
hasObj = False
|
for pNum in pNumList:
|
if pNum not in batLineup.posObjIDDict:
|
continue
|
tagObjID = batLineup.posObjIDDict[pNum]
|
tagBatObj = batObjMgr.getBatObj(tagObjID)
|
if not __skillTagFilter(tagBatObj, tagAffect):
|
continue
|
hasObj = True
|
aimObjList.append(tagBatObj)
|
if hasObj:
|
break
|
|
# ÆäËû£¬Ä¬ÈÏÈ«²¿
|
else:
|
pNumList = batLineup.posObjIDDict.keys()
|
for pNum in pNumList:
|
if pNum <= 0:
|
continue
|
tagObjID = batLineup.posObjIDDict[pNum]
|
tagBatObj = batObjMgr.getBatObj(tagObjID)
|
if not __skillTagFilter(tagBatObj, tagAffect):
|
continue
|
aimObjList.append(tagBatObj)
|
|
# Ä¿±êϸ·Ö
|
# ѪÁ¿×îµÍ
|
if tagAffect == ChConfig.SkillTagAffect_HPLowest:
|
aimObjList.sort(key=lambda o:(o.GetHP()), reverse=False)
|
#GameWorld.DebugLog("ѪÁ¿×îµÍÅÅÐò: %s" % [[o.GetID(), o.GetHP(), o.GetMaxHP()] for o in aimObjList])
|
aimObjList = aimObjList[:tagCount]
|
|
# ѪÁ¿×î¸ß
|
elif tagAffect == ChConfig.SkillTagAffect_HPHighest:
|
aimObjList.sort(key=lambda o:(o.GetHP()), reverse=True)
|
#GameWorld.DebugLog("ѪÁ¿×î¸ßÅÅÐò: %s" % [[o.GetID(), o.GetHP(), o.GetMaxHP()] for o in aimObjList])
|
aimObjList = aimObjList[:tagCount]
|
|
else:
|
# ·¶Î§Ä¿±ê³¬¹ý¸öÊý£¬ÔòËæ»úÈ¡
|
if tagCount and len(aimObjList) > tagCount:
|
random.shuffle(aimObjList)
|
aimObjList = aimObjList[:tagCount]
|
|
return aimObjList
|
|
def __skillTagFilter(tagBatObj, tagAffect):
|
## ¼¼ÄÜÄ¿±ê¹ýÂËÆ÷
|
# @return: ÊÇ·ñÔÊÐíÌí¼Ó¸Ãµ¥Î»
|
if not tagBatObj:
|
return False
|
if tagAffect != ChConfig.SkillTagAffect_Death and tagBatObj.GetHP() <= 0:
|
return False
|
if tagAffect == ChConfig.SkillTagAffect_Death and tagBatObj.GetHP() > 0:
|
return False
|
if not tagBatObj.GetCanAttack():
|
return False
|
return True
|
|
def __doAddBuff(turnFight, curBatObj, useSkill):
|
#Ö´ÐÐÌí¼Óbuff
|
|
for tagBatObj in useSkill.GetTagObjList():
|
TurnBuff.OnAddBuff(turnFight, tagBatObj, useSkill, buffOwner=curBatObj)
|
|
DoAttackResult(turnFight, curBatObj, useSkill)
|
return
|
|
def __doUseSkill(turnFight, curBatObj, useSkill):
|
|
atkType = useSkill.GetAtkType()
|
GameWorld.DebugLog("__doUseSkill: curID=%s,skillID=%s,atkType=%s" % (curBatObj.GetID(), useSkill.GetSkillID(), atkType))
|
# ͨÓù¥»÷
|
if atkType == 1:
|
SkillModule_1(turnFight, curBatObj, useSkill)
|
return
|
|
# ÖÎÁÆ
|
if atkType == 2:
|
SkillModule_2(turnFight, curBatObj, useSkill)
|
return
|
|
# ¸´»î
|
if atkType == 3:
|
return
|
|
# ¶à´Î¹¥»÷£¨ËøÄ¿±ê¶à´ÎÉ˺¦£¬·Çǰ¶ËµÄ¶à¶ÎƮѪ£©
|
if atkType == 4:
|
return
|
|
# µ¯É䣨¶à´Î¹¥»÷£¬Çл»Ä¿±ê£©
|
if atkType == 5:
|
return
|
|
# 6 ÅÆøÔö¼õ͵
|
if atkType == 6:
|
SkillModule_6(turnFight, curBatObj, useSkill)
|
return
|
|
return
|
|
def SkillModule_1(turnFight, curBatObj, useSkill):
|
## ͨÓù¥»÷£¬µ¥¹¥¡¢Èº¹¥
|
|
#Ö´Ðй¥»÷½á¹û
|
for tagBatObj in useSkill.GetTagObjList():
|
__doSkillHurtHP(curBatObj, tagBatObj, useSkill)
|
|
DoAttackResult(turnFight, curBatObj, useSkill)
|
return
|
|
def SkillModule_2(turnFight, curBatObj, useSkill):
|
## ÖÎÁÆ
|
|
skillID = useSkill.GetSkillID()
|
for tagBatObj in useSkill.GetTagObjList():
|
cureHP = CalcCureHP(curBatObj, tagBatObj, useSkill, largeNum=True)
|
if cureHP <= 0:
|
continue
|
|
dHP = tagBatObj.GetHP()
|
dMapHP = tagBatObj.GetMaxHP()
|
|
remainHP = min(dHP + cureHP, dMapHP)
|
realCureHP = max(remainHP - dHP, 0)
|
tagBatObj.SetHP(remainHP)
|
|
dID = tagBatObj.GetID()
|
hurtObj = useSkill.AddHurtObj(dID)
|
hurtObj.AddHurtType(ChConfig.HurtTYpe_Recovery)
|
hurtObj.SetHurtHP(cureHP)
|
hurtObj.SetLostHP(realCureHP)
|
hurtObj.SetCurHP(tagBatObj.GetHP())
|
GameWorld.DebugLog(" ÖÎÁÆ: dID=%s,cureHP=%s,realCureHP=%s,%s/%s" % (dID, cureHP, realCureHP, tagBatObj.GetHP(), dMapHP))
|
|
TurnAttack.AddTurnObjCureHP(tagBatObj, curBatObj, cureHP, realCureHP, skillID)
|
|
DoAttackResult(turnFight, curBatObj, useSkill)
|
return
|
|
def SkillModule_6(turnFight, curBatObj, useSkill):
|
## ÅÆøÔö¼õ͵
|
|
curID = curBatObj.GetID()
|
skillID = useSkill.GetSkillID()
|
bySkill = useSkill.GetBySkill()
|
relatedSkillID = bySkill.GetSkillID() if bySkill else 0
|
|
angerPer, angerValue, calcType = 0, 0, 0
|
effect = SkillCommon.GetSkillEffectByEffectID(useSkill, ChConfig.Def_Skill_Effect_Anger)
|
if effect:
|
angerPer = effect.GetEffectValue(0)
|
angerValue = effect.GetEffectValue(1)
|
calcType = effect.GetEffectValue(2)
|
xpMax = IpyGameDataPY.GetFuncCfg("AngerXP", 2)
|
calcValue = int(xpMax * angerPer / 10000.0 + angerValue)
|
attrID = ChConfig.AttrID_XP
|
|
GameWorld.DebugLog("ÅÆøÔö¼õ͵: curID=%s,calcValue=%s,skillID=%s,angerPer=%s,angerValue=%s,calcType=%s,relatedSkillID=%s"
|
% (curID, calcValue, skillID, angerPer, angerValue, calcType, relatedSkillID))
|
curStealTotal = 0
|
for tagBatObj in useSkill.GetTagObjList():
|
|
tagID = tagBatObj.GetID()
|
# ¼õ
|
if calcType == 2:
|
diffType = 0
|
tagXP = tagBatObj.GetXP()
|
diffValue = min(tagXP, calcValue) # È¡½ÏСֵ£¬²»×ãʱʣ¶àÉÙ¼õ¶àÉÙ
|
updValue = tagXP - diffValue
|
tagBatObj.SetXP(updValue, False)
|
GameWorld.DebugLog(" ¼õÅÆø: tagID=%s,diffValue=%s,tagXP=%s,updXP=%s" % (tagID, diffValue, tagXP, updValue))
|
Sync_PropertyRefreshView(turnFight, tagBatObj, attrID, updValue, diffValue, diffType, skillID, relatedSkillID)
|
|
# ͵
|
elif calcType == 3:
|
diffType = 0
|
tagXP = tagBatObj.GetXP()
|
diffValue = min(tagXP, calcValue) # È¡½ÏСֵ£¬²»×ãʱʣ¶àÉÙ¼õ¶àÉÙ
|
updValue = tagXP - diffValue
|
tagBatObj.SetXP(updValue, False)
|
GameWorld.DebugLog(" ÍµÅÆø: tagID=%s,diffValue=%s,tagXP=%s,updXP=%s" % (tagID, diffValue, tagXP, updValue))
|
Sync_PropertyRefreshView(turnFight, tagBatObj, attrID, updValue, diffValue, diffType, skillID, relatedSkillID)
|
|
curStealTotal += diffValue
|
|
# ÆäËûĬÈϼÓ
|
else:
|
diffType = 1
|
tagXP = tagBatObj.GetXP()
|
diffValue = calcValue
|
updValue = tagXP + diffValue
|
tagBatObj.SetXP(updValue, False)
|
GameWorld.DebugLog(" ¼ÓÅÆø: tagID=%s,diffValue=%s,tagXP=%s,updXP=%s" % (tagID, diffValue, tagXP, updValue))
|
Sync_PropertyRefreshView(turnFight, tagBatObj, attrID, updValue, diffValue, diffType, skillID, relatedSkillID)
|
|
if curStealTotal > 0:
|
diffType = 1
|
curXP = curBatObj.GetXP()
|
diffValue = curStealTotal
|
updValue = curXP + diffValue
|
curBatObj.SetXP(updValue, False)
|
GameWorld.DebugLog(" ͵×ÜÅÆø: curID=%s,curStealTotal=%s,curXP=%s,updXP=%s" % (curID, curStealTotal, curXP, updValue))
|
Sync_PropertyRefreshView(turnFight, curBatObj, attrID, updValue, diffValue, diffType, skillID, relatedSkillID)
|
|
DoAttackResult(turnFight, curBatObj, useSkill)
|
return
|
|
def DoAttackResult(turnFight, curBatObj, useSkill):
|
'''Ö´Ðй¥»÷½á¹û£¬¼¼ÄÜ¡¢buffͨÓÃ
|
@param curBatObj: Ê©·¨·½»òbuff¹éÊô·½
|
'''
|
|
if curBatObj:
|
# ·´µ¯¡¢ÎüѪ µÄÔÒò£¬ÐèҪͳһ´¦Àíºó½áË㣬¿ÉÄܵ¼ÖÂHPΪ¸ºÖµ£¬ÐÞÕýΪ0
|
if curBatObj.GetHP() < 0:
|
curBatObj.SetHP(0)
|
|
skillID = useSkill.GetSkillID()
|
curBatObj.AddSkillUseCnt(skillID)
|
|
# ÐèÏÈ֪ͨÉËѪ - ǰ¶Ë°´Ë³ÐòÓÅÏȱíÏÖ¼¼ÄÜÊÍ·ÅÄÚÈÝ£¬
|
isEnhanceSkill = useSkill.GetIsEnhanceSkill()
|
if not isEnhanceSkill or len(useSkill.GetHurtObjList()):
|
Sync_UseSkill(turnFight, curBatObj, useSkill)
|
if not isEnhanceSkill:
|
__doCostZhanchui(turnFight, curBatObj, useSkill)
|
__doSkillUserAnger(turnFight, curBatObj, useSkill)
|
|
# ͳ¼ÆËÀÍö
|
killObjIDList = [] # »÷ɱµÄÄ¿±êIDÁбí
|
for tagObj in useSkill.GetTagObjList():
|
tagID = tagObj.GetID()
|
# ¿ÉÄܵ¥¸ö¼¼ÄܶÔͬһĿ±êÔì³É¶à´ÎÉ˺¦£¬ËùÒÔÕâÀï±éÀú£¬È絯ÉäµÈ
|
for hurtObj in useSkill.GetHurtObjList():
|
if hurtObj.GetObjID() == tagID and not hurtObj.HaveHurtType(ChConfig.HurtTYpe_Recovery):
|
__doSkillHurtAnger(tagObj, hurtObj.GetLostHP(), useSkill)
|
if tagObj.GetHP() <= 0:
|
killObjIDList.append(tagID)
|
TurnAttack.SetObjKilled(turnFight, tagObj, curBatObj, useSkill)
|
if curBatObj.GetHP() <= 0:
|
TurnAttack.SetObjKilled(turnFight, curBatObj)
|
|
# ½áË㸱±¾Ïà¹ØµÄ¹¥»÷½á¹û£¬½öÖ÷¶¯·¢ÆðÍæ¼ÒÕóÈÝÎ佫´¥·¢
|
curPlayer = turnFight.curPlayer
|
if curPlayer and curBatObj.GetOwnerID() == curPlayer.GetPlayerID():
|
FBLogic.OnPlayerLineupAttackResult(curPlayer, curBatObj, killObjIDList, useSkill, turnFight.mapID, turnFight.funcLineID)
|
|
# ¶îÍâ´¥·¢¼¼ÄÜ
|
__doUseEnhanceSkill(turnFight, curBatObj, useSkill)
|
|
# Ñ»·´¥·¢±»¶¯£¬´ýÀ©Õ¹
|
|
# ×îºó´¦Àí·´»÷ »ò Á¬»÷
|
|
return
|
|
def __doCostZhanchui(turnFight, curBatObj, useSkill):
|
|
turnFight.mapID
|
if turnFight.mapID != ChConfig.Def_FBMapID_Main:
|
## ½öÖ÷ÏßÕ½¶·ÐèÒª
|
return
|
|
curPlayer = turnFight.curPlayer
|
if not curPlayer:
|
return
|
# ½öÖ÷¶¯·¢ÆðÍæ¼ÒÕóÈÝÎ佫Êͷż¼ÄÜÐèÒªÏûºÄ
|
if curBatObj.GetOwnerID() != curPlayer.GetPlayerID():
|
return
|
|
costZhanchui = 0
|
batType = useSkill.GetBatType()
|
if SkillCommon.isAngerSkill(useSkill):
|
costZhanchui = IpyGameDataPY.GetFuncCfg("ZhanchuiCost", 2)
|
elif batType == ChConfig.TurnBattleType_Combo:
|
costZhanchui = IpyGameDataPY.GetFuncCfg("ZhanchuiCost", 3)
|
elif batType == ChConfig.TurnBattleType_AtkBack:
|
costZhanchui = IpyGameDataPY.GetFuncCfg("ZhanchuiCost", 4)
|
elif SkillCommon.isTurnNormalSkill(useSkill):
|
costZhanchui = IpyGameDataPY.GetFuncCfg("ZhanchuiCost", 1)
|
|
if costZhanchui <= 0:
|
return
|
|
fightPoint = max(curPlayer.GetFightPoint(), 1) # Ö÷ÏßÕ½¶·ÏûºÄ±¶Öµ£¬Ä¬ÈÏ1
|
costZhanchuiTotal = costZhanchui * fightPoint
|
if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao, costZhanchuiTotal, isNotify=False):
|
# ²»×ãʱ£¬ÓжàÉÙ¿Û¶àÉÙ
|
nowMoney = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao)
|
PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao, min(nowMoney, costZhanchuiTotal), isNotify=False)
|
|
return
|
|
def __doSkillUserAnger(turnFight, curBatObj, useSkill):
|
## ¼¼ÄÜÊÍ·ÅÕßÅÆøÏà¹Ø
|
if SkillCommon.isAngerSkill(useSkill):
|
curBatObj.SetXP(0)
|
elif SkillCommon.isTurnNormalSkill(useSkill):
|
addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 3)
|
AddTurnFightXP(curBatObj, addXP, "skillID:%s" % useSkill.GetSkillID())
|
return
|
|
def __doSkillHurtAnger(batObj, lostHP, useSkill):
|
## ½áËãÊÜÉËÕßÅÆø
|
if lostHP <= 0:
|
return
|
addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 4)
|
if addXP <= 0:
|
return
|
AddTurnFightXP(batObj, addXP, "skillID:%s" % useSkill.GetSkillID())
|
return
|
|
def AddTurnFightXP(gameObj, addXP, reason=""):
|
## »ØºÏÕ½¶·Ôö¼ÓXP
|
if addXP <= 0 or not addXP:
|
#GameWorld.DebugLog(" ûÓÐÔö¼ÓXP! curID=%s" % (gameObj.GetID()))
|
return
|
posNum = gameObj.GetPosNum()
|
if posNum <= 0:
|
#·ÇÖ÷Õ½µ¥Î»²»¼Ó
|
return
|
curXP = gameObj.GetXP()
|
updXP = curXP + addXP
|
gameObj.SetXP(updXP)
|
GameWorld.DebugLog(" ¸üÐÂXP: curID=%s,curXP=%s,addXP=%s,updXP=%s,reason=%s" % (gameObj.GetID(), curXP, addXP, updXP, reason))
|
return
|
|
def __doUseEnhanceSkill(turnFight, curBatObj, useSkill):
|
if useSkill.GetIsEnhanceSkill():
|
GameWorld.DebugLog("×ÔÉíΪ¶îÍâ´¥·¢µÄ¼¼Äܲ»ÔÙ´¥·¢¶îÍâ¼¼ÄÜ! skillID=%s" % useSkill.GetSkillID())
|
return
|
enhanceSkillIDList = useSkill.GetEnhanceSkillList()
|
if not enhanceSkillIDList:
|
return
|
GameWorld.DebugLog("¶îÍâ´¥·¢µÄ¼¼ÄÜ! skillID=%s,enhanceSkillIDList=%s" % (useSkill.GetSkillID(), enhanceSkillIDList))
|
# ¸ù¾Ý´¥·¢¼¼ÄܵÄÌØµã¾ö¶¨ÊÇ´¥·¢Ò»´Î»¹ÊÇ ´¥·¢¶à´Î
|
# ȺÌåBUFFµÄÇë²Î¿¼ IsPlayerUseSkill ¿Í»§¶Ë¾ö¶¨¶ÔÏó£¬Ò»Ñù¿ÉÒÔʵÏÖͬÑùЧ¹û
|
tagObjList = useSkill.GetTagObjList()
|
for enhanceSkillID in enhanceSkillIDList:
|
enhanceSkillData = IpyGameDataPY.GetIpyGameData("Skill", enhanceSkillID)
|
if not enhanceSkillData:
|
continue
|
# ¼Ì³ÐÖ÷¼¼ÄÜÄ¿±ê
|
if enhanceSkillData.GetTagAim() == ChConfig.SkillTagAim_MainSkill:
|
GameWorld.DebugLog(" ¶îÍâ´¥·¢¼¼ÄÜ£¬¼Ì³ÐÖ÷¼¼ÄÜÄ¿±ê! enhanceSkillID=%s" % enhanceSkillID)
|
# ¶îÍâ´¥·¢µÄ¼¼ÄÜÖ±½ÓÔÚÍâ²ã¼ì²é¸ÅÂÊ£¬Èç¹û¶¼Ã»Óд¥·¢Ôò²»ÐèÒªÔÙ´¦Àí
|
enhanceRate = enhanceSkillData.GetHappenRate()
|
enchanceTagObjList = []
|
for tagObj in tagObjList:
|
tagID = tagObj.GetID()
|
if tagObj.GetHP() <= 0:
|
GameWorld.DebugLog(" Òѱ»»÷ɱ²»´¥·¢: tagID=%s" % (tagID))
|
continue
|
inHurt = False
|
for hurtObj in useSkill.GetHurtObjList():
|
if hurtObj.GetObjID() != tagID:
|
continue
|
if not hurtObj.GetHurtHP() or hurtObj.HaveHurtType(ChConfig.HurtType_Miss):
|
continue
|
inHurt = True
|
break
|
if not inHurt:
|
GameWorld.DebugLog(" ûÓÐÉËѪ²»´¥·¢: tagID=%s" % (tagID))
|
continue
|
if enhanceRate and enhanceRate != ChConfig.Def_MaxRateValue and not GameWorld.CanHappen(enhanceRate, ChConfig.Def_MaxRateValue):
|
GameWorld.DebugLog(" ¸ÅÂʲ»´¥·¢: tagID=%s,enhanceRate=%s" % (tagID, enhanceRate))
|
continue
|
|
enchanceTagObjList.append(tagObj)
|
|
if enchanceTagObjList:
|
OnUseSkill(turnFight, curBatObj, enhanceSkillData, enchanceTagObjList, bySkill=useSkill, isEnhanceSkill=True)
|
|
continue
|
|
GameWorld.DebugLog(" ¶îÍâ´¥·¢¼¼ÄÜ£¬ÖØÐÂËø¶¨Ä¿±ê! enhanceSkillID=%s" % enhanceSkillID)
|
OnUseSkill(turnFight, curBatObj, enhanceSkillData, bySkill=useSkill, isEnhanceSkill=True)
|
|
return
|
|
def __doSkillHurtHP(attacker, defObj, curSkill):
|
## Ö´Ðм¼ÄÜÉËѪ£¬Ö»¼ÆËãÉËѪ£¬ÆäËûÂß¼µÈ¼¼ÄÜͬ²½ºóÔÙ´¦Àí
|
# @return: None - ûÓÐÖ´Ðгɹ¦£¬¼´ºöÂÔ¸ÃÄ¿±ê
|
|
atkObj = attacker
|
atkID = atkObj.GetID()
|
defID = defObj.GetID()
|
hurtObj = curSkill.AddHurtObj(defID)
|
|
#¼ì²éÊÇ·ñ¼¸ÂÊ´¥·¢£¬¸½¼Ó¼¼ÄÜ¡¢±»¶¯´¥·¢µÄÍâ²ãÒѼì²é¹ý¸ÅÂÊ£¬²»Öظ´¼ì²é
|
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.Log('¼ì²éÊÇ·ñ¼¸ÂÊ´¥·¢ = %sʧ°Ü = %s'%(rate, useSkill.GetSkillName()))
|
#·ÅÕâÀ¼æÈÝȺ¹¥Ê±Èç¹û¸Ã¼¼ÄÜÊÇÓиÅÂʵģ¬Ôòÿ¸öÄ¿±êµ¥¶ÀÅжÏ
|
hurtObj.AddHurtType(ChConfig.HurtType_Fail)
|
hurtObj.SetCurHP(defObj.GetHP())
|
return hurtObj
|
|
effect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_Attack)
|
atkSkillValue = 0
|
atkSkillPer = effect.GetEffectValue(0) if effect else 0
|
|
dHP = defObj.GetHP() # ·ÀÊØ·½µ±Ç°ÑªÁ¿
|
dMaxHP = defObj.GetMaxHP() # ·ÀÊØ·½×î´óѪÁ¿
|
|
zhansha = False # Õ¶É±ÌØÊâ´¦Àí
|
# նɱ
|
if zhansha:
|
pass
|
|
else:
|
hurtValue, hurtTypes = CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer)
|
|
# ¸÷ÖÖ¼õÉË ÎüÊÕ¶Ü´¦Àí
|
#hurtValue = CalcHurtHPWithBuff(atkObj, defObj, hurtValue, curSkill, tick)
|
|
#É˺¦½á¹¹Ìå
|
hurtObj.SetHurtTypes(hurtTypes)
|
hurtObj.SetHurtHP(hurtValue)
|
remainHP = min(dMaxHP, max(0, dHP - hurtValue)) # Ê£ÓàѪÁ¿
|
|
remainHP = int(remainHP) #·À·¶
|
lostHP = dHP - remainHP # ʵ¼ÊµôѪÁ¿
|
hurtObj.SetLostHP(lostHP)
|
hurtObj.SetCurHP(remainHP)
|
defObj.SetHP(remainHP)
|
GameWorld.DebugLog(" ÉËѪ: atkID=%s,defID=%s,hurtValue=%s,lostHP=%s,%s/%s" % (atkID, defID, hurtValue, lostHP, defObj.GetHP(), defObj.GetMaxHP()))
|
|
#·´µ¯É˺¦
|
CalcBounceHP(atkObj, defObj, hurtObj, curSkill)
|
|
#ÎüѪ
|
CalcSuckBlood(atkObj, defObj, hurtObj, curSkill)
|
|
TurnAttack.AddTurnObjHurtValue(atkObj, defObj, hurtValue, lostHP, curSkill)
|
return hurtObj
|
|
def CalcHurtHP(atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, **atkwargs):
|
'''¼ÆËãÉ˺¦
|
'''
|
pmType = GetPMType(atkObj, curSkill)
|
ignoreDef = IsIgnoreDef(curSkill)
|
|
atkID = atkObj.GetID()
|
defID = defObj.GetID()
|
|
skillID = curSkill.GetSkillID()
|
isTurnNormalSkill = SkillCommon.isTurnNormalSkill(curSkill)
|
isAngerSkill = SkillCommon.isAngerSkill(curSkill)
|
isAtkbackSkill = SkillCommon.isAtkbackSkill(curSkill)
|
|
angerOverflow = 0 # ÅÆøÒç³öÖµ
|
|
mustHit = False
|
if isAngerSkill:
|
mustHit = True
|
curXP = atkObj.GetXP()
|
angerOverflow = max(atkObj.GetXP() - IpyGameDataPY.GetFuncCfg("AngerXP", 2), 0)
|
GameWorld.DebugLog("XP±ØÃüÖÐ! curXP=%s,angerOverflow=%s" % (curXP, angerOverflow))
|
|
#ÃüÖй«Ê½ ¹¥»÷·½ÀàÐͲ»Í¬£¬¹«Ê½²»Í¬
|
if not mustHit:
|
aMissRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_MissRateDef) #atkObj.GetHit() # ¿¹ÉÁ±ÜÂÊ - ÃüÖÐ
|
dMissRate = defObj.GetBatAttrValue(ChConfig.AttrID_MissRate) # ÉÁ±ÜÂÊ
|
missNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnMissNum)
|
missRate = eval(IpyGameDataPY.GetFuncCompileCfg("MissCfg", 1))
|
if GameWorld.CanHappen(missRate):
|
return 0, pow(2, ChConfig.HurtType_Miss)
|
|
hurtTypes = pow(2, ChConfig.HurtType_Normal)
|
|
isSuperHit = False # ÊÇ·ñ±©»÷
|
if isSuperHit:
|
hurtTypes |= pow(2, ChConfig.HurtType_SuperHit)
|
|
isParry = False # ÊÇ·ñ¸ñµ²
|
if isParry:
|
hurtTypes |= pow(2, ChConfig.HurtType_Parry)
|
|
if ignoreDef:
|
hurtTypes |= pow(2, ChConfig.HurtType_IgnoreDef)
|
|
#²ÎÓëÔËËãµÄÊýÖµ
|
rand = random.random() #ÖÖ×ÓÊý 0~1
|
|
aAtk = atkObj.GetBatAttrValue(ChConfig.AttrID_Atk) # ¹¥»÷·½×î´ó¹¥»÷
|
|
dHP = defObj.GetHP()
|
dDef = 0 if ignoreDef else defObj.GetBatAttrValue(ChConfig.AttrID_Def) # ·ÀÊØ·½·ÀÓùÁ¦
|
|
aFinalDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPer) # ×îÖÕ¼Ó³É
|
dFinalDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_FinalDamPerDef) # ×îÖÕ¼õÉË
|
|
aNormalSkillPer, dNormalSkillPerDef = 0, 0
|
if isTurnNormalSkill:
|
aNormalSkillPer = atkObj.GetBatAttrValue(ChConfig.AttrID_NormalSkillPer) # ÆÕ¼¼ÔöÉË
|
dNormalSkillPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_NormalSkillPerDef) # ÆÕ¼¼¼õÉË
|
|
aAngerSkillPer, dAngerSkillPerDef = 0, 0
|
if isAngerSkill:
|
aAngerSkillPer = atkObj.GetBatAttrValue(ChConfig.AttrID_AngerSkillPer) # ÆÕ¼¼ÔöÉË
|
dAngerSkillPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_AngerSkillPerDef) # ÆÕ¼¼¼õÉË
|
|
# Îï·¨Ôö¼õÉË
|
if pmType == IPY_GameWorld.ghtMag: # ·¨ÉË
|
aPMDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_MagDamPer)
|
dPMDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_MagDamPerDef)
|
else: # ÎïÉË
|
aPMDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_PhyDamPer)
|
dPMDamPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_PhyDamPerDef)
|
|
# ËùÓÐÍò·ÖÂʲÎÊýͳһ³ý10000.0
|
atkSkillPer /= 10000.0
|
aNormalSkillPer /= 10000.0
|
dNormalSkillPerDef /= 10000.0
|
aAngerSkillPer /= 10000.0
|
dAngerSkillPerDef /= 10000.0
|
aPMDamPer /= 10000.0
|
dPMDamPerDef /= 10000.0
|
aFinalDamPer /= 10000.0
|
dFinalDamPerDef /= 10000.0
|
|
|
GameWorld.DebugLog("ÉËѪ¼ÆËã: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s"
|
% (atkID, defID, skillID, atkSkillPer, aAtk, dDef, dHP, hurtTypes))
|
|
if "hurtFormulaKey" in atkwargs:
|
aBurnValue = atkwargs.get('burnValue', 0)
|
aBurnPer = atkwargs.get('burnPer', 0)
|
hurtFormulaKey = atkwargs.get('hurtFormulaKey', None)
|
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
|
elif isTurnNormalSkill:
|
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 1))
|
GameWorld.DebugLog(" ÆÕ¹¥¼¼ÄÜÉ˺¦=%s" % (hurtValue))
|
elif isAngerSkill:
|
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 2))
|
GameWorld.DebugLog(" ÅÆø¼¼ÄÜÉ˺¦=%s" % (hurtValue))
|
elif isAtkbackSkill:
|
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 3))
|
GameWorld.DebugLog(" ·´»÷É˺¦=%s" % (hurtValue))
|
else:
|
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 4))
|
GameWorld.DebugLog(" ÆäËûÉ˺¦=%s" % (hurtValue))
|
|
hurtValue = max(1, int(hurtValue)) # ¸ºÖµ¡¢±£µ×·À·¶
|
|
return hurtValue, hurtTypes
|
|
def CalcBounceHP(atkObj, defObj, hurtObj, curSkill):
|
'''¼ÆËã·´µ¯·´µ¯É˺¦
|
'''
|
if not atkObj.GetCanAttack():
|
return
|
|
bounceHP = int(hurtObj.GetHurtHP() * random.uniform(0.1, 0.2))
|
|
if bounceHP <= 0:
|
return
|
|
remainHP = atkObj.GetHP() - bounceHP # ·´µ¯ÔÊÐíµ¯µ½¸ºÖµ£¬Èç¹û×îÖÕÎüѪûÓÐÎüµ½ÕýÖµÔòËãËÀÍö
|
hurtObj.SetBounceHP(bounceHP)
|
atkObj.SetHP(remainHP)
|
GameWorld.DebugLog(" ·´µ¯É˺¦=%s,remainHP=%s/%s" % (bounceHP, remainHP, atkObj.GetMaxHP()))
|
|
TurnAttack.AddTurnObjHurtValue(defObj, atkObj, bounceHP, bounceHP, isBounce=True)
|
return
|
|
def CalcSuckBlood(atkObj, defObj, hurtObj, curSkill):
|
'''¼ÆËãÎüѪ
|
'''
|
|
suckHP = int(hurtObj.GetHurtHP() * random.uniform(0.1, 0.2))
|
|
if suckHP <= 0:
|
return
|
|
curHP = atkObj.GetHP()
|
maxHP = atkObj.GetMaxHP()
|
remainHP = min(curHP + suckHP, maxHP)
|
cureHP = remainHP - curHP # ʵ¼ÊÖÎÁÆÁ¿
|
|
hurtObj.SetSuckHP(suckHP)
|
atkObj.SetHP(remainHP)
|
GameWorld.DebugLog(" ÎüѪ=%s,remainHP=%s/%s" % (suckHP, remainHP, maxHP))
|
|
# ÎüѪÔݶ¨ËãÖÎÁÆ
|
TurnAttack.AddTurnObjCureHP(atkObj, atkObj, suckHP, cureHP)
|
return
|
|
def CalcCureHP(userObj, tagObj, curSkill, largeNum=False):
|
''' ¼ÆËãÖÎÁÆÖµ
|
'''
|
cureBaseValue = 0 #ÖÎÁÆ»ù´¡Öµ
|
effect = SkillCommon.GetSkillEffectByEffectID(curSkill, ChConfig.Def_Skill_Effect_Cure)
|
skillPer = effect.GetEffectValue(0) if effect else 0
|
cureType = effect.GetEffectValue(1) if effect else 0
|
|
#»ñµÃ»ù´¡ÖÎÁÆÖµ
|
if cureType == ChConfig.Def_Cure_Attack:
|
cureBaseValue = userObj.GetAtk()
|
elif cureType == ChConfig.Def_Cure_MaxHP:
|
cureBaseValue = userObj.GetMaxHP()
|
#elif cureType == ChConfig.Def_Cure_HurtValue:
|
# cureBaseValue = GameObj.GetLastHurtValue(userObj)
|
elif cureType == ChConfig.Def_Cure_TagMaxHP:
|
cureBaseValue = 0 if not tagObj else tagObj.GetMaxHP()
|
|
#skillPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(userObj, None, curSkill, ChConfig.TriggerType_AddHP)
|
|
# »ØºÏÖÆ
|
curePer = 0 # ÖÎÁƼӳÉ
|
cureDefPer = 0 # µÐ·½µÄÈõ»¯ÖÎÁÆ
|
angerOverflow = 0 # ÅÆøÒç³öÖµ
|
if SkillCommon.isAngerSkill(curSkill):
|
angerOverflow = max(userObj.GetXP() - IpyGameDataPY.GetFuncCfg("AngerXP", 2), 0)
|
#enemyObj = TurnAttack.GetEnemyObj(userObj)
|
#curePer += GameObj.GetCurePer(userObj)
|
#if enemyObj:
|
# cureDefPer += GameObj.GetCureDefPer(enemyObj)
|
|
skillPer /= float(ChConfig.Def_MaxRateValue)
|
curePer /= float(ChConfig.Def_MaxRateValue)
|
cureDefPer /= float(ChConfig.Def_MaxRateValue)
|
|
baseValue = max(0, cureBaseValue) # ·ÀÖ¹»ùÖµ±»Èõ»¯Îª¸ºÖµ£¬ÔÚ»Ö¸´±ÈÀýÒ²ÊǸºÖµµÄÇé¿öϸº¸ºµÃÕýµ¼Ö¿ÉÒÔ»Ö¸´ÑªÁ¿
|
|
#¹«Ê½¼ÆËãÖÎÁÆÖµ
|
cureHP = eval(IpyGameDataPY.GetFuncCompileCfg("CureFormula", 1))
|
if not largeNum:
|
cureHP = min(cureHP, ChConfig.Def_UpperLimit_DWord)
|
cureHP = max(1, int(cureHP)) # ±£µ×1µã
|
|
GameWorld.DebugLog("¼ÆËãÖÎÁÆÖµ(%s)£ºskillID=%s,cureType=%s,baseValue=%s,skillPer=%s,curePer=%s,cureDefPer=%s,angerOverflow=%s"
|
% (cureHP, curSkill.GetSkillID(), cureType, baseValue, skillPer, curePer, cureDefPer, angerOverflow))
|
return cureHP
|
|
def Sync_UseSkill(turnFight, curBatObj, useSkill):
|
## ֪ͨÊͷż¼ÄÜ
|
poolMgr = ObjPool.GetPoolMgr()
|
clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkill)
|
clientPack.ObjID = curBatObj.GetID()
|
clientPack.PMType = GetPMType(curBatObj, useSkill)
|
clientPack.BattleType = useSkill.GetBatType()
|
clientPack.CurHP = curBatObj.GetHP() % ChConfig.Def_PerPointValue
|
clientPack.CurHPEx = curBatObj.GetHP() / ChConfig.Def_PerPointValue
|
clientPack.SkillID = useSkill.GetSkillID()
|
clientPack.HurtList = []
|
for hurtObj in useSkill.GetHurtObjList():
|
hurt = poolMgr.acquire(ChPyNetSendPack.tagSCUseSkillHurt)
|
hurt.ObjID = hurtObj.GetObjID()
|
hurt.AttackTypes = hurtObj.GetHurtTypes()
|
hurt.HurtHP = hurtObj.GetHurtHP() % ChConfig.Def_PerPointValue
|
hurt.HurtHPEx = hurtObj.GetHurtHP() / ChConfig.Def_PerPointValue
|
hurt.CurHP = hurtObj.GetCurHP() % ChConfig.Def_PerPointValue
|
hurt.CurHPEx = hurtObj.GetCurHP() / ChConfig.Def_PerPointValue
|
hurt.SuckHP = min(hurtObj.GetSuckHP(), ChConfig.Def_UpperLimit_DWord)
|
hurt.BounceHP = min(hurtObj.GetBounceHP(), ChConfig.Def_UpperLimit_DWord)
|
clientPack.HurtList.append(hurt)
|
clientPack.HurtCount = len(clientPack.HurtList)
|
turnFight.addBatPack(clientPack)
|
return
|
|
def Sync_PropertyRefreshView(turnFight, curBatObj, attrID, value, diffValue, diffType=0, skillID=0, relatedSkillID=0):
|
'''֪ͨ¶ÔÏóÊôÐÔË¢ÐÂչʾB418
|
@param attrID: ֪ͨ±ä»¯µÄÊôÐÔID
|
@param diffValue: ±ä»¯Öµ
|
@param diffType: ±ä»¯ÀàÐÍ£¬0-¼õÉÙ£»1-Ôö¼Ó
|
@param skillID: ʹÓõļ¼ÄܱíID£¬¼´Äĸö¼¼ÄܵÄЧ¹û
|
@param relatedSkillID: ¹ØÁªµÄ¼¼ÄÜID£¬Ò»°ãÊÇÖ÷¼¼ÄÜID£¬·ÇÖ÷¼¼ÄܶîÍâ´¥·¢µÄΪ0
|
'''
|
if attrID not in ChConfig.CDBRefresh_AttrIDDict:
|
return
|
refreshType, isBig = ChConfig.CDBRefresh_AttrIDDict[attrID]
|
poolMgr = ObjPool.GetPoolMgr()
|
clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCObjPropertyRefreshView)
|
clientPack.ObjID = curBatObj.GetID()
|
clientPack.RefreshType = refreshType
|
if isBig:
|
clientPack.Value = value % ShareDefine.Def_PerPointValue
|
clientPack.ValueEx = value / ShareDefine.Def_PerPointValue
|
clientPack.DiffValue = diffValue % ShareDefine.Def_PerPointValue
|
clientPack.DiffValueEx = diffValue / ShareDefine.Def_PerPointValue
|
else:
|
clientPack.Value = value
|
clientPack.ValueEx = 0
|
clientPack.DiffValue = diffValue
|
clientPack.DiffValueEx = 0
|
clientPack.DiffType = diffType
|
clientPack.SkillID = skillID
|
clientPack.RelatedSkillID = relatedSkillID
|
turnFight.addBatPack(clientPack)
|
return
|