/* Do not remove the headers from this file! see /USAGE for more info. */ /* ** get.c */ #include <mudlib.h> #include <move.h> #include <setbit.h> inherit VERB_OB; private nomask void get_one(object ob, object with_ob, string rel) { mixed msg = ( with_ob ? ob->get_with(with_ob) : ob->get() ); mixed tmp; string where; string * aliases; if(rel) { tmp = environment(ob); // ADD ERROR CHECK FOR NO ENV ? where = tmp->query_relation(ob); // ADD ERROR CHECK FOR NO RELATION if(where!=rel) { aliases=tmp->query_relation_aliases(rel); if(!sizeof(aliases) || (member_array(where, aliases) <0)) { write("It's not " + rel + " there.\n"); return; } } } if (!msg) msg = "You aren't able to take it.\n"; if (stringp(msg)) { write(msg); return; } if(msg == MOVE_NO_ERROR) return; tmp = ob->move(this_body()); if (tmp == MOVE_OK) { write("Taken.\n"); ob->set_flag(TOUCHED); this_body()->other_action("$N $vtake a $o.", ob); return; } if (tmp == MOVE_NO_ERROR) return; if (tmp == MOVE_NO_ROOM) tmp = "Your load is too heavy.\n"; if (!tmp) tmp = "That doesn't seem possible.\n"; write(tmp); } void do_get_obj(object ob){ get_one(ob, 0, 0); } void do_get_obs(object array info) { handle_obs(info, (: get_one :)); } void do_get_obj_from_obj(object ob1, object ob2) { get_one(ob1, 0, 0); } void do_get_obs_from_obj(array info, object ob2) { handle_obs(info, (: get_one :)); } void do_get_obj_from_wrd_obj(object ob1, string rel, object ob2) { get_one(ob1, 0, rel); } void do_get_obs_from_wrd_obj(array info, string rel, object ob2) { handle_obs(info, (: get_one :), rel); } void do_get_obj_out_of_obj(object ob1, object ob2) { get_one(ob1, 0, 0); } void do_get_obs_out_of_obj(array info, object ob2) { handle_obs(info, (: get_one :)); } void do_get_obj_with_obj(object ob1, object ob2) { get_one(ob1, ob2, 0); } void do_get_wrd_obj(string prep,object ob) { ob->do_verb_rule("get", "WRD OBJ",prep,ob); } mixed can_get_wrd_str(string amount, string str) { int z; string s1, s2; sscanf(amount, "%d%s", z, s1); if (s1 != "" && amount != "all") return 0; sscanf(str, "%s %s", s1, s2); if (s2) { if (s2 != "coin" && s2 != "coins") return 0; return MONEY_D->is_denomination(s1); } return str == "coin" || str == "coins" || MONEY_D->is_denomination(str); } mixed can_get_wrd_str_from_obj(string amount, string str, object obj) { return can_get_wrd_str(amount, str); } void do_get_wrd_str_from_obj(string amount, string str, object obj) { string s; // If there are two words, we want the first sscanf(str, "%s %s", str, s); // direct_get_wrd_str_from_obj() or do_get_wrd_str() tested if // there is money there already present("money", obj)->get(amount, str); } void do_get_wrd_str(string amount, string str) { object obj; if (obj = present("money", environment(this_body()))) do_get_wrd_str_from_obj(amount, str, environment(this_body())); else write("There are no coins here.\n"); } mixed can_get_wrd(string prep) { if(!prep) return 0; if(!environment(this_body())) return 0; if(environment(this_body())->has_method(sprintf("get %s", prep))) return 1; return 0; } void do_get_wrd(string prep) { environment(this_body())->do_verb_rule("get","WRD",prep); } void create() { add_rules( ({ "OBS", "WRD STR", "OBS from OBJ", "OBS out of OBJ", "OBJ with OBJ", "WRD STR from OBJ", "WRD OBJ", "OBS from WRD OBJ" }), ({ "take", "carry", "pick up" }) ); add_rules( ({ "WRD" }) ); }