inherit "/std/room";
#define MAXITEMS 40
mapping room_cont;
int max_num=4;
void create() {
room_cont = ([ ]);
max_num = 5;
::create();
call_out("test_cont",0);
}
int query_max_num() { return max_num; }
void set_max_num(int i) { max_num = i; }
void add_thing(object ob) {
string shr;
int value;
object *list;
if (!ob || environment(ob) != this_object())
return ;
shr = (string)ob->short();
value = (int)ob->query_value();
if (!room_cont[shr]) {
room_cont[shr] = ([ value : ({ ob }) ]);
return ;
}
if (!room_cont[shr][value])
room_cont[shr][value] = ({ ob });
else
if (sizeof(room_cont[shr][value]) > max_num)
call_out("do_dest", 0, ob);
else
room_cont[shr][value] += ({ ob });
list = all_inventory(this_object());
if(sizeof(list) > MAXITEMS) call_out("do_dest",0,list[0]);
return ;
}
void do_dest(object ob) {
if (ob && !interactive(ob) && environment(ob) == this_object())
ob->dest_me();
}
/* for updateing etc.... */
void test_cont() {
int i;
object *obs;
obs = all_inventory();
for (i=0;i<sizeof(obs);i++)
add_thing(obs[i]);
}
void remove_thing(object ob) {
mixed *arr;
int i, val;
string sh;
if (!ob || environment(ob) == this_object())
return ;
sh = (string)ob->short();
val = (int)ob->query_value();
if (!room_cont[sh])
return ;
if (!room_cont[sh][val])
return ;
arr = room_cont[sh][val];
if ((i = member_array(ob, arr)) == -1)
return ;
if (sizeof(arr) <= 1) {
room_cont[sh] = m_delete(room_cont[sh], val);
if (!m_sizeof(room_cont[sh]))
room_cont = m_delete(room_cont, sh);
} else
room_cont[sh][val] = delete(arr, i, 1);
}
int test_add(object ob, int flag)
{
call_out("add_thing", 0, ob);
return ::test_add(ob,flag);
}
void event_exit(object ob) {
call_out("remove_thing", 0, ob);
}