class EngineState():

    def __init__(self, engine):
	"""
	The game determines what is happening on screen
	based on what state the GameEngine instance has.
	"""
	# the game engine that owns this state
	self.engine = engine # TRYING TO DEPRECATE
	self.screen = Screen()
	self.res = self.engine.setsMgr.screenRes
	res = self.res

	# get/load the font
	self.font = FontManager().loadFont( 'JohnDoe' )
	self.str_paused = UIText( "Paused", [res[0]*0.5, res[1]*0.5]
				, self.font, 35 )
	self.str_paused.setVisible(False)

	
	gameWorld = self.engine.gameWorld
	#gameWorld.setPlayerType( 'Cop' )
	gameWorld.setPlayerType( 'Robber' )
	#gameWorld.getPlayer().setName( "Alfonso" )

	# This is an optimization...
	# If using the Cop player type, use the smaller tiles
	if gameWorld.getPlayer().getType() == "Cop":
	    gameWorld.setLevelByName( 'Level1XS' )
	else:
	    gameWorld.setLevelByName( 'Level1L' )

	glutTimerFunc(50, self.engine.on_update, 50)

    def renderFrame(self):
	""" RenderFrame - Base Class """
	if not self.screen:
	    self.screen = Screen()

	self.screen.drawThis( self.str_paused )

	return self

    def on_key_press(self, key, x, y):
	"""
	On key press
	"""
	if key == '\x1b':
	    return None

	# for now, this means to "spawn a server"
	if key == 'x':
	    if system() == "Linux" or system() == "Macintosh":
		Popen( [r'/usr/bin/python/python'
		    ,os.path.join( self.engine.setsMgr.home_dir
				    , 'StartServer.py' )] )
	    elif system() == "Windows":
		Popen([r'C:\Python25\python.exe'
		    ,os.path.join( self.engine.setsMgr.home_dir
				    , 'StartServer.py' )])
	    else:
	    	print "you are on an unsupported platform for spawning a server"
	    # declare that this game instance is the server owner
	    self.engine.serverOwner = True
	    
	# for now, its "connect"
	elif key == 'c':
	    self.engine.connect()

	elif key == 'v':
	    self.engine.disconnect()

	elif key == 'g':
	    self.str_paused.toggleVisible()
	    self.engine.gameWorld.pause()

	return self

    def on_key_release(self, key, x, y):
	"""
	On key release
	"""
	return self

    def on_specialkey_press(self, key, x, y):
	"""
	On special key press
	"""
	return self

    def on_specialkey_release(self, key, x, y):
	"""
	On special key release
	"""
	return self

    def on_mouse_motion(self, x, y):
	"""
	On mouse motion
	"""
	self.engine.gameWorld.startGame()
	return self

    def on_mouse(self, button, state, x, y):
	"""
	On mouse
	"""
	return self

    def on_socket(self, packet):
	"""
	On socket
	"""
	self.gameTime = packet['time']
	return self

    def update(self, elapsed):
	"""
	switches the state based on 
	"""
	return self
class GameState(EngineState):

    def __init__(self, engine):
	"""
	The game determines what is happening on screen
	based on what state the GameEngine instance has.
	"""
	self.engine = engine
	self.res = self.engine.setsMgr.screenRes
	self.screen = None

	# get/load the font
	self.font = FontManager().loadFont( 'Basic' )
	self.str_paused = UIText( "Paused",
		[self.res[0]*0.5, self.res[1]*0.5],
		self.font, 0.05 )
	self.str_paused.setVisible(False)

	engine.gameWorld.setLevelByName( 'Level1L' )
	engine.gameWorld.gameTime = 0.0

	engine.gameWorld.startGame()
	#glutTimerFunc(300, self.print_game_world, 300)

    def print_game_world(self, elapsed):
	gW = self.engine.gameWorld
	tileSize = gW.level.getTileSize()
	peerPos = gW.peers.values()[0].pos
	print ''
	print '--- Gameworld ---'
	print 'Player = {', gW.player.playerName, ":", gW.player.pos, "}"
	print 'mapPixelPos = ', gW.player.pos[0] + gW.scrScroll[0]\
				, gW.player.pos[1] + gW.scrScroll[1]
	print 'mapTilePos = ', gW.player.pos[0] / tileSize[0],\
				gW.player.pos[1] / tileSize[1]
	print 'renderPos = ', gW.player.pos[0] - gW.scrScroll[0]\
			    , gW.player.pos[1] - gW.scrScroll[1]
	print '  ------ ------ '
	print 'Peers = {', gW.peers.values()[0].playerName, ":", peerPos, "}" 
	print 'mapTilePos = ', peerPos[0] / tileSize[0],\
				peerPos[1] / tileSize[1]
	print 'renderPos = ', peerPos[0] - gW.scrScroll[0]\
			    , peerPos[1] - gW.scrScroll[1]
	print '  ------ ------ '
	print 'TileSize = ', tileSize
	print ''
	glutTimerFunc(300, self.print_game_world, 300)

    def renderFrame(self):
	""" RenderFrame - Base Class """
	if not self.screen:
	    self.screen = Screen()

	scrSize = self.screen.getSize()
	#self.engine.gameWorld.positionPlayer( [scrSize[0],scrSize[1]] )

	self.screen.drawThis( self.str_paused )
	
	return self

    def on_key_press(self, key, x, y):
	"""
	On key press
	"""
	if key == chr(27):   # Escape
	    return ChoosePlayerState(self.engine)
	elif key == 'g':
	    self.str_paused.toggleVisible()
	    self.engine.gameWorld.pause()
	
	# controller
	self.engine.gameWorld.on_key_press(key, x, y)

	return self


    def on_key_release(self, key, x, y):
	"""On key release"""
	# controller	
	self.engine.gameWorld.on_key_release(key, x, y)
	return self


    def on_specialkey_press(self, key, x, y):
	"""On special key press"""
	# controller
	self.engine.gameWorld.on_specialkey_press(key, x, y)
	return self

    def on_specialkey_release(self, key, x, y):
	"""On special key release"""
	# controller
	self.engine.gameWorld.on_specialkey_release(key, x, y)
	return self

    def on_mouse_motion(self, x, y):
	"""On mouse motion"""
	# controller
	self.engine.gameWorld.on_mouse_motion(x, y)
	return self

    def on_mouse(self, button, state, x, y):
	"""On mouse press/release"""
	# controller
	self.engine.gameWorld.on_mouse(button, state, x, y)
	return self

    def update(self, elapsed):
	"""
	switches the state based on 
	"""
	if self.engine.gameWorld.gameStatus == "winner":
	    # Send a signal to the server that this player
	    #	seems to have won the game ( the server will
	    #	have to agree with our word )
	    
	    # Go to the appropriate engine-state screen
	    #self.engine.gameWorld = GameWorld()
	    print 'switching to winner state'
	    return WinnerState(self.engine)

	elif self.engine.gameWorld.gameStatus == "loser":
	    # Go to the appropriate engine-state screen
	    #self.engine.gameWorld = GameWorld()
	    return LoserState(self.engine)
	else:
	    return self