#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#
|
##@package AIManager.py
|
# Ä£¿éµÄ¼òҪ˵Ã÷:AI¹ÜÀíÆ÷
|
# @author:ifo
|
# @date 2011-09-06 10:00
|
# @version 1.0
|
#
|
# change log:
|
# ÐÞ¸ÄÄ£¿é£¬¶Ô´úÂë½øÐÐÓÅ»¯ÒÔ±ãÌá¸ßÐÔÄÜ 2011-9-6 Alee
|
#
|
# Ä£¿éÏêϸ˵Ã÷:AI¹ÜÀíÆ÷
|
#
|
#---------------------------------------------------------------------
|
#µ¼Èë
|
from Protocol import PacketsReceived, PacketsReceivedPY
|
import copy
|
import os
|
import logging
|
|
import ConfigurationReader.ConfigIniReader
|
|
|
#Èç¹û²»ÔÚ¶àÏß³ÌÏÂÔËÐУ¬Ôò¹Ø±ÕÕâ¸öÏ¿ÉÒÔÌá¸ßЧÂÊ
|
RUN_IN_MT = True
|
|
import CommFunc
|
|
[
|
IsNeedParser,
|
RegForm,
|
IsRegisted,
|
] = range(3)
|
|
|
|
def ImportPy( name, symbol ):
|
#logging.debug( "ImportPy: from %s import %s" % ( name, symbol ) )
|
mod = __import__( name, globals(), locals(), [symbol], -1)
|
mod = getattr(mod, symbol )
|
return mod
|
|
|
|
_AIManager__gAIPyMod = {}
|
|
def LoadAllAI():
|
global _AIManager__gAIPyMod
|
|
pyPath = os.getcwd()
|
pyPath += "\\AI\\AIFile\\"
|
logging.debug( "AIFile Path:%s" % pyPath )
|
|
files = os.listdir(pyPath)
|
for file in files:
|
if len(file) < 2 or file[:2] != "AI":
|
continue
|
fileName = file.split( "." )[0]
|
if _AIManager__gAIPyMod.has_key( fileName ):
|
continue
|
|
AIMod = ImportPy( "AI.AIFile."+fileName , fileName )
|
_AIManager__gAIPyMod[fileName] = AIMod
|
|
LoadAllAI()
|
|
|
|
class AIManager():
|
def __init__(self, robot):
|
self.robot = robot
|
self.PackDataDict = {}
|
self.PackKeyDict = PacketsReceived.ChNetPackDict #·â°ü×Öµä
|
self.PYPackKeyDict = PacketsReceivedPY.ChNetPackDict
|
|
config = ConfigurationReader.ConfigIniReader.GetConfig()
|
self.usePsyco = config.GetUsePsyco()
|
|
self.aiInsts = []
|
|
#³õʼ´´½¨»úÆ÷ÈËʱ£¬²»×Ô¶¯´´½¨ËùÓÐAIµÄʵÀý£¬¶øÊÇÔÚÊ×´ÎSetAIActiveΪTrueʱ¶¯Ì¬´´½¨
|
# GenerateAIInstancesFunc = self.ApplyPsyco( self.GenerateAIInstances )
|
# GenerateAIInstancesFunc()
|
|
def ApplyPsyco(self, func ):
|
if self.usePsyco:
|
import psyco
|
func = psyco.proxy( func )
|
return func
|
|
def GenerateAIInstances(self):
|
for mod in __gAIPyMod.values():
|
aiInst = mod( self.robot )
|
#logging.info( "Generate AI Instance %s for Robot(%s)" \
|
# % ( aiInst.AIName(), str(self.robot)) )
|
aiInst._RegisterPacket( self )
|
self.aiInsts.append( aiInst )
|
|
def GenerateAIInstance(self, aiName ):
|
if __gAIPyMod.has_key( aiName ):
|
aiInst = __gAIPyMod[aiName]( self.robot )
|
#logging.info( "Generate AI Instance %s for Robot(%s)" \
|
# % ( aiInst.AIName(), str(self.robot)) )
|
aiInst._RegisterPacket( self )
|
self.aiInsts.append( aiInst )
|
return aiInst
|
else:
|
return None
|
|
|
def ProcessAI(self):
|
for aiInst in self.aiInsts:
|
aiInst.Tick()
|
|
def SetAIActive(self, aiNameList, bActive ):
|
logging.debug( "SetAIActive(%s) for aiList:%s" % ( bActive, str(aiNameList) ) )
|
bFind = False
|
for aiName in aiNameList:
|
for aiInst in self.aiInsts:
|
if aiName == aiInst.AIName():
|
aiInst.SetActive( bActive )
|
bFind = True
|
break
|
#ûÓÐÕÒµ½ÏàÓ¦µÄAI£¬³¢ÊÔ¶¯Ì¬´´½¨
|
if ( not bFind ) and bActive:
|
aiInstNew = self.GenerateAIInstance( aiName )
|
if aiInstNew:
|
aiInstNew.SetActive( bActive )
|
|
|
|
def RegNetMsg(self, packHead, callFuncName, isNeedParse = True):
|
#䶨ÒåµÄ·â°üÍ·
|
if packHead not in self.PackKeyDict and packHead not in self.PYPackKeyDict:
|
return
|
|
#²»¿Éµ÷ÓõĻص÷º¯Êý
|
if not callable(callFuncName):
|
return
|
|
#´Ë·â°üµÄ×¢²áÐÅÏ¢×Öµä
|
curPackHeadRegList = self.PackDataDict.get(packHead, None)
|
if curPackHeadRegList == None:
|
curPackHeadRegList = [ False, [], False ]
|
self.PackDataDict[packHead] = curPackHeadRegList
|
|
#Ìí¼Ó±¾´Î×¢²á
|
if callFuncName not in curPackHeadRegList[RegForm]:
|
curPackHeadRegList[RegForm].append(callFuncName)
|
|
#¸üд˷â°üµÄIsNeedParser״̬
|
curPackHeadRegList[IsNeedParser] = curPackHeadRegList[IsNeedParser] or isNeedParse
|
|
#¸üд˷â°üµÄIsRegisted״̬
|
if not curPackHeadRegList[IsRegisted]:
|
curPackHeadRegList[IsRegisted] = True
|
|
def OnPacketData(self,serverPack, length = 0):
|
OnPacket = self.ApplyPsyco( self.OnPacketDataInternal )
|
|
OnPacket( serverPack, length )
|
|
|
def OnPacketDataInternal(self,serverPack, length = 0):
|
#·â°üÍ·½âÎö£¬ÓÅ»¯
|
headData = serverPack[1] + serverPack[0]
|
curPackHead = CommFunc.ReadWORD(headData, 0)[0]
|
|
|
#È¡´Ë°üÍ·×¢²áÐÅÏ¢
|
curPackHeadRegDict = self.PackDataDict.get(curPackHead, None)
|
#ÎÞ´Ë·â°ü×¢²áÐÅÏ¢
|
if curPackHeadRegDict == None:
|
return
|
|
#»ñȡһ¸ö¿ÕµÄ·â°üʵÀý
|
curPackData = self.PackKeyDict.get(curPackHead, None)
|
if not curPackData:
|
curPackData = self.PYPackKeyDict.get(curPackHead, None)
|
if not curPackData:
|
return
|
|
#»áÔÚ¶àÏß³ÌÏÂÔËÐУ¬ËùÒÔ±ØÐë½øÐÐÉ±´
|
if RUN_IN_MT:
|
curPackData = copy.deepcopy(curPackData)
|
|
#if curPackData.GetLength() != length:
|
# logging.warning( "ERROR length. Need:%d actually:%d head=%s" % ( curPackData.GetLength(), length, curPackHead) )
|
|
#½âÎö²¢·Ö·¢·â°ü
|
needParse = curPackHeadRegDict[IsNeedParser]
|
if needParse:
|
curPackData.ReadData(serverPack)
|
for regFormInfo in curPackHeadRegDict[RegForm]:
|
regFormInfo(curPackData)
|
|
|
|