tmuck2.4/
tmuck2.4/admin/scripts/
tmuck2.4/docs/
tmuck2.4/minimal-db/
tmuck2.4/minimal-db/data/
tmuck2.4/minimal-db/logs/
tmuck2.4/minimal-db/muf/
tmuck2.4/old/
tmuck2.4/src/
tmuck2.4/src/compile/
tmuck2.4/src/editor/
tmuck2.4/src/game/
tmuck2.4/src/interface/
tmuck2.4/src/scripts/
tmuck2.4/src/utilprogs/
#include "copyright.h"
/* predicates.c,v 2.8 1994/02/20 23:14:50 dmoore Exp */

#include "config.h"

#include <ctype.h>
#include <string.h>

#include "db.h"
#include "params.h"
#include "externs.h"


int can_link_to(const dbref who, const object_flag_type what_type, const dbref where)
{
    if (where == HOME) return 1;
    if (Garbage(where)) return 0;

    switch (what_type) {
    case TYPE_EXIT:
	return (controls(who, where, Wizard(who)) || HasFlag(where, LINK_OK));
	/*NOTREACHED*/
	break;
    case TYPE_PLAYER:
    case TYPE_ROOM:
	return ((Typeof(where) == TYPE_ROOM)
	        && (controls(who, where, Wizard(who))
		    || Linkable(where)));
	/*NOTREACHED*/
	break;
    case TYPE_THING:
	return (((Typeof(where) == TYPE_ROOM)
                 || (Typeof(where) == TYPE_PLAYER))
                && (controls(who, where, Wizard(who))
                    || Linkable(where)));
	/*NOTREACHED*/
	break;
    case NOTYPE:
	return (controls(who, where, Wizard(who))
		|| HasFlag(where, (ABODE|LINK_OK)));
	/*NOTREACHED*/
	break;
    }
    return 0;
}


/* If who is allowed to see the flags of what, in unparse_object. */
int can_see_flags(const dbref who, const dbref what)
{
    if (Garbage(what)) return 0;

    if (can_link_to(who, NOTYPE, what)) return 1;

    if (Typeof(what) == TYPE_PLAYER) return 0;

    return HasFlag(what, CHOWN_OK);
}


int can_link(const dbref who, const dbref what)
{
    if (Garbage(what)) return 0;

    if ((Typeof(what) == TYPE_EXIT)
	&& (GetNDest(what) == 0))
	return 1;

    return controls(who, what, Wizard(who));
}


int could_doit(const dbref player, const dbref thing)
{
    if (Garbage(thing)) return 0;

    if ((Typeof(thing) == TYPE_EXIT) && (GetNDest(thing) == 0)) { 
	return 0;
    }

    return eval_boolexp(player, GetKey(thing), thing);
}


int can_doit(const dbref player, const dbref thing, const char *default_fail_msg)
{
    dbref loc = GetLoc(player);

    if (Garbage(thing)) return 0; /* Should have never been called. */
  
    if (!could_doit(player, thing)) {
	/* can't do it */
	if (GetFail(thing)) {
	    exec_or_notify(player, thing, GetFail(thing), 0);
	} else if (default_fail_msg) {
	    notify(player, default_fail_msg);
	}
    
	if (GetOFail(thing) && !Dark(player)) {
	    notify_except(loc, player, "%n %p",
			  player, player, GetOFail(thing));
	}
    
	return 0;
    } else {
	/* can do it */
	if (GetSucc(thing)) {
	    exec_or_notify(player, thing, GetSucc(thing), 0);
	}
    
	if (GetOSucc(thing) && !Dark(player)) {
	    notify_except(loc, player, "%n %p",
			  player, player, GetOSucc(thing));
	}
    
	return 1;
    }
}


int can_see(const dbref player, const dbref thing, const int wizard, const int can_see_loc)
{
    if (Garbage(thing)) return 0; /* Should have never been called. */

    if (player == thing || Typeof(thing) == TYPE_EXIT
	|| Typeof(thing) == TYPE_ROOM) return 0;

    if (can_see_loc) {
	switch (Typeof(thing)) {
	case TYPE_PROGRAM:
	    return (HasFlag(thing, LINK_OK)
		    || controls(player, thing, wizard));
	default:
	    return (!Dark(thing) || controls(player, thing, wizard));
	}
    } else {
	/* can't see loc */
	return (controls(player, thing, wizard));
    }
}


/* No one controls garbage.  Wizards control everything.  Players control
   things they own. */
int controls(const dbref who, const dbref what, const int wizard)
{
    if (Garbage(what)) return 0;
    if (wizard) return 1;
    if (who == GetOwner(what)) return 1;

    return 0;
}


/* Are we allowed to set a certain kind of flag? */
int restricted(const dbref player, const dbref thing, const object_flag_type flag, const int wizplayer, const int godplayer)
{
    int result;

    if (Garbage(thing)) return 1; /* Shouldn't have been called. */

    switch (flag) {
    case DARK:
	result = (!wizplayer && (Typeof(thing) != TYPE_ROOM));
	break;
    case MUCKER:
    case BUILDER:
	result = !wizplayer;
	break;
    case WIZARD:
	if (wizplayer) {
	    result = ((Typeof(thing) == TYPE_PLAYER) && !godplayer);
	} else {
	    result = 1;
	}
	break;
#ifdef GOD_FLAGS
    case GOD:
	if (godplayer) {
	    result = ((Typeof(thing) == TYPE_PLAYER) && !godplayer);
	} else {
	    result = 1;
	}
	if (thing == head_player) {
	    result = 1;
	}
	break;
#endif
    default:
	result = 0;
	break;
    }
    return result;
}


int payfor(const dbref who, const int cost)
{
    int pennies;

    pennies = GetPennies(who);
    if (Wizard(who)) {
	return 1;
    } else if (pennies >= cost) {
	SetPennies(who, 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
	    && !strchr(name, ARG_DELIMITER)
	    && !strchr(name, AND_TOKEN)
	    && !strchr(name, OR_TOKEN)
	    && !word_start(name, NOT_TOKEN)
	    && muck_stricmp(name, "me")
	    && muck_stricmp(name, "home")
	    && muck_stricmp(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;
}