/* * NAME: filter_objects() * DESCRIPTION: the same as filter_array() */ static varargs mixed * filter_objects(mixed *arr, string func, object obj, mixed arg) { return filter_array(arr, func, obj, arg); } /* * NAME: file_name() * DESCRIPTION: based on object_name() */ static varargs string file_name(object obj) { string str; if (obj == 0) { obj = this_object(); } str = object_name(obj); return str[1 ..]; } /* * NAME: function_exists() * DESCRIPTION: based on function_object() */ static varargs string function_exists(string func, object obj) { string str; ARGCHECK(func, function_exists, 1); if (obj == 0) { obj = this_object(); } ARGCHECK(obj, function_exists, 2); str = function_object(func, obj); if (str != 0) { str = str[1 ..]; } return str; } /* * NAME: closurep() * DESCRIPTION: return 1 if the argument is a closure, 0 otherwise */ static int closurep(mixed value) { return (arrayp(value) && sizeof(value) != 0 && value[0] == LAMBDA); } /* * NAME: pointerp() * DESCRIPTION: return 1 if the argument is an array and not a closure */ static int pointerp(mixed value) { return (arrayp(value) && (sizeof(value) == 0 || value[0] != LAMBDA)); } /* * NAME: add_worth() * DESCRIPTION: dummy function */ static varargs void add_worth(int worth, object obj) { /* do nothing */ } /* * NAME: wizlist() * DESCRIPTION: show the wizlist */ static varargs void wizlist(string name) { show_wiz_list(); } /* * NAME: transfer() * DESCRIPTION: transfer an object */ static int transfer(mixed obj, mixed dest) { int weight; object from, from_env, dest_env; if (!objectp(obj)) { call_other(obj, "???"); obj = find_object(obj); } ARGCHECK(objectp(obj), transfer, 1); if (!objectp(dest)) { call_other(dest, "???"); dest = find_object(dest); } ARGCHECK(objectp(dest), transfer, 2); weight = obj->query_weight(); if (obj == 0) { return 3; } from = environment(obj); if (from != 0 && living(from) && (obj->drop() || obj == 0)) { return 2; } if (from != 0 && (from_env=environment(from)) != 0 && !living(from) && (!from->can_put_and_get() || from == 0)) { return 3; } if ((dest_env=environment(dest)) != 0 && !living(dest)) { if (obj->prevent_insert() || obj == 0) { return 4; } if (!dest->can_put_and_get() || dest == 0) { return 5; } } if (living(dest) && (!obj->get() || obj == 0)) { return 6; } if (dest_env != 0 && weight != 0 && (!dest->add_weight(weight) || dest == 0)) { return 1; } if (from != 0 && from_env != 0 && weight != 0) { from->add_weight(-weight); } move_object(obj, dest); return 0; } /* * NAME: present() * DESCRIPTION: find an object in an inventory */ static varargs object present(mixed item, object obj) { object env, *inv; int i, sz; if (obj == 0) { obj = this_object(); inv = query_inventory(this_object()); env = environment(); if (env != 0) { inv += query_inventory(env); } } else { inv = query_inventory(obj); } if (objectp(item)) { for (i = 0, sz = sizeof(inv); i < sz; i++) { if (item == inv[i]) { return item; } } } else { string str, dummy; int count; object invobj; ARGCHECK(stringp(item), present, 1); if (sscanf(item, "%s %d%s", str, count, dummy) == 3 && dummy == "") { item = str; } else { count = 1; } for (i = 0, sz = sizeof(inv); obj != 0 && i < sz; i++) { invobj = inv[i]; if (invobj->id(item) && --count == 0) { return invobj; } } } return 0; } /* * NAME: _F_destruct() * DESCRIPTION: let an object destruct itself */ nomask void _F_destruct() { if (PRIVILEGED()) { set_heart_beat(0); del_object(); ::destruct_object(this_object()); } } /* * NAME: destruct() * DESCRIPTION: destruct an object */ static void destruct(object obj) { private void move_or_destruct(object obj, object dest); object env, item, user; int weight; ARGCHECK(obj, destruct, 1); if (object_name(obj) == GLOBAL) { error("Cannot destruct the global object"); } else if (sscanf(object_name(obj), USER + "#%*s") != 0 && obj->query_player() != 0) { error("Cannot destruct user object"); } env = environment(obj); if (env != 0) { if (living(obj)) { env->exit(obj); } weight = obj->query_weight(); if (weight != 0) { env->add_weight(-weight); } while ((item=first_inventory(obj)) != 0) { move_or_destruct(item, env); } } else { while ((item=first_inventory(obj)) != 0) { MASTER->destruct_environment_of(item); if (item != 0 && item == first_inventory(obj)) { destruct(item); } } } env = environment(obj); if (env != 0) { lock(remove_inv(obj, env)); } if (function_object("valid_player", obj) == PLAYER) { user = obj->_Q_user(); if (user != 0) { lock(privileged = 1, user->set_player(0), privileged = 0); destruct(user); } } lock(privileged = 1, obj->_F_destruct(), privileged = 0); } /* * NAME: move_or_destruct() * DESCRIPTION: move or destruct an object */ private void move_or_destruct(object obj, object dest) { int res; object env; res = transfer(obj, dest); if (obj != 0) { switch (res) { case 0: return; case 1: case 4: case 5: env = environment(dest); if (env != 0) { move_or_destruct(obj, env); return; } default: destruct(obj); break; } } } /* * NAME: destruct_object() * DESCRIPTION: destruct an object */ static void destruct_object(object obj) { destruct(obj); } /* * NAME: query_host_name() * DESCRIPTION: return the host name */ static string query_host_name() { return "fancy.foo"; } /* * NAME: query_load_average() * DESCRIPTION: return the load average */ static string query_load_average() { return "0.00 cmds/s, 0.00 comp lines/s"; } /* * NAME: swapout() * DESCRIPTION: swap out all objects */ static varargs void swapout(int flag) { if (flag) { lock(privileged = 1, DRIVER->set_users(), ::swapout(1), privileged = 0); } else { ::swapout(); } } /* * NAME: shutdown() * DESCRIPTION: shut down the mud */ static void shutdown() { lock(privileged = 1, DRIVER->start_shut_down(), privileged = 0); } /* * NAME: version() * DESCRIPTION: return the driver version number */ static string version() { return __VERSION__; } /* * NAME: create_wizard() * DESCRIPTION: create a new wizard */ static varargs string create_wizard(string wizard, string domain) { return MASTER->master_create_wizard(wizard, domain, this_object()); } /* * NAME: crypt() * DESCRIPTION: encrypt a password */ static varargs string crypt(string passwd, string salt) { ARGCHECK(passwd, crypt, 1); return (salt == 0) ? ::crypt(passwd) : ::crypt(passwd, salt); } /* * NAME: notify_fail() * DESCRIPTION: set the notify_fail message */ static void notify_fail(string mesg) { object player; ARGCHECK(mesg, notify_fail, 1); player = this_player(); if (player != 0 && (player=interactive(player)) != 0) { player->set_notify_fail(mesg); } }