anchor.diff:  	proc/close_spawn_windows()
   		src << browse(null, "window=latechoices") //closes late choices window
   		src << browse(null, "window=playersetup") //closes the player setup window
  +
  +#define MAX_ALIEN_PLAYER_PERCENT 20
  +
  +//cael - this should probably be moved to ticker or somewhere, but it's fine here for now
  +//limits the number of alien players in a game
  +/proc/GetAvailableAlienPlayerSlots()
  +	var/num_players = 0
  +
  +	//check new players
  +	for(var/mob/new_player/N in world)
  +		if(N.preferences && N.ready)
  +			num_players++
  +
  +	//check players already spawned, only count humans or aliens
  +	for(var/mob/living/carbon/human/H in world)
  +		if(H.ckey)
  +			num_players++
  +
  +	return round(num_players * (MAX_ALIEN_PLAYER_PERCENT / 100))
  
positive.code: 			data_core.manifest_inject(character)
  			ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc.	//TODO!!!!! ~Carn
  			AnnounceArrival(character, rank)
  		else
  			character.Robotize()
  		del(src)
  
  
  	proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank)
  		if (ticker.current_state == GAME_STATE_PLAYING)
  
negative.code: 			if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
  				usr << "/red The round is either not ready, or has already finished..."
  				return
  
  			if(preferences.species != "Human")
  				if(!is_alien_whitelisted(src, preferences.species) && config.usealienwhitelist)
  					src << alert("You are currently not whitelisted to play [preferences.species].")
  					return 0
  				else if(GetAvailableAlienPlayerSlots() >= 1)
  					src << "\red Unable to join game. Too many players have already joined as aliens."
  
  			LateChoices()
  
  		if(href_list["manifest"])
  