#include "os.h" #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 = TYPE_CODES; 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++ = WIZARD_MARK; #ifdef ROBOT_MODE if (db[thing].flags & ROBOT) *p++ = ROBOT_MARK; #endif /* ROBOT_MODE */ if (db[thing].flags & STICKY) *p++ = STICKY_MARK; if (db[thing].flags & DARK) *p++ = DARK_MARK; if (db[thing].flags & LINK_OK) *p++ = LINK_MARK; if (db[thing].flags & ABODE) *p++ = ABODE_MARK; if (db[thing].flags & TEMPLE) *p++ = TEMPLE_MARK; #ifdef RESTRICTED_BUILDING if (db[thing].flags & BUILDER) *p++ = BUILDER_MARK; #endif /* RESTRICTED_BUILDING */ if (db[thing].flags & HAVEN) *p++ = HAVEN_MARK; if (db[thing].flags & UNWANTED) *p++ = UNWANTED_MARK; #ifdef GENDER if (Genderof (thing) == GENDER_MALE) *p++ = MALE_MARK; if (Genderof (thing) == GENDER_FEMALE) *p++ = FEMALE_MARK; if (Genderof (thing) == GENDER_NEUTER) *p++ = NEUTER_MARK; #endif /* GENDER */ } *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, NOTYPE, loc) || (db[loc].flags & UNWANTED)) { /* 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) { 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: strcpy (buftop, unparse_object (player, b->thing)); 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; }