#include "copyright.h"
#include "config.h"
/* Predicates for testing various conditions */
#include <ctype.h>
#include "db.h"
#include "interface.h"
#include "params.h"
#include "externs.h"
int can_link_to(dbref who, object_flag_type what_type, dbref where)
{
if (where == HOME) return 1;
if (where < 0 || where > db_top) return 0;
switch (what_type)
{
case TYPE_EXIT:
return (controls(who, where) || (FLAGS(where) & LINK_OK));
case TYPE_PLAYER:
return (Typeof(where) == TYPE_ROOM && (controls(who, where)
|| Linkable(where)));
case TYPE_ROOM:
case TYPE_THING:
return (((Typeof(where) == TYPE_ROOM) ||
(Typeof(where) == TYPE_PLAYER)) && (controls(who, where) ||
Linkable(where)));
case NOTYPE:
return ((controls(who,where)) || (FLAGS(where) & LINK_OK)
|| ((Typeof(where) != TYPE_PLAYER) && (FLAGS(where) & ABODE)));
}
return 0;
}
int can_link(dbref who, dbref what)
{
return (controls(who, what) || ((Typeof(what) == TYPE_EXIT)
&& DBFETCH(what)->sp.exit.ndest == 0));
}
int could_doit(dbref player, dbref thing)
{
if(Typeof(thing) == TYPE_EXIT && DBFETCH(thing)->sp.exit.ndest == 0) return 0;
return(eval_boolexp (player, DBFETCH(thing)->key, thing));
}
int can_doit(dbref player, dbref thing, char *default_fail_msg)
{
dbref loc;
char *ptr;
char buf[BUFFER_LEN];
if((loc = getloc(player)) == NOTHING) return 0;
if(!could_doit(player, thing))
{
/* can't do it */
if(GET_FAIL(thing))
exec_or_notify(player, thing, GET_FAIL(thing));
else if(default_fail_msg)
notify(player, player, default_fail_msg);
if(GET_OFAIL(thing) && !Dark(player))
{
strcpy(buf, unparse_name(player));
strcat(buf, " ");
#ifdef MUSH
ptr = exec(player, pronoun_substitute(player, GET_OFAIL(thing)),
thing, 0);
if(ptr) {
strcat(buf, ptr);
free(ptr);
}
#else
strcat(buf, pronoun_substitute(player, GET_OFAIL(thing)));
#endif
notify_except(player, loc, player, buf);
}
#ifdef MUSH
did_it(player, thing, NULL, NULL, NULL, NULL, "AFAILURE", NOTHING);
#endif
return 0;
}
else
{
/* can do it */
if(GET_SUCC(thing))
exec_or_notify(player, thing, GET_SUCC(thing));
if(GET_OSUCC(thing) && !Dark(player))
{
strcpy(buf, unparse_name(player));
strcat(buf, " ");
#ifdef MUSH
ptr = exec(player, pronoun_substitute(player, GET_OSUCC(thing)),
thing, 0);
if(ptr) {
strcat(buf, ptr);
free(ptr);
}
#else
strcat(buf, pronoun_substitute(player, GET_OSUCC(thing)));
#endif
notify_except(player, loc, player, buf);
}
#ifdef MUSH
did_it(player, thing, NULL, NULL, NULL , NULL, "ASUCCESS", NOTHING);
#endif
return 1;
}
}
int can_see(dbref player, dbref thing, int can_see_loc)
{
if (can_see_loc)
{
switch (Typeof(thing))
{
case TYPE_PROGRAM:
return((FLAGS(thing) & LINK_OK) || controls(player, thing));
default:
return (!Dark(thing) || controls(player, thing));
}
}
else
{
/* can't see loc */
#ifndef SILENT_PLAYERS
return(controls(player, thing));
#else /* SILENT_PLAYERS */
return(Sticky(player) ? 0 : controls(player, thing));
#endif
}
}
int controls(dbref who, dbref what)
{
/* Wizard controls everything */
/* owners control their stuff */
if (what < 0 || what >= db_top) return 0;
if (Typeof(what) == TYPE_GARBAGE) return 0;
if (FLAGS(who) & GOD) return 1;
#ifdef GOD_PRIV
if (Wizard(who)) return (!(FLAGS(what) & GOD));
if (FLAGS(what) & GOD) return 0;
#else /* !GOD_PRIV */
if (Wizard(who)) return 1;
if (Wizard(what)) return 0;
#endif /* GOD_PRIV */
#ifdef MUSH
/* Things controll themselves */
if (Typeof(what) == TYPE_THING && who == what) return 1;
/* Things can controll their owner */
if (Typeof(what) == TYPE_THING && who == OWNER(what)) return 1;
if (Typeof(what) == TYPE_THING && Typeof(who) == TYPE_THING && OWNER(who)
== OWNER(what)) return 1;
#endif
return (who == OWNER(what));
}
int restricted(dbref player, dbref thing, object_flag_type flag)
{
switch (flag)
{
case INTERACTIVE:
return 1;
case DARK:
if(o_liberal_dark) {
return (!Wizard(player) && Typeof(thing) == TYPE_PLAYER);
} else {
return (!Wizard(player) && (Typeof(thing) != TYPE_ROOM)
&& (Typeof(thing) != TYPE_PROGRAM));
}
case MUCKER:
case BUILDER:
return (!Wizard(player));
case WIZARD:
if (Wizard(player))
#ifdef GOD_PRIV
return ((Typeof(thing) == TYPE_PLAYER) && !God(player));
#else /* !GOD_PRIV */
return 0;
#endif /* GOD_PRIV */
else return 1;
case GOD:
return(!God(player));
default:
return 0;
}
}
int payfor(dbref who, int cost)
{
if(Wizard(who)) return 1;
else if(DBFETCH(who)->pennies >= cost)
{
DBFETCH(who)->pennies -= cost;
DBDIRTY(who);
return 1;
}
else return 0;
}
int word_start (char *str, char let)
{
int chk;
for (chk = 1; *str; str++)
{
if (chk && *str == let) return 1;
chk = *str == ' ';
}
return 0;
}
int ok_name(char *name)
{
return (name
&& *name
&& *name != LOOKUP_TOKEN
&& *name != NUMBER_TOKEN
&& *name != EXIT_DELIMITER
&& !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(char *name, dbref player)
{
char *scan;
dbref found;
if(!ok_name(name) || strlen(name) > PLAYER_NAME_LIMIT) return 0;
for(scan = name; *scan; scan++)
{
if(!(isprint(*scan) && !isspace(*scan))) return 0;
}
/* lookup name to avoid conflicts */
found = lookup_player(name);
return ((found == NOTHING) || (player == found));
}
int ok_password(char *password)
{
char *scan;
if(*password == '\0') return 0;
for(scan = password; *scan; scan++)
{
if(!(isprint(*scan) && !isspace(*scan))) return 0;
}
return 1;
}