#!/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,HP:%s/%s" % (curBatObj.GetID(), skillID, len(tagObjList), batType, bySkillID, curBatObj.GetHP(), curBatObj.GetMaxHP())) # ÒÔÏÂΪ¼¼ÄÜ¿ÉÒÔʹÓõĴ¦Àí£¬Ö®ºóµÄÂß¼­Ä¬Èϼ¼ÄÜʹÓóɹ¦ 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, True) return def DoCombo(turnFight, atkObj, useSkill): ''' ¸ñµ²¡¢·´»÷¡¢Á¬»÷¹æÔò 1. ËùÓÐÎ佫»ò¹ÖÎï¾ù¿ÉÄܲúÉú¸ñµ²£¬Èº¹¥Ê±¸ñµ²Ò»¶ÔÒ»Åжϣ¬¾ù¿ÉÄܲúÉú¸ñµ² 2. ½öÆÕ¹¥Ê±¿É±»·´»÷£¬·´Åжϱ¾´Î¼¼ÄÜÄ¿±êÖеÄÖ÷Ä¿±ê£¨¼´¶ÔλĿ±ê£©ÊÇ·ñ²úÉú¸ñµ²£¬ÇÒÊǽüÕ½Î佫£¬Êǵϰ¿É·´»÷ Á¬»÷£º 1. ½öÆÕ¹¥¿ÉÁ¬»÷£¬·´»÷´ò¶ÏÁ¬»÷ 2. ·Ç¶ÔµÐ¼¼ÄÜ£¬ÈçÄÌÂè»ØÑªÆÕ¹¥£¬Åж϶ÔλĿ±ê¿¹Á¬ÊôÐÔÊÇ·ñ¿ÉÁ¬»÷ 3. ¶ÔµÐ¼¼ÄÜ£¬Åжϱ¾´Î¼¼ÄÜÄ¿±êÖеÄÖ÷Ä¿±ê£¨¼´¶ÔλĿ±ê£©¿¹Á¬ÊôÐÔÊÇ·ñ¿ÉÁ¬»÷ ¶ÔµÐ¼¼ÄÜÖ÷Ä¿±ê£º µ¥Ì壺 ĬÈϸÃÄ¿±ê ³°·í£º ÓÅÏȱ»³°·íµÄÄ¿±ê ºáÅÅ£º ÓÅÏȸÃÅÅÖÐÓë×Ô¼ºÍ¬Áе쬷ñÔò°´Ë³Ðò ×ÝÅÅ£º ÓÅÏÈÇ°ÃæµÄµ¥Î» ''' if not SkillCommon.isTurnNormalSkill(useSkill): #GameWorld.DebugLog("·ÇÆÕ¹¥²»´¦Àí·´»÷Á¬»÷") return tagFriendly = useSkill.GetTagFriendly() if tagFriendly: tagObj = GetRelativeObj(turnFight, atkObj) 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, [atkObj], ChConfig.TurnBattleType_AtkBack) return if not tagObj: return comboNum = atkObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnComboNum) aComboRate = atkObj.GetBatAttrValue(ChConfig.AttrID_ComboRate) aComboRate += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, tagObj, ChConfig.AttrID_ComboRate, useSkill) dComboRateDef = tagObj.GetBatAttrValue(ChConfig.AttrID_ComboRateDef) happenRate = eval(IpyGameDataPY.GetFuncCompileCfg("ComboCfg", 1)) if not GameWorld.CanHappen(happenRate): GameWorld.DebugLog("ÎÞ·¨Á¬»÷! atkID=%s,happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s" % (atkObj.GetID(), happenRate, aComboRate, dComboRateDef, comboNum)) return GameWorld.DebugLog("¡ñ %s ¡¾Á¬»÷¡¿ happenRate=%s,aComboRate=%s,dComboRateDef=%s,comboNum=%s" % (TurnAttack.GetObjName(atkObj), happenRate, aComboRate, dComboRateDef, comboNum)) atkObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, comboNum + 1) # Á¬»÷ÌØ³¤ DoHeroSpecialty(turnFight, atkObj, ChConfig.HeroSpecialty_Combo, useSkill.GetSkillID()) # Á¬»÷¸ù¾Ý¼¼ÄÜÄ¿±êÅäÖÃÂß¼­ÖØÐÂÑ¡ÔñÄ¿±ê OnUseSkill(turnFight, atkObj, useSkill, batType=ChConfig.TurnBattleType_Combo) return def __getCanAtkBackSkill(useSkill, tagObj): ## »ñÈ¡ÊÇ·ñ¿É·´»÷¼°·´»÷¼¼ÄÜ if not tagObj: return tagID = tagObj.GetID() canAtkbackDictTypeList = IpyGameDataPY.GetFuncEvalCfg("ParryCfg", 2) if tagObj.GetAtkDistType() not in canAtkbackDictTypeList: GameWorld.DebugLog("¸ÃÔ¶½üÀàÐÍÎ佫²»¿É·´»÷! tagID=%s,AtkDistType=%s not in %s" % (tagID, tagObj.GetAtkDistType(), canAtkbackDictTypeList)) 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_TurnNormaSkill: # ʹÓÃÆÕ¹¥·´»÷ GameWorld.DebugLog("¿ÉÒÔ·´»÷! tagID=%s" % tagID) return useSkill return def DoBeAttackResult(turnFight, curObj, useSkill, isUseSkill=False): '''±»¹¥»÷½á¹û @param curObj: Ê©·¨·½»òbuff¹éÊô·½ @param isUseSkill: ÊÇ·ñÊÇÖ±½ÓʹÓü¼ÄܵĹ¥»÷½á¹û£¬·ñÔòÊÓΪ³ÖÐøÐ﵀ ''' 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 = logicData[0] buff = logicData[1] TurnBuff.SyncBuffRefresh(turnFight, batObj, buff, relatedSkillID, isNewAdd=True) elif logicType == ChConfig.AfterLogic_SyncBuff: buffObj = logicData[0] buff = logicData[1] TurnBuff.SyncBuffRefresh(turnFight, buffObj, buff, relatedSkillID) # ͳ¼Æ»÷ɱ killObjList = [] # »÷ɱÆäËûÕóӪĿ±êÁбí for tagObj in useSkill.GetTagObjList(): tagID = tagObj.GetID() if tagObj.IsAlive() and tagObj.GetHP() <= 0 and tagObj.GetFaction() != curObj.GetFaction(): killObjList.append(tagObj) TurnAttack.SetObjKilled(turnFight, tagObj, curObj, useSkill) if curObj.IsAlive() and curObj.GetHP() <= 0: TurnAttack.SetObjKilled(turnFight, curObj) # ͳ¼ÆÉËѪ£¬¿ÉÄܵ¥¸ö¼¼ÄܶÔͬһĿ±êÔì³É¶à´ÎÉ˺¦ isSuperHit, isStun, isSuckHP = False, False, False 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) DoHeroSpecialty(turnFight, tagObj, ChConfig.HeroSpecialty_Miss, relatedSkillID) if hurtObj.HaveHurtType(ChConfig.HurtType_Parry): DoHeroSpecialty(turnFight, tagObj, ChConfig.HeroSpecialty_Parry, relatedSkillID) if hurtObj.HaveHurtType(ChConfig.HurtType_SuperHit): isSuperHit = True if hurtObj.HaveHurtType(ChConfig.HurtType_Stun): isStun = True if hurtObj.GetSuckHP() > 0: isSuckHP = True # Ⱥ¹¥Ö»´¥·¢Ò»´ÎÌØ³¤ if isSuperHit: DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuperHit, relatedSkillID) if isStun: DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_Stun, relatedSkillID) if isSuckHP: DoHeroSpecialty(turnFight, curObj, ChConfig.HeroSpecialty_SuckHP, relatedSkillID) # ½áË㸱±¾Ïà¹ØµÄ¹¥»÷½á¹û£¬½öÖ÷¶¯·¢ÆðÍæ¼ÒÕóÈÝÎ佫´¥·¢ curPlayer = turnFight.curPlayer if curPlayer and curObj and curObj.GetOwnerID() == curPlayer.GetPlayerID(): FBLogic.OnPlayerLineupAttackResult(curPlayer, curObj, killObjList, useSkill, turnFight.mapID, turnFight.funcLineID) # ÓÅÏÈ´¥·¢±¾¼¼ÄܶîÍâЧ¹û£¬×¢£º½ö¸Ã¼¼ÄÜÊͷźó¸Ã¼¼ÄܵĶîÍâЧ¹ûÊÓΪÖ÷¼¼ÄܵÄЧ¹û£¬ÓÅÏȼ¶×î¸ß __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList, isUseSkill) # ========== ÒÔÏ´¥·¢±»¶¯ ========== # ÆÆ¶Üʱ 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 isUseSkill and 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) and useSkill.GetBatType() == ChConfig.TurnBattleType_Normal: 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 DoHeroSpecialty(turnFight, gameObj, specialty, relatedSkillID=0): ## Ö´ÐÐÎä½«ÌØ³¤ if gameObj.GetSpecialty() != specialty: return specialtyAddXPDict = IpyGameDataPY.GetFuncEvalCfg("AngerXP", 5, {}) if str(specialty) not in specialtyAddXPDict: return addXP = specialtyAddXPDict[str(specialty)] curXP = gameObj.GetXP() updXP = curXP + addXP gameObj.SetXP(updXP, False) GameWorld.DebugLog(" ÌØ³¤¼ÓXP: curID=%s,curXP=%s,addXP=%s,updXP=%s,ÌØÐÔ=%s" % (gameObj.GetID(), curXP, addXP, updXP, specialty)) Sync_PropertyRefreshView(turnFight, gameObj, ChConfig.AttrID_XP, updXP, addXP, diffType=1, relatedSkillID=relatedSkillID) return def __DoCurSkillEff(turnFight, curObj, useSkill, missObjIDList, isUseSkill): ## Ö´Ðб¾¼¼ÄÜ/buffÊͷźó¶îÍâЧ¹û for index in xrange(useSkill.GetEffectCount()): curEffect = useSkill.GetEffect(index) triggerWay = curEffect.GetTriggerWay() if isUseSkill: if triggerWay != ChConfig.TriggerWay_CurSkillEff: continue else: if triggerWay != ChConfig.TriggerWay_CurSkillEffLst: continue effID = curEffect.GetEffectID() GameWorld.DebugLog("Ö´ÐжîÍâ¼¼ÄÜЧ¹û: %s, triggerWay=%s,missObjIDList=%s" % (effID, triggerWay, missObjIDList)) if effID == 5010: # ¶îÍâ¼¼ÄÜЧ¹û __doUseEnhanceSkill(turnFight, curObj, useSkill, curEffect, missObjIDList) continue for tagObj in useSkill.GetTagObjList(): tagID = tagObj.GetID() GameWorld.DebugLog(" tagID=%s" % (tagID)) 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) 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: if not tagObj.CheckInState(checkInStateList): 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: if tagObj.CheckInState(checkInStateList): inState = True 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 OnUsePassiveSkill(turnFight, batObj, tagObj, passiveSkill, connSkill=None, effSkillID=0, effectID=0): '''±»¶¯´¥·¢Ê¹Óü¼ÄÜ @param passiveSkill: Êͷŵı»¶¯¼¼ÄÜ @param connSkill: ÓÉʲô¼¼ÄÜÒýÆðµÄ @param effSkillID: ±»¶¯Ð§¹ûËùÊôµÄ¼¼ÄÜID @param effectID: ±»¶¯Ð§¹ûID ×¢£º¿ÉÄÜÓÉAÒýÆð´¥·¢B¼¼ÄܵÄЧ¹ûÊͷż¼ÄÜC ''' if not passiveSkill: return isOK = False passiveSkillID = passiveSkill.GetSkillID() # ¼Ì³ÐÖ÷¼¼ÄÜÄ¿±ê if passiveSkill.GetTagAim() == ChConfig.SkillTagAim_MainSkill: happenRate = passiveSkill.GetHappenRate() GameWorld.DebugLog("±»¶¯´¥·¢¼¼ÄÜ£¬¼Ì³ÐÖ÷¼¼ÄÜÄ¿±ê! effSkillID=%s,effectID=%s,passiveSkillID=%s,happenRate=%s" % (effSkillID, effectID, passiveSkillID, happenRate)) if not tagObj: return tagID = tagObj.GetID() if not tagObj.IsAlive(): GameWorld.DebugLog(" Òѱ»»÷ɱ²»´¥·¢: tagID=%s" % (tagID)) return if happenRate and happenRate != ChConfig.Def_MaxRateValue and not GameWorld.CanHappen(happenRate, ChConfig.Def_MaxRateValue): GameWorld.DebugLog(" ¸ÅÂʲ»´¥·¢: tagID=%s,happenRate=%s" % (tagID, happenRate)) return passiveTagObjList = [tagObj] isOK = OnUseSkill(turnFight, batObj, passiveSkill, passiveTagObjList, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill) else: GameWorld.DebugLog("±»¶¯´¥·¢¼¼ÄÜ£¬ÖØÐÂËø¶¨Ä¿±ê! effSkillID=%s,effectID=%s,passiveSkillID=%s" % (effSkillID, effectID, passiveSkillID)) isOK = OnUseSkill(turnFight, batObj, passiveSkill, batType=ChConfig.TurnBattleType_Passive, bySkill=connSkill) return isOK 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) atkObj.SetLastHurtValue(hurtValue) 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): '''¼ÆËãÉ˺¦£¬Ä¬Èϰ´¹¥»÷¼ÆËã ''' skillID = curSkill.GetSkillID() pmType = GetPMType(atkObj, curSkill) ignoreDef = IsIgnoreDef(curSkill) changeHurtType = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtType, curSkill) if changeHurtType == 1: ignoreDef = True GameWorld.DebugLog("Ç¿ÖÆ±ä¸ü±¾´ÎÉ˺¦ÎªÎÞÊÓ·ÀÓù! skillID=%s" % skillID) atkID = atkObj.GetID() defID = defObj.GetID() calcType = curSkill.GetCalcType() # É˺¦¼ÆË㷽ʽ 0-°´¹¥»÷ isTurnNormalSkill = SkillCommon.isTurnNormalSkill(curSkill) isAngerSkill = SkillCommon.isAngerSkill(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 isTurnNormalSkill and 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) isSuperHit, isParry, isStun = False, False, False aSuperDamPer, dSuperDamPerDef = 0, 0 # ±©»÷£¨dot³ýÍ⣩ if not isDot: isSuperHit = CanSuperHit(turnFight, atkObj, defObj, curSkill) # ÊÇ·ñ±©»÷ # ÉÁ±Ü¡¢»÷ÔΡ¢¸ñµ² if isTurnNormalSkill: isParry = CanParry(turnFight, atkObj, defObj, curSkill) # ÊÇ·ñ¸ñµ² isStun = 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) if isStun: hurtTypes |= pow(2, ChConfig.HurtType_Stun) #²ÎÓëÔËËãµÄÊýÖµ #rand = random.random() #ÖÖ×ÓÊý 0~1 aAtk = atkObj.GetAtk() # ¹¥»÷·½×î´ó¹¥»÷ dHP = defObj.GetHP() dDef = 0 if ignoreDef else defObj.GetDef() # ·ÀÊØ·½·ÀÓùÁ¦ 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) # ÆÕ¼¼¼õÉË aAddSkillPer = 0 # ¼¼ÄÜÔöÉË aAddSkillPer += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SkillPer, curSkill) # Îï·¨Ôö¼õÉË 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 aAddSkillPer /= 10000.0 aPMDamPer /= 10000.0 dPMDamPerDef /= 10000.0 aSuperDamPer /= 10000.0 dSuperDamPerDef /= 10000.0 aFinalDamPer /= 10000.0 dFinalDamPerDef /= 10000.0 if calcType != ChConfig.Def_Calc_Attack: aAtk = GetCalcBaseValue(calcType, atkObj, defObj) GameWorld.DebugLog("ÉËѪ¼ÆËã: atkID=%s,defID=%s,skillID=%s,atkSkillPer=%s,calcType=%s,aAtk=%s,dDef=%s,dHP=%s,hurtTypes=%s,aAddSkillPer=%s" % (atkID, defID, skillID, atkSkillPer, calcType, aAtk, dDef, dHP, hurtTypes, aAddSkillPer)) # ³ÖÐøÐÔÉ˺¦ if isTurnNormalSkill: hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 1)) GameWorld.DebugLog(" ÆÕ¹¥¼¼ÄÜÉ˺¦=%s" % (hurtValue)) elif isAngerSkill: hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("HurtFormula", 2)) GameWorld.DebugLog(" Å­Æø¼¼ÄÜÉ˺¦=%s" % (hurtValue)) elif isDot: hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("DOTFormula", 1)) GameWorld.DebugLog(" ³ÖÐø¼¼ÄÜÉ˺¦=%s" % (hurtValue)) elif calcType != ChConfig.Def_Calc_Attack: hurtValue = eval(IpyGameDataPY.GetFuncCompileCfg("CalcTypeFormula", 1)) GameWorld.DebugLog(" ·Ç°´¹¥»÷Á¦É˺¦=%s,calcType=%s,aAtk=%s" % (hurtValue, calcType, aAtk)) 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)) multiValue = TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.PassiveEff_ChangeHurtMulti, curSkill) if multiValue and multiValue != 1: hurtValue = int(hurtValue * multiValue) GameWorld.DebugLog(" É˺¦±¶Öµ: hurtValue=%s,multiValue=%s" % (hurtValue, multiValue)) hurtAtkPerMax = curSkill.GetHurtAtkPerMax() # ×î´óÍò·Ö±È£¬ÏÞÖÆ×îÖÕÉ˺¦²»³¬¹ý¹¥»÷Á¦Íò·ÖÂÊ if hurtAtkPerMax: aAtk = atkObj.GetAtk() hurtValueMax = aAtk * hurtAtkPerMax / 10000.0 hurtValue = min(hurtValue, hurtValueMax) GameWorld.DebugLog(" É˺¦×î¸ßÏÞÖÆ: hurtValue=%s,hurtAtkPerMax=%s,aAtk=%s" % (hurtValue, hurtAtkPerMax, aAtk)) hurtValue = max(1, int(hurtValue)) # ¸ºÖµ¡¢±£µ×·À·¶£¬·Å×îºó return hurtValue, hurtTypes def CanSuperHit(turnFight, atkObj, defObj, curSkill): aSuperHitRate = atkObj.GetBatAttrValue(ChConfig.AttrID_SuperHitRate) aSuperHitRate += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_SuperHitRate, curSkill) 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) aStunRate += TurnPassive.GetTriggerEffectValue(turnFight, atkObj, defObj, ChConfig.AttrID_StunRate, curSkill) 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(turnFight, atkObj, defObj, curSkill): if defObj.IsInControlled(): #±»¿ØÖÆÎÞ·¨¸ñµ² return False # ¸ñµ²Ó¡¼Ç buffMgr = defObj.GetBuffManager() parryYJBuff = buffMgr.FindBuffByState(ChConfig.BatObjState_ParryYJ) if parryYJBuff and parryYJBuff.GetLayer(): GameWorld.DebugLog("¸ñµ²Ó¡¼Ç¸ñµ²ÁË: buffID=%s,buffLayer=%s" % (parryYJBuff.GetBuffID(), parryYJBuff.GetLayer())) TurnBuff.DecBuffLayer(turnFight, defObj, parryYJBuff, 1, curSkill.GetSkillID()) return True 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 calcType == ChConfig.Def_Calc_LastHurt: baseValue = curObj.GetLastHurtValue() 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) # ¹¥»÷·½ if not buffOwner: return atkObj = buffOwner defObj = batObj atkID = ownerID 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: atkID=%s,defID=%s,buffID=%s,skillID=%s,ownerID=%s,hurtValue=%s,hurtTypes=%s,dHP=%s" % (atkID, 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) atkObj.SetLastHurtValue(hurtValue) 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