/* Do not remove the headers from this file! see /USAGE for more info. */

inherit VERB_OB;

private object* get_all_readable_entry_items()
{
    object * res = ({});
    object * search;
    search = all_inventory(environment(this_body())) + all_inventory(this_body());
    while(sizeof(search))
    {
	res += filter(search, (:$1->has_entries():));
	search = filter(search, (:$1->inventory_accessable() && !$1->is_living():));
	search = decompose(map(search, (:all_inventory:)));
    }
    return res;
}

mixed can_read_obj(object ob) {
    return check_vision();
}

mixed can_read_word_obj(string p, object ob) {
    if (p != "in" && p != "from") return 0;
    return check_vision();
}

mixed can_read_word_str(string p, string s) {
    if (p != "about") return 0;
    return check_vision();
}

mixed can_read_str_word_obj(string str, string p, object ob) {
    if (p != "in" && p != "from") return 0;
    return check_vision();
}

mixed can_read_word_str_word_obj(string p1, string str, string p2, object ob) {
    if (p1 != "about") return 0;
    if (p2 != "in" && p2 != "from") return 0;
    return check_vision();
}

protected void read_it(object ob, string str) {
    string text;

    if(ob->is_gettable() && !try_to_acquire(ob))
	return;

    if (str)
	text = ob->read_entry(str);
    else
	text = ob->read();

    more(text);
}

void do_read_obj(object ob) {
    read_it(ob, 0);
}

void do_read_word_obj(string prep, object ob) {
    read_it(ob, 0);
}

void do_read_str_word_obj(string str, string p, object ob) {
    read_it(ob, str);
}

void do_read_word_str_word_obj(string p1, string str, string p2, object ob) {
    read_it(ob, str);
}

void do_read_word_str(string p, string str) {
    object* assumptions;

    assumptions = get_all_readable_entry_items();
    switch(sizeof(assumptions))
    {
    case 0:
	write("There is nothing here in which to look that up.\n");
	return;
    case 1:
	printf("[from %s]\n", assumptions[0]->the_short());
	read_it(assumptions[0], str);
	return;
    default:
	write("I'm not clear on what you're trying to read from.\n");
	return;
    }
}



void create()
{
    add_rules( ({ "OBJ:v", "from OBJ:v", "in OBJ:v", "about STR",
		  "about STR in OBJ:v", "about STR from OBJ:v",
	          "STR in OBJ:v", "STR from OBJ:v", }) );
}
