#include <stdio.h> #include "db.h" #include "externs.h" #include "config.h" struct { unsigned long flag; int type; char chr; } obj_flags[] = { { TYPE_ROOM, TYPE_ROOM, 'R' }, { TYPE_THING, TYPE_THING, 'T' }, { TYPE_EXIT, TYPE_EXIT, 'E' }, { TYPE_PLAYER, TYPE_PLAYER, 'P' }, { CHOWN_OK, NOTYPE, 'C'}, { DARK, NOTYPE, 'D' }, { HAVEN, NOTYPE, 'H' }, { INHERIT_POWERS, NOTYPE, 'I' }, { PUPPET, NOTYPE, 'p' }, { VISIBLE, NOTYPE, 'v' }, { OPAQUE, NOTYPE, 'o' }, { QUIET, NOTYPE, 'q' }, { THING_LIGHT, TYPE_THING, 'l' }, { EXIT_LIGHT, TYPE_EXIT, 'l' }, { PLAYER_NEWBIE, TYPE_PLAYER, 'n' }, { PLAYER_SLAVE, TYPE_PLAYER, 's' }, { PLAYER_MORTAL, TYPE_PLAYER, 'm' }, { PLAYER_ANSI, TYPE_PLAYER, '@' }, { PLAYER_INVISIBLE, TYPE_PLAYER, 'i' }, { PLAYER_TERSE, TYPE_PLAYER, 't' }, { PLAYER_NO_WALLS, TYPE_PLAYER, 'N' }, { PLAYER_SUSPECT, TYPE_PLAYER, '#' }, { PLAYER_NO_COM, TYPE_PLAYER, '+' }, { PLAYER_NO_ANN, TYPE_PLAYER, 'a' }, { NOMODIFY, NOTYPE, 'M' }, { 0x0, 0x0, ' ' } }; unsigned long str_to_flags(OBJ *player, char *str) { unsigned long flags = 0; char *p; int i; int error = 0; for(p = str;*p;p++) { for(i = 0;obj_flags[i].flag;++i) if(obj_flags[i].chr == *p) { flags |= obj_flags[i].flag; break; } if(!(obj_flags[i].flag)) { if(player) notify(player, tprintf("Unknown flag: %c", *p)); error = 1; } } return((error)?0:flags); } char *unparse_flags(OBJ *thing) { char buf[4096]; char *p = buf; unsigned long flags, flags2; switch(Typeof(thing)) { case TYPE_PLAYER: *p++ = 'P'; break; case TYPE_THING: *p++ = 'T'; break; case TYPE_ROOM: *p++ = 'R'; break; case TYPE_EXIT: *p++ = 'E'; break; } flags = thing->flags & ~TYPE_MASK; flags2 = thing->flags2; if(thing->flags & ~TYPE_MASK) { if(flags & PUPPET) *p++ = 'p'; if(flags & DARK) *p++ = 'D'; if(flags & HAVEN) *p++ = 'H'; if(flags & VISIBLE) *p++ = 'v'; if(flags & OPAQUE) *p++ = 'o'; if(flags & INHERIT_POWERS) *p++ = 'I'; if(flags & QUIET) *p++ = 'q'; if(flags & NOMODIFY) *p++ = 'M'; switch(Typeof(thing)) { case TYPE_PLAYER: if(flags & PLAYER_SLAVE) *p++ = 's'; if(flags & PLAYER_TERSE) *p++ = 't'; if(flags & PLAYER_ANSI) *p++ = '@'; if(flags & PLAYER_MORTAL) *p++ = 'm'; if(flags & PLAYER_NEWBIE) *p++ = 'n'; if(flags & PLAYER_INVISIBLE) *p++ = 'i'; if(flags & PLAYER_NO_WALLS) *p++ = 'N'; if(flags & PLAYER_NO_ANN) *p++ = 'a'; if(flags & PLAYER_NO_COM) *p++ = '+'; /* Uncomment the next line if you want to see the suspect flag */ /* if(flags & PLAYER_SUSPECT) *p++ = '#'; */ break; case TYPE_EXIT: if(flags & EXIT_LIGHT) *p++ = 'l'; break; case TYPE_THING: if(flags & THING_LIGHT) *p++ = 'l'; break; case TYPE_ROOM: if(flags & ROOM_FLOATING) *p++ = 'f'; break; } } *p = '\0'; return(stack_string_alloc(buf, 0)); } char *unparse_object(OBJ *player, OBJ *loc) { char buf[4096]; if(IS(player, TYPE_PLAYER, PLAYER_NEWBIE)) return(name(loc)); if(!power(player, POW_BACKSTAGE) && loc->owner != player->owner) return(name(loc)); sprintf(buf, "%s <#%d%s>|n|", name(loc), loc->dbref, unparse_flags(loc)); if(Typeof(loc) == TYPE_EXIT) { if(loc->link && my_is_color(atr_get(loc, "COLOR"))) return(tprintf("|%s|%s", atr_get(loc, "COLOR"), buf)); return(tprintf("|n|%s", buf)); } return(tprintf("|n|%s", buf)); }