/* FLAG STUFF */ #include "config.h" #include "params.h" #include "db.h" #include "interface.h" #include "externs.h" #include "mush.h" /* Flag name, letter, Type, FLAG */ FLAG flag_table[] = { { "ABODE", 'A', TYPE_ROOM, ABODE}, #ifdef MUSH { "AUDIBLE", 'a', NOTYPE, AUDIBLE}, #endif { "AUTOSTART", 'A', TYPE_EXIT, ABODE}, { "AUTHOR", 'A', TYPE_PLAYER, ABODE}, { "BUILDER", 'B', NOTYPE, BUILDER}, { "CHOWN_OK", 'C', NOTYPE, CHOWN_OK}, { "DARK", 'D', NOTYPE, DARK}, { "DEBUG", 'D', TYPE_PROGRAM, DARK}, { "ENTER_OK", 'e', NOTYPE, ENTER_OK}, { "GOD", 'G', NOTYPE, GOD}, #ifdef MUSH { "HALT", 'H', TYPE_THING, HAVEN}, #endif { "HAVEN", 'H', NOTYPE, HAVEN}, { "HEARING", 'H', TYPE_EXIT, HAVEN}, { "INTERACTIVE", 'I', TYPE_PLAYER, INTERACTIVE}, { "JUMP_OK", 'J', NOTYPE, JUMP_OK}, { "LINK_OK", 'L', NOTYPE, LINK_OK}, { "MONITOR", 'M', TYPE_PLAYER, MUCKER}, { "MUCKER", 'M', TYPE_PLAYER, MUCKER}, #ifdef MUSH { "NOCOMMAND", 'n', NOTYPE, NOCOMMAND}, #endif { "NOSPOOF", 'N', TYPE_PLAYER, NOSPOOF}, #ifdef MUSH { "PUPPET", 'p', TYPE_THING, PUPPET}, #endif { "QUELL", 'Q', NOTYPE, QUELL}, { "SAFE", 's', NOTYPE, SAFE}, { "SETUID", 'S', TYPE_PROGRAM, STICKY}, { "SILENT", 'S', TYPE_PLAYER, STICKY}, { "STICKY", 'S', NOTYPE, STICKY}, { "UNFINDABLE", 'U', NOTYPE, UNFIND}, { "VERBOSE", 'V', NOTYPE, VERBOSE}, { "VISUAL", 'v', NOTYPE, VISUAL}, { "WIZARD", 'W', NOTYPE, WIZARD}, }; #ifdef MUSH void decompile_flags(dbref player, dbref thing, char *objct) { char hold ='\0'; int i; if(FLAGS(thing) & ~TYPE_MASK) { /* print flags */ for (i = 0; i < sizeof(flag_table) / sizeof(FLAG); i++) { if(FLAGS(thing) & (flag_table[i].flag) && (Typeof(thing) == flag_table[i].type || flag_table[i].type == NOTYPE) && hold != flag_table[i].letter) { notify(player, player, tprintf("@set %s=%s", objct, flag_table[i].name)); hold = (flag_table[i].letter); } } } } #endif char *unparse_flags(dbref thing) { static char buf[BUFFER_LEN]; char *type_codes = "R-EPFG*"; char *p; char hold = '\0'; int command_num; p = buf; if(Typeof(thing) != TYPE_THING) *p++ = type_codes[Typeof(thing)]; if(FLAGS(thing) & ~TYPE_MASK) { /* print flags */ for (command_num = 0; command_num < sizeof(flag_table) / sizeof(FLAG); command_num++) { if(FLAGS(thing) & (flag_table[command_num].flag) && (Typeof(thing) == flag_table[command_num].type || flag_table[command_num].type == NOTYPE) && hold != flag_table[command_num].letter) { *p++ = (flag_table[command_num].letter); hold = (flag_table[command_num].letter); } } } *p = '\0'; return buf; } int strn_cmp(char *sub, char *string) { if(!*sub || !*string) return 0; if(!strncasecmp(sub, string, strlen(sub))) return 1; return 0; } FLAG *flag_lookup(char *name, dbref thing) { int command_num; for (command_num = 0; (command_num < sizeof(flag_table) / sizeof(FLAG)) && (stringn_compare(name, flag_table[command_num].name, strlen(name)) > 0); command_num++); if ((command_num < sizeof(flag_table) / sizeof(FLAG)) && (!stringn_compare(name, flag_table[command_num].name, strlen(name))) && (Typeof(thing) == flag_table[command_num].type || flag_table[command_num].type == NOTYPE)) return(&flag_table[command_num]); return NULL; } #ifdef MUSH int convert_flags(player, s, p_mask, p_toggle, p_type) dbref player; char *s; object_flag_type *p_mask; object_flag_type *p_toggle; object_flag_type *p_type; { FLAG *f; object_flag_type mask, toggle, type; int done; mask = toggle = 0; type = NOTYPE; while (s && *s) { done = 0; switch (*s) { case 'P': type = TYPE_PLAYER; break; case 'R': type = TYPE_ROOM; break; case 'E': type = TYPE_THING; break; default: /* check generic flags first */ for (f = flag_table; !done; f++) { if (*s == f->letter) { mask |= f->flag; done = 1; } } /* if (!done && (type != NOTYPE)) while ((f->type != type) && (f->type != NOTYPE)) f++; for ( ; !done && (f->type != NOTYPE); f++) { if (*s == f->letter) { if (type == NOTYPE) { type = f->type; toggle |= f->flag; done = 1; } else if (type != f->type) { notify(player, player, tprintf("Type conflict with flag '%c'.", *s)); return 0; } } } */ /* if we get this far and still haven't found anything, error. */ if (!done) { notify(player, player, tprintf("%c: unknown flag.", *s)); return 0; } } s++; } *p_mask = mask; *p_toggle = toggle; *p_type = type; return 1; } #endif void do_list_flags(__DO_PROTO) { int i; char buff[BUFFER_LEN]; char *bp; bp = buff; safe_str("Flags:", buff, &bp); for (i = 0; i < sizeof(flag_table) / sizeof(FLAG); i++) { safe_chr(' ', buff, &bp); safe_str(flag_table[i].name, buff, &bp); } *bp = '\0'; notify(player, player, buff); }