/* dump.c */

#include "os.h"
#include "copyright.h"
#include "config.h"
#include "db.h"
#include "externs.h"

/* The following are needed so that modules that contain required code can
 * be linked in.. However the following routines do not NEED to do anything.
 */
/*****************************************************************************/
void report (void)
{
}

dbref free_get (void)
{
  return NOTHING;
}

void fix_free_list (void)
{
}

void parse_que (dbref player, char *command, dbref cause)
{
}

int
eval_boolexp (dbref player, struct boolexp *b, dbref privs, int nrecurs,
  int locktype)
{
  return 1;
}

int wild_match (char *s, char *d)
{
  return 1;
}

void notify (dbref player, const char *msg)
{
}

void init_match (dbref player, const char *arg, int type)
{
}

void match_everything (void)
{
}

dbref noisy_match_result (void)
{
  return 1;
}

char *tprintf (char *format, ...)
{
  return (char *) "";
}

void panic (const char *message)
{
  fprintf (stderr, "PANIC: %s\n", message);
  exit (-1);
}

/*****************************************************************************/

/* in a dump, you can see everything */
int can_link_to (dbref who, dbref where)
{
  return 1;
}

int controls (dbref who, dbref what)
{
  return 1;
}

int main (int argc, char **argv)
{
  struct object *o;
  dbref owner;
  dbref thing;

  if (argc < 1) {
    fprintf (stderr, "Usage: %s [owner]\n", *argv);
    return (1);
  }

  if (argc >= 2) {
    owner = atol (argv[1]);
  } else {
    owner = NOTHING;
  }

  if (db_read (stdin) < 0) {
    fprintf (stderr, "%s: bad input\n", argv[0]);
    return (5);
  }

  for (o = db; o < db + db_top; o++) {
    /* don't show it if it isn't owned by the right player */
    if (owner != NOTHING && o->owner != owner)
      continue;

    printf
      ("OBJECT #%d: %s [OWNER: %s(#%d)]\nLOC: %s(%d)\nPENNIES: %d\nTYPE: ",
      o - db, o->name, db[o->owner].name, o->owner, unparse_object (owner,
        o->location), o->location, o->penn);
    switch (o->flags & TYPE_MASK) {
    case TYPE_ROOM:
      printf ("Room");
      break;
    case TYPE_EXIT:
      printf ("Exit");
      break;
    case TYPE_THING:
      printf ("Thing");
      break;
    case TYPE_PLAYER:
      printf ("Player");
      break;
    default:
      printf ("***UNKNOWN TYPE***");
      break;
    }

    /* handle flags */
    putchar ('\n');
    if (o->flags & ~TYPE_MASK) {
      printf ("TYPE FLAGS: ");
      switch (o->flags & TYPE_MASK) {
      case TYPE_PLAYER:
        if (o->flags & PLAYER_DARK)
          printf ("Unfind ");
#ifdef RESTRICTED_BUILDING
        if (o->flags & PLAYER_BUILD)
          printf ("Builder ");
#endif
        if (o->flags & PLAYER_GAGGED)
          printf ("Gagged ");
        if (o->flags & PLAYER_SUSPECT)
          printf ("Suspect ");
        break;
      case TYPE_THING:
        if (o->flags & THING_PUPPET)
          printf ("Puppet ");
        if (o->flags & THING_KEY)
          printf ("Key ");
        if (o->flags & THING_SAFE)
          printf ("Safe ");
        if (o->flags & THING_IMMORTAL)
          printf ("Immortal ");
        if (o->flags & THING_VERBOSE)
          printf ("Verbose ");
#ifdef DESTROY
        if (o->flags & THING_DEST_OK)
          printf ("Destroy_ok ");
#endif /* DESTROY */
        break;
      case TYPE_ROOM:
        if (o->flags & LINK_OK)
          printf ("Link_Ok ");
        if (o->flags & ROOM_TEMPLE)
          printf ("Temple ");
        if (o->flags & ROOM_ABODE)
          printf ("Abode ");
        if (o->flags & ROOM_JUMP_OK)
          printf ("Jump_Ok ");
        if (o->flags & ROOM_FLOATING)
          printf ("Floating ");
        if (o->flags & ROOM_NO_TEL)
          printf ("No_Tel ");
        break;
      case TYPE_EXIT:
        if (o->flags & EXIT_TRANSPARENT)
          printf ("Transparent ");
        if (o->flags & EXIT_KEY)
          printf ("Key ");
        break;
      }
      printf ("\nGENERAL FLAGS: ");
      if (o->flags & WIZARD)
        printf ("Wizard ");
      if (o->flags & DARK)
        printf ("Dark ");
      if (o->flags & STICKY)
        printf ("Sticky ");
      if (o->flags & HAVEN)
        printf ("Haven ");
      if (o->flags & HALT)
        printf ("Halt ");
      if (o->flags & QUIET)
        printf ("Quiet ");
      if (o->flags & TERSE)
        printf ("Terse ");
#ifdef DESTROY
      if (o->flags & GOING)
        printf ("Destroyed ");
#endif /* DESTROY */
      if (o->flags & CHOWN_OK)
        printf ("Chown_Ok ");
      if (o->flags & ENTER_OK)
        printf ("Enter_Ok ");
      if (o->flags & VISUAL)
        printf ("Visual ");
      if (o->flags & OPAQUE)
        printf ("Opaque ");
      if (o->flags & NOSPOOF)
        printf ("Nospoof ");
#ifdef INHERIT_FLAG
      if (o->flags & INHERIT)
        printf ("Inherit ");
#endif
#ifdef ROYALTY_FLAG
      if (o->flags & ROYALTY)
        printf ("Royalty ");
#endif
    }
    putchar ('\n');

    if (o->key != TRUE_BOOLEXP)
      printf ("KEY: %s\n", unparse_boolexp (owner, o->key, 0));
    if (((o->flags & TYPE_MASK) == TYPE_PLAYER)
      && (o->usekey != TRUE_BOOLEXP))
      printf ("USEKEY: %s\n", unparse_boolexp (owner, o->usekey, 0));
    if (o->enterkey != TRUE_BOOLEXP)
      printf ("ENTERKEY: %s\n", unparse_boolexp (owner, o->enterkey, 0));
    if (o->list) {
      ALIST *list;
      ATTR *my_attr;
      printf ("ATTRIBUTES:\n");
      for (list = o->list; list; list = AL_NEXT (list)) {
        if (!AL_BAD (list)) {
          my_attr = AL_ATTR (list);
          if (!string_compare ("XYXXY", my_attr->name))
            printf ("\tPassword: %s\n", uncompress (AL_STR (list)));
          else
            printf ("\t%s: %s\n", my_attr->name, uncompress (AL_STR (list)));
        }
      }
    }
    if (o->contents != NOTHING) {
      printf ("CONTENTS:\n");
      DOLIST (thing, o->contents) {
        /* dump thing description */
        printf ("\t%s(%d) [OWNER: %s(%d)]\n", unparse_object (owner, thing),
          thing, db[owner].name, owner);
      }
    }
    if (o->exits != NOTHING) {
      if ((o->flags & TYPE_MASK) == TYPE_ROOM) {
        puts ("EXITS:\n");
        DOLIST (thing, o->exits) {
          printf ("\t%s ", unparse_object (owner, thing));
          if (db[thing].location != NOTHING) {
            printf (" => %s\n", unparse_object (owner, db[thing].location));
          } else {
            printf (" ***OPEN***\n");
          }
          if (db[thing].key != TRUE_BOOLEXP) {
            printf ("\tKEY: %s\n", unparse_boolexp (owner, db[thing].key, 0));
          }
        }
      } else {
        printf ("HOME: %s\n", unparse_object (owner, o->exits));
      }
    }
    putchar ('\n');
  }
  return (0);
}