コード例 #1
0
    def __init__(self,player_id,team,serverIP,serverPort):
		'''State: Players,Buildings, Time, Resourse Pool'''
		self.players 	= {}
		self.buildings 	= {}
		self.TimeLeft = 15*60 
		self.width = 80.0
		self.height = 48.0
		self.view =None
		self.GameOver =False
		self.playerID =player_id
		self.player = None
		self.action = 0
		self.attemptedAction = 0
		self.lastAction = 0
		self.ActionTimeout = 1
		
		self.team =team
		self.otherTeam = 2 if self.team==1 else  1 
		self.scores =[0,0]
		self.IsServer = False
		self.ResourcePool = None
		self.client = AsyncClient()
		self.serverIP =serverIP
		self.serverPort = serverPort
                self.Tick = 0
                self.Position = (0,0)
                self.lastUpdate = 0
コード例 #2
0
class Environment(): #in an MVC system , this would be a controller
    ''' The environment class contains the state of the game. The server has the master version, the clients have slave versions (updated through the network) '''
    ATTACK_RADIUS = 3
    SCAN_RADIUS = 3
    FPS=30
    

    def __init__(self,player_id,team,serverIP,serverPort):
		'''State: Players,Buildings, Time, Resourse Pool'''
		self.players 	= {}
		self.buildings 	= {}
		self.TimeLeft = 15*60 
		self.width = 80.0
		self.height = 48.0
		self.view =None
		self.GameOver =False
		self.playerID =player_id
		self.player = None
		self.action = 0
		self.attemptedAction = 0
		self.lastAction = 0
		self.ActionTimeout = 1
		
		self.team =team
		self.otherTeam = 2 if self.team==1 else  1 
		self.scores =[0,0]
		self.IsServer = False
		self.ResourcePool = None
		self.client = AsyncClient()
		self.serverIP =serverIP
		self.serverPort = serverPort
                self.Tick = 0
                self.Position = (0,0)
                self.lastUpdate = 0

    def readGestures(self):
     
            if(self.player.action == Player.ATTACK): #ATTACK
                                self.handleAttack()

            elif(self.player.action == Player.BUILD): #building
                                self.handleBuild()

            elif(self.player.action == Player.UPGRADE): #building
                                self.handleUpgrade()

            elif(self.player.action == Player.SCAN): #building
                                self.handleScan()

            elif(self.player.action == Player.IDLE):
                                self.handleIdle()
                                              
           ## for b in self.buildings.itervalues():
            ##            if   (b.getPosition() - self.player.getPosition()).length < b.size and b.isTrap() and b.team<>self.player.team:         
             ##                           b.explode(self,self.Tick)   
        

    def handleAttack(self):
                if(self.player.sides>=3):
                        self.player.performAttack(self.Tick)  
                       
    def handleBuild(self):
                ACTION = "BUILD"
                if((self.ResourcePool.getPosition()-self.player.getPosition()).length< self.ResourcePool.size):
                        ACTION ="MINE"
                else:
                        for b in self.buildings.itervalues():
                                
                                if(b.team == self.player.team and b.isPolyFactory() and b.resources == 5 and (b.getPosition()- player.getPosition()).length <b.size):
                                        ACTION ="MINE"
                                        break      
                if( ACTION =="MINE"):
                        self.player.performBuild(self.Tick)  
                        
                                         
                else:
                        if(self.player.resources>0):
                                BUILDING =None
                                for b in self.buildings.itervalues():
                                        if   (b.getPosition() - self.player.getPosition()).length < b.size:
                                                BUILDING =b
                                                break
                                

                                if BUILDING.team ==self.player.team:
                                        self.player.performBuild(self.Tick) 
        
    def handleUpgrade(self):
                allowedUpgradeLoc = False
                if((self.ResourcePool.getPosition()-self.player.getPosition()).length< self.ResourcePool.size):
                        allowedUpgradeLoc=True
                else:
                        for b in self.buildings.itervalues():
                                if(b.team == self.player.team and b.isPolyFactory() and b.resources == 5 and (b.getPosition()- self.player.getPosition()).length <b.size): 
                                        allowedUpgradeLoc=True
                                        break
                if(allowedUpgradeLoc):
                       self.player.upgrade(self.Tick) 

    def handleScan(self):
             self.player.scan(self.Tick)    

    def handleIdle(self):

             pass  
      
    def updateTime(self):
		self.Tick+= 1.0/Environment.FPS
		#if( self.TimeLeft<=0):
		#    self.GameOver =True
            
    def Update(self):
		self.deSerialize()
		self.updateTime()
		self.updatePositions()
		#self.readGestures()
		self.view.paint(self.Tick )
                
		
    def makeRequest(self,action,Position):
        #print self.action
        if self.player:
            self.player.action = action
            self.player.position = Position
            self.readGestures()
        self.client.MakeRequest(self.playerID,self.team,action,Position)
        
        self.action = 0
    
    def updatePositions(self):
            for playerId in self.players:
                     
                     if self.players[playerId].player_id <> self.playerID:
                         
                         self.players[playerId].updatePosition( 1.0/Environment.FPS)
                     
    def start(self):
		'''controls the environment by initiating the looping calls'''

		self.lastUpdate =time.time()
		self.view.start('client-'+str(self.playerID))
		self.client.start(self.serverIP,self.serverPort)
		
                if os.path.exists(CLIENTLOCALDATA.split('.')[0]+str(self.playerID)+'.'+CLIENTLOCALDATA.split('.')[1]):		
                    os.remove(CLIENTLOCALDATA.split('.')[0]+str(self.playerID)+'.'+CLIENTLOCALDATA.split('.')[1])
		
		self._renderCall = LoopingCall(self.Update) 
		#self._requestCall = LoopingCall(self.makeRequest) 
		self._renderCall.start(1.0/Environment.FPS)	
		#self._requestCall.start(1.0/Environment.FPS)	


	#FUNCTIONS FOR NETWORKING
	
    def deSerialize(self):
        state=None
        localdb = shelve.open(CLIENTLOCALDATA.split('.')[0]+str(self.playerID)+'.'+CLIENTLOCALDATA.split('.')[1])
        if localdb.has_key('data'):
                
            try:

                state = localdb['data']['string']             

            finally:
                localdb.close()
                    
            if(state<>None):
                t = state.split('$')
                players =  pickle.loads(t[0]) #update players
                #self.players.clear()
                                      
                for p in players.itervalues():
                    found =False
                    pkey = 0
                    if p.player_id == self.playerID and self.player==None:
                        self.player = p
                        self.players[id( self.player)] = self.player
                        
                      
                    for ep in self.players.itervalues():
                            
                        if ep.player_id == p.player_id:
                               
                                found=True
                                pkey = id(ep)
                                break
                    if found:
                        if p.player_id == self.playerID:
                                   
                                    self.players[pkey].position = self.player.position
                                    self.players[pkey].action = self.player.position

                        else:
                            self.players[pkey].targetPosition = p.position
                            self.players[pkey].action = p.action
                            self.players[pkey].animations.extend(p.animations)

                        self.players[pkey].sides = p.sides
                        self.players[pkey].resources = p.resources
                        self.players[pkey].partialResources = p.partialResources

                        
                    else:
                        self.players[id(p)]=p

                buildings =  pickle.loads(t[1]) #update buildings
                self.buildings.clear()
                for b in buildings.itervalues():                    
                    self.buildings[id(b)] = b

                self.ResourcePool = pickle.loads(t[2])
                self.scores =pickle.loads(t[3])
                self.TimeLeft =int(t[4])
                
               
                self.GameOver = not bool(t[6]) #weird