def furball(self, mission, seed=0):
		globalvars.disable_menu = True #Disable the standard menu for now.
		rd.seed(seed) #Fix the seed for the random number generator.
		wipeOldScenario(); resetDust()
		globalvars.BGIMAGE = image_list['bggalaxies'].convert()
		#Make a few enemies near the player
		mindist = 200
		maxdist = 800
		#Make enemy units:
		points_to_win = 3 #Same as the number of enemies
		for _ in xrange(points_to_win):
			x,y = getCoordsNearLoc(globalvars.player.rect.center, mindist, maxdist, maxdist)
			enemy_ship = hudHelpers.getNewEnemy(x,y,'destroyer',2,2,2,2,2)
			hudHelpers.addNewEnemyToWorld(enemy_ship)
		#Make the score keeper:
		time_limit = 30 #time limit in seconds
		text = ['FURBALL COMPLETED']
		#Display timer and score count with the following:
		globalvars.score_keeper = displayUtilities.TimeLimitDisplay(text, \
			points_to_win=points_to_win, time_limit=time_limit, mission=mission)
		globalvars.intangibles_top.add(globalvars.score_keeper)
		#Draw the new background and flip the whole screen.
		globalvars.screen.blit(globalvars.BGIMAGE, (0,0))
		pygame.display.flip()
		#Display the intro to the mission
		globalvars.menu.setBasicTextPanel(['You have '+str(time_limit)+' seconds to defeat 3 enemies to win.'])
def resetDust(use_top=False):
	#Kill all the old dust.
	for d in globalvars.intangibles_bottom:
		if d.is_a == globalvars.DUST:
			d.kill()
	for d in globalvars.intangibles_top:
		if d.is_a == globalvars.DUST:
			d.kill()
	#Make 50 dust particles scattered around the player.
	for _ in range(50):
		x,y = getCoordsNearLoc(globalvars.player.rect.center, 50, 
				globalvars.WIDTH, globalvars.WIDTH)
		temp = objInstances.Dust(x=x, y=y, width=1, height=1,\
				 color=colors.white)
		if use_top:
			globalvars.intangibles_top.add(temp)
		else:
			globalvars.intangibles_bottom.add(temp)
	def asteroids(self, mission, seed=0):
		''' '''
		globalvars.disable_menu = True #Disable the standard menu for now.
		rd.seed(seed) #Fix the seed for the random number generator.
		wipeOldScenario(); resetDust(use_top=True)
		rocks = ['bigrock','medrock','smallrock','gold','silver']
		#Reset the player's location to 0,0 and his speed to zero
		globalvars.player.loc = (0.0, 0.0)
		globalvars.player.speed = 0.0
		globalvars.player.targetSpeed = 0.0
		#Define an arena 2000 pixels across for the player and all the asteroids
		#to bounce around inside
		globalvars.arena = 1000 #1000 pixel radius centered at zero, zero.
		#Make the background color blue so that we can draw a black circle 
		#to show where the arena is located.
		globalvars.BGCOLOR = colors.blue
		#Draw a black circle and put it in intangibles to show the limits 
		#of the arena
		temp = objInstances.FixedCircle(x=0, y=0, radius=globalvars.arena, color=colors.black)
		globalvars.intangibles_bottom.add(temp)
		#Make 10 rocks centered around, but not on the player
		for _ in range(10):
			#Select a rock type
			rock = rocks[rd.randint(0, len(rocks)-1)]
			#Get the coordinates of the rock
			mindist = 200
			maxdist = 800
			x,y = getCoordsNearLoc(globalvars.player.rect.center, mindist, maxdist, maxdist)
			#Make the rock
			temp = objInstances.Asteroid(x=x, y=y, image_name=rock)
			globalvars.tangibles.add(temp); globalvars.whiskerables.add(temp)
		time_limit = 30 #time limit in seconds
		points_to_win = 50
		text = ['ASTEROIDS COMPLETED']
		#Display timer and score count with the following:
		globalvars.score_keeper = displayUtilities.TimeLimitDisplay(text, \
			points_to_win=points_to_win, time_limit=time_limit, mission=mission)
		globalvars.intangibles_top.add(globalvars.score_keeper)
		#Draw the new background and flip the whole screen.
		globalvars.screen.fill(globalvars.BGCOLOR)
		pygame.display.flip()
		#Display the intro to the mission
		globalvars.menu.setBasicTextPanel(['You have '+str(time_limit)+' seconds to collect '+str(points_to_win)+' points.', 'Blow up asteroids and collect gems to earn points.'])
