def renderFrame(self):
	if not self.screen:
	    self.screen = Screen()

	self.screen.drawThis( self.titleBGImg )

	selectionBox = UIImage("box.png",
				pos=self.UI[self.selected].pos,
				size=[(self.res[0]*0.05)*10, self.res[1]*0.05])
	selectionBox.center()
	self.screen.drawThis( selectionBox )

	for uiObj in self.UI.values():
	    # draw the background image firstly
	    self.screen.drawThis( uiObj )

	return self
Example #2
0
    def __init__(self, rect: Rect, color: Optional[Color], sock,
                 connection_list, receive_list, parent_conn, child_conn,
                 send_process, nicks):
        mod_loader.import_mods()

        super().__init__(rect, color)

        fps_font = Font('assets/fonts/arial.ttf', 20)

        sub_elem = UIElement(Rect(50, 50, 50, 50), None)
        sub_elem.append_child(FPSCounter(Rect(50, 50, 0, 0), fps_font))
        self.append_child(sub_elem)

        self.sock = sock
        self.connection_list = connection_list
        self.receive_list = receive_list
        self.child_conn = child_conn
        self.parent_conn = parent_conn
        self.send_process = send_process

        self.game = Game(Game.Side.SERVER,
                         mod_loader,
                         self.parent_conn,
                         nicks,
                         -1,
                         connection_list=self.connection_list)

        self.minimap_elem = UIImage(
            Rect(0, config['screen']['size'][1] - 388, 0, 0),
            'assets/sprite/minimap.png')

        self.minimap = Minimap(self.game)
        self.minimap_elem.append_child(self.minimap)

        self.append_child(self.minimap_elem)
        self.game.create_unit('warrior', (0, 0))
        self.game.create_unit('fortress', (500, 0))
        self.game.create_unit('fortress', (-500, 0))
        self.game.create_unit('archer', (-25, -25))
        self.game.create_unit('archer', (25, -25))
        self.game.create_unit('archer', (-25, 25))
        self.game.create_unit('archer', (25, 25))
Example #3
0
    def set_selected(self, unit):
        i = 0
        self.childs.clear()
        for name in unit.cls_dict['valid_types']:
            entity = self.game.mod_loader.entities[name]
            self.units[name] = ProduceMenu.ProduceMenuItem(name, entity, self.game)
            btn = UIButton(Rect(150, i * 30 + 15, 25, 25), None, self.select, name)
            btn.append_child(UIImage(Rect((0, 0), btn.relative_bounds.size), None, self.units[name].icon))

            self.append_child(btn)
            i += 1
        self.selected_unit = unit.unit_id
    def renderFrame(self):
	""" RenderFrame - Base Class """

	Screen().drawThis( self.titleBGImg )
	Screen().drawThis( self.entryBox )
	Screen().drawThis( self.keysBox )

	selectionBox = UIImage("box.png",
				pos=self.UI[self.selected].pos,
				size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2])
	selectionBox.center()
	Screen().drawThis( selectionBox )

	for uiObj in self.UI.values():
	    # draw the background image firstly
	    Screen().drawThis( uiObj )

	for letter in self.screenKeys.values():
	    Screen().drawThis( letter )

	return self
Example #5
0
    def __init__(self, rect: Rect, color: Optional[Color], sock, receive_list,
                 socket_process, parent_conn, child_conn, send_process, nicks,
                 team_id):
        super().__init__(rect, color)

        self.sock = sock
        self.receive_list = receive_list
        self.socket_process = socket_process
        self.parent_conn = parent_conn
        self.child_conn = child_conn
        self.send_process = send_process

        mod_loader.import_mods()

        config.reload()

        fps_font = Font('assets/fonts/arial.ttf', 20)

        sub_elem = UIElement(Rect(50, 50, 50, 50), None)
        sub_elem.append_child(FPSCounter(Rect(50, 50, 0, 0), fps_font))
        self.append_child(sub_elem)

        self.game = Game(Game.Side.CLIENT, mod_loader, self.parent_conn, nicks,
                         team_id)

        self.minimap = Minimap(self.game)
        self.minimap_elem = UIImage(
            Rect(0, config['screen']['size'][1] - 388, 0, 0),
            'assets/sprite/minimap.png')
        self.minimap_elem.append_child(self.minimap)

        self.minimap_elem.append_child(
            ResourceMenu(self.game.current_player, Rect(45, 108, 0, 0),
                         Font('assets/fonts/arial.ttf', 25)))

        menu_parent = UIElement(Rect(0, 0, 0, 0), None)
        self.append_child(menu_parent)
        menu_parent.append_child(self.minimap_elem)
        menu_parent.append_child(BuildMenu(self.relative_bounds, self.game))
        menu_parent.append_child(ProduceMenu(self.relative_bounds, self.game))
