/* $Header: unparse.c,v 2.0 90/05/05 12:45:46 lachesis Exp $ * $Log: unparse.c,v $ * Revision 2.0 90/05/05 12:45:46 lachesis * Incorporated ABODE and HAVEN flags (remembering to convert FireFoot's * usage of those flags to ours). * Added Examine of objects that don't belong to you, added GOD_PRIV. * * Revision 1.2 90/04/21 17:20:52 lachesis * Added property lists. * * Revision 1.1 90/04/14 14:56:56 lachesis * Initial revision * */ #include "db.h" #include "externs.h" #include "config.h" #include "interface.h" static const char *unparse_flags(dbref thing) { static char buf[BUFFER_LEN]; char *p; const char *type_codes = "R-EP"; p = buf; if(Typeof(thing) != TYPE_THING) *p++ = type_codes[Typeof(thing)]; if(db[thing].flags & ~TYPE_MASK) { /* print flags */ if(db[thing].flags & WIZARD) *p++ = 'W'; if(db[thing].flags & STICKY) *p++ = 'S'; if(db[thing].flags & DARK) *p++ = 'D'; if(db[thing].flags & LINK_OK) *p++ = 'L'; if(db[thing].flags & TEMPLE) *p++ = 'T'; #ifdef RESTRICTED_BUILDING if(db[thing].flags & BUILDER) *p++ = 'B'; #endif /* RESTRICTED_BUILDING */ #ifdef PLAYER_CHOWN if(db[thing].flags & CHOWN_OK) *p++ = 'C'; #endif /* PLAYER_CHOWN */ if(db[thing].flags & JUMP_OK) *p++ = 'J'; #ifdef HAVEN if (db[thing].flags & HAVEN) *p++ = 'H'; #endif /* HAVEN */ #ifdef ABODE if (db[thing].flags & ABODE) *p++ = 'A'; #endif /* ABODE */ } *p = '\0'; return buf; } const char *unparse_object(dbref player, dbref loc) { static char buf[BUFFER_LEN]; switch(loc) { case NOTHING: return "*NOTHING*"; case HOME: return "*HOME*"; default: if(controls(player, loc) || can_link_to(player, loc) #ifdef PLAYER_CHOWN || (db[loc].flags & CHOWN_OK) #endif /* PLAYER_CHOWN */ ) { /* show everything */ sprintf(buf, "%s(#%d%s)", db[loc].name, loc, unparse_flags(loc)); return buf; } else { /* show only the name */ return db[loc].name; } } } static char boolexp_buf[BUFFER_LEN]; static char *buftop; static void unparse_boolexp1(dbref player, struct boolexp *b, boolexp_type outer_type) { if(b == TRUE_BOOLEXP) { (void) strcpy(buftop, "*UNLOCKED*"); buftop += strlen(buftop); } else { switch(b->type) { case BOOLEXP_AND: if(outer_type == BOOLEXP_NOT) { *buftop++ = '('; } unparse_boolexp1(player, b->sub1, b->type); *buftop++ = AND_TOKEN; unparse_boolexp1(player, b->sub2, b->type); if(outer_type == BOOLEXP_NOT) { *buftop++ = ')'; } break; case BOOLEXP_OR: if(outer_type == BOOLEXP_NOT || outer_type == BOOLEXP_AND) { *buftop++ = '('; } unparse_boolexp1(player, b->sub1, b->type); *buftop++ = OR_TOKEN; unparse_boolexp1(player, b->sub2, b->type); if(outer_type == BOOLEXP_NOT || outer_type == BOOLEXP_AND) { *buftop++ = ')'; } break; case BOOLEXP_NOT: *buftop++ = '!'; unparse_boolexp1(player, b->sub1, b->type); break; case BOOLEXP_CONST: (void) strcpy(buftop, unparse_object(player, b->thing)); buftop += strlen(buftop); break; case BOOLEXP_PROP: (void) strcpy(buftop, b -> prop_check -> type); (void) strcat(buftop, ":"); (void) strcat(buftop, b -> prop_check -> class); buftop += strlen(buftop); break; default: abort(); /* bad type */ break; } } } const char *unparse_boolexp(dbref player, struct boolexp *b) { buftop = boolexp_buf; unparse_boolexp1(player, b, BOOLEXP_CONST); /* no outer type */ *buftop++ = '\0'; return boolexp_buf; }