def find_filtered_monsters(self):
		filtered_monsters = []

		# Turn criteria for monsters into check lists
		check_environment   = (lists.environments_list   if self.environment.get()=='Any'   else [self.environment.get()])
		check_creature_type = (lists.creature_types_list if self.creature_type.get()=='Any' else [self.creature_type.get()])
		check_creature_size = (lists.creature_sizes_list if self.creature_size.get()=='Any' else [self.creature_size.get()])

		# Search all monsters and see which ones work
		for monster_name, monster in self.monsters_dict.iteritems():
			
			# Check if allowed from all the criteria
			if (    (monster.environment=='Any'   or (monster.environment in check_environment))
				and (monster.creature_type=='Any' or (monster.creature_type in check_creature_type))
				and (monster.creature_size=='Any' or (monster.creature_size in check_creature_size))
				and (lists.cr_rating_float_from_string(monster.challenge_rating)<=lists.cr_rating_float_from_string(self.max_challenge_rating.get()))
				):
				filtered_monsters.append(monster)

		# Sort by chosen method
		filtered_monsters = self.sort_filtered_monsters(filtered_monsters)
		return filtered_monsters
	def sort_filtered_monsters(self, filtered_monsters):

		# Make the keys to sort by
		sorted_pairs = []
		for index, monster in zip(range(len(filtered_monsters)),filtered_monsters):
			key = lists.cr_rating_float_from_string(monster.challenge_rating)
			sorted_pairs.append( (index, key) )

		# Sort & extract just the indices
		sorted_pairs = sorted(sorted_pairs,key=lambda x: x[1],reverse=True)
		sorted_indices = [pair[0] for pair in sorted_pairs]

		# Sort the monsters
		filtered_monsters = [filtered_monsters[index] for index in sorted_indices]
		return filtered_monsters
	def get_encounter_xp(self):
		crlist=[]
		#get all monster crs, xp done per monster rather than combined
		for quant, monster in self.chosen_monsters:
			for i in range(quant):
				crlist.append(lists.cr_rating_float_from_string(monster.challenge_rating))
		#this function should do xp per character. for now test with a single level 1 character
		level=4
		partysize=1
		xptot=0
		#work out xp for all monsters and add to total. Then divide by number of players
		for cr in crlist:
			if cr >= 1:
				xptot+=int(lists.xplists[level-1][int(cr-1)])
		xptot/=partysize
		return xptot
	def get_encounter_CR_level(self):

		# Count each type of CR level
		crlist = []		
		for quant, monster in self.chosen_monsters:
			for i in range(quant):
				crlist.append(lists.cr_rating_float_from_string(monster.challenge_rating))

		# loop over monster crs and join until there is only one
		matchflag=1
		newcrlist=[]
		while len(crlist)>1:

			#loop over monster crs and join any that are same value
			while matchflag>0:
				matches=0
				for i in range(0,20):
					number=crlist.count(i)
					if number>1:
						j=lists.numberlist[number-2].index(i)
						if newcrlist.count(j+1) >0:
							matches+=1
						newcrlist.append(j+1)
					if number==1:
						newcrlist.append(i)
				crlist=newcrlist
				newcrlist=[]
				if matches==0:
					matchflag=0
					
			#now only different crs remain, combine pairs using function from lists
			if len(crlist) > 1:
				crlist.sort()
				print crlist
				newcrlist=[lists.combine_cr_pair(crlist[0],crlist[1])]
				if len(crlist)>2:
					for i in range(2,len(crlist)):
						newcrlist.append(crlist[i])
				#update cr list ready for next iteration, starting again from combining matches
				crlist=newcrlist
				newcrlist=[]
		return crlist[0]