Example #6
0
 def __init__(self, bounds, game):
     super().__init__(bounds, None)
     self.selected = None
     self.game = game
     self.buildings = {}
     i = 0
     for name, entity in self.game.mod_loader.entities.items():
         if 'buildable' in entity['tags']:
             self.buildings[name] = BuildMenu.BuildMenuItem(name, entity, game)
             btn = UIButton(Rect(0, i * 55 + 15, 50, 50), None, self.select, name)
             btn.append_child(UIImage(Rect((0, 0), btn.relative_bounds.size), None, self.buildings[name].icon))
             self.append_child(btn)
             i += 1
Example #7
0
    def __init__(self, rect: Rect, color: Optional[Color]):
        super().__init__(rect, color)

        self.main = None
        self.font = Font('assets/fonts/arial.ttf', 20)

        self.append_child(
            FPSCounter(Rect(0, 0, 0, 0),
                       self.font,
                       absolute_anchor=Anchor.TOP_RIGHT,
                       relative_anchor=Anchor.TOP_RIGHT))

        self.append_child(
            DialogWindow(Rect(0, 57, 1750, 787),
                         Color('azure'),
                         relative_anchor=Anchor.TOP_CENTER,
                         absolute_anchor=Anchor.TOP_CENTER))

        self.append_child(
            UIImage(self.absolute_bounds.copy(), 'assets/images/screen.png'))
    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
	res = self.res

	# get/load the font
	self.font = FontManager().loadFont( 'Basic' )
	self.UI = {}
	self.UI['waiting'] = UIText("Waiting"
		, pos=[res[0]*0.5, res[1]*0.3], font=self.font, scale=0.04)
	self.UI['waiting'].center()
	self.UI['for'] = UIText("For"
		, pos=[res[0]*0.5, res[1]*0.5], font=self.font, scale=0.04)
	self.UI['for'].center()
	self.UI['players'] = UIText("Players"
		, pos=[res[0]*0.5, res[1]*0.7], font=self.font, scale=0.04)
	self.UI['players'].center()
	self.UI['back'] = UIText("Back"\
		, pos=[res[0]*0.5, res[1]*0.9], font=self.font, scale=0.04)
	self.UI['back'].center()

	self.selectionBox = UIImage( "box.png"\
				, pos=self.UI['back'].pos
				, size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2] )
	self.selectionBox.center()

	self.titleBGImg = UIImage("TitleScreenBG.png"\
		, pos=[0,0], size=res)


	glutTimerFunc(50, self.engine.on_update, 50)
    def renderFrame(self):
	""" RenderFrame - Base Class """
	Screen().drawThis( self.titleBGImg )

	playerChoiceBox = UIImage( "box.png"\
				, pos=self.UI[self.plChoice].pos
				, size=[self.res[0]*0.42, self.res[1]*0.42] )
	playerChoiceBox.center()
	Screen().drawThis( playerChoiceBox )

	selectionBox = UIImage( "box.png"\
				, pos=self.UI[self.selected].pos
				, size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2] )
	selectionBox.center()
	Screen().drawThis( selectionBox )

	for uiObj in self.UI.values():
	    Screen().drawThis( uiObj )

	return self
