#include "copyright.h"

#include <stdio.h>

#include "db.h"

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

    if(argc < 1) {
	fprintf(stderr, "Usage: %s [owner]\n", *argv);
	exit(1);
    }
    
    if(argc >= 2) {
	owner = atol(argv[1]);
    } else {
	owner = NOTHING;
    }

    if(db_read(stdin) < 0) {
	fprintf(stderr, "%s: bad input\n", argv[0]);
	exit(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(%d) Pennies: %d Type: ",
	       o - db, o->name, db[o->owner].name,
	       getname(o->location),
	       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 != NOTHING) printf("KEY: %c%s\n",
				     o->flags & ANTILOCK ? '!' : ' ',
				     getname(o->key));
	if(o->description) {
	    puts("Description:");
	    puts(o->description);
	}
	if(o->succ_message) {
	    puts("Success Message:");
	    puts(o->succ_message);
	}
	if(o->fail_message) {
	    puts("Fail Message:");
	    puts(o->fail_message);
	}
	if(o->ofail) {
	    puts("Other Fail Message:");
	    puts(o->ofail);
	}
	if(o->osuccess) {
	    puts("Other Success Message:");
	    puts(o->osuccess);
	}
	if(o->contents != NOTHING) {
	    puts("Contents:");
	    DOLIST(thing, o->contents) {
		/* dump thing description */
		printf(" %s(%d)\n", db[thing].name, thing);
	    }
	}
	if(o->exits != NOTHING) {
	    if((o->flags & TYPE_MASK) == TYPE_ROOM) {
		puts("Exits:");
		DOLIST(thing, o->exits) {
		    printf(" %s", getname(thing));
		    if(db[thing].key != NOTHING) {
			printf(" KEY: %c%s(%d)",
			       db[thing].flags & ANTILOCK ? '!' : ' ',
			       getname(db[thing].key),
			       db[thing].key);
		    }
		    if(db[thing].location != NOTHING) {
			printf(" => %s(%d)\n",
			       getname(db[thing].location),
			       db[thing].location);
		    } else {
			puts(" ***OPEN***");
		    }
		}
	    } else {
		printf("Home: %s(%d)\n", getname(o->exits), o->exits);
	    }
	}
	putchar('\n');
    }

    exit(0);
}