/* command, trial out by Turrican for a commands daemon. */ #include <move_failures.h> #define MAX_PUT_NUMBER 20 inherit COMMAND_BASE; int is_in_me_or_here(object ob, object me) { if (!environment(ob)) { return 1; } while (ob && ob != me && ob != environment(me) && !living(ob)) { ob = environment(ob); } return ob == me || ob == environment(me); } /* in_in_me_or_here() */ mixed cmd(mixed *indir, string *indir_match, string *args) { string person; string thing; string sh; string con; int tot; int max; object *per; object *ret; object *fail; object pobj; object ob; object *obs; object *succ; object *too_many; con = args[1]; per = indir[1]; thing = indir_match[0]; person = indir_match[1]; succ = ({ }); // Check to see if they have too many drated objects. if (sizeof(indir[0]) > MAX_PUT_NUMBER) { too_many = indir[0][MAX_PUT_NUMBER..]; indir[0] = indir[0][0..MAX_PUT_NUMBER - 1]; } foreach(pobj in per) { if ( living( pobj ) && !pobj->query_living_container() ) { tell_object(TP, "You cannot put things "+con+" living things.\n"); continue; } obs = indir[0]; obs -= per; if (!sizeof(obs)) { tell_object(TP, "Nothing to " + query_verb() + " " + con + " " + inside_the_short(pobj) +".\n" ); continue; } if (!is_in_me_or_here(pobj, this_player())) { add_failed_mess("Cannot $V $I " + con+ " " + pobj->the_short() + ".\n", obs); continue; } ret = ({ }); fail = ({ }); foreach(ob in obs) { if ( member_array( ob, succ ) > -1 ) { continue; } if(function_exists("do_put", ob) || function_exists("command_control", ob)) { if (function_exists("do_put", ob)) { max = (int)call_other(ob, "do_put", pobj, thing, person, ({ thing, person }), "<direct:object> " + con + " <indirect:object>"); } else { max = ob->command_control("put", pobj, thing, person, ({ thing, person }), "<indirect:object> " + con + " <indirect:object>"); } if (max == 0) { fail += ({ ob }); continue; } } if (pobj->query_closed() || ob->move(pobj) != MOVE_OK) { fail += ({ ob }); } else { ret += ({ ob }); tot += (int)ob->query_weight(); } } if (sizeof(ret)) { succ += ret; sh = query_multiple_short(ret); add_succeeded_mess("$N $V $I "+con+" "+ inside_the_short(pobj)+ ".\n", ret); } if (sizeof(fail)) { add_failed_mess("You cannot $V $I "+con+" "+ inside_the_short(pobj) +".\n", fail ); } } if (sizeof(too_many)) { if (sizeof(succ) > 0 ) { add_succeeded_mess(({ "You cannot handle more than " + query_num(MAX_PUT_NUMBER) + " objects with $V; discarding $I.\n", "" }), too_many); } else { add_failed_mess("You cannot handle more than " + query_num(MAX_PUT_NUMBER) + " objects with $V; discarding $I.\n", too_many); } } return sizeof(succ) > 0; } /* cmd() */ mixed *query_patterns() { return ({ "<indirect:object:me> {in|on|into} <indirect:object>", (: cmd($1, $3, $4) :) }); } /* query_patterns() */