#!/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 TurnPassive
|
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):
|
'''ʹÓü¼ÄÜͨÓÃÈë¿Ú
|
@param useSkill: ʹÓõļ¼ÄÜ£¬×¢Òâ²¢²»Ò»¶¨ÊÇÉíÉϵļ¼ÄÜ£¬¿ÉÄÜÖ»ÊÇ SkillData ±íÊý¾Ý
|
@param bySkill: ÓÉÄĸö¼¼ÄܶîÍâ´¥·¢µÄ£¬±ÈÈ總¼Ó´¥·¢µÄ¼¼ÄÜ»ò±»¶¯¼¼Äܾù¿ÉÄÜÓÉij¸ö¼¼ÄÜ´¥·¢
|
@param isEnhanceSkill: ÊÇ·ñ¸½¼Ó´¥·¢µÄ¼¼ÄÜ£¬¼´Ö÷¼¼Äܲð·Ö³É¶à¸ö¼¼ÄÜ£¬¶îÍâÊͷŵÄ
|
@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)
|
rate = useSkill.GetHappenRate()
|
if rate and rate != ChConfig.Def_MaxRateValue:
|
for tagObj in tagObjList[::-1]:
|
if not GameWorld.CanHappen(rate, ChConfig.Def_MaxRateValue):
|
tagObjList.remove(tagObj)
|
|
if not tagObjList:
|
# ¿ÉÀ©Õ¹ÆäËûÄ¿±êÑ¡Ôñ£¬È縴»î¼¼ÄÜûÓÐËÀÍöµ¥Î»Ê±ÔòʹÓÃÁíÍâµÄЧ¹û
|
return
|
|
bySkillID = bySkill.GetSkillID() if bySkill else 0
|
GameWorld.DebugLog("ʹÓü¼ÄÜ: curID=%s,skillID=%s,tagCnt=%s,batType=%s,bySkillID=%s"
|
% (curBatObj.GetID(), skillID, len(tagObjList), batType, bySkillID))
|
# ÒÔÏÂΪ¼¼ÄÜ¿ÉÒÔʹÓõĴ¦Àí£¬Ö®ºóµÄÂ߼ĬÈϼ¼ÄÜʹÓóɹ¦
|
|
poolMgr = ObjPool.GetPoolMgr()
|
usePoolSkill = False
|
if isinstance(useSkill, IpyGameDataPY.IPY_Skill):
|
usePoolSkill = True
|
# ͳһʹÓà BattleObj.PySkill
|
useSkill = poolMgr.acquire(BattleObj.PySkill, useSkill)
|
|
useSkill.ResetUseRec()
|
useSkill.SetTagObjList(tagObjList)
|
useSkill.SetBatType(batType)
|
useSkill.SetBySkill(bySkill)
|
|
curBatObj.ClearSkillTempAttr()
|
for tagObj in tagObjList:
|
tagObj.ClearSkillTempAttr()
|
|
objID = curBatObj.GetID()
|
useTag = ""
|
|
#Õâ¸ö¼¼ÄÜÊÇBuff
|
if SkillCommon.IsBuff(useSkill):
|
__doAddBuff(turnFight, curBatObj, useSkill)
|
else:
|
# Ö÷¼¼ÄܶîÍâ´¥·¢µÄ¼¼Äܿɲ»Ï·¢£¬Ç°¶ËÊÓΪ½öÊÍ·ÅÒ»¸öÖ÷¼¼ÄÜ
|
if batType != ChConfig.TurnBattleType_Enhance:
|
# ÒòΪ¿ÉÄÜ´¥·¢Á¬»÷£¬ËùÒÔ±ê¼ÇÐè´øÉÏÀÛ¼ÆÊ¹Óü¼ÄÜ´ÎÊý£¬È·±£Î¨Ò»
|
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)
|
|
__doUseSkill(turnFight, curBatObj, useSkill)
|
|
DoAttackResult(turnFight, curBatObj, useSkill)
|
|
if useTag:
|
clientPack = poolMgr.acquire(ChPyNetSendPack.tagSCTurnFightTag)
|
clientPack.Tag = useTag
|
clientPack.Len = len(clientPack.Tag)
|
clientPack.Sign = 1
|
turnFight.addBatPack(clientPack)
|
|
# ´¦Àí·´»÷ »ò Á¬»÷
|
DoCombo(turnFight, curBatObj, useSkill)
|
|
# ×îºóÖØÖᢻØÊÕ¶ÔÏó
|
useSkill.ResetUseRec()
|
if usePoolSkill:
|
poolMgr.release(useSkill)
|
return True
|
|
def GetSkillTags(turnFight, curBatObj, tagAim, tagFriendly, tagAffect, tagCount):
|
## »ñÈ¡¼¼ÄÜÄ¿±ê
|
# @return: [Ö÷Ä¿±ê, Ä¿±ê2, ...]
|
|
curFaction = curBatObj.GetFaction()
|
|
# ×Ô¼º£¬Ö±½Ó·µ»Ø
|
if tagAim == ChConfig.SkillTagAim_Self:
|
return [curBatObj]
|
|
sneerObj = None # ³°·íÄ¿±ê
|
sneerObjID, sneerObjPosNum = 0, 0
|
if tagFriendly:
|
tagFaction = curFaction
|
else:
|
tagFaction = ChConfig.Def_FactionB if curFaction == ChConfig.Def_FactionA else ChConfig.Def_FactionA
|
sneerObj = curBatObj.GetSneerTagObj() # ±»³°·íµÄÄ¿±ê£¬¶ÔµÐµÄÇ¿ÖÆËø¶¨±»³°·íÄ¿±ê
|
|
sneerObjFirst = True # ³°·íÄ¿±êÓÅÏÈ
|
if sneerObj:
|
sneerObjID = sneerObj.GetID()
|
sneerObjPosNum = sneerObj.GetPosNum()
|
|
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:
|
if sneerObj:
|
aimObjList.append(sneerObj)
|
else:
|
relativeObj = __GetRelativeObjDefault(batObjMgr, curBatObj, posNum, batLineup)
|
if relativeObj:
|
aimObjList.append(relativeObj)
|
|
# ǰÅÅ
|
elif tagAim == ChConfig.SkillTagAim_FrontRow:
|
aimObjList = __getRowAimObjList(batObjMgr, posNum, sneerObj, batLineup, tagAffect, False)
|
|
# ºóÅÅ
|
elif tagAim == ChConfig.SkillTagAim_BackRow:
|
aimObjList = __getRowAimObjList(batObjMgr, posNum, sneerObj, batLineup, tagAffect, True)
|
|
# ÊúÅÅ/×ÝÅÅ
|
elif tagAim == ChConfig.SkillTagAim_Vertical:
|
# ÓÅÏÈ×Ô¼ºËùÔÚ×Ý
|
inColNum = ChConfig.GetInColNum(posNum)
|
colNumList = range(1, 1 + ChConfig.TurnFightCols)
|
if inColNum in colNumList:
|
colNumList.remove(inColNum)
|
colNumList.insert(0, inColNum)
|
|
# ÓÅÏȳ°·íËùÔÚ×Ý
|
if sneerObj:
|
sneerInColNum = ChConfig.GetInColNum(sneerObjPosNum)
|
if sneerInColNum in colNumList:
|
colNumList.remove(sneerInColNum)
|
colNumList.insert(0, sneerInColNum)
|
|
GameWorld.DebugLog("×ÝÅÅ: colNumList=%s,sneerObjID-PosNum=%s-%s" % (colNumList, sneerObjID, sneerObjPosNum))
|
for col in colNumList:
|
for row in range(1, 1 + ChConfig.TurnFightRows):
|
pNum = (row - 1) * ChConfig.TurnFightCols + col
|
#GameWorld.DebugLog(" col=%s,row=%s,pNum=%s" % (col, row, pNum))
|
if pNum not in batLineup.posObjIDDict:
|
continue
|
tagObjID = batLineup.posObjIDDict[pNum]
|
tagBatObj = batObjMgr.getBatObj(tagObjID)
|
if not __skillTagFilter(tagBatObj, tagAffect):
|
continue
|
aimObjList.append(tagBatObj)
|
if aimObjList:
|
break
|
|
# ÆäËû£¬Ä¬ÈÏÈ«²¿
|
else:
|
inColNum = ChConfig.GetInColNum(posNum) # Íæ¼ÒËùÔÚ×ÝÁÐ
|
# ÓÅÏÈ×Ô¼ºËùÔÚ×Ý
|
colNumList = range(1, 1 + ChConfig.TurnFightCols)
|
if inColNum in colNumList:
|
colNumList.remove(inColNum)
|
colNumList.insert(0, inColNum)
|
|
GameWorld.DebugLog("È«²¿: colNumList=%s,sneerObjID-PosNum=%s-%s" % (colNumList, sneerObjID, sneerObjPosNum))
|
# °´Ç°ÅÅÓÅÏÈÔÔò
|
for row in range(1, 1 + ChConfig.TurnFightRows):
|
for col in colNumList:
|
pNum = (row - 1) * ChConfig.TurnFightCols + col
|
#GameWorld.DebugLog(" col=%s,row=%s,pNum=%s" % (col, row, pNum))
|
if pNum not in batLineup.posObjIDDict:
|
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])
|
|
# ѪÁ¿×î¸ß
|
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])
|
|
# δ±»¿ØÖÆÓÅÏÈ
|
elif tagAffect == ChConfig.SkillTagAffect_UncontrolledPriority:
|
sneerObjFirst = False
|
aimObjList.sort(key=lambda o:(o.IsInControlled()))
|
GameWorld.DebugLog("δ±»¿ØÖÆÓÅÏÈ: %s" % [[o.GetID(), o.IsInControlled()] for o in aimObjList])
|
|
else:
|
# ·¶Î§Ä¿±ê³¬¹ý¸öÊý£¬ÔòËæ»úÈ¡
|
if tagCount and len(aimObjList) > tagCount:
|
random.shuffle(aimObjList)
|
|
# ³°·íÓÅÏÈ
|
if sneerObjFirst and sneerObj:
|
if sneerObj in aimObjList and aimObjList.index(sneerObj) != 0:
|
aimObjList.remove(sneerObj)
|
aimObjList.insert(0, sneerObj)
|
|
if tagCount and len(aimObjList) > tagCount:
|
aimObjList = aimObjList[:tagCount]
|
|
return aimObjList
|
|
def __getRowAimObjList(batObjMgr, posNum, sneerObj, batLineup, tagAffect, rowReverse):
|
## »ñÈ¡ÐÐÅÅÄ¿±ê¶ÔÏóÁбí
|
# @param rowReverse: ÊÇ·ñºóÅÅÓÅÏÈÔÔò
|
|
# ǰºóÅÅ˳Ðò
|
if rowReverse:
|
rowNumList = range(1, 1 + ChConfig.TurnFightRows)[::-1]
|
else:
|
rowNumList = range(1, 1 + ChConfig.TurnFightRows)
|
|
# ÓÅÏȳ°·í¶ÔÏóËùÔÚÐÐ
|
sneerObjID, sneerObjPosNum = 0, 0
|
if sneerObj:
|
sneerObjID = sneerObj.GetID()
|
sneerObjPosNum = sneerObj.GetPosNum()
|
sneerInRowNum = ChConfig.GetInRowNum(sneerObjPosNum) # ËùÔÚÐÐÅÅ
|
if sneerInRowNum in rowNumList:
|
rowNumList.remove(sneerInRowNum)
|
rowNumList.insert(0, sneerInRowNum)
|
|
inColNum = ChConfig.GetInColNum(posNum) # Íæ¼ÒËùÔÚ×ÝÁÐ
|
# ÓÅÏÈ×Ô¼ºËùÔÚ×Ý£¬ÎªÖ÷Ä¿±ê
|
colNumList = range(1, 1 + ChConfig.TurnFightCols)
|
if inColNum in colNumList:
|
colNumList.remove(inColNum)
|
colNumList.insert(0, inColNum)
|
|
GameWorld.DebugLog("ǰºóÅÅ: rowNumList=%s,colNumList=%s,sneerObjID-PosNum=%s-%s" % (rowNumList, colNumList, sneerObjID, sneerObjPosNum))
|
aimObjList = []
|
for row in rowNumList:
|
for col in colNumList:
|
pNum = (row - 1) * ChConfig.TurnFightCols + col
|
#GameWorld.DebugLog(" row=%s,col=%s,pNum=%s" % (row, col, pNum))
|
if pNum not in batLineup.posObjIDDict:
|
continue
|
tagObjID = batLineup.posObjIDDict[pNum]
|
tagBatObj = batObjMgr.getBatObj(tagObjID)
|
if not __skillTagFilter(tagBatObj, tagAffect):
|
continue
|
aimObjList.append(tagBatObj)
|
if aimObjList:
|
break
|
|
return aimObjList
|
|
def GetRelativeObj(turnFight, curBatObj):
|
'''»ñÈ¡¶ÔλĿ±ê£¬³°·íʱÓÅÏȶÔλ³°·íÄ¿±ê
|
¶ÔλĿ±êÓÃ;£º
|
1. ¶ÔλĿ±ê²¢²»´ú±í½ö¹¥»÷¸ÃÄ¿±ê
|
2. ¹¥»÷ʱ¸ù¾Ý¼¼Äܹ¥»÷Ä¿±ê·¶Î§ÓÅÏȹ¥»÷¶ÔλĿ±êËùÔڵĺáÅÅ»ò×ÝÅÅ
|
3. ¶ÔλĿ±ê¿ÉÓÃÓÚÅжÏÁ¬»÷¡¢ÈõÁÆ
|
'''
|
sneerObj = curBatObj.GetSneerTagObj()
|
if sneerObj:
|
# Óг°·íÄ¿±êÓÅÏÈÖ±½Ó¶Ôλ
|
return sneerObj
|
|
curFaction = curBatObj.GetFaction()
|
# ĬÈ϶ÔλµÐ¶ÔÕóÓª
|
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)
|
lineupNumList = [lineupNum] # µÐ·½ÓÅÏȶÔλÕóÈÝ£¬ÔÙÆäËûÕóÈÝ£¬Ö§³Ö¶àÕóÈݶÔÕ½
|
for tagNum in batFaction.lineupDict.keys():
|
if tagNum not in lineupNumList:
|
lineupNumList.append(tagNum)
|
|
for num in lineupNumList:
|
batLineup = batFaction.getBatlineup(num)
|
relativeObj = __GetRelativeObjDefault(batObjMgr, curBatObj, posNum, batLineup)
|
if relativeObj:
|
return relativeObj
|
|
# ÀíÂÛÉÏÖ»ÒªÕ½¶·Ã»ÓнáÊø£¬Ò»¶¨»áÓжÔλĿ±ê£¬ÕâÀïĬÈÏ·µ»Ø×Ô¼º£¬Íâ²ã¿É²»ÐèÒªÅжÏÊÇ·ñ´æÔÚ¶ÔλĿ±ê
|
return curBatObj
|
|
def __GetRelativeObjDefault(batObjMgr, curBatObj, posNum, batLineup):
|
## »ñÈ¡ÔÚijһÕóÓªÖеÄĬÈ϶ÔλĿ±ê
|
|
tagAffect = ChConfig.SkillTagAffect_None # ĬÈ϶ÔλĿ±ê²»ÐèҪϸ·ÖÄ¿±ê£¬Ä¬ÈϹæÔò¼´¿É
|
inColNum = ChConfig.GetInColNum(posNum) # Íæ¼ÒËùÔÚ×ÝÁÐ
|
# ÓÅÏÈ×Ô¼ºËùÔÚ×Ý
|
colNumList = range(1, 1 + ChConfig.TurnFightCols)
|
if inColNum in colNumList:
|
colNumList.remove(inColNum)
|
colNumList.insert(0, inColNum)
|
|
# °´Ç°ÅÅÓÅÏÈÔÔò
|
for row in range(ChConfig.TurnFightRows):
|
for col in colNumList:
|
pNum = row * ChConfig.TurnFightCols + col
|
if pNum not in batLineup.posObjIDDict:
|
continue
|
tagObjID = batLineup.posObjIDDict[pNum]
|
tagBatObj = batObjMgr.getBatObj(tagObjID)
|
if not __skillTagFilter(tagBatObj, tagAffect):
|
continue
|
return tagBatObj
|
|
return
|
|
def __skillTagFilter(tagBatObj, tagAffect):
|
## ¼¼ÄÜÄ¿±ê¹ýÂËÆ÷
|
# @return: ÊÇ·ñÔÊÐíÌí¼Ó¸Ãµ¥Î»
|
if not tagBatObj:
|
return False
|
if tagAffect != ChConfig.SkillTagAffect_Death and not tagBatObj.IsAlive():
|
return False
|
if tagAffect == ChConfig.SkillTagAffect_Death and tagBatObj.IsAlive():
|
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)
|
|
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)
|
# ÖÎÁÆ
|
if atkType == 2:
|
SkillModule_2(turnFight, curBatObj, useSkill)
|
# ¸´»î
|
elif atkType == 3:
|
pass
|
# ¶à´Î¹¥»÷£¨ËøÄ¿±ê¶à´ÎÉ˺¦£¬·Çǰ¶ËµÄ¶à¶ÎƮѪ£©
|
elif atkType == 4:
|
pass
|
# µ¯É䣨¶à´Î¹¥»÷£¬Çл»Ä¿±ê£©
|
elif atkType == 5:
|
pass
|
# ÅÆøÔö
|
elif atkType == 6:
|
SkillModule_6(turnFight, curBatObj, useSkill, "Increase")
|
# ÅÆø¼õ
|
elif atkType == 7:
|
SkillModule_6(turnFight, curBatObj, useSkill, "Reduce")
|
# ÅÆøÍµ
|
elif atkType == 8:
|
SkillModule_6(turnFight, curBatObj, useSkill, "Steal")
|
|
return
|
|
def SkillModule_1(turnFight, curBatObj, useSkill):
|
## ͨÓù¥»÷£¬µ¥¹¥¡¢Èº¹¥
|
|
for tagBatObj in useSkill.GetTagObjList():
|
__doSkillHurtHP(turnFight, curBatObj, tagBatObj, 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)
|
|
return
|
|
def SkillModule_6(turnFight, curBatObj, useSkill, opType):
|
## ÅÆøÔö¼õ͵
|
|
curID = curBatObj.GetID()
|
skillID = useSkill.GetSkillID()
|
bySkill = useSkill.GetBySkill()
|
relatedSkillID = bySkill.GetSkillID() if bySkill else 0
|
|
#cureType = useSkill.GetCalcType()
|
skillPer = useSkill.GetSkillPer()
|
skillValue = useSkill.GetSkillValue()
|
|
xpMax = IpyGameDataPY.GetFuncCfg("AngerXP", 2)
|
calcValue = int(xpMax * skillPer / 10000.0 + skillValue)
|
attrID = ChConfig.AttrID_XP
|
|
GameWorld.DebugLog("ÅÆø%s: curID=%s,calcValue=%s,skillID=%s,skillPer=%s,skillValue=%s,relatedSkillID=%s"
|
% (opType, curID, calcValue, skillID, skillPer, skillValue, relatedSkillID))
|
curStealTotal = 0
|
for tagBatObj in useSkill.GetTagObjList():
|
|
tagID = tagBatObj.GetID()
|
# ¼õ
|
if opType == "Reduce":
|
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 opType == "Steal":
|
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)
|
|
return
|
|
def DoAttackResult(turnFight, curBatObj, useSkill):
|
'''Ö´Ðй¥»÷½á¹û
|
@param curBatObj: Ê©·¨·½»òbuff¹éÊô·½
|
'''
|
|
if curBatObj:
|
# ·´µ¯¡¢ÎüѪ µÄÔÒò£¬ÐèҪͳһ´¦Àíºó½áË㣬¿ÉÄܵ¼ÖÂHPΪ¸ºÖµ£¬ÐÞÕýΪ0
|
if curBatObj.GetHP() < 0:
|
curBatObj.SetHP(0)
|
|
skillID = useSkill.GetSkillID()
|
curBatObj.AddSkillUseCnt(skillID)
|
if useSkill.GetCoolDownTime():
|
useSkill.SetCalcTime(turnFight.getTimeline())
|
useSkill.SetRemainTime(useSkill.GetCoolDownTime())
|
|
# ÐèÏȼ¼ÄÜʹÓà - ǰ¶Ë°´Ë³ÐòÓÅÏȱíÏÖ¼¼ÄÜÊÍ·ÅÄÚÈÝ£¬Ç°¶ËÐèÒª¶¯×÷»òÓÐÉËѪÔò֪ͨ
|
if useSkill.GetSkillMotionName() or len(useSkill.GetHurtObjList()):
|
Sync_UseSkill(turnFight, curBatObj, useSkill)
|
|
__doCostZhanchui(turnFight, curBatObj, useSkill)
|
__doSkillUserAnger(turnFight, curBatObj, useSkill)
|
|
DoBeAttackResult(turnFight, curBatObj, useSkill)
|
return
|
|
def DoCombo(turnFight, curBatObj, useSkill):
|
'''
|
¸ñµ²¡¢·´»÷¡¢Á¬»÷¹æÔò
|
1. ËùÓÐÎ佫»ò¹ÖÎï¾ù¿ÉÄܲúÉú¸ñµ²£¬Èº¹¥Ê±¸ñµ²Ò»¶ÔÒ»Åжϣ¬¾ù¿ÉÄܲúÉú¸ñµ²
|
2. ½öÆÕ¹¥Ê±¿É±»·´»÷£¬·´Åжϱ¾´Î¼¼ÄÜÄ¿±êÖеÄÖ÷Ä¿±ê£¨¼´¶ÔλĿ±ê£©ÊÇ·ñ²úÉú¸ñµ²£¬ÇÒÊǽüÕ½Î佫£¬Êǵϰ¿É·´»÷
|
|
Á¬»÷£º
|
1. ½öÆÕ¹¥¿ÉÁ¬»÷£¬·´»÷´ò¶ÏÁ¬»÷
|
2. ·Ç¶ÔµÐ¼¼ÄÜ£¬ÈçÄÌÂè»ØÑªÆÕ¹¥£¬Åж϶ÔλĿ±ê¿¹Á¬ÊôÐÔÊÇ·ñ¿ÉÁ¬»÷
|
3. ¶ÔµÐ¼¼ÄÜ£¬Åжϱ¾´Î¼¼ÄÜÄ¿±êÖеÄÖ÷Ä¿±ê£¨¼´¶ÔλĿ±ê£©¿¹Á¬ÊôÐÔÊÇ·ñ¿ÉÁ¬»÷
|
|
¶ÔµÐ¼¼ÄÜÖ÷Ä¿±ê£º
|
µ¥Ì壺 ĬÈϸÃÄ¿±ê
|
³°·í£º ÓÅÏȱ»³°·íµÄÄ¿±ê
|
ºáÅÅ£º ÓÅÏȸÃÅÅÖÐÓë×Ô¼ºÍ¬Áе쬷ñÔò°´Ë³Ðò
|
×ÝÅÅ£º ÓÅÏÈÇ°ÃæµÄµ¥Î»
|
'''
|
|
if not SkillCommon.isTurnNormalSkill(useSkill):
|
#GameWorld.DebugLog("·ÇÆÕ¹¥²»´¦Àí·´»÷Á¬»÷")
|
return
|
|
tagFriendly = useSkill.GetTagFriendly()
|
if tagFriendly:
|
tagObj = GetRelativeObj(turnFight, curBatObj)
|
else:
|
tagObjList = useSkill.GetTagObjList()
|
if not tagObjList:
|
return
|
tagObj = tagObjList[0] # µÚÒ»¸öĬÈÏΪÖ÷Ä¿±ê£¬¼¼ÄܶÔÏóÑ¡ÔñÂ߼ʱ¾ö¶¨Ö÷Ä¿±ê
|
atkBackSkill = __getCanAtkBackSkill(useSkill, tagObj)
|
if atkBackSkill:
|
# ¿ÉÒÔ·´»÷£¬´ò¶ÏÁ¬»÷
|
GameWorld.DebugLog("¡ñ %s ¡¾·´»÷¡¿" % TurnAttack.GetObjName(tagObj))
|
OnUseSkill(turnFight, tagObj, atkBackSkill, [curBatObj], ChConfig.TurnBattleType_AtkBack)
|
return
|
|
if not tagObj:
|
return
|
|
if CanCombo(curBatObj, tagObj):
|
# Á¬»÷¸ù¾Ý¼¼ÄÜÄ¿±êÅäÖÃÂß¼ÖØÐÂÑ¡ÔñÄ¿±ê
|
GameWorld.DebugLog("¡ñ %s ¡¾Á¬»÷¡¿" % TurnAttack.GetObjName(curBatObj))
|
OnUseSkill(turnFight, curBatObj, useSkill, batType=ChConfig.TurnBattleType_Combo)
|
|
return
|
|
def __getCanAtkBackSkill(useSkill, tagObj):
|
## »ñÈ¡ÊÇ·ñ¿É·´»÷¼°·´»÷¼¼ÄÜ
|
if not tagObj:
|
return
|
|
tagID = tagObj.GetID()
|
if tagObj.GetAtkDistType() != ChConfig.AtkDistType_Short:
|
GameWorld.DebugLog("·Ç½üÕ½²»¿É·´»÷! tagID=%s" % tagID)
|
return
|
|
canAtkBack = False
|
for hurtObj in useSkill.GetHurtObjList():
|
if hurtObj.GetObjID() != tagID:
|
continue
|
if hurtObj.HaveHurtType(ChConfig.HurtType_Parry): # ¸ñµ²Ê±¿É·´»÷
|
canAtkBack = True
|
break
|
|
if not canAtkBack:
|
GameWorld.DebugLog("ûÓиñµ²²»¿É·´»÷! tagID=%s" % tagID)
|
return
|
|
skillManager = tagObj.GetSkillManager()
|
for index in range(0, skillManager.GetSkillCount()):
|
useSkill = skillManager.GetSkillByIndex(index)
|
if not useSkill:
|
continue
|
if useSkill.GetFuncType() == ChConfig.Def_SkillFuncType_AtkbackSkill:
|
GameWorld.DebugLog("¿ÉÒÔ·´»÷! tagID=%s" % tagID)
|
return useSkill
|
return
|
|
def CanCombo(atkObj, defObj):
|
## ¿É·ñÁ¬»÷
|
comboNum = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum)
|
aComboRate = atkObj.GetBatAttrValue(ChConfig.AttrID_ComboRate)
|
dComboRateDef = defObj.GetBatAttrValue(ChConfig.AttrID_ComboRateDef)
|
happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("ComboCfg", 1))
|
if GameWorld.CanHappen(happenRate):
|
GameWorld.DebugLog("¿ÉÒÔÁ¬»÷! atkID=%s,happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s"
|
% (atkObj.GetID(), happenRate, aComboRate, dComboRateDef, comboNum))
|
atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum + 1)
|
return True
|
GameWorld.DebugLog("ÎÞ·¨Á¬»÷! atkID=%s,happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s"
|
% (atkObj.GetID(), happenRate, aComboRate, dComboRateDef, comboNum))
|
return False
|
|
def DoBeAttackResult(turnFight, curObj, useSkill):
|
'''±»¹¥»÷½á¹û
|
@param curObj: Ê©·¨·½»òbuff¹éÊô·½
|
'''
|
|
curID = curObj.GetID()
|
isTurnNormalSkill = SkillCommon.isTurnNormalSkill(useSkill)
|
isAngerSkill = SkillCommon.isAngerSkill(useSkill)
|
|
batObjMgr = BattleObj.GetBatObjMgr()
|
|
# ÓÅÏÈ´¦ÀíafterLogic£¬¿ÉÔÙÔ¤ÏÈ»ã×ÜһЩ»á´¥·¢±»¶¯µÄÐÅÏ¢
|
relatedSkillID = useSkill.GetSkillID()
|
shieldBrokenList = [] # ¼Ç¼¶ÜÆÆ
|
afterLogicList = useSkill.GetAfterLogicList()
|
for logicType, logicData in afterLogicList:
|
if logicType == ChConfig.AfterLogic_DelBuff:
|
buffObjID, buff, tagObjID = logicData
|
buffSkillData = buff.GetSkillData()
|
buffSkillTypeID = buffSkillData.GetSkillTypeID()
|
TurnBuff.DoBuffDelAfterLogicOver(turnFight, buffObjID, buff, useSkill)
|
if SkillCommon.isDamageShieldSkill(buffSkillData):
|
shieldBrokenList.append([buffObjID, tagObjID, buffSkillTypeID])
|
|
elif logicType == ChConfig.AfterLogic_AddBuff:
|
batObj, buff, _ = logicData
|
TurnBuff.SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID)
|
|
elif logicType == ChConfig.AfterLogic_SyncBuff:
|
buffObj, buff, _, _ = logicData
|
TurnBuff.SyncBuffRefresh(turnFight, buffObj, buff, relatedSkillID)
|
|
# ͳ¼Æ»÷ɱ
|
killObjIDList = [] # »÷ɱµÄÄ¿±êIDÁбí
|
for tagObj in useSkill.GetTagObjList():
|
tagID = tagObj.GetID()
|
if tagObj.IsAlive() and tagObj.GetHP() <= 0:
|
killObjIDList.append(tagID)
|
TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill)
|
if curObj and curObj.IsAlive() and curObj.GetHP() <= 0:
|
TurnAttack.SetObjKilled(turnFight, curObj)
|
|
# ͳ¼ÆÉËѪ£¬¿ÉÄܵ¥¸ö¼¼ÄܶÔͬһĿ±êÔì³É¶à´ÎÉ˺¦
|
missObjIDList = []
|
for hurtObj in useSkill.GetHurtObjList():
|
hurtObjID = hurtObj.GetObjID()
|
tagObj = batObjMgr.getBatObj(hurtObjID)
|
if not tagObj:
|
continue
|
if not hurtObj.HaveHurtType(ChConfig.HurtTYpe_Recovery) and (isTurnNormalSkill or isAngerSkill) and tagObj.IsAlive():
|
__doSkillHurtAnger(tagObj, hurtObj.GetLostHP(), useSkill)
|
if hurtObj.HaveHurtType(ChConfig.HurtType_Miss):
|
missObjIDList.append(hurtObjID)
|
|
# ½áË㸱±¾Ïà¹ØµÄ¹¥»÷½á¹û£¬½öÖ÷¶¯·¢ÆðÍæ¼ÒÕóÈÝÎ佫´¥·¢
|
curPlayer = turnFight.curPlayer
|
if curPlayer and curObj and curObj.GetOwnerID() == curPlayer.GetPlayerID():
|
FBLogic.OnPlayerLineupAttackResult(curPlayer, curObj, killObjIDList, useSkill, turnFight.mapID, turnFight.funcLineID)
|
|
# ÓÅÏÈ´¥·¢±¾¼¼ÄܶîÍâЧ¹û£¬×¢£º½ö¸Ã¼¼ÄÜÊͷźó¸Ã¼¼ÄܵĶîÍâЧ¹ûÊÓΪÖ÷¼¼ÄܵÄЧ¹û£¬ÓÅÏȼ¶×î¸ß
|
__DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList)
|
|
# ========== ÒÔÏ´¥·¢±»¶¯ ==========
|
|
# ÆÆ¶Üʱ
|
for buffObjID, tagObjID, buffSkillTypeID in shieldBrokenList:
|
buffObj = batObjMgr.getBatObj(buffObjID)
|
tagObj = batObjMgr.getBatObj(tagObjID)
|
TurnPassive.OnTriggerPassiveEffect(turnFight, buffObj, ChConfig.TriggerWay_ShieldBroken, tagObj, connSkillTypeID=buffSkillTypeID)
|
|
for tagObj in useSkill.GetTagObjList():
|
tagID = tagObj.GetID()
|
if tagID == curID or tagID in missObjIDList:
|
# ×Ô¼º»ò¶Ô·½ÉÁ±ÜÁ˲»ÔÙ´¥·¢±»¶¯
|
continue
|
|
# Ö±½Ó¹¥»÷
|
if not SkillCommon.IsBuff(useSkill) and useSkill.GetSkillType() in [ChConfig.Def_SkillType_Atk]:
|
TurnPassive.OnTriggerPassiveEffect(turnFight, curObj, ChConfig.TriggerWay_AttackOverDirect, tagObj, connSkill=useSkill)
|
TurnPassive.OnTriggerPassiveEffect(turnFight, tagObj, ChConfig.TriggerWay_BeAttackedDirect, curObj, connSkill=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 batType != ChConfig.TurnBattleType_Normal:
|
# Ôݶ¨½ö³£¹æÖ÷¶¯µã»÷ÐÐΪµÄÐèÒª¿Û³ýÕ½´¸£¨Óëǰ¶ËÊÖ¶¯Õ½¶·µã»÷µÄ´¥·¢µãͬ²½£©£¬±»¶¯´¥·¢µÄÔݶ¨²»¿Û
|
return
|
|
if SkillCommon.isAngerSkill(useSkill):
|
costZhanchui = IpyGameDataPY.GetFuncCfg("ZhanchuiCost", 2)
|
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 __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList):
|
## Ö´Ðб¾¼¼ÄÜ/buffÊͷźó¶îÍâЧ¹û
|
for index in xrange(useSkill.GetEffectCount()):
|
curEffect = useSkill.GetEffect(index)
|
if curEffect.GetTriggerWay() != ChConfig.TriggerWay_CurSkillEff:
|
continue
|
|
effID = curEffect.GetEffectID()
|
if effID == 5010:
|
# ¶îÍâ¼¼ÄÜЧ¹û
|
__doUseEnhanceSkill(turnFight, curObj, useSkill, curEffect, missObjIDList)
|
continue
|
|
for tagObj in useSkill.GetTagObjList():
|
tagID = tagObj.GetID()
|
if tagID in missObjIDList:
|
# ÉÁ±ÜÁ˲»´¥·¢
|
continue
|
|
TurnPassive.DoSkillEffectLogic(turnFight, curObj, tagObj, useSkill, curEffect, useSkill)
|
|
return
|
|
def __doUseEnhanceSkill(turnFight, curBatObj, useSkill, curEffect, missObjIDList):
|
## Ö´ÐÐÖ÷¼¼ÄܵĶîÍâ¼¼ÄÜЧ¹û
|
#if useSkill.GetBatType() == ChConfig.TurnBattleType_Enhance:
|
# #GameWorld.DebugLog("×ÔÉíΪ¶îÍâ´¥·¢µÄ¼¼Äܲ»ÔÙ´¥·¢¶îÍâ¼¼ÄÜ! skillID=%s" % useSkill.GetSkillID())
|
# return
|
enhanceSkillID = curEffect.GetEffectValue(0)
|
checkInStateList = curEffect.GetEffectValue(1)
|
if checkInStateList:
|
if isinstance(checkInStateList, int):
|
checkInStateList = [checkInStateList]
|
GameWorld.DebugLog("¶îÍâ´¥·¢µÄ¼¼ÄÜ: enhanceSkillID=%s,checkInStateList=%s" % (enhanceSkillID, checkInStateList))
|
tagObjList = useSkill.GetTagObjList()
|
|
enhanceSkillData = IpyGameDataPY.GetIpyGameData("Skill", enhanceSkillID)
|
if not enhanceSkillData:
|
return
|
|
# ¼Ì³ÐÖ÷¼¼ÄÜÄ¿±ê
|
if enhanceSkillData.GetTagAim() == ChConfig.SkillTagAim_MainSkill:
|
GameWorld.DebugLog("¼Ì³ÐÖ÷¼¼ÄÜÄ¿±ê! enhanceSkillID=%s" % enhanceSkillID)
|
# ¶îÍâ´¥·¢µÄ¼¼ÄÜÖ±½ÓÔÚÍâ²ã¼ì²é¸ÅÂÊ£¬Èç¹û¶¼Ã»Óд¥·¢Ôò²»ÐèÒªÔÙ´¦Àí
|
enhanceRate = enhanceSkillData.GetHappenRate()
|
enchanceTagObjList = []
|
for tagObj in tagObjList:
|
tagID = tagObj.GetID()
|
if not tagObj.IsAlive():
|
GameWorld.DebugLog(" Òѱ»»÷ɱ²»´¥·¢: tagID=%s" % (tagID))
|
continue
|
if tagID in missObjIDList:
|
GameWorld.DebugLog(" ÉÁ±ÜµÄ²»´¥·¢: tagID=%s" % (tagID))
|
continue
|
if checkInStateList:
|
inState = False
|
for state in checkInStateList:
|
if tagObj.IsInState(state):
|
inState = True
|
break
|
if not inState:
|
GameWorld.DebugLog(" ²»ÔÚ״̬ϲ»´¥·¢: tagID=%s not in state:%s" % (tagID, checkInStateList))
|
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, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
|
|
return
|
|
# Ö»Ö´ÐÐÒ»´Î£¬·ÀֹȺ¹¥Ê±¶îÍâ´¥·¢¶à´Î
|
GameWorld.DebugLog("ÖØÐÂËø¶¨Ä¿±ê! enhanceSkillID=%s" % enhanceSkillID)
|
if checkInStateList:
|
inState = False
|
for tagObj in tagObjList:
|
for state in checkInStateList:
|
if not state or tagObj.IsInState(state):
|
inState = True
|
break
|
if inState:
|
break
|
if not inState:
|
GameWorld.DebugLog(" ûÓÐÄ¿±êÔÚ״̬ϲ»´¥·¢: tagObj not in state:%s" % str(checkInStateList))
|
return
|
OnUseSkill(turnFight, curBatObj, enhanceSkillData, batType=ChConfig.TurnBattleType_Enhance, bySkill=useSkill)
|
return
|
|
def __doSkillHurtHP(turnFight, attacker, defObj, curSkill):
|
## Ö´Ðм¼ÄÜÉËѪ£¬Ö»¼ÆËãÉËѪ£¬ÆäËûÂß¼µÈ¼¼ÄÜͬ²½ºóÔÙ´¦Àí
|
# @return: None - ûÓÐÖ´Ðгɹ¦£¬¼´ºöÂÔ¸ÃÄ¿±ê
|
|
atkObj = attacker
|
atkID = atkObj.GetID()
|
defID = defObj.GetID()
|
skillID = curSkill.GetSkillID()
|
hurtObj = curSkill.AddHurtObj(defID)
|
|
atkSkillPer = curSkill.GetSkillPer()
|
atkSkillValue = curSkill.GetSkillValue()
|
|
dHP = defObj.GetHP() # ·ÀÊØ·½µ±Ç°ÑªÁ¿
|
dMaxHP = defObj.GetMaxHP() # ·ÀÊØ·½×î´óѪÁ¿
|
|
zhansha = False # Õ¶É±ÌØÊâ´¦Àí
|
# նɱ
|
if zhansha:
|
pass
|
|
else:
|
hurtValue, hurtTypes = CalcHurtHP(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer)
|
hurtValue, realHurtHP = CalcHurtHPWithBuff(turnFight, atkObj, defObj, curSkill, hurtValue)
|
|
#É˺¦½á¹¹Ìå
|
hurtObj.SetHurtTypes(hurtTypes)
|
hurtObj.SetHurtHP(hurtValue)
|
hurtObj.SetRealHurtHP(realHurtHP)
|
remainHP = min(dMaxHP, max(0, dHP - realHurtHP)) # Ê£ÓàѪÁ¿
|
|
remainHP = int(remainHP) #·À·¶
|
lostHP = dHP - remainHP # ʵ¼ÊµôѪÁ¿
|
hurtObj.SetLostHP(lostHP)
|
hurtObj.SetCurHP(remainHP)
|
defObj.SetHP(remainHP)
|
GameWorld.DebugLog(" ÉËѪ: atkID=%s,defID=%s,hurtValue=%s,realHurtHP=%s,lostHP=%s,%s/%s"
|
% (atkID, defID, hurtValue, realHurtHP, lostHP, defObj.GetHP(), defObj.GetMaxHP()))
|
TurnAttack.AddTurnObjHurtValue(atkObj, defObj, hurtValue, lostHP, skillID)
|
|
#·´µ¯É˺¦
|
CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill)
|
|
#ÎüѪ
|
CalcSuckBlood(atkObj, defObj, hurtObj, curSkill)
|
return
|
|
def CalcHurtHP(turnFight, atkObj, defObj, curSkill, atkSkillValue, atkSkillPer, **kwargs):
|
'''¼ÆËãÉ˺¦£¬Ä¬Èϰ´¹¥»÷¼ÆËã
|
'''
|
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)
|
isDot = ("damageoftime" in kwargs)
|
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 isDot:
|
mustHit = True
|
|
#ÃüÖй«Ê½ ¹¥»÷·½ÀàÐͲ»Í¬£¬¹«Ê½²»Í¬
|
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):
|
GameWorld.DebugLog("ÉÁ±ÜÁË! missRate=%s,dMissRate=%s,aMissRateDef=%s,missNum=%s" % (missRate, dMissRate, aMissRateDef, missNum))
|
defObj.SetDict(ChConfig.Def_Obj_Dict_TurnMissNum, missRate + 1)
|
return 0, pow(2, ChConfig.HurtType_Miss)
|
|
hurtTypes = pow(2, ChConfig.HurtType_Normal)
|
|
#calcType = curSkill.GetCalcType() ĿǰÔÝʱ°´¹¥»÷ËãÉ˺¦£¬Ö®ºó¿ÉÒÔÀ©Õ¹ÆäËû
|
|
isSuperHit, isParry = False, False
|
aSuperDamPer, dSuperDamPerDef = 0, 0
|
if not isDot:
|
isSuperHit = CanSuperHit(atkObj, defObj) # ÊÇ·ñ±©»÷
|
isParry = (isTurnNormalSkill and CanParry(atkObj, defObj)) # ÊÇ·ñ¸ñµ²£¬½öÕë¶ÔÆÕ¹¥
|
CanStun(turnFight, atkObj, defObj, curSkill) # ÊÇ·ñ»÷ÔÎ
|
|
if isSuperHit:
|
hurtTypes |= pow(2, ChConfig.HurtType_SuperHit)
|
aSuperDamPer = atkObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPer)
|
dSuperDamPerDef = atkObj.GetBatAttrValue(ChConfig.AttrID_SuperDamPerDef)
|
|
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
|
aSuperDamPer /= 10000.0
|
dSuperDamPerDef /= 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 isDot:
|
hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1))
|
GameWorld.DebugLog(" ³ÖÐø¼¼ÄÜÉ˺¦=%s" % (hurtValue))
|
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))
|
|
if isParry:
|
parryReduceRatio = IpyGameDataPY.GetFuncCfg("ParryCfg", 3)
|
hurtValue = hurtValue * (1 - parryReduceRatio)
|
GameWorld.DebugLog(" ¸ñµ²ºóÉ˺¦=%s,parryReduceRatio=%s" % (hurtValue, parryReduceRatio))
|
|
hurtValue = max(1, int(hurtValue)) # ¸ºÖµ¡¢±£µ×·À·¶
|
return hurtValue, hurtTypes
|
|
def CanSuperHit(atkObj, defObj):
|
aSuperHitRate = atkObj.GetBatAttrValue(ChConfig.AttrID_SuperHitRate)
|
dSuperHitRateDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuperHitRateDef)
|
happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("SuperHitCfg", 1))
|
if GameWorld.CanHappen(happenRate):
|
GameWorld.DebugLog("±©»÷ÁË: happenRate=%s,aSuperHitRate=%s,dSuperHitRateDef=%s" % (happenRate, aSuperHitRate, dSuperHitRateDef))
|
return True
|
return False
|
|
def CanStun(turnFight, atkObj, defObj, curSkill):
|
aStunRate = atkObj.GetBatAttrValue(ChConfig.AttrID_StunRate)
|
dStunRateDef = defObj.GetBatAttrValue(ChConfig.AttrID_StunRateDef)
|
happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("StunCfg", 1))
|
if not GameWorld.CanHappen(happenRate):
|
return False
|
GameWorld.DebugLog("»÷ÔÎÁË: happenRate=%s,aStunRate=%s,dStunRateDef=%s" % (happenRate, aStunRate, dStunRateDef))
|
stunSkillID = IpyGameDataPY.GetFuncCfg("StunCfg", 2)
|
TurnBuff.DoAddBuffBySkillID(turnFight, defObj, stunSkillID, atkObj, curSkill, afterLogic=True)
|
return True
|
|
def CanParry(atkObj, defObj):
|
if defObj.IsInControlled():
|
#±»¿ØÖÆÎÞ·¨¸ñµ²
|
return False
|
aParryRateDef = atkObj.GetBatAttrValue(ChConfig.AttrID_ParryRateDef)
|
dParryRate = defObj.GetBatAttrValue(ChConfig.AttrID_ParryRate)
|
parryNum = defObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnParryNum)
|
happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("ParryCfg", 1))
|
if GameWorld.CanHappen(happenRate):
|
GameWorld.DebugLog("¸ñµ²ÁË: happenRate=%s,aParryRateDef=%s,dParryRate=%s,parryNum=%s" % (happenRate, aParryRateDef, dParryRate, parryNum))
|
defObj.SetDict(ChConfig.Def_Obj_Dict_TurnParryNum, parryNum + 1)
|
return True
|
return False
|
|
def CalcHurtHPWithBuff(turnFight, atkObj, defObj, curSkill, hurtValue):
|
## ¼ÆËãÉ˺¦ºó£¬Òò¸÷ÖÖbuffºÍ״̬µÄÓ°Ïì´¦Àí
|
# @return: hurtValue, realHurtHP
|
|
if hurtValue <= 0:
|
return 0, 0
|
|
# ¼õÉ˶ܼõÉË£¬ »á¸Ä±ä hurtValue
|
hurtValue = max(0, hurtValue)
|
|
# ³ÐÉ˶ܳÐÉË£¬Ê£Óàʱ¼ä¶ÌµÄÓÅÏȳÐÉË£¬³ÐÉ˲»Ó°ÏìÊä³ö£¬Ï൱ÓÚ¶îÍâµÄHP£¬½öÓÃÓÚµÖ¿ÛµôѪ£¬½ö ¸Ä±ä realHurtHP
|
realHurtHP = hurtValue
|
shieldBuffList = []
|
buffMgr = defObj.GetBuffManager()
|
for index in range(buffMgr.GetBuffCount()):
|
buff = buffMgr.GetBuffByIndex(index)
|
skillData = buff.GetSkillData()
|
# ³ÐÉ˶Ü
|
if SkillCommon.isDamageShieldSkill(skillData):
|
remainTime = buff.GetRemainTime() # Ê£Óà»ØºÏ
|
if not skillData.GetLastTime():
|
remainTime = 999 # ÓÀ¾Ã¶Ü
|
buffValue = buff.GetValue1() + buff.GetValue2() * ChConfig.Def_PerPointValue # Ê£Óà¶ÜÖµ
|
shieldBuffList.append([remainTime, buffValue, buff])
|
|
if shieldBuffList:
|
shieldBuffList.sort()
|
for _, buffValue, buff in shieldBuffList:
|
if realHurtHP <= 0:
|
break
|
buffID = buff.GetBuffID()
|
if realHurtHP < buffValue:
|
damageShieldValue = realHurtHP
|
else:
|
damageShieldValue = buffValue
|
GameWorld.DebugLog(" ³ÐÉ˶Ü: buffID=%s,buffValue=%s,realHurtHP=%s,damageShieldValue=%s" % (buffID, buffValue, realHurtHP, damageShieldValue))
|
realHurtHP -= damageShieldValue # ³ÐÉËÖµ
|
if damageShieldValue >= buffValue:
|
GameWorld.DebugLog(" ɾ³ý¶Ü: buffID=%s,realHurtHP=%s" % (buffID, realHurtHP))
|
TurnBuff.DoBuffDel(turnFight, defObj, buff, relatedSkill=curSkill, afterLogic=True, tagObj=atkObj)
|
else:
|
updShieldValue = buffValue - damageShieldValue
|
GameWorld.DebugLog(" ¸üжÜÖµ: updShieldValue=%s,realHurtHP=%s" % (updShieldValue, realHurtHP))
|
buff.SetValue1(updShieldValue % ChConfig.Def_PerPointValue)
|
buff.SetValue2(updShieldValue / ChConfig.Def_PerPointValue)
|
curSkill.AddAfterLogic(ChConfig.AfterLogic_SyncBuff, [defObj, buff, atkObj, "ReduceShieldValue"])
|
|
return hurtValue, max(0, realHurtHP)
|
|
def CalcBounceHP(turnFight, atkObj, defObj, hurtObj, curSkill):
|
'''¼ÆËã·´µ¯·´µ¯É˺¦
|
'''
|
if not atkObj.GetCanAttack():
|
return
|
|
bounceHP = int(hurtObj.GetHurtHP() * random.uniform(0.1, 0.2))
|
if bounceHP <= 0:
|
return
|
|
GameWorld.DebugLog(" ·´µ¯É˺¦=%s,%s/%s" % (bounceHP, atkObj.GetHP(), atkObj.GetMaxHP()))
|
bounceHP, realBounceHP = CalcHurtHPWithBuff(turnFight, defObj, atkObj, curSkill, bounceHP)
|
if bounceHP <= 0:
|
return
|
hurtObj.SetBounceHP(bounceHP)
|
|
if realBounceHP > 0:
|
remainHP = atkObj.GetHP() - realBounceHP # ·´µ¯ÔÊÐíµ¯µ½¸ºÖµ£¬Èç¹û×îÖÕÎüѪûÓÐÎüµ½ÕýÖµÔòËãËÀÍö
|
atkObj.SetHP(remainHP)
|
GameWorld.DebugLog(" bounceHP=%s,realBounceHP=%s,%s/%s" % (bounceHP, realBounceHP, atkObj.GetHP(), atkObj.GetMaxHP()))
|
|
TurnAttack.AddTurnObjHurtValue(defObj, atkObj, bounceHP, realBounceHP, isBounce=True)
|
return
|
|
def CalcSuckBlood(atkObj, defObj, hurtObj, curSkill):
|
'''¼ÆËãÎüѪ
|
'''
|
|
hurtHP = hurtObj.GetHurtHP()
|
if hurtHP <= 1:
|
return
|
|
aSuckHPPer = atkObj.GetBatAttrValue(ChConfig.AttrID_SuckHPPer)
|
dSuckHPPerDef = defObj.GetBatAttrValue(ChConfig.AttrID_SuckHPPerDef)
|
suckHP = int(eval(IpyGameDataPY.GetFuncCompileCfg("SuckHPCfg", 1)))
|
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,aSuckHPPer=%s,dSuckHPPerDef=%s" % (suckHP, remainHP, maxHP, aSuckHPPer, dSuckHPPerDef))
|
|
# ÎüѪÔݶ¨ËãÖÎÁÆ
|
TurnAttack.AddTurnObjCureHP(atkObj, atkObj, suckHP, cureHP)
|
return
|
|
def CalcCureHP(userObj, tagObj, curSkill, largeNum=False):
|
''' ¼ÆËãÖÎÁÆÖµ
|
'''
|
cureType = curSkill.GetCalcType()
|
skillPer = curSkill.GetSkillPer()
|
#skillValue = curSkill.GetSkillValue()
|
|
cureBaseValue = GetCalcBaseValue(cureType, userObj, tagObj)
|
|
#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 GetCalcBaseValue(calcType, curObj, tagObj):
|
##»ñµÃ»ù´¡¼ÆËãÖµ
|
if calcType == ChConfig.Def_Calc_Attack:
|
baseValue = curObj.GetAtk()
|
elif calcType == ChConfig.Def_Calc_MaxHP:
|
baseValue = curObj.GetMaxHP()
|
#elif cureType == ChConfig.Def_Calc_HurtValue:
|
# baseValue = GameObj.GetLastHurtValue(userObj)
|
elif calcType == ChConfig.Def_Calc_TagMaxHP:
|
baseValue = 0 if not tagObj else tagObj.GetMaxHP()
|
return baseValue
|
|
def DoDOTAttack(turnFight, batObj, curBuff, hurtValue, hurtTypes):
|
## Ö´Ðе¥´ÎdotÂß¼
|
skillID = curBuff.GetSkillID()
|
skillIpyData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
|
if not skillIpyData:
|
return
|
buffID = curBuff.GetBuffID()
|
ownerID = curBuff.GetOwnerID()
|
buffOwner = BattleObj.GetBatObjMgr().getBatObj(ownerID) # ¹¥»÷·½
|
|
atkObj = buffOwner
|
defObj = batObj
|
|
defID = defObj.GetID()
|
tagObjList = [defObj]
|
|
poolMgr = ObjPool.GetPoolMgr()
|
useSkill = poolMgr.acquire(BattleObj.PySkill, skillIpyData)
|
useSkill.SetTagObjList(tagObjList)
|
useSkill.ClearHurtObj()
|
hurtObj = useSkill.AddHurtObj(defID)
|
|
dHP = defObj.GetHP()
|
GameWorld.DebugLog("½áËãdot: defID=%s,buffID=%s,skillID=%s,ownerID=%s,hurtValue=%s,hurtTypes=%s,dHP=%s"
|
% (defID, buffID, skillID, ownerID, hurtValue, hurtTypes, dHP))
|
hurtValue, realHurtHP = CalcHurtHPWithBuff(turnFight, atkObj, defObj, useSkill, hurtValue)
|
|
# dotµÄ·´µ¯¡¢ÎüѪ´ý¶¨
|
|
remainHP = max(0, dHP - realHurtHP) # Ê£ÓàѪÁ¿
|
lostHP = dHP - remainHP # ʵ¼ÊµôѪÁ¿
|
defObj.SetHP(remainHP)
|
|
GameWorld.DebugLog(" hurtValue=%s,realHurtHP=%s,lostHP=%s,%s/%s" % (hurtValue, realHurtHP, lostHP, defObj.GetHP(), defObj.GetMaxHP()))
|
|
hurtObj.SetHurtTypes(hurtTypes)
|
hurtObj.SetHurtHP(hurtValue)
|
hurtObj.SetRealHurtHP(realHurtHP)
|
hurtObj.SetLostHP(lostHP)
|
hurtObj.SetCurHP(remainHP)
|
|
TurnAttack.AddTurnObjHurtValue(atkObj, batObj, hurtValue, lostHP, skillID)
|
|
Sync_PropertyRefreshView(turnFight, defObj, ChConfig.AttrID_HP, remainHP, hurtValue, diffType=0, skillID=skillID, hurtTypes=hurtTypes)
|
|
DoBeAttackResult(turnFight, atkObj, useSkill)
|
|
useSkill.ResetUseRec()
|
poolMgr.release(useSkill)
|
return
|
|
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, hurtTypes=0):
|
'''֪ͨ¶ÔÏóÊôÐÔË¢ÐÂչʾB418
|
@param attrID: ֪ͨ±ä»¯µÄÊôÐÔID
|
@param diffValue: ±ä»¯Öµ
|
@param diffType: ±ä»¯ÀàÐÍ£¬0-¼õÉÙ£»1-Ôö¼Ó
|
@param skillID: ʹÓõļ¼ÄܱíID£¬¼´Äĸö¼¼ÄܵÄЧ¹û
|
@param relatedSkillID: ¹ØÁªµÄ¼¼ÄÜID£¬Ò»°ãÊÇÖ÷¼¼ÄÜID£¬·ÇÖ÷¼¼ÄܶîÍâ´¥·¢µÄΪ0
|
@param hurtTypes: Æ®×ÖÀàÐÍ»ã×Ü£¬Ö§³Ö¶àÖÖÀàÐͲ¢´æ£¬ÈçÎÞÊÓ·ÀÓùÇÒ±©»÷ͬʱ±»¸ñµ²£¬¶þ½øÖÆ»òÔËËã×îÖÕÖµ£»0-ʧ°Ü£»1-ÆÕͨ£»2-»ØÑª£»5-¸ñµ²£»6-ÎÞÊÓ·ÀÓù£»7-±©»÷£»9-ÉÁ±Ü
|
'''
|
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
|
clientPack.AttackTypes = hurtTypes
|
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
|