# -*- coding: GBK -*-  
 | 
# ÓÃÓÚ¹ÜÀíËùÓлúÆ÷ÈË  
 | 
# author: Alee  
 | 
# Date: 2011.9.1  
 | 
# history:  2011.9.1     Created  
 | 
  
 | 
import logging  
 | 
from ProjectBinding.ProjectRobot import ProjectRobot  
 | 
import ConfigurationReader.RobotsConfigReader  
 | 
import ConfigurationReader.ConfigIniReader   
 | 
from threading import Thread  
 | 
import traceback  
 | 
  
 | 
import time  
 | 
  
 | 
class AIThread(Thread):  
 | 
    def __init__(self, robotMgr, index):  
 | 
        Thread.__init__(self, None, None, "AIThreadPy_%s"%index)  
 | 
        self.robotMgr = robotMgr  
 | 
        self.AIList = []  
 | 
        config =  ConfigurationReader.ConfigIniReader.GetConfig()  
 | 
        self.tjgLimitCnt = config.GetTJGLimitCnt()  
 | 
        self.lastTime = 0  
 | 
        self.badRobotCnt = 0 # ÀúÊ·Òì³£ÍÑ»ú¹Ò¸öÊý  
 | 
          
 | 
        self.ProcessFindTJGTime = 5  
 | 
        self.lastLoginTime = 0  
 | 
          
 | 
    def runThread(self):     
 | 
        logging.info( "thread %s start" % self.getName() )  
 | 
  
 | 
        while True:  
 | 
            try:  
 | 
                  
 | 
                nowTime = time.time()  
 | 
  
 | 
                if self.lastLoginTime and nowTime - self.lastLoginTime > self.ProcessFindTJGTime:  
 | 
                    logging.debug( "self.tjgLimitCnt %s " % self.tjgLimitCnt )  
 | 
                    # ÏÞÖÆÍÑ»ú¹ÒµÇ¼ÊýÁ¿, Ã»ÓÐʵʱµÄÍæ¼ÒÉÏÏߺó»á²¹ÊÕÒæ  
 | 
                    if self.robotMgr.GetRobotCount() > self.tjgLimitCnt:  
 | 
                        self.robotMgr.dbRobot.ClearToken()  
 | 
                      
 | 
                    self.lastLoginTime = nowTime  
 | 
                    logoningList = self.robotMgr.GetRobotAccIDList()    # ÔڵǼµÄ»úÆ÷ÈË  
 | 
                      
 | 
                    tokenList = self.robotMgr.dbRobot.GetTokenList()  
 | 
                    robotList = []  
 | 
                    for i in xrange(len(tokenList)):  
 | 
                        tokenInfo = tokenList.pop()  
 | 
  
 | 
                        if tokenInfo[1] in logoningList:  
 | 
                            print "ÕýÔڵǼÖÐ------", tokenInfo[1]  
 | 
                            continue  
 | 
                        robot = self.robotMgr.AddRobot(tokenInfo)  
 | 
                        robotList.append(robot)  
 | 
                        if i == 10:  
 | 
                            # Ò»´ÎµÇ¼10¸öÍæ¼Ò  
 | 
                            break  
 | 
                          
 | 
                    for robot in robotList:  
 | 
                        #logging.debug( "Run AI for Index:%d", index )  
 | 
                        if not robot:  
 | 
                            continue  
 | 
                          
 | 
                        # Á¬½Ó-µÇ¼-ÔËÐÐAI  
 | 
                        if not robot.IsConnected():  
 | 
                            robot.ReCreateRobot()  
 | 
                              
 | 
                      
 | 
                for index in xrange(self.robotMgr.GetRobotCount()):  
 | 
                    #logging.debug( "Run AI for Index:%d", index )  
 | 
                    if index >= self.robotMgr.GetRobotCount():  
 | 
                        # ProcessAI¿ÉÄÜ»áÇå³ýÁËrobot  
 | 
                        break  
 | 
                    try:  
 | 
                        robot = self.robotMgr.GetRobot( index )  
 | 
                    except:  
 | 
                        # ÅжÏindex·À·¶²»µ½£¬¿ÉÄܶàÏß³ÌÒýÆð£¬´Ë´¦±¨´í½áÊøÑ»·  
 | 
                        break  
 | 
                    if not robot:  
 | 
                        continue  
 | 
                    robot.GetAIMgr().ProcessAI()  
 | 
                      
 | 
                if not self.lastLoginTime:  
 | 
                    self.lastLoginTime = nowTime  
 | 
                time.sleep( 0.02 )   # Ãë  
 | 
                  
 | 
                # ¶ÓÁÐÖÐÇåÀíÎÞЧµÄÍÑ»ú¹Ò, Ò»´ÎÖ»ÇåÀíÒ»¸ö  
 | 
                for index in xrange(self.robotMgr.GetRobotCount()):  
 | 
                    #logging.debug( "Run AI for Index:%d", index )  
 | 
                    try:  
 | 
                        robot = self.robotMgr.GetRobot( index )  
 | 
                    except:  
 | 
                        # ÅжÏindex·À·¶²»µ½£¬¿ÉÄܶàÏß³ÌÒýÆð£¬´Ë´¦±¨´í½áÊøÑ»·  
 | 
                        break  
 | 
                    if not robot:  
 | 
                        print "====ûÓлúÆ÷ÈË"  
 | 
                        self.robotMgr.Remove(robot)  
 | 
                        self.badRobotCnt += 1  
 | 
                        break  
 | 
  
 | 
                    if robot.GetNeedDestroy():  
 | 
                        print "++++++±»´Ý»Ù"  
 | 
                        logging.debug( "GetNeedDestroy __peer:0x%08X " % (robot.GetPeerValue()) )  
 | 
                        self.robotMgr.Remove(robot)  
 | 
                        self.badRobotCnt += 1  
 | 
                        break  
 | 
                  
 | 
                    # Á¬½Ó-µÇ¼-ÔËÐÐAI  
 | 
                nowTime = time.time()    
 | 
                if nowTime - self.lastTime > 12:  
 | 
                    print "ÍÑ»ú¹ÒÍæ¼ÒÊýÁ¿: %s - %s"%(self.robotMgr.GetRobotCount(), self.robotMgr.GetLoginOKRobotCount())  
 | 
                    self.lastTime = nowTime  
 | 
                    if self.badRobotCnt:  
 | 
                        print "²Î¿¼-ÀúÊ·Òì³£ÍÑ»ú¹Ò´ÎÊý£º%s"%self.badRobotCnt  
 | 
                      
 | 
            except Exception, e:  
 | 
                logging.error( "AIThread: %s"%str(e) )  
 | 
                logging.error( "AIThread: %s"%traceback.print_exc() )  
 | 
                  
 | 
    def run(self):  
 | 
        runM = self.runThread  
 | 
  
 | 
        runM()  
 | 
  
 | 
          
 | 
  
 | 
