#include "copyright.h" /* Predicates for testing various conditions */ #include <ctype.h> #include "db.h" #include "interface.h" #include "config.h" #include "externs.h" int can_link_to (dbref who, dbref where) { return (where >= 0 && where < db_top && Typeof (where) == TYPE_ROOM && (controls (who, where) || (db[where].flags & LINK_OK))); } int could_doit (dbref player, dbref thing) { dbref key; int status; if (Typeof (thing) != TYPE_ROOM && db[thing].location == NOTHING) return 0; if ((key = db[thing].key) == NOTHING) return 1; status = (player == key || member (key, db[player].contents)); return ((db[thing].flags & ANTILOCK) ? !status : status); } int can_doit (dbref player, dbref thing, const char *default_fail_msg) { dbref loc; char buf[BUFFER_LEN]; if ((loc = getloc (player)) == NOTHING) return 0; if (!could_doit (player, thing)) { /* can't do it */ if (db[thing].fail_message) { notify (player, db[thing].fail_message); } else if (default_fail_msg) { notify (player, default_fail_msg); } if (db[thing].ofail) { sprintf (buf, "%s %s", db[player].name, db[thing].ofail); notify_except (db[loc].contents, player, buf); } return 0; } else { /* can do it */ if (db[thing].succ_message) { notify (player, db[thing].succ_message); } if (db[thing].osuccess) { sprintf (buf, "%s %s", db[player].name, db[thing].osuccess); notify_except (db[loc].contents, player, buf); } return 1; } } int can_see (dbref player, dbref thing, int can_see_loc) { if (player == thing || Typeof (thing) == TYPE_EXIT) { return 0; } else if (can_see_loc) { return (!Dark (thing) || controls (player, thing)); } else { /* can't see loc */ return (controls (player, thing)); } } int controls (dbref who, dbref what) { /* Wizard controls everything */ /* owners control their stuff */ return (what >= 0 && what < db_top && (Wizard (who) || who == db[what].owner)); } int can_link (dbref who, dbref what) { return ((Typeof (what) == TYPE_EXIT && db[what].location == NOTHING) || controls (who, what)); } int payfor (dbref who, int cost) { if (Wizard (who)) { return 1; } else if (db[who].pennies >= cost) { db[who].pennies -= cost; return 1; } else { return 0; } } int ok_name (const char *name) { return (name && *name && *name != LOOKUP_TOKEN && *name != NUMBER_TOKEN && string_compare (name, "me") && string_compare (name, "home") && string_compare (name, "here")); } int ok_player_name (const char *name) { const char *scan; if (!ok_name (name)) return 0; for (scan = name; *scan; scan++) { if (!isgraph (*scan)) { return 0; } } /* lookup name to avoid conflicts */ return (lookup_player (name) == NOTHING); }