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]