Example #10
0
class ServerGameWindow(UIElement):
    def __init__(self, rect: Rect, color: Optional[Color], sock,
                 connection_list, receive_list, parent_conn, child_conn,
                 send_process, nicks):
        mod_loader.import_mods()

        super().__init__(rect, color)

        fps_font = Font('assets/fonts/arial.ttf', 20)

        sub_elem = UIElement(Rect(50, 50, 50, 50), None)
        sub_elem.append_child(FPSCounter(Rect(50, 50, 0, 0), fps_font))
        self.append_child(sub_elem)

        self.sock = sock
        self.connection_list = connection_list
        self.receive_list = receive_list
        self.child_conn = child_conn
        self.parent_conn = parent_conn
        self.send_process = send_process

        self.game = Game(Game.Side.SERVER,
                         mod_loader,
                         self.parent_conn,
                         nicks,
                         -1,
                         connection_list=self.connection_list)

        self.minimap_elem = UIImage(
            Rect(0, config['screen']['size'][1] - 388, 0, 0),
            'assets/sprite/minimap.png')

        self.minimap = Minimap(self.game)
        self.minimap_elem.append_child(self.minimap)

        self.append_child(self.minimap_elem)
        self.game.create_unit('warrior', (0, 0))
        self.game.create_unit('fortress', (500, 0))
        self.game.create_unit('fortress', (-500, 0))
        self.game.create_unit('archer', (-25, -25))
        self.game.create_unit('archer', (25, -25))
        self.game.create_unit('archer', (-25, 25))
        self.game.create_unit('archer', (25, 25))

    def update(self, event):
        self.game.update(event)

        if event.type == EVENT_UPDATE:
            while self.receive_list:
                sender, command = self.receive_list.pop(0)
                self.game.handle_command(command[0],
                                         command[1:],
                                         sender=sender)

        return super().update(event)

    def draw(self, screen):
        super().draw(screen)
        self.game.draw(screen)

    def shutdown(self):
        print('Shutdown')
        self.send_process.terminate()
        self.parent_conn.close()
        self.sock.close()
Example #11
0
class ClientGameWindow(UIElement):
    def __init__(self, rect: Rect, color: Optional[Color], sock, receive_list,
                 socket_process, parent_conn, child_conn, send_process, nicks,
                 team_id):
        super().__init__(rect, color)

        self.sock = sock
        self.receive_list = receive_list
        self.socket_process = socket_process
        self.parent_conn = parent_conn
        self.child_conn = child_conn
        self.send_process = send_process

        mod_loader.import_mods()

        config.reload()

        fps_font = Font('assets/fonts/arial.ttf', 20)

        sub_elem = UIElement(Rect(50, 50, 50, 50), None)
        sub_elem.append_child(FPSCounter(Rect(50, 50, 0, 0), fps_font))
        self.append_child(sub_elem)

        self.game = Game(Game.Side.CLIENT, mod_loader, self.parent_conn, nicks,
                         team_id)

        self.minimap = Minimap(self.game)
        self.minimap_elem = UIImage(
            Rect(0, config['screen']['size'][1] - 388, 0, 0),
            'assets/sprite/minimap.png')
        self.minimap_elem.append_child(self.minimap)

        self.minimap_elem.append_child(
            ResourceMenu(self.game.current_player, Rect(45, 108, 0, 0),
                         Font('assets/fonts/arial.ttf', 25)))

        menu_parent = UIElement(Rect(0, 0, 0, 0), None)
        self.append_child(menu_parent)
        menu_parent.append_child(self.minimap_elem)
        menu_parent.append_child(BuildMenu(self.relative_bounds, self.game))
        menu_parent.append_child(ProduceMenu(self.relative_bounds, self.game))

    def update(self, event):
        self.game.update(event)

        if event.type == EVENT_UPDATE:
            while self.receive_list:
                args = self.receive_list.pop(0)
                self.game.handle_command(args[0], args[1:])

        return super().update(event)

    def draw(self, screen):
        super().draw(screen)
        self.game.draw(screen)

    def shutdown(self):
        self.sock.close()
        self.send_process.terminate()
        self.socket_process.terminate()
        self.parent_conn.close()
        self.child_conn.close()
        print('Closed')
