#include "copyright.h"

#include "os.h"

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

#ifndef COMPRESS
#define uncompress(x) (x)
#else
const char *uncompress (const char *s);
#endif /* COMPRESS */

const char *unparse_object (dbref player, dbref loc);

/* in a dump, you can see everything */
int can_link_to (dbref who, object_flag_type what, 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 exits separately */
    if ((o->flags & TYPE_MASK) == TYPE_EXIT)
      continue;

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

    printf ("#%d: %s [%s] at %s Pennies: %d Type: ",
      o - db, o->name, db[o->owner].name,
      unparse_object (owner, o->location), o->pennies);
    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 (' ');
    if (o->flags & ~TYPE_MASK) {
      printf ("Flags: ");
      if (o->flags & LINK_OK)
        printf ("LINK_OK ");
      if (o->flags & DARK)
        printf ("DARK ");
      if (o->flags & STICKY)
        printf ("STICKY ");
      if (o->flags & WIZARD)
        printf ("WIZARD ");
      if (o->flags & TEMPLE)
        printf ("TEMPLE ");
#ifdef RESTRICTED_BUILDING
      if (o->flags & BUILDER)
        printf ("BUILDER ");
#endif /* RESTRICTED_BUILDING */
    }
    putchar ('\n');

    if (o->key != TRUE_BOOLEXP)
      printf ("KEY: %s\n", unparse_boolexp (owner, o->key));
    if (o->description) {
      puts ("Description:");
      puts (uncompress (o->description));
    }
    if (o->succ_message) {
      puts ("Success Message:");
      puts (uncompress (o->succ_message));
    }
    if (o->fail_message) {
      puts ("Fail Message:");
      puts (uncompress (o->fail_message));
    }
    if (o->ofail) {
      puts ("Other Fail Message:");
      puts (uncompress (o->ofail));
    }
    if (o->osuccess) {
      puts ("Other Success Message:");
      puts (uncompress (o->osuccess));
    }
    if (o->contents != NOTHING) {
      puts ("Contents:");
      DOLIST (thing, o->contents) {
        /* dump thing description */
        putchar (' ');
        puts (unparse_object (owner, thing));
      }
    }
    if (o->exits != NOTHING) {
      if ((o->flags & TYPE_MASK) == TYPE_ROOM) {
        puts ("Exits:");
        DOLIST (thing, o->exits) {
          printf (" %s", unparse_object (owner, thing));
          if (db[thing].key != TRUE_BOOLEXP) {
            printf (" KEY: %s", unparse_boolexp (owner, db[thing].key));
          }
          if (db[thing].location != NOTHING) {
            printf (" => %s\n", unparse_object (owner, db[thing].location));
          } else {
            puts (" ***OPEN***");
          }
        }
      } else {
        printf ("Home: %s\n", unparse_object (owner, o->exits));
      }
    }
    putchar ('\n');
  }

  return (0);
}