/*  Another efun...   /Gwendolyn@nannymud.lysator.liu.se 2000  */

-----------------------------------------------------------------

NAME
	get_spec_obj - return an array with objects matching pattern
		       with consideration to mask

SYNOPSIS
	object *get_spec_obj(int mask, int pattern)

DESCRIPTION
	Scans through all objects in the mud searching for objects
	which match pattern with consideration to mask. Found objects
	are returned in an array. These bytevalues are legal:
	   
		   1  ->  object with heart_beat running
		   4  ->  living object
		   8  ->  cloned from a master copy
		  32  ->  swapped to file

WARNING
	DON'T use it to find all swapped objects and then reference
	them since that is very costly! A good idea is to restrict
	usage of this function to arches, master.c or whatever.

---------------------------------------------------------------

struct vector *get_spec_obj(int mask, int choice)
{
   struct vector *spec_obj;
   struct object *obj;
   int flag, number = 0;
   mask = (mask & (O_HEART_BEAT | O_ENABLE_COMMANDS | O_CLONE | O_SWAPPED));
   choice = (choice & mask);
   for(obj = obj_list; obj; obj = obj->next_all)
   {
      flag = (obj->flags & mask);
      if(!(obj->flags & O_DESTRUCTED) && flag == choice)
         number++;
   }
   if(!number)
      return allocate_array(0);
   spec_obj = allocate_array(number);
   for(obj = obj_list; obj; obj = obj->next_all)
   {
      flag = (obj->flags & mask);
      if(obj->flags & O_DESTRUCTED || flag != choice)
         continue;
      --number;
      spec_obj->item[number].type = T_OBJECT;
      spec_obj->item[number].u.ob = obj;
      add_ref(obj, "get_spec_obj");
   }
   return spec_obj;
}