/* $Header: predicates.c,v 1.1 90/04/14 14:56:49 lachesis Exp $
* $Log: predicates.c,v $
* Revision 1.1 90/04/14 14:56:49 lachesis
* Initial revision
*
*/
#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
&& (controls(who, where) || (db[where].flags & LINK_OK)));
}
int could_doit(dbref player, dbref thing)
{
if(Typeof(thing) == TYPE_EXIT && db[thing].sp.exit.ndest == 0) {
return 0;
}
return(eval_boolexp (player, db[thing].key));
}
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 && !Dark(player)) {
#ifdef GENDER
pronoun_substitute(buf, player, db[thing].ofail, 1);
#else
sprintf(buf, "%s %s", db[player].name, db[thing].ofail);
#endif /* GENDER */
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 && !Dark(player)) {
#ifdef GENDER
pronoun_substitute(buf, player, db[thing].osuccess, 1);
#else
sprintf(buf, "%s %s", db[player].name, db[thing].osuccess);
#endif /* GENDER */
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 */
if (what < 0 || what >= db_top) return 0;
#ifdef RECYCLE
/* No one controls garbage */
if (Typeof(what) == TYPE_GARBAGE) return 0;
#endif
if (Wizard(who)) return 1;
switch(Typeof(what)) {
case TYPE_ROOM:
return (who == db[what].sp.room.owner);
/*NOTREACHED*/
break;
case TYPE_PLAYER:
return (who == what);
/*NOTREACHED*/
break;
case TYPE_EXIT:
return (who == db[what].sp.exit.owner);
/*NOTREACHED*/
break;
case TYPE_THING:
return (who == db[what].sp.thing.owner);
/*NOTREACHED*/
break;
}
return 0;
}
int can_link(dbref who, dbref what)
{
return((Typeof(what) == TYPE_EXIT && db[what].sp.exit.ndest == 0)
|| controls(who, what));
}
int payfor(dbref who, int cost)
{
if(Wizard(who)) {
return 1;
} else if(db[who].sp.player.pennies >= cost) {
db[who].sp.player.pennies -= cost;
return 1;
} else {
return 0;
}
}
int word_start (const char *str, const char let)
{
int chk;
for (chk = 1; *str; str++) {
if (chk && *str == let) return 1;
chk = *str == ' ';
}
return 0;
}
int ok_name(const char *name)
{
return (name
&& *name
&& *name != LOOKUP_TOKEN
&& *name != NUMBER_TOKEN
&& !index(name, ARG_DELIMITER)
&& !index(name, AND_TOKEN)
&& !index(name, OR_TOKEN)
&& !word_start(name, NOT_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) || strlen(name) > PLAYER_NAME_LIMIT) return 0;
for(scan = name; *scan; scan++) {
if(!(isprint(*scan) && !isspace(*scan))) { /* was isgraph(*scan) */
return 0;
}
}
/* lookup name to avoid conflicts */
return (lookup_player(name) == NOTHING);
}
int ok_password(const char *password)
{
const char *scan;
if(*password == '\0') return 0;
for(scan = password; *scan; scan++) {
if(!(isprint(*scan) && !isspace(*scan))) {
return 0;
}
}
return 1;
}