class RobotMgr():  
 | 
      
 | 
    def __init__(self, asioMgr, dbRobot):  
 | 
        self.__asioMgr = asioMgr  
 | 
        self.__robotNum = 0  
 | 
        self.__robots = []  
 | 
        self.__robotAccIDs = []  
 | 
        self.dbRobot = dbRobot  
 | 
        self.TeamMgr = {}  
 | 
          
 | 
        #Æô¶¯AIÏ̠߳     
 | 
        #config =  ConfigurationReader.ConfigIniReader.GetConfig()  
 | 
        #AI_THREAD_NUM = config.GetAIThreadNum()  
 | 
  
 | 
        th = AIThread(self, 0)  
 | 
        th.start()  
 | 
  
 | 
    def GetRobotAccIDList(self):  
 | 
        self.__robotAccIDs = []  
 | 
        for robot in self.__robots:  
 | 
            self.__robotAccIDs.append(robot.GetRobotConfig()[1])  
 | 
        return self.__robotAccIDs  
 | 
  
 | 
    def AddRobot(self, tokenInfo):  
 | 
  
 | 
        #´´½¨RobotʵÀý£¬¾ßÌåÏîĿʵÏÖÏàÓ¦µÄRobotBaseµÄ×ÓÀ࣬ÔÚÕâÀï´´½¨×ÓÀàµÄʵÀý  
 | 
        logging.debug( "Create Robot index:%s....." % (tokenInfo,)  )  
 | 
        robot = ProjectRobot( self.__asioMgr, tokenInfo )  
 | 
        self.__robots.append( robot)  
 | 
  
 | 
        return robot  
 | 
              
 | 
    #»úÆ÷È˵Ä×ÜÊý              
 | 
    def GetRobotCount(self):  
 | 
        return len(self.__robots)  
 | 
      
 | 
    #ÒÑÁ¬½ÓÉÏ·þÎñÆ÷µÄ»úÆ÷È˵ÄÊýÁ¿  
 | 
    def GetConnectedRobotCount(self):  
 | 
        n = 0  
 | 
        for robot in self.__robots:  
 | 
            if robot.IsConnected():  
 | 
                n += 1  
 | 
        return n      
 | 
      
 | 
    #ÒѾµÇ¼³É¹¦µÄ»úÆ÷ÈËÊýÁ¿  
 | 
    def GetLoginOKRobotCount(self):  
 | 
        n = 0  
 | 
        for robot in self.__robots:  
 | 
            if robot.GetIsLoginOK():  
 | 
                n += 1  
 | 
            else:  
 | 
                logging.debug( "!!!not login :0x%08X", robot.GetPeerValue())  
 | 
        return n       
 | 
          
 | 
          
 | 
