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/
/* Copyright (c) 1992 by Ken Arromdee and David Moore.  All rights reserved. */
/* entrances.c,v 2.5 1994/02/17 23:49:53 dmoore Exp */
#include "config.h"

#include "db.h"
#include "match.h"
#include "params.h"		/* LOOKUP_COST */
#include "externs.h"

static void show_stuff_player(const dbref, const dbref);
static void show_stuff_other(const dbref, const dbref);
static void show_item(const dbref, const dbref, const dbref, const int);

void do_entrances(const dbref player, const char *arg, const char *ignore1, const char *ignore2)
{
    dbref thing;
    struct match_data md;
    
    if (!*arg) {
	thing = GetLoc(player);
    } else {
	init_match(player, arg, NOTYPE, &md);
	match_neighbor(&md);
	match_possession(&md);
	match_me(&md);
	match_here(&md);
	match_absolute(&md);
	match_player(&md);
	
	if ((thing = noisy_match_result(&md)) == NOTHING)
	    return;
    }

    if (thing == HOME) thing = GetLink(player);

    if (Garbage(thing)) {
	notify(player, "<garbage> has nothing linked to it.");
	return;
    }

    if (!controls(player, thing, Wizard(player))) {
	notify(player, "Permission denied.");
	return;
    }

    /* Same cost as @find, for the time being, until we get backlinks */
    if (!payfor(player, LOOKUP_COST)) {
	notify(player, "You don't have enough pennies.");
	return;
    }

    show_stuff_player(player, thing);
    show_stuff_other(player, thing);
}


static void show_stuff_player(const dbref player, const dbref thing)
{
    dbref thing_owner, i;

    thing_owner = GetOwner(thing);
    if (thing_owner == player) {
	notify(player, "Linked things owned by you:");
    } else {
	notify(player, "Linked things owned by %u:", player, thing_owner);
    }

    for (i = thing_owner; i != NOTHING; i = GetOwnList(i)) {
	if (Typeof(i) == TYPE_PROGRAM) continue;

	show_item(player, thing, i, 1);
    }
	
    notify(player, "***End of List***");
}


static void show_stuff_other(const dbref player, const dbref thing)
{
    dbref thing_owner, i;

    thing_owner = GetOwner(thing);
    if (thing_owner == player) {
	notify(player, "Linked things owned by others:");
    } else {
	notify(player, "Linked things not owned by %u:", player, thing_owner);
    }

    for (i = 0; i < db_top; i++) {
	if (Garbage(i)) continue;
	if (Typeof(i) == TYPE_PROGRAM) continue;
	if (GetOwner(i) == thing_owner) continue;

	show_item(player, thing, i, 0);
    }
	
    notify(player, "***End of List***");
}


static void show_item(const dbref player, const dbref thing, const dbref i, const int self)
{
    dbref *exit_list;
    int cnt, found;

    found = 0;
    exit_list = GetDest(i);
    for (cnt = GetNDest(i); cnt; cnt--) {
	if (*exit_list++ == thing) found++;
    }

    if (found == 1) {
	if (self || (Typeof(i) == TYPE_PLAYER)) {
	    notify(player, "%u", GetOwner(i), i);
	} else {
	    notify(player, "%u  Owner: %n", GetOwner(i), i, GetOwner(i));
	}
    } else if (found > 1) {
	if (self || (Typeof(i) == TYPE_PLAYER)) {
	    notify(player, "%u [multiplicity %i]", GetOwner(i), i, found);
	} else {
	    notify(player, "%u [multiplicity %i]  Owner: %n", GetOwner(i),
		   i, found, GetOwner(i));
	}
    }
}