class WaitingForPlayersState(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
	res = self.res

	# get/load the font
	self.font = FontManager().loadFont( 'Basic' )
	self.UI = {}
	self.UI['waiting'] = UIText("Waiting"
		, pos=[res[0]*0.5, res[1]*0.3], font=self.font, scale=0.04)
	self.UI['waiting'].center()
	self.UI['for'] = UIText("For"
		, pos=[res[0]*0.5, res[1]*0.5], font=self.font, scale=0.04)
	self.UI['for'].center()
	self.UI['players'] = UIText("Players"
		, pos=[res[0]*0.5, res[1]*0.7], font=self.font, scale=0.04)
	self.UI['players'].center()
	self.UI['back'] = UIText("Back"\
		, pos=[res[0]*0.5, res[1]*0.9], font=self.font, scale=0.04)
	self.UI['back'].center()

	self.selectionBox = UIImage( "box.png"\
				, pos=self.UI['back'].pos
				, size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2] )
	self.selectionBox.center()

	self.titleBGImg = UIImage("TitleScreenBG.png"\
		, pos=[0,0], size=res)


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

    def renderFrame(self):
	""" RenderFrame - Base Class """
	
	Screen().drawThis( self.titleBGImg )
	
	Screen().drawThis( self.selectionBox )	

	for uiObj in self.UI.values():
	    Screen().drawThis( uiObj )

	return self

    def update(self, elapsed):
	"""
	"""
	# go to the next state
	if len( self.engine.gameWorld.peers ) > 0:
	    return GameState(self.engine)
	else:
	    return self

    def on_key_press(self, key, x, y):
	"""
	On key press
	"""
	if key == chr(27):   # Escape
	    return ChoosePlayerState(self.engine)
	return self


    def on_mouse(self, button, state, x, y):
	"""
	On mouse press/release
	"""
	if self.UI['back'].CollidePoint( (x,y) ):
	    return ChoosePlayerState(self.engine)
	return self

    def on_socket(self, elapsed):
	"""
	On socket
	"""
	return self

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

	self.screen = Screen()
	self.res = self.engine.setsMgr.screenRes
	res = self.res # typing 'self.res' was making lines too long. :P
	
	# get/load the font
	self.font = FontManager().loadFont( 'Basic' )

	# screen objects
	self.UI = {}
	self.UI['title'] = UIText("Start a Server"\
		, pos=[res[0]*.01,res[1]*.10], font=self.font, scale=0.05)
	self.UI['server_name'] = UIText("Server Name"\
		, [res[0]*0.3, res[1]*0.2], self.font, 0.034)
	self.UI['text_entry'] = UIText(self.engine.serverName\
		, [res[0]*0.5, res[1]*0.3], self.font, 0.047)
	self.UI['text_entry'].center()
	self.UI['backspace'] = UIText("BKSP"\
		, [res[0]*0.24, res[1]*0.74], self.font, 0.031)
	self.UI['space'] = UIText("SPACE"\
		, [res[0]*0.6, res[1]*0.74], self.font, 0.031)
	self.UI['back'] = UIText("Back"\
		, pos=[res[0]*0.1, res[1]*0.9], font=self.font, scale=0.031)
	self.UI['back'].center()
	self.UI['create'] = UIText("Create"\
		, pos=[res[0]*0.9, res[1]*0.9], font=self.font, scale=0.031)
	self.UI['create'].center()
	
	self.selected = 'create'

	self.titleBGImg = UIImage("TitleScreenBG.png", pos=[0,0], size=res)
	
	self.entryBox = UIImage("box.png",
				pos=[res[0]*0.5, res[1]*0.3],
				size=[(0.03*res[0])*12, 0.05*res[1]])
	self.entryBox.center()

	# This is the text input that currently has focus; 
	#   the default is text_entry
	self.hasFocus = self.UI['text_entry']
	self.ServerNameMax = 12

	# Here, a hash is created containing a UIText for each letter
	#   in the alphabet.
	# They are spaced and stacked on the screen so that they lie
	#   in 3 rows of 8, 9, and 9 letters each.
	self.screenKeys = {}
	lettPos = [res[0]*0.32, res[1]*0.45]
	lettersToAdd = 8
	lettScale = 0.04
	for letter in map(chr, range(65, 91)):
	    
	    # add the letter to the hash
	    self.screenKeys[letter] = UIText(letter, [lettPos[0], lettPos[1]],
		    self.font, lettScale)

	    # This denotes that the last letter in the row has been added
	    #	
	    if lettersToAdd == 1:
		lettersToAdd = 9    # the subsequent rows all have 9 letters
		lettPos[0] = res[0]*0.3   # reset the x pos (slightly less ^\ )
		lettPos[1] += lettScale+(lettScale*res[0])  # increment the y pos
	    else:
		lettersToAdd -= 1	    # decrement the counter
		lettPos[0] += lettScale+(lettScale*res[0])  # increment the x pos

	self.keysBox = UIImage("box.png", pos=self.screenKeys['N'].pos\
		, size=[ (lettScale*res[0])*10, (lettScale*res[1])*6 ])
	self.keysBox.center()    