#===============================================================================  
 | 
#    def ConnectServer(self, index ):  
 | 
#          
 | 
#        robot = self.GetRobot(index)  
 | 
#        if not robot:  
 | 
#            return False  
 | 
#   
 | 
#        logging.debug( "ConnectServer for %d" % index )  
 | 
#        #´´½¨ÁËʵÀýÁË£¬ÕâʱֻÐèÒªÔÙ´ÎÁ¬½Ó¼´¿É  
 | 
#        robot.ReCreateRobot()  
 | 
#        return True  
 | 
#===============================================================================  
 | 
          
 | 
    def GetRobot(self, index ):  
 | 
        #logging.debug( "GetRobot for %d" % index )  
 | 
          
 | 
        return self.__robots[index]  
 | 
          
 | 
    def Remove(self, robot):  
 | 
        self.__robots.remove(robot)  
 | 
          
 | 
          
 | 
    def DisconnectServer(self, robot ):  
 | 
          
 | 
        accID = robot.GetPlayerInfo().GetAccID()  
 | 
        logging.debug( "DisconnectServer for %s" % accID )  
 | 
          
 | 
        #¶Ï¿ª·þÎñÆ÷  
 | 
        robot.DestroyRobot()  
 | 
        if robot in self.__robots:  
 | 
            self.Remove(robot)  
 | 
      
 | 
    def StartAI(self, index ):  
 | 
        logging.debug( "StartAI for %d" % index )  
 | 
          
 | 
        robot = self.GetRobot(index)  
 | 
        if not robot:  
 | 
            return False  
 | 
          
 | 
        #robotAIList = robot.GetRobotConfig()  
 | 
        #robot.SetAIActive( robotAIList, True )  
 | 
          
 | 
          
 | 
          
 | 
    def StopAI(self, index ):  
 | 
        logging.debug( "StopAI for %d" % index )  
 | 
          
 | 
        robot = self.GetRobot(index)  
 | 
        if not robot:  
 | 
            return False  
 | 
          
 | 
        #robotAIList = robot.GetRobotConfig()  
 | 
        #robot.SetAIActive( robotAIList, False )  
 | 
          
 | 
#===============================================================================  
 | 
#    def CalcTeam(self):  
 | 
#        self.TeamMgr = {}  
 | 
#        for robot in self.__robots:  
 | 
#            teamID = robot.GetTeamID()  
 | 
#            mapID = robot.GetMapID()  
 | 
#   
 | 
#            #{mapID:[×é¶ÓÍæ¼ÒÊý£¬ÓÐÍÑ»ú¶Ó³¤µÄÍæ¼ÒÊý£¬Ê£ÓàÍæ¼ÒÊý]}  
 | 
#            if mapID not in self.TeamMgr:  
 | 
#                self.TeamMgr[mapID] = [{}, {}]  
 | 
#                  
 | 
#            self.TeamMgr[mapID][0][teamID] = self.TeamMgr[mapID][0].get(teamID, 0) + 1  
 | 
#            if robot.GetTeamMemberLV() != 2:  
 | 
#                # Ö»¹ÜÀí¶Ó³¤ÊÇÍÑ»ú¹ÒÍæ¼Ò£¬±ÜÃâ±»¾Ü¾ø×é¶ÓµÄÇé¿ö  
 | 
#                continue  
 | 
#   
 | 
#            self.TeamMgr[mapID][1][teamID] = robot  
 | 
#   
 | 
#        logging.debug("CalcTeam----%s"%self.TeamMgr)  
 | 
#        # ×é¶ÓÉÏÏÞ4ÈË  
 | 
#        maxTeamCnt = 4  
 | 
#        spaceCnt = 0  # ×é¶Ó¿Õȱλ  
 | 
#        for mapID, teamsInfo in self.TeamMgr:  
 | 
#            for teamID in teamsInfo[1]:  
 | 
#                spaceCnt += (maxTeamCnt - teamsInfo[0][teamID])  
 | 
#                  
 | 
#              
 | 
#              
 | 
#        return  
 | 
#===============================================================================  
 | 
      
 | 
__gRobotMgr = None  
 | 
  
 | 
def CreateRobotMgr( asioMgr, dbRobot ):  
 | 
    global __gRobotMgr  
 | 
    if not __gRobotMgr:  
 | 
        __gRobotMgr =  RobotMgr( asioMgr, dbRobot )  
 | 
          
 | 
          
 | 
def GetRobotMgr():  
 | 
    global __gRobotMgr  
 | 
    return __gRobotMgr 
 |