#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);
}