#include "config.h" #include "params.h" #include "db.h" #include "externs.h" #include "interface.h" #define T_ROOM 0x1 #define T_THING 0x2 #define T_EXIT 0x4 #define T_PLAYER 0x8 #define T_PROGRAM 0x10 #define T_ALL 0x1F #define T_NONE 0x0 struct flist { const char *name; object_flag_type the_flag; const char *sname; object_flag_type type_check; } flag_list[]={ "WIZARD", WIZARD, "W", T_ALL, "LINK_OK", LINK_OK, "L", T_ALL, "DARK", DARK, "d", T_ROOM | T_EXIT | T_PLAYER | T_THING, "DEBUG", DARK, "d", T_PROGRAM, "SETUID", STICKY, "S", T_PROGRAM, "SILENT", STICKY, "S", T_PLAYER, "STICKY", STICKY, "S", T_ROOM | T_EXIT | T_THING, "BUILDER", BUILDER, "B", T_ALL, #ifdef PLAYER_CHOWN "CHOWN_OK", CHOWN_OK, "C", T_ALL, #endif "JUMP_OK", JUMP_OK, "J", T_ALL, #ifdef HAVEN "HAVEN", HAVEN, "H", T_ROOM | T_EXIT | T_PLAYER, "HALTED", HALTED, "H", T_THING | T_PROGRAM, #else "HALTED", HALTED, "H", T_ALL, #endif /* HAVEN */ "QUELL", QUELL, "q", T_ALL, "PUPPET", PUPPET, "p", T_ROOM | T_EXIT | T_THING | T_PROGRAM, "PARANOID", PUPPET, "p", T_PLAYER, "VISIBLE", VISIBLE, "V", T_ALL, #ifdef ABODE "ABODE", ABODE, "A", T_ROOM, "ARCHITECT", ARCHITECT, "A", T_EXIT | T_PLAYER | T_PROGRAM | T_THING, #else /* ABODE */ "ARCHITECT", ARCHITECT, "A", T_ALL, #endif "MURKY", MAGE, "M", T_ROOM | T_THING | T_EXIT, "MAGE", MAGE, "M", T_PLAYER | T_PROGRAM, (const char *)0, 0, (const char *)0, }; object_flag_type filter_type(object_flag_type type) { switch(type) { case TYPE_ROOM: return T_ROOM; break; case TYPE_THING: return T_THING; break; case TYPE_EXIT: return T_EXIT; break; case TYPE_PLAYER: return T_PLAYER; break; case TYPE_PROGRAM: return T_PROGRAM; break; default: return T_NONE; } } object_flag_type lookup_flag(const char *name) { struct flist *f; object_flag_type res = 0; if(!name) return 0; if(!*name) return 0; for(f = flag_list; f->name && !res; f++) if(string_prefix(f->name, name)) { res = f->the_flag; } return res; } const char *unparse_flag(object_flag_type x) { static char buf[BUFFER_LEN]; struct flist *f; object_flag_type o_type; o_type = filter_type(x&TYPE_MASK); (*buf) = buf[1] = '\0'; for(f = flag_list; f->name; f++) if((x&f->the_flag) && (o_type&f->type_check) && *f->sname) { strcat(buf," "); strcat(buf, f->name); } return buf+1; } const char *unparse_flag_short(object_flag_type x) { static char buf[BUFFER_LEN]; struct flist *f; object_flag_type o_type; *buf = '\0'; o_type = filter_type(x&TYPE_MASK); for(f = flag_list; f->name; f++) if((x&f->the_flag) && (o_type&f->type_check)) strcat(buf, f->sname); return buf; }