def populateSpace(
    objects=None,
    width=1000,
    height=1000,
    center=(0, 0),
    seed=0.0,
    ship_tech=0,
    engine_tech=0,
    weapon_tech=0,
    missile_tech=0,
    mine_tech=0,
    fuel_depots=None,
    planets=None,
):
    """This is the first draft of a method to randomly populate space with objects.
	This is currently called by the racing minigame.
	Pre: objects is a dictionary containing natural numbers specifying how
	many of each of a variety of objects should be placed in the space.
	width is a nat specifying the width of the rectangle of space to be populated.
	height is a nat specifying the height.
	center is where the center of the rectangle should be positioned.
	Post: """
    # print 'TESTING populate '+str(width)+'x'+str(height)+' space centered at '+str(center)
    # Test variables START
    TESTING = False  # True #Turn on and off testing.
    area_covered = 0
    num_removed = 0
    # Test variables END

    rd.seed(seed)  # Fix the seed for the random number generator.

    # Populate space in a semi narrow corridor between the player and the finish line
    course_length = width / 2  # actually half length because getCoordsNearLoc doubles it
    course_height = height / 2  # actually half height because getCoordsNearLoc doubles it

    physical_objs = []

    # Make one NPC just headed for a warp point.
    x, y = geometry.getCoordsNearLoc(center, 0, course_length, course_height)
    # Generate a pirate ship with the node's level of tech
    temp = getNewEnemy(x, y, "destroyer", ship_tech, engine_tech, weapon_tech, missile_tech, mine_tech)
    temp.team = globalvars.team_manager.default_neutral_team
    temp.state = ship.GOTHRUWARP_STATE
    physical_objs.append(temp)

    for _ in xrange(objects["capital_ship"]):
        x, y = geometry.getCoordsNearLoc(center, 0, course_length, course_height)
        enemy_ship = getNewCapitalShip(x, y)
        physical_objs.append(enemy_ship)

    for _ in xrange(objects["enemy"]):
        x, y = geometry.getCoordsNearLoc(center, 0, course_length, course_height)
        # Generate a pirate ship with the node's level of tech
        temp = getNewEnemy(x, y, "destroyer", ship_tech, engine_tech, weapon_tech, missile_tech, mine_tech)
        physical_objs.append(temp)

    for _ in xrange(objects["crystal"]):
        x, y = geometry.getCoordsNearLoc(center, 0, course_length, course_height)
        physical_objs.append(objInstances.Gem(x=x, y=y, speed_min=0.0, speed_max=0.0))

    for _ in xrange(objects["large_asteroid"]):
        x, y = geometry.getCoordsNearLoc(center, 0, course_length, course_height)
        physical_objs.append(objInstances.Asteroid(x=x, y=y, speed_min=0.0, speed_max=0.0, image_name="bigrock"))

    for _ in xrange(objects["medium_asteroid"]):
        x, y = geometry.getCoordsNearLoc(center, 0, course_length, course_height)
        physical_objs.append(objInstances.Asteroid(x=x, y=y, speed_min=0.0, speed_max=0.0, image_name="medrock"))

    for _ in xrange(objects["small_asteroid"]):
        x, y = geometry.getCoordsNearLoc(center, 0, course_length, course_height)
        physical_objs.append(objInstances.Asteroid(x=x, y=y, speed_min=0.0, speed_max=0.0, image_name="smallrock"))

    for _ in xrange(objects["gold_metal"]):
        x, y = geometry.getCoordsNearLoc(center, 0, course_length, course_height)
        physical_objs.append(objInstances.Asteroid(x=x, y=y, speed_min=0.0, speed_max=0.0, image_name="gold"))

    for _ in xrange(objects["silver_metal"]):
        x, y = geometry.getCoordsNearLoc(center, 0, course_length, course_height)
        physical_objs.append(objInstances.Asteroid(x=x, y=y, speed_min=0.0, speed_max=0.0, image_name="silver"))

    for _ in xrange(objects["health"]):
        x, y = geometry.getCoordsNearLoc(center, 0, course_length, course_height)
        physical_objs.append(objInstances.HealthKit(x, y))

    if not fuel_depots is None:
        for f in fuel_depots:
            physical_objs.append(f)

    if not planets is None:
        for p in planets:
            physical_objs.append(p)

            # Prevent collisions.
    nudgeApart(physical_objs)

    # Put everything in tangibles and whiskerables unless they collide with any tangibles.
    toreturn = pygame.sprite.Group()
    for p in physical_objs:
        temp = pygame.sprite.spritecollideany(p, globalvars.tangibles)
        # print temp
        if temp is None:
            if TESTING:
                area_covered += math.pi * p.collisionradius ** 2
            # Set the ship's health bar. This must be done right
            # before adding any ship to tangibles
            # It cannot be done earlier in this method because a ship
            # might collide with an object and not be added, but setHealthBar
            # puts the health bar in intangibles so the health bar ends up
            # floating in space with no one to ever remove it.
            if p.is_a == globalvars.SHIP or p.is_a == globalvars.CAPITALSHIP:
                addNewEnemyToWorld(p, add_to_team=p.team)
            else:
                globalvars.tangibles.add(p)
                globalvars.whiskerables.add(p)
            toreturn.add(p)
        else:
            if TESTING:
                num_removed += 1

            # Print testing feedback
    if TESTING:
        print "Area covered: " + str(area_covered)
        temp = course_length * 2 * course_height * 2
        print "compared to the total area " + str(temp)
        print "fraction of area covered " + str(area_covered / temp)
        print "Objects removed: " + str(num_removed)
        print "from a total of " + str(sum(objects)) + " objects."
        print "Fraction of objects removed: " + str(float(num_removed) / float(sum(objects)))
    return toreturn
	def update(self):
		self.countdown -= 1
		globalvars.player.destination = self.player_destination
		if self.countdown < 0:
			#reset countdown
			self.countdown = globalvars.FPS*5
			#Transition to next phase
			if self.phase == 0:
				#Puts in dust and gives player ship motion.
				resetDust()
				globalvars.player.theta = 0.0
				globalvars.player.speed = 10.0
				globalvars.player.targetSpeed = 10.0
				self.phase += 1
			elif self.phase == 1:
				#puts in rocks at fixed places.
				numbers = dict()
				numbers['enemy'] = 0
				numbers['crystal'] = 5
				numbers['large_asteroid'] = 20
				numbers['medium_asteroid'] = 30
				numbers['small_asteroid'] = 40
				numbers['gold_metal'] = 5
				numbers['silver_metal'] = 6
				numbers['health'] = 7
				numbers['capital_ship'] = 0
				#Populate space in a semi narrow corridor between the player and the finish line
				course_length = 8000 #pixels
				course_height = 1000 #pixels
				#Midway between player and destination
				midway = (course_length/2, 0)
				hudHelpers.populateSpace(objects=numbers,\
					width=course_length, \
					height=course_height,\
					center=globalvars.player.rect.center,\
					seed=0)
				self.phase += 1
			elif self.phase == 2:
				#puts in ships at fixed places.
				#puts in rocks at fixed places.
				numbers = dict()
				numbers['enemy'] = 10
				numbers['crystal'] = 0
				numbers['large_asteroid'] = 0
				numbers['medium_asteroid'] = 0
				numbers['small_asteroid'] = 0
				numbers['gold_metal'] = 0
				numbers['silver_metal'] = 0
				numbers['health'] = 0
				numbers['capital_ship'] = 1
				#Populate space in a semi narrow corridor between the player and the finish line
				course_length = 8000 #pixels
				course_height = 1000 #pixels
				#Midway between player and destination
				midway = (course_length/2, 0)
				hudHelpers.populateSpace(objects=numbers,\
					width=course_length, \
					height=course_height,\
					center=globalvars.player.rect.center,\
					seed=0)
				self.phase += 1
			elif self.phase == 3:
				#clears all sprite groups again.
				wipeOldScenario()
				#Add self back in
				globalvars.intangibles_bottom.add(self)
				#Draw the new background and flip the whole screen.
				globalvars.screen.fill(globalvars.BGCOLOR)
				pygame.display.flip()
				resetDust()
				#5 seconds of lots of explosions everywhere.
				self.phase += 1
			elif self.phase == 4:
				#prints graphical data straight to file.
				if sys.platform != 'darwin': #This is not working on my mac for some reason
					import matplotlib.pyplot as plt
					plt.plot(globalvars.dirty_rect_size)
					plt.xlabel('Frames')
					plt.ylabel('Number of dirty rects')
					plt.savefig('profiling/dirty_rect_size.jpeg') #plt.show()
					plt.clf()
					plt.plot(globalvars.time_lapses, 'ro')
					plt.xlabel('Frames')
					plt.ylabel('Tick length')
					plt.savefig('profiling/tick_lengths.jpeg') #plt.show()
					plt.clf()
				exit()
		if self.phase == 4:
			x,y = getCoordsNearLoc(globalvars.player.rect.center, 50, 
				globalvars.WIDTH, globalvars.WIDTH)
			globalvars.intangibles_top.add(objInstances.Explosion(x=x,y=y))
	def __init__(self, myid, x, y):
		''' '''
		self.id = myid
		self.x = x
		self.y = y
		self.loc = (x,y)
		#list of id,location pairs this node is connected to
		self.connections = []

		#Parameters for the faction (if any) that owns this node:
		self.owner = -1 #Id of the faction that owns this node.
		self.flag = ''
		#The following arrays determine how many items of the given tech level 
		#are produced at this node per turn.
		#For example, if self.ship_production[4] = 2 then 2 class 4 ships will be produced.
		self.ship_production = [0 for _ in range(len(ship.ship_class_names))]
		self.engine_production = [0 for _ in range(len(ship.engine.engine_class_names))]
		self.weapon_production = [0 for _ in range(len(ship.weapon.weapon_class_names))]
		self.missile_production = [0 for _ in range(len(ship.missile.missile_class_names))]
		self.mine_production = [0 for _ in range(len(ship.mine.mine_class_names))]
		#How many of these tech items are at this node.
		#Production values are added into this array each turn.
		self.ship_tech = [0 for _ in range(len(ship.ship_class_names))]
		self.engine_tech = [0 for _ in range(len(ship.engine.engine_class_names))]
		self.weapon_tech = [0 for _ in range(len(ship.weapon.weapon_class_names))]
		self.missile_tech = [0 for _ in range(len(ship.missile.missile_class_names))]
		self.mine_tech = [0 for _ in range(len(ship.mine.mine_class_names))]

		#Parameters to distinguish nodes by parameterizing the infinite space generator.
		#Randomly initialize these for now:
		rd.seed(self.id)
		self.description = 'Unknown'
		self.piracy = rd.uniform(0.0, 4.0) #chance to generate pirate ships
		self.pirate_caps = rd.uniform(0.0, 1.2) #chance of generating pirate capital ships
		self.amt_debris = rd.uniform(3.0, 15.0) #chance of asteroids
		self.amt_wealth = rd.uniform(0.5, 3.0) #chance of gems, health, and rich asteroids
		#The class of pirate ships generated at this node.
		self.pirate_weapon_tech = rd.randint(0, len(ship.weapon.weapon_class_names) / 2)
		self.pirate_missile_tech = rd.randint(0, len(ship.missile.missile_class_names) / 2)
		self.pirate_mine_tech = rd.randint(0, len(ship.mine.mine_class_names) / 2)
		self.pirate_ship_tech = rd.randint(0, len(ship.ship_class_names) / 2)
		self.pirate_engine_tech = rd.randint(0, len(ship.engine.engine_class_names) / 2)

		#Nodes will store the references to the following objects at their location
		self.warps=[]
		self.planets=[]
		self.fuel_depots=[]

		#For now make 2 planets and 2 fuel stops at each node within a 4000 pixel radius of the node center
		num_to_make = 2
		mindist = 500
		radius = 4000
		for _ in range(num_to_make):
			x,y = getCoordsNearLoc(self.loc, mindist, radius, radius)
			self.planets.append(objInstances.Planet(x, y))
		for _ in range(num_to_make):
			x,y = getCoordsNearLoc(self.loc, mindist, radius, radius)
			self.fuel_depots.append(objInstances.GasStation(x, y))

		#Objects that can appear in space around this node
		self.obstacles = dict()
		self.obstacles['enemy'] = 0
		self.obstacles['crystal'] = 0
		self.obstacles['large_asteroid'] = 0
		self.obstacles['medium_asteroid'] = 0
		self.obstacles['small_asteroid'] = 0
		self.obstacles['gold_metal'] = 0
		self.obstacles['silver_metal'] = 0
		self.obstacles['health'] = 0
		self.obstacles['capital_ship'] = 0

		#Now initialize the values to be used to populate space based on the above values.
		self.initialize()