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