#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package TurnAttack # # @todo:»ØºÏÖÆ¹¥»÷Âß¼­ # @author hxp # @date 2023-11-30 # @version 1.0 # # ÏêϸÃèÊö: »ØºÏÖÆ¹¥»÷Âß¼­£¬¾ùʹÓÃNPCʵÀý×÷Ϊս¶·Ö÷Ìå # ʵʱս¶·£º ½öÓÃÓÚÖ÷Ïߣ¬Ã¿¸öÍæ¼Ò×î¶à½öÔÊÐí´æÔÚÒ»¸öʵʱս¶· # ÓÉǰ¶Ë¿ØÖÆÕ½¶·Á÷³Ì£¬ºó¶Ë½øÐмÆËã # ˲ʱս¶·£º ÓÃÓÚ·ÇÖ÷ÏßÍâµÄ¸÷ÖÖÕ½¶·£¬È縱±¾PVEÌôÕ½£¬PVPÌôÕ½µÈ£¬Ò»Ñù½öÓÐÒ»¸ö˲ʱս¶·£¬ # Ò»´ÎÐÔ´¦ÀíÍ꣬ºó¶Ë¿ØÖÆÕûÌåÕ½¶·Á÷³Ì¼°¼ÆË㣬ǰ¶Ë½ö×öÕ½±¨½âÎö±íÏÖÕ½¶·¹ý³Ì # #------------------------------------------------------------------------------- #"""Version = 2023-11-30 15:30""" #------------------------------------------------------------------------------- import ChConfig import PlayerTask import ChPyNetSendPack import NetPackCommon import PlayerControl import GameWorld import IpyGameDataPY import PlayerOnline import NPCCommon import ShareDefine import PyGameData import SkillCommon import BattleObj import TurnPassive import TurnSkill import TurnBuff import ObjPool import FBLogic import random import time import json TimelineSet = 10000 # µ¥»ØºÏ×î´óʱ¼äÖá PosNumMax = 7 # ×î´óվλ±àºÅ ActionNumStart = -1 # ÆðʼÐж¯Î»ÖñàºÅ£¬Ò»°ãÊÇ´Ó1¿ªÊ¼£¬Èç¹ûÓмÓÖ÷¹«¡¢ºìÑÕµÈÔò¿Û³ýÏàӦλÖÃÖµ£¬Èç´Ó0»ò-1¿ªÊ¼ # »ØºÏÕ½¶·Á÷³Ì״̬ ( FightState_Start, # 0 Æðʼ״̬£¬ÎÞÌØÊâÒâÒ壬½ö´ú±í¿ªÊ¼ÁË£¬ÓëOver¶ÔÓ¦ FightState_PrepareOK, # 1 ×¼±¸Íê±Ï£¬°üº¬¶ÔÕ½NPCÕÙ»½OK¡¢ÆäËûµÈ FightState_Fighting, # 2 Õ½¶·ÖÐ FightState_FightEnd, # 3 Õ½¶·½áÊø FightState_Award, # 4 ½áËã½±Àø FightState_Over, # 5 ½áÊø×´Ì¬£¬ÎÞÌØÊâÒâÒ壬½ö´ú±íËùÓд¦Àí½áÊøÁË£¬ÓëStart¶ÔÓ¦ FightState_Rest, # 6 ½áÊø²¢ÐÝÏ¢£¬Ò»°ãÊÇǰ¶ËÖ÷¶¯Í˳ö²¢ÐÝÏ¢µÄ ) = range(7) class BatLineup(): ## Õ½¶·ÕóÈÝ def __init__(self, faction, num, turnFight): self.turnFight = turnFight # TurnFight self.faction = faction # ËùÊôÕóÓª self.num = num # ¸ÃÕóÈÝËùÔÚÕóÓªÖеıàºÅ£¬²»Í¬ÕóÓª¿ÉÖØ¸´£¬¶àV¶à self.ownerID = 0 # ÕóÈÝËùÊôÍæ¼ÒID£¬¿ÉÄÜΪ0£¬0´ú±í·ÇÍæ¼ÒÕóÈÝ self.shapeType = 0 # ÕóÐÍ self.fightPower = 0 # ÕóÈÝ×ÜÕ½Á¦ self.posObjIDDict = {} # վλ¶ÔÓ¦Õ½¶·ÊµÌå {վλ±àºÅ:batObjID, ...}, վλ±àºÅСÓÚ0Ϊ·ÇÖ÷Õ½µ¥Î»£¬ÈçÖ÷¹«¡¢ºìÑÕµÈ self.lingshouObjIDDict = {} # ÁéÊÞÕ½¶·µ¥Î» {λÖñàºÅ:batObjID, ...} self.beautyObjIDDict = {} # ºìÑÕÕ½¶·µ¥Î» {λÖñàºÅ:batObjID, ...} self.actionNum = ActionNumStart # Ðж¯Î»Ö㬴Ó1¿ªÊ¼ return def getPlayerID(self): return self.turnFight.playerID # ·¢ÆðµÄÍæ¼ÒID def isEmpty(self): return not self.posObjIDDict def setLineup(self, lineupInfo): ## ÉèÖÃÕóÈÝ # @param lineupInfo: ÕóÈÝÐÅÏ¢ self.clearLineup() self.ownerID = lineupInfo.get("PlayerID", 0) # ÕóÈÝËùÊôµÄÍæ¼ÒID self.shapeType = lineupInfo.get("ShapeType", 0) self.fightPower = lineupInfo.get("FightPower", 0) SummonLineupObjs(self, self.faction, self.num, lineupInfo, self.getPlayerID()) return def clearLineup(self): ## Çå³ýÕóÈÝ batObjMgr = BattleObj.GetBatObjMgr() for objID in self.posObjIDDict.values(): batObjMgr.delBatObj(objID) for objID in self.lingshouObjIDDict.values(): batObjMgr.delBatObj(objID) for objID in self.beautyObjIDDict.values(): batObjMgr.delBatObj(objID) self.posObjIDDict = {} self.lingshouObjIDDict = {} self.beautyObjIDDict = {} self.fightPower = 0 return class BatFaction(): ## Õ½¶·ÕóÓª def __init__(self, faction, turnFight): self.turnFight = turnFight # TurnFight self.faction = faction self.lineupDict = {} # ¸ÃÕóÓªËùÓÐÕóÈÝÐÅÏ¢ {±àºÅ:BatLineup, ...} return def getBatlineup(self, num=1): ## »ñȡս¶·ÕóÈÝ lineup = None if num in self.lineupDict: lineup = self.lineupDict[num] else: lineup = BatLineup(self.faction, num, self.turnFight) self.lineupDict[num] = lineup return lineup def clearLineups(self): ## Çå³ýËùÓÐÕ½¶·ÕóÈÝ for lineup in self.lineupDict.values(): lineup.clearLineup() return class TurnFight(): '''ij³¡»ØºÏÕ½¶·£¬Ö§³Ö¶àV¶à£¬ËùÓÐÕ½¶·Í¨Óã¬Ö÷Ïß¡¢ÅÀËþ¡¢PVPµÈ ¿ÉÄÜΪϵͳºǫ́·¢ÆðµÄ£¬Ôò¹¥»÷·½¡¢·ÀÊØ·½ÕóÈÝÒÔÍæ¼ÒËù±£´æµÄÕóÈݾµÏñ½øÐÐÕ½¶· Èç¹ûÍæ¼Ò·¢ÆðµÄ£¬Ôò¹¥»÷·½Îª·¢Æð·½Íæ¼Ò£¬Ä¿±êΪ·ÀÊØ·½£¬Ö§³Ö¶àV¶à£¬Èç×é¶ÓPK ¶àV¶àµÄÇé¿öÒ²ÊÇij¸ö¶ÓÔ±¸÷×Ô·¢ÆðÕ½¶·£¬Ö»ÊÇÓõ½¶ÓÓѵľµÏñÕóÈÝÒ»ÆðÕ½¶·£¬¶ÓÓÑÎÞ¸ÐÖª ¶àV¶à¿ÉʹÓÃÁ½ÖÖģʽ£º 1. ¶à¸öÕóÈÝÒ»Æð³ö³¡£¬ÔÚÒ»³¡Õ½¶·ÖÐÍê³É 2. ÒÔµ¥ÕóÈÝ·½Ê½ÂÖÁ÷³ö³¡Õ½¶·£¬¸Ã·½Ê½Í¬Ñù¿ÉÒÔʹÓ÷½Ê½1µÄÂß¼­ÊµÏÖ£¬¹ÌÓÅÏÈʹÓ÷½Ê½1Õ½¶·Âß¼­£¬·½±ãÀ©Õ¹ ''' def __init__(self, mapID=0, funcLineID=0, playerID=0, isNeedReport=False): self.guid = GameWorld.GetGUID() # ij³¡Õ½¶·µÄΨһguid£¬¿ÉÓÃÓÚ´æ´¢¼Ç¼ÈçÕ½±¨µÈ self.playerID = playerID # ¿ÉÄÜΪ0£¬ÏµÍ³ºǫ́×Ô¶¯´¦ÀíµÄÕ½¶·Ê±Îª0£¬Ä³¸öÍæ¼Ò·¢ÆðÔòΪ·¢ÆðÍæ¼ÒID£¬Í¬¸öÍæ¼ÒID¿ÉÄÜͬʱ´æÔڶೡս¶·£¬ÈçÖ÷Ïß+ÆäËû self.curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if playerID else None self.mapID = mapID self.funcLineID = funcLineID self.state = -1 # -1 ´ú±íδս¶· self.turnNum = 1 # µ±Ç°µÚx»ØºÏ£¬Ä¬ÈϵÚ1»ØºÏ¿ªÊ¼ self.turnMax = 15 # ×î´ó»ØºÏÊý self.enterLogic = False # ÊÇ·ñÒÑÖ´Ðнø³¡Âß¼­ self.winFaction = 0 # ±¾³¡Õ½¶·½áÊø±ê¼Ç£¬»ñʤÕóÓª£¬Îª0ʱ´ú±íδ½áÊø£¬ËùÓÐС¶Ó´òÍê»òʧ°Ü²ÅÓнá¹û£¬0-δ½áÊø£¬>0-»ñʤµÄÕóÓª self.isWin = False self.batBuffer = "" # Õ½±¨buffer£¬Õ½±¨ÔÝʱֻ±£Áô×îºóÒ»¸öС¶ÓµÄ self.isNeedReport = isNeedReport # ÊÇ·ñÐèÒªÕ½±¨ self.msgDict = {} # À©Õ¹ÐÅÏ¢×ֵ䣬һ°ãÓÉMapID°ó¶¨µÄ¹¦Äܾö¶¨ÐÅÏ¢ÄÚÈÝ {k:v, ...} self.factionDict = {} # Õ½¶·ÕóÓª {faction:BatFaction, ...}£¬Ò»°ãÊÇÖ»ÓÐÁ½¸öÕóÓª£¬factionΪ1»ò2£¬Ã¿¸öÕóÓªÖ§³Ö¶à¸öÕóÈÝ self.actionSortList = [] # ÕóÈÝÐж¯Ë³Ðò [[faction, num], ...] self.actionIndex = 0 # Ðж¯Ë³ÐòË÷Òý self.timeline = 0 # ʱ¼äÖá½Úµã turnNum*1000+actionIndex*100++actionNum self.startTime = 0 # ¿ªÊ¼Ê±¼ä´Á£¬Ö§³ÖºÁÃëСÊý self.costTime = 0 # µ¥³¡Õ½¶·×ܺÄʱ£¬Ö§³ÖºÁÃëСÊý # ¶àС¶Ó - Ò»°ãÖ»ÓÐPVEÓõ½ self.lineupIndex = 0 # µ±Ç°Ð¡¶ÓË÷Òý self.lineupIDList = [] # npcС¶ÓÁбí self.strongerLV = 0 # npc³É³¤µÈ¼¶ self.difficulty = 0 # npcÄÑ¶È return def setTurnFight(self, mapID, funcLineID, turnMax, isNeedReport=False, msgDict={}, lineupIDList=[], strongerLV=0, difficulty=0): ## ÉèÖñ¾³¡»ØºÏÕ½¶·É趨 self.mapID = mapID self.funcLineID = funcLineID self.turnMax = turnMax # ×î´ó»ØºÏÊý self.isNeedReport = isNeedReport self.lineupIndex = 0 self.lineupIDList = lineupIDList self.strongerLV = strongerLV self.difficulty = difficulty self.msgDict = {} self.nextTurnFight(msgDict) return def nextTurnFight(self, msgDict={}): ## Ò»°ãÓÃÓÚÍæ¼Ò·¢ÆðµÄÕ½¶·£¬ÔÚÐèÒª±£ÁôÍæ¼ÒÕóÈÝÊôÐÔ¼°×´Ì¬µÄÇé¿öÏ£¬ÖØÖûغϽøÈëÏÂÒ»³¡Õ½¶· self.turnNum = 1 self.enterLogic = False self.winFaction = 0 self.isWin = False self.msgDict.update(msgDict) self.timeline = 0 self.startTime = time.time() self.costTime = 0 return def haveNextLineup(self): ## ÊÇ·ñ¿ÉÒÔ´òÏÂһС¶Ó£¬»ñʤÇÒ»¹ÓÐÏÂһС¶Óʱ¿É´ò return (self.winFaction == ChConfig.Def_FactionA and self.lineupIndex < len(self.lineupIDList) - 1) def nextLineupID(self): ## ÏÂһС¶ÓID if not self.haveNextLineup(): return 0 self.lineupIndex += 1 return self.lineupIDList[self.lineupIndex] def setFactionLineup(self, faction, lineupDict): ## ÉèÖÃÕóÓªÕóÈÝ # @param lineupDict: {ÕóÈݱàºÅ:ÕóÈÝÐÅÏ¢, ...} ÿ¸öÕóÓªÖ§³Ö¶à¸öÕóÈÝ£¬¼´Ö§³Ö¶àV¶à batFaction = self.getBatFaction(faction) batFaction.clearLineups() for num, lineupInfo in lineupDict.items(): if not lineupInfo: continue batLineup = batFaction.getBatlineup(num) batLineup.setLineup(lineupInfo) return def sortActionQueue(self): ## ˢгöÊÖ˳Ðò¶ÓÁÐ sortList = [] for batFaction in self.factionDict.values(): faction = batFaction.faction for num, batLineup in batFaction.lineupDict.items(): isPlayer = 1 if batLineup.ownerID else 0 # Íæ¼ÒÕóÈÝÓÅÏȹ¥»÷ fightPower = batLineup.fightPower sortValue = -(faction * 10 + num) sortList.append([isPlayer, fightPower, sortValue, faction, num]) sortList.sort(reverse=True) # Õ½Á¦¸ßµÄÏÈÊÖ self.actionIndex = 0 self.actionSortList = [] for _, _, _, faction, num in sortList: self.actionSortList.append([faction, num]) GameWorld.DebugLog("ÕóÈÝÕ½Á¦ÅÅÐò[isPlayer, fp, sortV, f, n]: %s" % sortList) GameWorld.DebugLog("ÕóÈÝÐж¯Ë³Ðò[f, n]: %s" % self.actionSortList) return def getTurnNumStartTimelin(self, turnNum): return turnNum * TimelineSet + 0 # ÿ»ØºÏµÄʱ¼ä½ÚµãÆðµã def getTimeline(self): return self.timeline def setTimeline(self, timeline, isEmpty=False): '''»ØºÏÕ½¶·µÄʱ¼äÖá½Úµã £¬¼´µÚ¼¸»ØºÏ¿ªÊ¼£¬Ã¿¸ö»ØºÏÖ§³Ö9999¸öÐж¯½Úµã @param turnNum: µÚx»ØºÏ ''' self.timeline = timeline GameWorld.DebugLog("ʱ¼ä½Úµã¸üÐÂ: %s" % self.timeline) if isEmpty: # ¿ÕλÖõĽڵã¿ÉÖ±½ÓÌø¹ý return timeline OnTimelineChange(self) return timeline def getBatFaction(self, faction=ChConfig.Def_FactionA): ## ĬÈÏÕóÓª1 batFaction = None if faction in self.factionDict: batFaction = self.factionDict[faction] else: batFaction = BatFaction(faction, self) self.factionDict[faction] = batFaction return batFaction def checkOverByKilled(self): ##¼ì²éÊÇ·ñ»÷ɱ½áÊø # @return: 0-ÎÞ»ñʤÕóÓª£¬Í¬Ê±Ò²´ú±íÕ½¶·Î´½áÊø£»>0-»ñʤµÄÕóÓªID£¬Í¬Ê±Ò²´ú±íÕ½¶·ÒÑÈ«²¿½áÊø if self.winFaction: return self.winFaction batObjMgr = BattleObj.GetBatObjMgr() for faction, batFaction in self.factionDict.items(): allKilled = True for batLineup in batFaction.lineupDict.values(): if not allKilled: break for posNum, objID in batLineup.posObjIDDict.items(): if posNum <= 0: # ·ÇÖ÷սλÖò»ÅÐ¶Ï continue batObj = batObjMgr.getBatObj(objID) if not batObj: continue if batObj.IsAlive(): allKilled = False break if allKilled: self.winFaction = ChConfig.Def_FactionA if faction == ChConfig.Def_FactionB else ChConfig.Def_FactionB DoTurnFightOver(self.guid) return self.winFaction return 0 def exitFight(self, rest=False): ## Í˳öÕ½¶· self.syncState(FightState_Over if not rest else FightState_Rest) for batFaction in self.factionDict.values(): batFaction.clearLineups() self.state = -1 return def startFight(self): ## ×¼±¸¾ÍÐ÷£¬¿ªÊ¼Õ½¶· self.state = FightState_Start self.turnNum = 1 self.timeline = self.getTurnNumStartTimelin(self.turnNum) self.syncInit() return def isInFight(self): return self.state != -1 def syncInit(self): ## ³õʼ»¯Í¨Öª msg = json.dumps(self.msgDict, ensure_ascii=False) msg = msg.replace(" ", "") clientPack = ChPyNetSendPack.tagSCTurnFightInit() clientPack.MapID = self.mapID clientPack.FuncLineID = self.funcLineID clientPack.TurnMax = self.turnMax clientPack.Msg = msg clientPack.Len = len(clientPack.Msg) clientPack.FactionList = [] batObjMgr = BattleObj.GetBatObjMgr() for faction in self.factionDict.keys(): batFaction = self.getBatFaction(faction) tfFaction = ChPyNetSendPack.tagSCTurnFightFaction() tfFaction.Faction = faction tfFaction.LineupList = [] for num in batFaction.lineupDict.keys(): batLineup = batFaction.getBatlineup(num) tfLineup = ChPyNetSendPack.tagSCTurnFightLineup() tfLineup.Num = num tfLineup.OwnerID = batLineup.ownerID tfLineup.ShapeType = batLineup.shapeType tfLineup.ObjList = [] for posNum, objID in batLineup.posObjIDDict.items(): batObj = batObjMgr.getBatObj(objID) if not batObj: continue tfObj = ChPyNetSendPack.tagSCTurnFightObj() tfObj.ObjID = batObj.GetID() tfObj.NPCID = batObj.GetNPCID() tfObj.HeroID = batObj.GetHeroID() tfObj.SkinID = batObj.GetSkinID() tfObj.HP = batObj.GetHP() % ChConfig.Def_PerPointValue tfObj.HPEx = batObj.GetHP() / ChConfig.Def_PerPointValue tfObj.MaxHP = batObj.GetMaxHP() % ChConfig.Def_PerPointValue tfObj.MaxHPEx = batObj.GetMaxHP() / ChConfig.Def_PerPointValue tfObj.LV = batObj.GetLV() tfObj.PosNum = posNum tfObj.AngreXP = batObj.GetXP() tfLineup.ObjList.append(tfObj) tfLineup.ObjCnt = len(tfLineup.ObjList) tfFaction.LineupList.append(tfLineup) tfFaction.LineupCnt = len(tfFaction.LineupList) clientPack.FactionList.append(tfFaction) clientPack.FactionCnt = len(clientPack.FactionList) self.addBatPack(clientPack) return def syncState(self, state, msgDict={}): self.state = state msg = json.dumps(msgDict, ensure_ascii=False) msg = msg.replace(" ", "") clientPack = ChPyNetSendPack.tagMCTurnFightState() clientPack.Clear() clientPack.MapID = self.mapID clientPack.FuncLineID = self.funcLineID clientPack.State = state clientPack.TurnNum = self.turnNum clientPack.Msg = msg clientPack.Len = len(clientPack.Msg) self.addBatPack(clientPack) return def syncObjAction(self, turnNum, objID): clientPack = ChPyNetSendPack.tagMCTurnFightObjAction() clientPack.Clear() clientPack.TurnNum = turnNum clientPack.ObjID = objID self.addBatPack(clientPack) return def addBatPack(self, clientPack): ## Ìí¼ÓÕ½¶·¹ý³Ì·â°ü£¬·ÇÕ½¶·Ïà¹ØµÄ·â°ü¿ÉÒÔ²»Ê¹Óøú¯Êý·¢ËÍ£¬Èç¼Ó¾­Ñé¡¢µôÂäµÈ ## ×¢£ºÕ½¶·Ïà¹ØµÄ·â°üÐèµ÷Óñ¾º¯Êý·½±ãͳһ¹ÜÀíÕ½±¨ if hasattr(clientPack, "Head"): headStr = "%02x%02x" % (clientPack.Head.Cmd, clientPack.Head.SubCmd) else: headStr = "%02x%02x" % (clientPack.Cmd, clientPack.SubCmd) if self.isNeedReport: packBuff = clientPack.GetBuffer() GameWorld.DebugLog("»ØºÏÕ½¶·¹ý³Ì·â°ü: %s" % (headStr)) self.batBuffer += packBuff ObjPool.GetPoolMgr().release(clientPack) else: GameWorld.DebugLog("»ØºÏÕ½¶·¹ý³Ì·â°ü: %s" % (headStr)) # ÓÐÍæ¼ÒµÄͳһÿ¸ö°üµ¥¶À·¢ËÍ£¬Í¬ÑùÒ²Ö§³ÖÕ½±¨Í³¼Æ if self.curPlayer: NetPackCommon.SendFakePack(self.curPlayer, clientPack) else: ObjPool.GetPoolMgr().release(clientPack) return class TurnFightMgr(): ## »ØºÏÕ½¶·¹ÜÀíÆ÷ def __init__(self): self.turnFightDict = {} # {guid:TurnFight, ...} return def addTurnFight(self, mapID, funcLineID=0, playerID=0, isNeedReport=False): tf = ObjPool.GetPoolMgr().acquire(TurnFight, mapID, funcLineID, playerID, isNeedReport) if not tf: tf = TurnFight(mapID, funcLineID, playerID, isNeedReport) # Ò»°ãÊDz»¿ÉÄÜ£¬ÎªÁ˵ã³ö´úÂë self.turnFightDict[tf.guid] = tf return tf def delTurnFight(self, guid): turnFight = self.getTurnFight(guid) if not turnFight: return turnFight.exitFight() self.turnFightDict.pop(guid, None) ObjPool.GetPoolMgr().release(turnFight) return def getTurnFight(self, guid): tf = None if guid in self.turnFightDict: tf = self.turnFightDict[guid] elif False: tf = TurnFight() return tf def GetTurnFightMgr(): tfMgr = None if PyGameData.g_turnFightMgr: tfMgr = PyGameData.g_turnFightMgr else: tfMgr = TurnFightMgr() PyGameData.g_turnFightMgr = tfMgr return tfMgr class MainFight(): ## Ö÷ÏßÕ½¶·¹ÜÀí def __init__(self, playerID): self.playerID = playerID self.chapterID = 0 # Õ½ÚID self.levelNum = 0 # ¹Ø¿¨±àºÅ self.waveMax = 6 # ±¾¹Ø×î´ó²¨Êý£¬Ã¿²¨Óжà¸öС¶Ó£¬Ã¿¸öС¶Ó¼´ÎªÒ»ÕÅÕ½¶· TurnFight self.wave = 0 # µ±Ç°Ë¢¹Ö²¨£¬×¢Òâ²»ÊÇÍæ¼Òµ±Ç°½ø¶È²¨£¬±ÈÈç±»»÷ɱ»á»ØÍËÒ»²¨ self.turnFight = GetTurnFightMgr().addTurnFight(ChConfig.Def_FBMapID_Main, 0, playerID) return def isLevelBoss(self): ## µ±Ç°Õ½¶·ÊÇ·ñ¹Ø¿¨boss return self.turnFight.mapID == ChConfig.Def_FBMapID_MainBoss def GetMainFightMgr(curPlayer): ## »ñÈ¡Ö÷ÏßÕ½¶·¹ÜÀí olPlayer = PlayerOnline.GetOnlineMgr().GetOnlinePlayer(curPlayer) return olPlayer.mainFight def OnPlayerLogin(curPlayer): chapterID, levelNum, _ = PlayerControl.GetMainLevelPassInfo(curPlayer) nowChapterID, _, _ = PlayerControl.GetMainLevelNowInfo(curPlayer) if chapterID != nowChapterID: if IpyGameDataPY.GetIpyGameDataNotLog("MainChapter", chapterID) and IpyGameDataPY.GetIpyGameDataNotLog("MainLevel", chapterID, levelNum): fixNowValue = PlayerControl.SetMainLevelNowInfo(curPlayer, chapterID, levelNum, 1) GameWorld.Log("µ±Ç°Ö÷Ï߹ؿ¨Õ½ÚÓë¹ý¹ØÕ½ڲ»Ò»ÖÂʱ£¬ÇÒ¹ý¹Ø½ø¶ÈÕ½ÚÒѾ­´æÔÚ£¬Ç¿ÖÆÐÞÕýµ±Ç°Ë¢¹Ö½ø¶ÈΪ¹ý¹ØÕ½ڽø¶È! passChapterID-LV=%s-%s,nowChapterID=%s,fixNowValue=%s" % (chapterID, levelNum, nowChapterID, fixNowValue), curPlayer.GetPlayerID()) return def GetPlayerLineupInfoByCache(playerID, lineupID): ## »ñÈ¡Íæ¼ÒÕóÈÝÐÅÏ¢ - ¸ù¾ÝÍæ¼Ò²é¿´»º´æ lineupInfo = {} return lineupInfo def GetPlayerLineupInfo(curPlayer, lineupID): ## »ñÈ¡Íæ¼ÒÕóÈÝÐÅÏ¢£¬¿ÉÓÃÓÚÕ½¶·»ò²é¿´»º´æ£¬ÒòΪ¿ÉÄÜÈ¡Íæ¼ÒµÄ»º´æ½øÐжÔÕ½£¬ËùÒÔͳһʹÓÃjson¸ñʽ£¬Ç°¶ËͨÓà # @param lineupID: ÕóÈÝID # @return: ÕóÈÝÈ«²¿ÐÅÏ¢json×ֵ䣬ǰ¶ËͨÓøñʽ playerID = curPlayer.GetPlayerID() lineup = PlayerOnline.GetOnlinePlayer(curPlayer).GetLineup(lineupID) if not lineup.lineupHeroDict: return {} lineupInfo = {"PlayerID":playerID, "FightPower":lineup.fightPower, "ShapeType":lineup.shapeType} heroDict = {} curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero) for posNum in lineup.lineupHeroDict.keys(): hero = lineup.GetLineupHero(posNum) heroID = hero.heroID itemIndex = hero.itemIndex userData = "" heroLV = 1 if itemIndex >= 0 and itemIndex < curPack.GetCount(): heroItem = curPack.GetAt(itemIndex) if heroItem and not heroItem.IsEmpty(): userData = heroItem.GetUserData() heroLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroLV) skillIDlist = [] skillIDlist += hero.heroSkillIDList heroDict[str(posNum)] = { "HeroID":heroID, "SkinID":hero.skinID, "LV":heroLV, "Data":userData, "FightPower":hero.fightPower, "AttrDict":{str(k):v for k, v in hero.heroBatAttrDict.items() if v > 0}, "SkillIDList":skillIDlist, } lineupInfo.update({"Hero":heroDict}) return lineupInfo def GetNPCLineupInfo(lineupID, strongerLV=0, difficulty=0): ## »ñÈ¡NPCÕóÈÝÐÅÏ¢ # @param lineupID: ÕóÈÝID # @param npcLV: ³É³¤NPCµÈ¼¶ # @param difficulty: ³É³¤NPCÄѶÈϵÊý # @return: ÕóÈÝÈ«²¿ÐÅÏ¢json×ֵ䣬ǰ¶ËͨÓøñʽ ipyData = IpyGameDataPY.GetIpyGameData("NPCLineup", lineupID) if not ipyData: return {} heroDict = {} for posNum in range(1, 1 + 10): if not hasattr(ipyData, "GetPosNPCID%s" % posNum): break npcID = getattr(ipyData, "GetPosNPCID%s" % posNum)() if not npcID: continue battleDict = GetNPCBattleDict(ipyData, npcID, strongerLV, difficulty) if not battleDict: continue heroDict[str(posNum)] = battleDict lineupInfo = {"NPCLineupID":lineupID, "Hero":heroDict} return lineupInfo def GetNPCBattleDict(lineupIpyData, npcID, strongerLV=0, difficulty=0): ## »ñÈ¡NPCÕ½¶·Ïà¹Ø×ֵ䣬֧³Ö³É³¤NPC # @param strongerLV: ³É³¤µÈ¼¶ # @param difficulty: ÄѶÈϵÊý npcData = NPCCommon.GetNPCDataPy(npcID) if not npcData: return heroID = npcData.GetRelatedHeroID() npcLV = npcData.GetLV() lvIpyData = None heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if heroID else None npcStronger = IpyGameDataPY.GetIpyGameDataNotLog("NPCStronger", npcID) if npcStronger and strongerLV: lvIpyData = IpyGameDataPY.GetIpyGameData("PlayerLV", strongerLV) if lvIpyData: npcLV = strongerLV if not lvIpyData: lvIpyData = IpyGameDataPY.GetIpyGameData("PlayerLV", npcLV) if heroIpyData and lvIpyData: skinIDList = heroIpyData.GetSkinIDList() skinID = skinIDList[0] if skinIDList else 0 skillIDList = GetNPCHeroSkillIDList(heroID, heroIpyData, lvIpyData.GetReHeroBreakLV(), lvIpyData.GetReHeroAwakeLV()) else: heroID = 0 skinID = 0 skillIDList = [] + npcData.GetSkillIDList() # boss¶îÍâËæ»ú¼¼ÄÜ bossID = lineupIpyData.GetBossID() if npcID == bossID: skillIDExList = lineupIpyData.GetSkillIDExList() if skillIDExList: randSkillIDExList = [] + list(skillIDExList) skillExCnt = lineupIpyData.GetSkillExCnt() if skillExCnt > 0 and len(randSkillIDExList) > skillExCnt: random.shuffle(randSkillIDExList) randSkillIDExList = randSkillIDExList[:skillExCnt] skillIDList += randSkillIDExList GameWorld.DebugLog("ÕóÈÝboss¼¼ÄÜ: %s, Ëæ»ú¸½¼Ó¼¼ÄÜ: %s" % (skillIDList, randSkillIDExList)) # ³É³¤¹ÖÊôÐÔ batAttrDict = GetNPCStrongerAttrDict(npcID, lvIpyData, npcStronger, difficulty) if not batAttrDict: batAttrDict = {ChConfig.AttrID_Atk:npcData.GetAtk(), ChConfig.AttrID_Def:npcData.GetDef(), ChConfig.AttrID_MaxHP:npcData.GetMaxHP(), ChConfig.AttrID_FinalDamPer:npcData.GetFinalDamPer(), ChConfig.AttrID_FinalDamPerDef:npcData.GetFinalDamPerDef(), ChConfig.AttrID_MissRate:npcData.GetMissRate(), ChConfig.AttrID_MissRateDef:npcData.GetMissRateDef(), ChConfig.AttrID_SuperHitRate:npcData.GetSuperHitRate(), ChConfig.AttrID_SuperHitRateDef:npcData.GetSuperHitRateDef(), ChConfig.AttrID_StunRate:npcData.GetStunRate(), ChConfig.AttrID_StunRateDef:npcData.GetStunRateDef(), ChConfig.AttrID_ComboRate:npcData.GetComboRate(), ChConfig.AttrID_ComboRateDef:npcData.GetComboRateDef(), ChConfig.AttrID_ParryRate:npcData.GetParryRate(), ChConfig.AttrID_ParryRateDef:npcData.GetParryRateDef(), ChConfig.AttrID_SuckHPPer:npcData.GetSuckHPPer(), ChConfig.AttrID_SuckHPPerDef:npcData.GetSuckHPPerDef(), } batAttrDict.update(npcData.GetSpecAttrInfo()) battleDict = {"NPCID":npcID, "HeroID":heroID, "SkinID":skinID, "LV":npcLV, "AttrDict":{str(k):v for k, v in batAttrDict.items() if v > 0}, "SkillIDList":skillIDList, } GameWorld.DebugLog("GetNPCBattleDict npcID=%s,strongerLV=%s,difficulty=%s,%s" % (npcID, strongerLV, difficulty, battleDict)) return battleDict def GetNPCHeroSkillIDList(heroID, heroIpyData, breakLV, awakeLV): ## »ñÈ¡NPC¶ÔÓ¦Î佫µÄ¼¼ÄÜIDÁбí normalSkillID = heroIpyData.GetNormalSkillID() angerSkillID = heroIpyData.GetAngerSkillID() skillIDList = [normalSkillID, angerSkillID] breakIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroBreak", heroID) if breakIpyDataList: for breakIpyData in breakIpyDataList: if breakIpyData.GetBreakLV() > breakLV: break skillID = breakIpyData.GetSkillID() if skillID: skillIDList.append(skillID) awakeIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroAwake", heroID) if awakeIpyDataList: for awakeIpyData in awakeIpyDataList: if awakeIpyData.GetAwakeLV() > awakeLV: break skillID = awakeIpyData.GetSkillID() if skillID: skillIDList.append(skillID) return skillIDList def GetNPCStrongerAttrDict(npcID, lvIpyData, npcStronger, difficulty): ## »ñÈ¡NPC³É³¤ÊôÐÔ # @param strongerLV: ³É³¤µÈ¼¶ # @param difficulty: ÄѶÈϵÊý batAttrDict = {} if not lvIpyData or not npcStronger or not difficulty: return batAttrDict lv = lvIpyData.GetLV() for attrID in ChConfig.CalcBattleAttrIDList: attrIpyData = IpyGameDataPY.GetIpyGameData("PlayerAttr", attrID) if not attrIpyData: continue attrName = attrIpyData.GetParameter() if not hasattr(lvIpyData, "GetRe%s" % attrName): continue reValue = getattr(lvIpyData, "GetRe%s" % attrName)() # »ù´¡²Î¿¼Öµ ratio = getattr(npcStronger, "Get%sRatio" % attrName)() if hasattr(npcStronger, "Get%sRatio" % attrName) else 1 # ÊôÐÔϵÊý attrValue = int(reValue * ratio * difficulty) batAttrDict[attrID] = attrValue #GameWorld.DebugLog(" attrID=%s,attrValue=%s,reValue=%s,ratio=%s,difficulty=%s" % (attrID, attrValue, reValue, ratio, difficulty)) GameWorld.DebugLog("NPC³É³¤ÊôÐÔ: npcID=%s,lv=%s,difficulty=%s,%s" % (npcID, lv, difficulty, batAttrDict)) return batAttrDict def SummonLineupObjs(batLineup, faction, num, lineupInfo, playerID=0): '''ÕÙ»½ÕóÈÝÕ½¶·ÊµÀý @param faction: ËùÊôÕóÓª£¬Ä¿Ç°Ö§³ÖÁ½¸öÕóÓª£¬1»ò2 @param num: Õ½¶·ÕóÈÝÔÚ¸ÃÕóÓªÉϵıàºÅ£¬1V1ʱĬÈÏ1£¬¶à¶Ô¶àʱ1~n @param lineupInfo: ÕóÈÝÐÅÏ¢ @param playerID: ·¢ÆðµÄÍæ¼ÒID£¬ÏµÍ³³¡´ÎΪ0 ''' GameWorld.DebugLog("SummonLineupObjs faction:%s,num:%s,lineupInfo=%s" % (faction, num, lineupInfo), playerID) if playerID: curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if not curPlayer: return tfGUID = batLineup.turnFight.guid lineupPlayerID = lineupInfo.get("PlayerID", 0) # ÕóÈÝËùÊôÍæ¼ÒID heroDict = lineupInfo.get("Hero", {}) batObjMgr = BattleObj.GetBatObjMgr() initXP = IpyGameDataPY.GetFuncCfg("AngerXP", 1) atkBackSkillIDList = IpyGameDataPY.GetFuncEvalCfg("ParryCfg", 2) for posNumKey, heroInfo in heroDict.items(): posNum = int(posNumKey) atkBackSkillID = 0 # ·´»÷¼¼ÄÜID fightPower = 0 skillIDList = [] # Õ½¶·¶ÔÏó¿ÉÄܸıäÊôÐÔ»ò¼¼ÄÜ£¬ÖØÐ´´½¨£¬·ÀÖ¹ÎóÐÞ¸ÄÀ´Ô´Öµ attrDict = {} skillIDList += heroInfo.get("SkillIDList", []) attrDict.update(heroInfo.get("AttrDict", {})) npcID = heroInfo.get("NPCID", 0) heroID = heroInfo.get("HeroID", 0) skinID = heroInfo.get("SkinID", 0) lv = heroInfo.get("LV", 1) heroIpyData = IpyGameDataPY.GetIpyGameData("Hero", heroID) if heroID else None if heroIpyData: atkDistType = heroIpyData.GetAtkDistType() objName = heroIpyData.GetName() country = heroIpyData.GetCountry() sex = heroIpyData.GetSex() if lineupPlayerID: fightPower = heroInfo.get("FightPower", 0) if not heroIpyData: continue else: npcDataEx = NPCCommon.GetNPCDataPy(npcID) if not npcDataEx: continue if not heroIpyData: atkDistType = npcDataEx.GetAtkDistType() objName = npcDataEx.GetNPCName() country = npcDataEx.GetCountry() sex = npcDataEx.GetSex() batObj = batObjMgr.addBatObj() if not batObj: break objID = batObj.GetID() if npcID: batObj.SetNPCID(npcID) elif lineupPlayerID: batObj.SetOwnerID(lineupPlayerID) batObj.SetTFGUID(tfGUID) batObj.SetName(objName) batObj.SetFaction(faction) batObj.SetLineupPos(posNum, num) batObj.SetFightPower(fightPower) batObj.SetLV(lv) batObj.SetAtkDistType(atkDistType) batObj.SetCountry(country) batObj.SetSex(sex) batObj.SetHero(heroID, skinID) if atkDistType == ChConfig.AtkDistType_Short: atkBackSkillID = atkBackSkillIDList[0] if len(atkBackSkillIDList) > 0 else 0 elif atkDistType == ChConfig.AtkDistType_Long: atkBackSkillID = atkBackSkillIDList[1] if len(atkBackSkillIDList) > 1 else 0 if atkBackSkillID: skillIDList.append(atkBackSkillID) skillManager = batObj.GetSkillManager() skillManager.SkillReset() for skillID in skillIDList: skillManager.LearnSkillByID(skillID) batLineup.posObjIDDict[posNum] = objID GameWorld.DebugLog("AddBatObj %s,skill=%s" % (GetObjName(batObj), skillManager.GetSkillIDList())) batObj.InitBatAttr({int(k):v for k, v in attrDict.items()}, initXP) return #// B4 10 »ØºÏÖÆÕ½¶· #tagCMTurnFight # #struct tagCMTurnFight #{ # tagHead Head; # DWORD MapID; // ×Ô¶¨ÒåµØÍ¼ID£¬¿ÉÓÃÓÚ°ó¶¨Õ½¶·µØÍ¼³¡¾°¹¦ÄÜ£¨ÈçÖ÷Ïßboss¡¢ÅÀËþ¡¢¾º¼¼³¡µÈ£© # DWORD FuncLineID; // MapID¶ÔÓ¦µÄÀ©Õ¹Öµ£¬Èç¾ßÌåij¸ö¹Ø¿¨µÈ # BYTE TagType; // Ä¿±êÀàÐÍ£¬0-NPCÕóÈÝ£¬1-Íæ¼Ò # DWORD TagID; // Ä¿±êÀàÐͶÔÓ¦µÄID£¬ÈçÍæ¼ÒID # BYTE ValueCount; # DWORD ValueList[ValueCount]; // ¸½¼ÓÖµÁÐ±í£¬¿ÉÑ¡£¬¾ßÌ庬ÒåÓÉMapID¾ö¶¨ #}; def OnTurnFight(index, clientData, tick): ''' ±¾Õ½¶·»áÒ»´ÎÐÔ´¦ÀíÍêËùÓÐС¶ÓÕ½¶·£¬ÒÔÕ½±¨µÄÐÎʽÏ·¢£¬Ä¿Ç°³ýÁËÖ÷ÏßС¹Ö·Ö¶ÎÕ½¶·Í⣬¾ùʹÓøÃÕ½¶· ''' curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) mapID = clientData.MapID funcLineID = clientData.FuncLineID tagType = clientData.TagType tagID = clientData.TagID valueList = clientData.ValueList GameWorld.DebugLog("»ØºÏÖÆÕ½¶·ÇëÇó: mapID=%s,funcLineID=%s,tagType=%s,tagID=%s,valueList=%s" % (mapID, funcLineID, tagType, tagID, valueList), curPlayer.GetPlayerID()) reqRet = FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList) if not reqRet: return # ¹¥·À·½ËùʹÓõÄÕóÈÝID atkLineupID, defLineupID = FBLogic.GetFBPlayerLineupID(curPlayer, mapID, funcLineID) if atkLineupID not in ShareDefine.LineupList or defLineupID not in ShareDefine.LineupList: return # Íæ¼Ò if tagType == 1: # OnTurnFightVSPlayer pass # NPC else: ret = FBLogic.GetFBNPCLineupInfo(curPlayer, mapID, funcLineID) if not ret: return npcLineupIDList, strongerLV, difficulty = ret OnTurnFightVSNPC(curPlayer, mapID, funcLineID, atkLineupID, npcLineupIDList, strongerLV, difficulty) return def OnTurnFightVSNPC(curPlayer, mapID, funcLineID, atkLineupID, npcLineupIDList, strongerLV, difficulty): playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("OnTurnFightVSNPC: mapID=%s,funcLineID=%s,atkLineupID=%s,npcLineupIDList=%s,strongerLV=%s,difficulty=%s" % (mapID, funcLineID, atkLineupID, npcLineupIDList, strongerLV, difficulty), playerID) if not npcLineupIDList: return lineupMainInfo = GetPlayerLineupInfo(curPlayer, atkLineupID) if not lineupMainInfo: GameWorld.DebugLog("Íæ¼ÒûÓиÃÕóÈÝÊý¾Ý! atkLineupID=%s" % atkLineupID, playerID) return turnMax = 15 if mapID == ChConfig.Def_FBMapID_MainBoss: turnMax = IpyGameDataPY.GetFuncCfg("Mainline", 3) # Í£Ö¹Ö÷ÏßС¹ÖÕ½¶·¡¢Çå¿Õ mainFightMgr = GetMainFightMgr(curPlayer) mainTF = mainFightMgr.turnFight if mainTF.isInFight(): mainTF.exitFight() tfMgr = GetTurnFightMgr() turnFight = tfMgr.addTurnFight(mapID, funcLineID, playerID) guid = turnFight.guid turnFight.setTurnFight(mapID, funcLineID, turnMax, True, lineupIDList=npcLineupIDList, strongerLV=strongerLV, difficulty=difficulty) turnFight.setFactionLineup(ChConfig.Def_FactionA, {1:lineupMainInfo}) for index, lineupID in enumerate(npcLineupIDList): turnFight.lineupIndex = index GameWorld.DebugLog("¶ÔÕ½NPCÕóÈÝ: index=%s, lineupID=%s" % (index, lineupID)) if index > 0: turnFight.nextTurnFight() turnFight.setFactionLineup(ChConfig.Def_FactionB, {1:GetNPCLineupInfo(lineupID, strongerLV, difficulty)}) turnFight.sortActionQueue() turnFight.startFight() __processTurnFight(turnFight.guid) if not turnFight.isWin: break SyncTurnFightReport(curPlayer, guid, turnFight.batBuffer) tfMgr.delTurnFight(guid) return #// B4 13 Ö÷ÏßÕ½¶·ÇëÇó #tagCSMainFightReq # #struct tagCSMainFightReq #{ # tagHead Head; # BYTE ReqType; // 0-Í£Ö¹Õ½¶·»Ø³Ç£»1-ÉèÖÃÏûºÄ±¶Öµ£»2-ÌôÕ½¹Ø¿¨Ð¡¹Ö£»4-¼ÌÐøÕ½¶·£» # DWORD ReqValue; // ÇëÇóÖµ£¬ReqTypeΪ1ʱ·¢ËÍÏûºÄ±¶Öµ #}; def OnMainFightReq(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) reqType = clientData.ReqType reqValue = clientData.ReqValue if reqType == 0: __doExitMainFight(curPlayer) return elif reqType == 1: __doSetFightPoint(curPlayer, reqValue) return GameWorld.DebugLog("Ö÷ÏßÕ½¶·ÇëÇó: reqType=%s" % reqType, curPlayer.GetPlayerID()) clientPack = ChPyNetSendPack.tagSCTurnFightReportSign() clientPack.Sign = 0 NetPackCommon.SendFakePack(curPlayer, clientPack) # ±ê¼Ç¿ªÊ¼ if reqType == 2: # ǰ¶ËÖ÷¶¯ÇëÇó¿ªÊ¼¹Ø¿¨Ð¡¹ÖµÄÊÓΪ´ÓÐÝÏ¢ÖпªÊ¼ __doMainLevelWave(curPlayer, True) elif reqType == 4: __doMainFight(curPlayer, tick) else: pass # ±ê¼Ç½áÊø clientPack.Sign = 1 NetPackCommon.SendFakePack(curPlayer, clientPack) return def __doExitMainFight(curPlayer): ## Ö÷ÏßÍ˳öÕ½¶· - »Ø³ÇÐÝÏ¢ mainFightMgr = GetMainFightMgr(curPlayer) turnFight = mainFightMgr.turnFight if turnFight: turnFight.exitFight(True) return def __doSetFightPoint(curPlayer, fightPoint): ## ÉèÖÃÏûºÄ±¶Öµ GameWorld.DebugLog("ÉèÖÃÕ½´¸ÏûºÄ±¶Öµ: %s" % fightPoint) if fightPoint == 1: pass elif fightPoint == 2: # Ìõ¼þÑéÖ¤ pass elif fightPoint == 3: # Ìõ¼þÑéÖ¤ pass else: return curPlayer.SetFightPoint(fightPoint) return def __doMainLevelWave(curPlayer, isRestStart=False): ## ¿ªÊ¼ÐµĹؿ¨²¨ # @param isRestStart: ÊÇ·ñ´ÓÐÝÏ¢×´Ì¬ÖØÐ¿ªÊ¼µÄ playerID = curPlayer.GetPlayerID() chapterID, levelNum, wave = PlayerControl.GetMainLevelNowInfo(curPlayer) GameWorld.DebugLog("ÇëÇó¹Ø¿¨²¨Õ½¶·: chapterID=%s,levelNum=%s,wave=%s,isRestStart=%s" % (chapterID, levelNum, wave, isRestStart), playerID) fightPoint = max(curPlayer.GetFightPoint(), 1) if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao, fightPoint): GameWorld.DebugLog("Õ½´¸²»×㣬ÎÞ·¨¿ªÊ¼!") return chapterIpyData = IpyGameDataPY.GetIpyGameData("MainChapter", chapterID) if not chapterIpyData: return levelIpyData = IpyGameDataPY.GetIpyGameData("MainLevel", chapterID, levelNum) if not levelIpyData: # ÈçÉÏÏߺó¼õÉÙij¸öÕ½ڹؿ¨ÊýµÄÇé¿ö£¬µ¼ÖÂÕÒ²»µ½£¬Ôò´Ó¸ÃÕ½ڻØÍ˵½´æÔڵĹؿ¨¿ªÊ¼ while levelNum > 1: levelNum -= 1 levelIpyData = IpyGameDataPY.GetIpyGameDataNotLog("MainLevel", chapterID, levelNum) if levelIpyData: break if not levelIpyData: return # ±¾¹Ø¿¨×î´ó²¨Êý£¬ÔÝʱ֧³Ö×î´ó6²¨ waveMax = 6 while waveMax >= 1 and (not hasattr(levelIpyData, "GetWaveLineupIDList%s" % waveMax) or not getattr(levelIpyData, "GetWaveLineupIDList%s" % waveMax)()): waveMax -= 1 if waveMax < 1: return if wave > waveMax: wave = waveMax lineupIDList = getattr(levelIpyData, "GetWaveLineupIDList%s" % wave)() # С¶Ó1ÕóÈÝID|С¶Ó2ÕóÈÝID|... if not lineupIDList: return lineupID = lineupIDList[0] # NPCÕóÈÝID lineupMainInfo = GetPlayerLineupInfo(curPlayer, ShareDefine.Lineup_Main) if not lineupMainInfo: GameWorld.DebugLog("ûÓÐÉèÖÃÖ÷ÕóÈÝ!", playerID) return strongerLV = levelIpyData.GetNPCLV() difficulty = levelIpyData.GetDifficulty() mainFightMgr = GetMainFightMgr(curPlayer) mainFightMgr.chapterID = chapterID mainFightMgr.levelNum = levelNum mainFightMgr.waveMax = waveMax mainFightMgr.wave = wave turnMax = IpyGameDataPY.GetFuncCfg("Mainline", 2) mapID, funcLineID = ChConfig.Def_FBMapID_Main, PlayerControl.ComMainLevelValue(chapterID, levelNum, wave) GameWorld.DebugLog("ÉèÖÃÆðʼ¹Ø¿¨²¨: ¹Ø¿¨%s-%s,²¨=%s/%s,lineupIDList=%s,mapID=%s,funcLineID=%s,lineupID=%s,strongerLV=%s,difficulty=%s" % (chapterID, levelNum, wave, waveMax, lineupIDList, mapID, funcLineID, lineupID, strongerLV, difficulty), playerID) turnFight = mainFightMgr.turnFight turnFight.setTurnFight(mapID, funcLineID, turnMax, False, lineupIDList=lineupIDList, strongerLV=strongerLV, difficulty=difficulty) turnFight.setFactionLineup(ChConfig.Def_FactionA, {1:lineupMainInfo}) turnFight.setFactionLineup(ChConfig.Def_FactionB, {1:GetNPCLineupInfo(lineupID, strongerLV, difficulty)}) turnFight.sortActionQueue() turnFight.startFight() __doMainFight(curPlayer) return def __doMainFight(curPlayer, tick=0): '''Ö´ÐÐÖ÷ÏßÕ½¶·£¬µ¥³¡Õ½¶·¶Ïµçʽս¶·£¬ÒÔǰ¶ËÍæ¼ÒÊÖ¶¯µã»÷½Úµã×öΪ¶Ïµã´¦ ÿ³¡Õ½¶·µÄ³õʼ»¯¡¢½áÊøÄ¬È϶ϵ㣬ÓÉǰ¶Ë¾ö¶¨×Ô¶¯¼ÌÐø»òÕßµã»÷¼ÌÐø ''' # ÏÞÖÆÇëÇóCD if tick: key = "MainFightReqTick" lastTick = curPlayer.GetDictByKey(key) if lastTick and tick - lastTick <= 1000: GameWorld.DebugLog("Ö÷ÏßÕ½¶·ÇëÇóCDÖÐ") return curPlayer.SetDict(key, tick) mainFightMgr = GetMainFightMgr(curPlayer) turnFight = mainFightMgr.turnFight isLevelBoss = mainFightMgr.isLevelBoss() if isLevelBoss: ## ¹Ø¿¨bossÊÇÒ»´ÎÐÔ´¦ÀíÍêµÄ£¬Ò»°ã²»¿ÉÄÜ×ßµ½ÕâÀÕâ±ß×öÏ·À·¶ return winFaction = turnFight.winFaction if winFaction: nextLineupID = turnFight.nextLineupID() if nextLineupID: GameWorld.DebugLog("---¿ªÊ¼½øÈëÏÂһС¶Ó: lineupIndex=%s,nextLineupID=%s,%s" % (turnFight.lineupIndex, nextLineupID, turnFight.npcLineupIDList)) turnFight.nextTurnFight() # Çл»Ð¡¶Óʱ£¬Íæ¼ÒÕóÈݲ»ÐèÒª´¦Àí£¬±£Áô״̬ turnFight.setFactionLineup(ChConfig.Def_FactionB, {1:GetNPCLineupInfo(nextLineupID, turnFight.strongerLV, turnFight.difficulty)}) turnFight.sortActionQueue() turnFight.startFight() __doMainFight(curPlayer) else: __doMainLevelWave(curPlayer, False) return # С¹ÖÕ½¶·£¬Ã¿´ÎÏûºÄ1¸öÕ½´¸ fightPoint = max(curPlayer.GetFightPoint(), 1) # Ö÷ÏßÕ½¶·ÏûºÄ±¶Öµ£¬Ä¬ÈÏ1 if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao, fightPoint): GameWorld.DebugLog("»ØºÏ¿ªÊ¼Ê±Õ½´¸²»×ã!") return # ÒÔϾùÊÇ´¦Àí¹Ø¿¨Ð¡¹Ö·Ö¶Îʵʱս¶· isEntry = EntryLogic(turnFight) # ÊÇ·ñ¿ªÊ¼¼ì²é¶Ïµã£¬Ô¤Åпɶϵĵ㣬·½±ãǰ¶Ëµã»÷ÌåÑ飬µãÏÂÈ¥¾ÍÊÇÍæ¼Ò·ÅµÄij¸öÐж¯ # ³õʼ¿ªÊ¼½ø³¡ºó£¬Ä¬ÈÏ¿ªÊ¼¶Ïµã checkBreakpoint = True if isEntry else False batObjMgr = BattleObj.GetBatObjMgr() turnNum = turnFight.turnNum turnMax = turnFight.turnMax for turnNum in range(turnNum, turnMax + 1): turnTimeline = turnFight.getTurnNumStartTimelin(turnNum) # ±¾»ØºÏÆðʼʱ¼ä½Úµã curTimeline = turnFight.getTimeline() # »ØºÏ¿ªÊ¼ turnTimeline += 1 # ÿ»ØºÏ¿ªÊ¼ËãÒ»¸öʱ¼ä½Úµã if curTimeline < turnTimeline: curTimeline = turnFight.setTimeline(turnTimeline) GameWorld.DebugLog("¡¾----- »ØºÏÖÆÕ½¶·ÂÖ´Î: %s -----¡¿ curTimeline=%s" % (turnNum, curTimeline)) turnFight.turnNum = turnNum if curPlayer: turnFight.syncState(FightState_Fighting) for faction, num in turnFight.actionSortList: GameWorld.DebugLog("»ØºÏ¿ªÊ¼Âß¼­: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num)) batFaction = turnFight.getBatFaction(faction) batLineup = batFaction.getBatlineup(num) batLineup.actionNum = 1 for objID in batLineup.posObjIDDict.values(): batObj = batObjMgr.getBatObj(objID) TurnFightPerTurnBigStart(turnFight, batObj, turnNum) # ºìÑÕ # ÁéÊÞ if turnFight.checkOverByKilled(): break # Î佫 doMax = PosNumMax * len(turnFight.actionSortList) doCnt = 0 while doCnt < doMax and turnFight.actionIndex < len(turnFight.actionSortList): doCnt += 1 faction, num = turnFight.actionSortList[turnFight.actionIndex] batFaction = turnFight.getBatFaction(faction) batLineup = batFaction.getBatlineup(num) for posNum in range(batLineup.actionNum, PosNumMax + 1): # ÿ¸öÎ佫λËãÒ»¸öʱ¼ä½Úµã #GameWorld.DebugLog("Î佫½Úµã: faction=%s,posNum=%s,curTimeline=%s" % (faction, posNum, curTimeline)) if posNum not in batLineup.posObjIDDict: batLineup.actionNum = posNum + 1 curTimeline = turnFight.setTimeline(curTimeline + 1, True) #GameWorld.DebugLog("¿Õλ½Úµã: faction=%s,posNum=%s,curTimeline=%s" % (faction, posNum, curTimeline)) continue objID = batLineup.posObjIDDict[posNum] batObj = batObjMgr.getBatObj(objID) # Íæ¼Ò×Ô¼ºÕóÓª£¬Ô¤ÅпɷñÐж¯ if checkBreakpoint and faction == ChConfig.Def_FactionA and batObj: if batObj.CanAction(): GameWorld.DebugLog("Íæ¼ÒÕóÈÝÏÂÒ»¸ö¿ÉÐж¯µÄÎ佫£¬¶Ïµã: curTimeline=%s,nextPosNum=%s" % (curTimeline, posNum)) return batLineup.actionNum = posNum + 1 curTimeline = turnFight.setTimeline(curTimeline + 1) TurnFightHeroTurnStart(turnFight, batObj, turnNum) if not OnObjAction(turnFight, batObj): continue if not checkBreakpoint and faction == ChConfig.Def_FactionA: checkBreakpoint = True break if turnFight.actionIndex >= len(turnFight.actionSortList) - 1: turnFight.actionIndex = 0 else: turnFight.actionIndex += 1 # »ØºÏ½áÊø curTimeline = turnFight.setTimeline(curTimeline + 1) # ÿ»ØºÏ½áÊøËãÒ»¸öʱ¼ä½Úµã for faction, num in turnFight.actionSortList: GameWorld.DebugLog("»ØºÏ½áÊøÂß¼­: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num)) batFaction = turnFight.getBatFaction(faction) batLineup = batFaction.getBatlineup(num) for objID in batLineup.posObjIDDict.values(): batObj = batObjMgr.getBatObj(objID) TurnFightPerTurnBigEnd(turnFight, batObj, turnNum) if turnFight.checkOverByKilled(): break if not turnFight.winFaction: OnTurnAllOver(turnFight.guid) return def __processTurnFight(guid): ## Ò»´ÎÐÔ´¦ÀíÍêÒ»¸öС¶ÓµÄÕ½¶· turnFight = GetTurnFightMgr().getTurnFight(guid) curPlayer = turnFight.curPlayer turnMax = turnFight.turnMax EntryLogic(turnFight) batObjMgr = BattleObj.GetBatObjMgr() for turnNum in range(1, turnMax + 1): turnFight.turnNum = turnNum GameWorld.DebugLog("¡¾----- »ØºÏÖÆÕ½¶·ÂÖ´Î: %s -----¡¿" % turnNum) curTimeline = turnFight.getTurnNumStartTimelin(turnNum) # ±¾»ØºÏÆðʼʱ¼ä½Úµã curTimeline = turnFight.setTimeline(curTimeline + 1) if curPlayer: turnFight.syncState(FightState_Fighting) # »ØºÏ¿ªÊ¼ for faction, num in turnFight.actionSortList: GameWorld.DebugLog("»ØºÏ¿ªÊ¼Âß¼­: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num)) batFaction = turnFight.getBatFaction(faction) batLineup = batFaction.getBatlineup(num) batLineup.actionNum = 1 for objID in batLineup.posObjIDDict.values(): batObj = batObjMgr.getBatObj(objID) TurnFightPerTurnBigStart(turnFight, batObj, turnNum) # ºìÑÕ # ÁéÊÞ if turnFight.checkOverByKilled(): break # Î佫 doMax = PosNumMax * len(turnFight.actionSortList) doCnt = 0 while doCnt < doMax and turnFight.actionIndex < len(turnFight.actionSortList): doCnt += 1 faction, num = turnFight.actionSortList[turnFight.actionIndex] batFaction = turnFight.getBatFaction(faction) batLineup = batFaction.getBatlineup(num) for posNum in range(batLineup.actionNum, PosNumMax + 1): batLineup.actionNum = posNum + 1 if posNum not in batLineup.posObjIDDict: curTimeline = turnFight.setTimeline(curTimeline + 1, True) continue curTimeline = turnFight.setTimeline(curTimeline + 1) # ÿ¸öÎ佫λËãÒ»¸öʱ¼ä½Úµã objID = batLineup.posObjIDDict[posNum] batObj = batObjMgr.getBatObj(objID) TurnFightHeroTurnStart(turnFight, batObj, turnNum) if not OnObjAction(turnFight, batObj): continue break if turnFight.actionIndex >= len(turnFight.actionSortList) - 1: turnFight.actionIndex = 0 else: turnFight.actionIndex += 1 # »ØºÏ½áÊø curTimeline = turnFight.setTimeline(curTimeline + 1) # ÿ»ØºÏ½áÊøËãÒ»¸öʱ¼ä½Úµã for faction, num in turnFight.actionSortList: GameWorld.DebugLog("»ØºÏ½áÊøÂß¼­: turnNum=%s,faction=%s, num=%s" % (turnNum, faction, num)) batFaction = turnFight.getBatFaction(faction) batLineup = batFaction.getBatlineup(num) for objID in batLineup.posObjIDDict.values(): batObj = batObjMgr.getBatObj(objID) TurnFightPerTurnBigEnd(turnFight, batObj, turnNum) if turnFight.checkOverByKilled(): break if not turnFight.winFaction: OnTurnAllOver(turnFight.guid) return def GetObjName(batObj): faction = batObj.faction num = batObj.lineupNum posNum = batObj.posNum heroID = batObj.heroID npcID = batObj.npcID objName = GameWorld.CodeToGbk(batObj.GetName()) if heroID: objName += " Hero:%s" % heroID if npcID: objName += " NPC:%s" % npcID return "%s%s-P%s ID:%s %s" % ("A" if faction == ChConfig.Def_FactionA else "B", num, posNum, batObj.GetID(), objName) def EntryLogic(turnFight): ## Ö´Ðнø³¡Âß¼­ if turnFight.enterLogic: return GameWorld.DebugLog("Ö´Ðнø³¡Âß¼­...") batObjMgr = BattleObj.GetBatObjMgr() for faction, num in turnFight.actionSortList: batFaction = turnFight.getBatFaction(faction) batLineup = batFaction.getBatlineup(num) batLineup.actionNum = ActionNumStart for objID in batLineup.posObjIDDict.values(): batObj = batObjMgr.getBatObj(objID) TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_FightStart) turnFight.enterLogic = True return True def OnTimelineChange(turnFight): ## ÿ¸öʱ¼ä½Úµã±ä»¯Ê±´¦Àí nowTimeline = turnFight.getTimeline() batObjMgr = BattleObj.GetBatObjMgr() for batFaction in turnFight.factionDict.values(): for batLineup in batFaction.lineupDict.values(): for objID in batLineup.posObjIDDict.values(): batObj = batObjMgr.getBatObj(objID) #GameWorld.DebugLog("OnTimelineChange! objID=%s" % (objID)) if not batObj or not batObj.IsAlive(): continue batObj.SetDict(ChConfig.Def_Obj_Dict_TurnComboNum, 0) batObj.SetDict(ChConfig.Def_Obj_Dict_TurnMissNum, 0) batObj.SetDict(ChConfig.Def_Obj_Dict_TurnParryNum, 0) curID = batObj.GetID() skillManager = batObj.GetSkillManager() for index in range(0, skillManager.GetSkillCount()): curSkill = skillManager.GetSkillByIndex(index) if not curSkill: continue remainTime = curSkill.GetRemainTime() if not remainTime: continue calcTimeline = curSkill.GetCalcTime() passTurn = __calcPassturn(calcTimeline, nowTimeline, True) if passTurn <= 0: continue skillID = curSkill.GetSkillID() updRemainTime = max(0, remainTime - passTurn) curSkill.SetRemainTime(updRemainTime) curSkill.SetCalcTime(nowTimeline) GameWorld.DebugLog("¸üм¼ÄÜÊ£Óà»ØºÏÊý: curID=%s,skillID=%s,updRemainTime=%s,calcTimeline=%s,passTurn=%s" % (curID, skillID, updRemainTime, calcTimeline, passTurn)) buffMgr = batObj.GetBuffManager() for index in range(buffMgr.GetBuffCount())[::-1]: buff = buffMgr.GetBuffByIndex(index) buffID = buff.GetBuffID() skillID = buff.GetSkillID() skillData = buff.GetSkillData() if skillData.GetSkillType() in ChConfig.Def_LstBuff_List: #GameWorld.DebugLog(" ³ÖÐøÀàbuffÓÉ´¥·¢Ê±»ú¾ö¶¨Ê£Óàʱ¼ä! curID=%s,index=%s,skillID=%s,buffID=%s" % (curID, index, skillID, buffID)) continue remainTime = buff.GetRemainTime() if not remainTime: # ÓÀ¾Ãbuff²»´¦Àí #GameWorld.DebugLog(" ÓÀ¾Ãbuff²»´¦Àí! curID=%s,index=%s,skillID=%s" % (curID, index, skillID)) continue calcTimeline = buff.GetCalcTime() passTurn = __calcPassturn(calcTimeline, nowTimeline, False) if passTurn <= 0: #GameWorld.DebugLog(" passTurn <= 0 passTurn=%s,calcTimeline=%s,nowTimeline=%s,skillID=%s" % (passTurn, calcTimeline, nowTimeline, skillID)) continue updRemainTime = max(0, remainTime - passTurn) GameWorld.DebugLog("¸üÐÂbuffÊ£Óà»ØºÏÊý: curID=%s,buffID=%s,skillID=%s,updRemainTime=%s,calcTimeline=%s,passTurn=%s" % (curID, buffID, skillID, updRemainTime, calcTimeline, passTurn)) if updRemainTime > 0: buff.SetRemainTime(updRemainTime) buff.SetCalcTime(nowTimeline) TurnBuff.SyncBuffRefresh(turnFight, batObj, buff) else: TurnBuff.DoBuffDel(turnFight, batObj, buff) return def __calcPassturn(calcTimeline, nowTimeline, equalOK): ## ¼ÆËãÒѾ­¹ýÁ˵ĻغÏÊý # @param equalOK: ʱ¼ä½ÚµãÏàͬʱÊÇ·ñËã1»ØºÏ£¬Ò»°ã¼¼ÄÜ¿ÉÒÔË㣬buff²»Ëã calcTurnNum = calcTimeline / TimelineSet calcTimeNode = calcTimeline % TimelineSet nowTurnNum = nowTimeline / TimelineSet nowTimeNode = nowTimeline % TimelineSet if equalOK: if nowTimeNode >= calcTimeNode: return max(0, nowTurnNum - calcTurnNum) return max(0, nowTurnNum - calcTurnNum - 1) else: if nowTimeNode > calcTimeNode: return max(0, nowTurnNum - calcTurnNum) return max(0, nowTurnNum - calcTurnNum - 1) return 0 def TurnFightPerTurnBigStart(turnFight, batObj, turnNum): ## ´ó»ØºÏ¿ªÊ¼Ê± if not batObj: return if batObj.GetHP() <= 0: return TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnStart) return def TurnFightPerTurnBigEnd(turnFight, batObj, turnNum): ## ´ó»ØºÏ½áÊøÊ± if not batObj: return if batObj.GetHP() <= 0: return TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_BigTurnEnd) return def TurnFightHeroTurnStart(turnFight, batObj, turnNum): ## Î佫»ØºÏ¿ªÊ¼Ê±£¬²»ÄÜÐж¯Ò²Òª´¥·¢ if not batObj: return if batObj.GetHP() <= 0: return TurnPassive.OnTriggerPassiveEffect(turnFight, batObj, ChConfig.TriggerWay_HeroTurnStart) return def AddTurnObjCureHP(curObj, srcObj, addValue, cureHP, skillID=0): ## »ØºÏ¶ÔÏóÌí¼ÓÖÎÁÆÖµ # @param curObj: »ñµÃÖÎÁƵĶÔÏó # @param srcObj: À´×ÔË­µÄÖÎÁÆ # @param addValue: ÖÎÁÆÖµ # @param cureHP: ʵ¼Ê»ØÑªÁ¿ if not srcObj: return curID = curObj.GetID() srcID = srcObj.GetID() updStatValue = srcObj.StatCureValue(cureHP) GameWorld.DebugLog(" ͳ¼ÆÖÎÁÆ: curID=%s,srcID=%s,skillID=%s,addValue=%s,cureHP=%s,updStatValue=%s" % (curID, srcID, skillID, addValue, cureHP, updStatValue)) return def AddTurnObjHurtValue(curBatObj, tagBatObj, hurtValue, lostHP, skillID=0, isBounce=False): ## »ØºÏ¶ÔÏóÌí¼ÓÉ˺¦Öµ # @param isBounce: ÊÇ·ñ·´µ¯É˺¦ if hurtValue <= 0: return curID = curBatObj.GetID() tagID = tagBatObj.GetID() if curID != tagID: updStatValue = curBatObj.StatHurtValue(hurtValue) GameWorld.DebugLog(" ͳ¼ÆÉËѪ: curID=%s,tagID=%s,skillID=%s,hurtValue=%s,lostHP=%s,updStatValue=%s,tagHP=%s,isBounce=%s" % (curID, tagID, skillID, hurtValue, lostHP, updStatValue, tagBatObj.GetHP(), isBounce)) if tagBatObj: updStatValue = tagBatObj.StatDefValue(hurtValue) GameWorld.DebugLog(" ͳ¼Æ³ÐÉË: curID=%s,tagID=%s,skillID=%s,hurtValue=%s,lostHP=%s,updStatValue=%s,curHP=%s,isBounce=%s" % (tagID, curID, skillID, hurtValue, lostHP, updStatValue, tagBatObj.GetHP(), isBounce)) else: # È绻ѪÀ༼ÄÜ£¬×ԲеÄÉ˺¦²»ËãÊä³ö GameWorld.DebugLog(" ×Ô²Ð: curID=%s,tagID=%s,skillID=%s,hurtValue=%s,lostHP=%s,curHP=%s" % (curID, tagID, skillID, hurtValue, lostHP, curBatObj.GetHP())) return def OnObjAction(turnFight, curBatObj): ## Õ½¶·µ¥Î»Ðж¯ if not curBatObj: return curHP = curBatObj.GetHP() objID = curBatObj.GetID() if curHP <= 0: return turnNum = turnFight.turnNum objName = GetObjName(curBatObj) # ÊÇ·ñ¿ÉÐж¯×´Ì¬ÅÐ¶Ï canAction = curBatObj.CanAction() if not canAction: GameWorld.DebugLog("¡ï»ØºÏ%s %s µ±Ç°×´Ì¬²»¿ÉÐж¯!" % (turnNum, objName)) return atk = curBatObj.GetAtk() curXP = curBatObj.GetXP() GameWorld.DebugLog("¡ï»ØºÏ%s %s Ðж¯ : atk=%s,curHP=%s/%s,curXP=%s" % (turnNum, objName, atk, curHP, curBatObj.GetMaxHP(), curXP)) turnFight.syncObjAction(turnNum, objID) TurnPassive.OnTriggerPassiveEffect(turnFight, curBatObj, ChConfig.TriggerWay_HeroActionStart) xpMax = IpyGameDataPY.GetFuncCfg("AngerXP", 2) skillManager = curBatObj.GetSkillManager() useSkillList = [] #GameWorld.DebugLog('skillCount=%s' % skillManager.GetSkillCount(), npcID) for index in range(0, skillManager.GetSkillCount()): useSkill = skillManager.GetSkillByIndex(index) if not useSkill: continue if useSkill.GetFuncType() not in [ChConfig.Def_SkillFuncType_TurnNormaSkill, ChConfig.Def_SkillFuncType_AngerSkill]: #Ö»ÄÜÖ÷¶¯ÊÍ·ÅÆÕ¹¥»òÅ­¼¼ continue #±»¶¯¼¼ÄÜÎÞ·¨Ê¹Óà if SkillCommon.isPassiveSkill(useSkill): continue #»¹ÔÚÀäȴʱ¼äÄÚÎÞ·¨ÊÍ·Å if useSkill.GetRemainTime(): continue skillID = useSkill.GetSkillID() # ³£¹æ¹¥»÷ÓÅÏÈxp if SkillCommon.isAngerSkill(useSkill): if curXP < xpMax: continue if curBatObj.IsInState(ChConfig.BatObjState_Sneer): GameWorld.DebugLog("³°·í״̬Ï£¬ÎÞ·¨Ö÷¶¯ÊÍ·ÅÅ­¼¼!") # ¿É±»¶¯ÊÍ·ÅÅ­¼¼£¬ÈçÅ­¼¼×·»÷ continue useCnt = -1 # xp¼¼ÄÜÓÅÏÈÊÍ·Å else: useCnt = curBatObj.GetSkillUseCnt(skillID) useSkillList.append([useCnt, skillID, useSkill]) useSkillList.sort() # °´Ê¹ÓôÎÊýÓÅÏÈÉýÐòÅÅ£¬Ê¹ÓôÎÊýµÍµÄÓÅÏÈÅжÏʹÓà #GameWorld.DebugLog(' ¼¼ÄÜʹÓÃ˳Ðò = useSkillList%s' % str(useSkillList), npcID) for useInfo in useSkillList: useSkill = useInfo[-1] if TurnSkill.OnUseSkill(turnFight, curBatObj, useSkill): break TurnPassive.OnTriggerPassiveEffect(turnFight, curBatObj, ChConfig.TriggerWay_HeroActionEnd) return True def SetObjKilled(turnFight, gameObj, killer=None, useSkill=None): objID = gameObj.GetID() killerObjID = killer.GetID() if killer else 0 skillID = useSkill.GetSkillID() if useSkill else 0 GameWorld.DebugLog(" %s »ØºÏÕ½¶·Ö÷Ìå±»»÷ɱ: curID=%s,killerObjID=%s,skillID=%s" % (GetObjName(gameObj), objID, killerObjID, skillID)) gameObj.SetDead() clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagMCTurnFightObjDead) clientPack.ObjID = objID clientPack.KillerObjID = killerObjID clientPack.SkillID = skillID turnFight.addBatPack(clientPack) curPlayer = turnFight.curPlayer # ÔÝʱֻËãÖ÷ÏßС¹Ö if curPlayer and turnFight.mapID == ChConfig.Def_FBMapID_Main and gameObj.GetFaction() != ChConfig.Def_FactionA: PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_KillNPC, 1) return True def OnTurnAllOver(guid): ## ËùÓлغÏÒѾ­È«²¿Ö´ÐÐÍê±Ï GameWorld.DebugLog("ËùÓлغϽáÊø") turnFight = GetTurnFightMgr().getTurnFight(guid) if not turnFight: return if turnFight.winFaction: return if turnFight.playerID: # Íæ¼Ò·¢ÆðµÄ£¬Î´»÷ɱ¶Ô·½£¬ËãÍæ¼ÒÊä turnFight.winFaction = ChConfig.Def_FactionB else: # ϵͳ³¡´Î£¬°´Ò»¶¨¹æÔòÀ´£¬ÕâÀïÏÈËæ»ú turnFight.winFaction = random.choice([ChConfig.Def_FactionA, ChConfig.Def_FactionB]) DoTurnFightOver(guid) return def DoTurnFightOver(guid): ## Ö´ÐлغÏÕ½¶·½áËãÂß¼­ tfMgr = GetTurnFightMgr() turnFight = tfMgr.getTurnFight(guid) if not turnFight: return turnFight.costTime = time.time() - turnFight.startTime winFaction = turnFight.winFaction turnFight.isWin = (winFaction == ChConfig.Def_FactionA) GameWorld.DebugLog("--- Õ½¶·½áÊø´¦Àí ---, winFaction=%s, costTime=%ss, %s" % (winFaction, turnFight.costTime, guid)) # ͳ¼ÆÃ÷ϸ batObjMgr = BattleObj.GetBatObjMgr() statInfo = {} for faction in turnFight.factionDict.keys(): if str(faction) not in statInfo: statInfo[str(faction)] = {} facStatInfo = statInfo[str(faction)] batFaction = turnFight.getBatFaction(faction) for num in batFaction.lineupDict.keys(): if str(num) not in facStatInfo: facStatInfo[str(num)] = {} lineupStatInfo = facStatInfo[str(num)] batLineup = batFaction.getBatlineup(num) GameWorld.DebugLog("ÕóÈÝÃ÷ϸ: faction=%s,num=%s" % (faction, num)) for posNum, objID in batLineup.posObjIDDict.items(): batObj = batObjMgr.getBatObj(objID) if not batObj: continue objID = batObj.GetID() npcID = batObj.GetNPCID() heroID = batObj.GetHeroID() atkHurt = batObj.hurtStat defHurt = batObj.defStat cureHP = batObj.cureStat GameWorld.DebugLog(" Pos:%s ID=%s,npcID=%s,heroID=%s,HP=%s/%s, Êä³ö=%s,³ÐÉË=%s,ÖÎÁÆ=%s" % (posNum, objID, npcID, heroID, batObj.GetHP(), batObj.GetMaxHP(), atkHurt, defHurt, cureHP)) lineupStatInfo[str(posNum)] = {"ObjID":objID, "HeroID":heroID, "NPCID":npcID, "AtkHurt":atkHurt, "DefHurt":defHurt, "CureHP":cureHP} overMsg = {"winFaction":winFaction, "statInfo":statInfo} curPlayer = turnFight.curPlayer mapID = turnFight.mapID funcLineID = turnFight.funcLineID FBLogic.OnTurnFightOver(curPlayer, turnFight, mapID, funcLineID, overMsg) turnFight.syncState(FightState_Award, overMsg) return #// B4 14 ²é¿´Õ½±¨ #tagCSTurnFightReportView # #struct tagCSTurnFightReportView #{ # tagHead Head; # char GUID[40]; //Õ½±¨guid #}; def OnTurnFightReportView(index, clientData, tick): # ͨ¹ý²éÕÒÒÑ´æÔÚµÄÕ½±¨ #SyncTurnFightReport(curPlayer, guid, reprot) return def SyncTurnFightReport(curPlayer, guid, reprot): ## ֪ͨÍêÕûÕ½±¨ clientPack = ChPyNetSendPack.tagSCTurnFightReport() clientPack.GUID = guid clientPack.Report = reprot clientPack.Len = len(clientPack.Report) NetPackCommon.SendFakePack(curPlayer, clientPack) return