class CreateServerState(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.screen = Screen()
	self.res = self.engine.setsMgr.screenRes
	res = self.res # typing 'self.res' was making lines too long. :P
	
	# get/load the font
	self.font = FontManager().loadFont( 'Basic' )

	# screen objects
	self.UI = {}
	self.UI['title'] = UIText("Start a Server"\
		, pos=[res[0]*.01,res[1]*.10], font=self.font, scale=0.05)
	self.UI['server_name'] = UIText("Server Name"\
		, [res[0]*0.3, res[1]*0.2], self.font, 0.034)
	self.UI['text_entry'] = UIText(self.engine.serverName\
		, [res[0]*0.5, res[1]*0.3], self.font, 0.047)
	self.UI['text_entry'].center()
	self.UI['backspace'] = UIText("BKSP"\
		, [res[0]*0.24, res[1]*0.74], self.font, 0.031)
	self.UI['space'] = UIText("SPACE"\
		, [res[0]*0.6, res[1]*0.74], self.font, 0.031)
	self.UI['back'] = UIText("Back"\
		, pos=[res[0]*0.1, res[1]*0.9], font=self.font, scale=0.031)
	self.UI['back'].center()
	self.UI['create'] = UIText("Create"\
		, pos=[res[0]*0.9, res[1]*0.9], font=self.font, scale=0.031)
	self.UI['create'].center()
	
	self.selected = 'create'

	self.titleBGImg = UIImage("TitleScreenBG.png", pos=[0,0], size=res)
	
	self.entryBox = UIImage("box.png",
				pos=[res[0]*0.5, res[1]*0.3],
				size=[(0.03*res[0])*12, 0.05*res[1]])
	self.entryBox.center()

	# This is the text input that currently has focus; 
	#   the default is text_entry
	self.hasFocus = self.UI['text_entry']
	self.ServerNameMax = 12

	# Here, a hash is created containing a UIText for each letter
	#   in the alphabet.
	# They are spaced and stacked on the screen so that they lie
	#   in 3 rows of 8, 9, and 9 letters each.
	self.screenKeys = {}
	lettPos = [res[0]*0.32, res[1]*0.45]
	lettersToAdd = 8
	lettScale = 0.04
	for letter in map(chr, range(65, 91)):
	    
	    # add the letter to the hash
	    self.screenKeys[letter] = UIText(letter, [lettPos[0], lettPos[1]],
		    self.font, lettScale)

	    # This denotes that the last letter in the row has been added
	    #	
	    if lettersToAdd == 1:
		lettersToAdd = 9    # the subsequent rows all have 9 letters
		lettPos[0] = res[0]*0.3   # reset the x pos (slightly less ^\ )
		lettPos[1] += lettScale+(lettScale*res[0])  # increment the y pos
	    else:
		lettersToAdd -= 1	    # decrement the counter
		lettPos[0] += lettScale+(lettScale*res[0])  # increment the x pos

	self.keysBox = UIImage("box.png", pos=self.screenKeys['N'].pos\
		, size=[ (lettScale*res[0])*10, (lettScale*res[1])*6 ])
	self.keysBox.center()    


    def createServer( self ):
	"""
	for the sake of code reuse
	"""
	if system() == "Linux" or system() == "Macintosh":
	    Popen( [r'/usr/bin/python2.7'
		,os.path.join( self.engine.setsMgr.home_dir
				, 'StartServer.py' )] )
	elif system() == "Windows":
	    Popen([r'C:\Python27\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
	self.engine.serverName = self.UI['text_entry'].getText()
	return ChoosePlayerState(self.engine)


    def renderFrame(self):
	""" RenderFrame - Base Class """

	#screen = Screen()

	Screen().drawThis( self.titleBGImg )
	Screen().drawThis( self.entryBox )
	Screen().drawThis( self.keysBox )

	selectionBox = UIImage("box.png",
				pos=self.UI[self.selected].pos,
				size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2])
	selectionBox.center()
	Screen().drawThis( selectionBox )

	for scrObj in self.UI.values():
	    Screen().drawThis( scrObj )

	for letter in self.screenKeys.values():
	    Screen().drawThis( letter )

	return self

    def on_key_press(self, key, x, y):
	"""
	On key press
	"""
	# Esc
	if key == chr(27):			    # Escape
	    return TitleScreenState(self.engine)

	# Enter
	elif key == chr(13):
	    if self.selected == "back":
		return TitleScreenState(self.engine)
	    elif self.selected == "create":
		return self.createServer()

	# Arrow keys
	elif key >= 100 and key <= 103:
	    if self.selected == "back":
		self.selected = "create"
	    elif self.selected == "create":
		self.selected = "back"

	elif self.hasFocus != None:
	    if key == chr(32):			    # Space Bar
		if len(self.hasFocus.getText()) < self.ServerNameMax:
		    self.hasFocus.push(" ")
	    if key == chr(8) or key == chr(127):    # BS or Del
		self.hasFocus.pop()
	    if key.isalpha() or key.isdigit():	    # letter/numbers
		if len(self.hasFocus.getText()) < self.ServerNameMax:
		    self.hasFocus.push(key)

	return self


    def on_mouse_motion(self, x, y):
	"""
	On mouse motion
	"""
	if self.UI['back'].CollidePoint( (x,y) ):
	    self.selected = "back"
	    
	elif self.UI['create'].CollidePoint( (x,y) ):
	    self.selected = "create"

	return self

    def on_mouse(self, button, state, x, y):
	"""
	On mouse press
	"""
	if button == GLUT_LEFT_BUTTON and state == GLUT_UP:
	    if self.UI['back'].CollidePoint((x,y)):
		return TitleScreenState(self.engine)

	    if self.UI['create'].CollidePoint((x,y)):
		return self.createServer()

	    # test for user clicks on the screen keys
	    for letter in self.screenKeys:
		if self.screenKeys[letter].CollidePoint((x,y)):
		    if len(self.hasFocus.getText()) < self.ServerNameMax:
			self.UI['text_entry'].push( letter )

	    if self.UI['backspace'].CollidePoint((x,y)):
		self.UI['text_entry'].pop()

	    if self.UI['space'].CollidePoint((x,y)):
		if len(self.hasFocus.getText()) < self.ServerNameMax:
		    self.UI['text_entry'].push(" ")
		    
		

	return self
    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
	res = self.res

	# get/load the font
	self.font = FontManager().loadFont( 'Basic' )

	self.UI = {}
	self.UI['title'] = UIText("Join a Server"\
		, pos=[res[0]*.01,res[1]*.10], font=self.font, scale=0.05)
	self.UI['back'] = UIText("Back"\
		, pos=[res[0]*0.1, res[1]*0.9], font=self.font, scale=0.03)
	self.UI['back'].center()
	self.UI['join'] = UIText("Join"\
		, pos=[res[0]*0.9, res[1]*0.9], font=self.font, scale=0.03)
	self.UI['join'].center()
	self.UI['backspace'] = UIText("BKSP"\
		, [res[0]*0.24, res[1]*0.65], self.font, 0.03)
	self.UI['space'] = UIText("SPACE"\
		, [res[0]*0.6, res[1]*0.65], self.font, 0.03)
	self.UI['ip_entry'] = UIText(self.engine.host\
		, [res[0]*0.5, res[1]*0.3], self.font, 0.03)
	self.UI['ip_entry'].center()
	
	self.selected = 'join'

	self.entryBox = UIImage("box.png",
				pos=[res[0]*0.5, res[1]*0.3],
				size=[(0.03*res[0])*12, 0.05*res[1]])
	self.entryBox.center()

	self.titleBGImg = UIImage("TitleScreenBG.png"\
		, pos=[0,0], size=res)

	# This is the text input that currently has focus; 
	#   the default is text_entry
	self.hasFocus = self.UI['ip_entry']

	# Here, a hash is created containing a UIText for each letter
	#   in the alphabet.
	# They are spaced and stacked on the screen so that they lie
	#   in 3 rows of 8, 9, and 9 letters each.

	self.screenKeys = {"." : UIText(".", 
				    [res[0]*0.5, res[1]*0.65],
				    self.font, 0.06) }
	self.screenKeys["."].center()
	self.screenKeys["localhost"] = UIText("localhost", 
						[res[0]*0.33, res[1]*0.48],
						self.font, 0.04)

	lettPos = [res[0]*0.3, res[1]*0.56]
	lettScale = 0.04
	for letter in map( str, range(10) ):
	    # add the letter to the hash
	    self.screenKeys[letter] = UIText(letter, 
					    [lettPos[0], lettPos[1]],
					    self.font, lettScale)
	    lettPos[0] += lettScale+(lettScale*res[0])  # increment the x pos

	self.keysBox = UIImage("box.png",
			    pos=list(self.screenKeys["5"].pos),
			    size=[ (lettScale*res[0])*15, (lettScale*res[1])*7 ] )
	self.keysBox.center()    
class JoinServerState(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
	res = self.res

	# get/load the font
	self.font = FontManager().loadFont( 'Basic' )

	self.UI = {}
	self.UI['title'] = UIText("Join a Server"\
		, pos=[res[0]*.01,res[1]*.10], font=self.font, scale=0.05)
	self.UI['back'] = UIText("Back"\
		, pos=[res[0]*0.1, res[1]*0.9], font=self.font, scale=0.03)
	self.UI['back'].center()
	self.UI['join'] = UIText("Join"\
		, pos=[res[0]*0.9, res[1]*0.9], font=self.font, scale=0.03)
	self.UI['join'].center()
	self.UI['backspace'] = UIText("BKSP"\
		, [res[0]*0.24, res[1]*0.65], self.font, 0.03)
	self.UI['space'] = UIText("SPACE"\
		, [res[0]*0.6, res[1]*0.65], self.font, 0.03)
	self.UI['ip_entry'] = UIText(self.engine.host\
		, [res[0]*0.5, res[1]*0.3], self.font, 0.03)
	self.UI['ip_entry'].center()
	
	self.selected = 'join'

	self.entryBox = UIImage("box.png",
				pos=[res[0]*0.5, res[1]*0.3],
				size=[(0.03*res[0])*12, 0.05*res[1]])
	self.entryBox.center()

	self.titleBGImg = UIImage("TitleScreenBG.png"\
		, pos=[0,0], size=res)

	# This is the text input that currently has focus; 
	#   the default is text_entry
	self.hasFocus = self.UI['ip_entry']

	# Here, a hash is created containing a UIText for each letter
	#   in the alphabet.
	# They are spaced and stacked on the screen so that they lie
	#   in 3 rows of 8, 9, and 9 letters each.

	self.screenKeys = {"." : UIText(".", 
				    [res[0]*0.5, res[1]*0.65],
				    self.font, 0.06) }
	self.screenKeys["."].center()
	self.screenKeys["localhost"] = UIText("localhost", 
						[res[0]*0.33, res[1]*0.48],
						self.font, 0.04)

	lettPos = [res[0]*0.3, res[1]*0.56]
	lettScale = 0.04
	for letter in map( str, range(10) ):
	    # add the letter to the hash
	    self.screenKeys[letter] = UIText(letter, 
					    [lettPos[0], lettPos[1]],
					    self.font, lettScale)
	    lettPos[0] += lettScale+(lettScale*res[0])  # increment the x pos

	self.keysBox = UIImage("box.png",
			    pos=list(self.screenKeys["5"].pos),
			    size=[ (lettScale*res[0])*15, (lettScale*res[1])*7 ] )
	self.keysBox.center()    


    def renderFrame(self):
	""" RenderFrame - Base Class """

	Screen().drawThis( self.titleBGImg )
	Screen().drawThis( self.entryBox )
	Screen().drawThis( self.keysBox )

	selectionBox = UIImage("box.png",
				pos=self.UI[self.selected].pos,
				size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2])
	selectionBox.center()
	Screen().drawThis( selectionBox )

	for uiObj in self.UI.values():
	    # draw the background image firstly
	    Screen().drawThis( uiObj )

	for letter in self.screenKeys.values():
	    Screen().drawThis( letter )

	return self

    def on_key_press(self, key, x, y):
	"""
	On key press
	"""

	# Esc
	if key == chr(27):
	    return TitleScreenState(self.engine)

	# Enter
	elif key == chr(13):
	    if self.selected == "back":
		return TitleScreenState(self.engine)
	    elif self.selected == "join":
		self.engine.host = self.UI['ip_entry'].getText()
		return ChoosePlayerState(self.engine)

	elif key >= 100 and key <= 103:
	    if self.selected == "back":
		self.selected = "join"
	    elif self.selected == "join":
		self.selected = "back"

	elif self.hasFocus != None:
	    if key == chr(8) or key == chr(127):    # BS or Del
		if self.UI['ip_entry'].getText() == "localhost":
		    self.UI['ip_entry'].setText( "" )
		else:
		    self.hasFocus.pop()
	    elif key == ".":
		self.hasFocus.push(".")
	    elif key.isdigit():
		if len( self.UI['ip_entry'].getText() ) < 15:
		    if self.UI['ip_entry'].getText() == "localhost":
			self.UI['ip_entry'].setText( "" )
		    self.hasFocus.push(key)

	return self


    def on_mouse_motion(self, x, y):
	"""
	On mouse motion
	"""
	if self.UI['back'].CollidePoint( (x,y) ):
	    self.selected = "back"
	    
	elif self.UI['join'].CollidePoint( (x,y) ):
	    self.selected = "join"

	return self

    def on_mouse(self, button, state, x, y):
	"""
	On mouse press
	"""
	if button == GLUT_LEFT_BUTTON and state == GLUT_UP:
	    if self.UI['back'].CollidePoint((x,y)):
		return TitleScreenState(self.engine)

	    if self.UI['join'].CollidePoint((x,y)):
		self.engine.host = self.UI['ip_entry'].getText()
		return ChoosePlayerState(self.engine)

	    # test for user clicks on the screen keys
	    if len( self.UI['ip_entry'].getText() ) < 15:
		for letter in self.screenKeys:
		    if self.screenKeys[letter].CollidePoint((x,y)):
			if letter == "localhost":
			    self.UI['ip_entry'].setText("localhost")
			else:
			    if self.UI['ip_entry'].getText().isalpha():
				self.UI['ip_entry'].setText( "" )
			    self.UI['ip_entry'].push( letter )

	    if self.UI['backspace'].CollidePoint((x,y)):
		if self.UI['ip_entry'].getText() == "localhost":
		    self.UI['ip_entry'].setText( "" )
		else:
		    self.UI['ip_entry'].pop()

	    if self.UI['space'].CollidePoint((x,y)):
		self.UI['ip_entry'].push(" ")
		    

	return self