TinyMAZE/
TinyMAZE/config/
TinyMAZE/doc/
TinyMAZE/run/msgs/
TinyMAZE/src/
TinyMAZE/src/db/
TinyMAZE/src/ident/
TinyMAZE/src/io/
TinyMAZE/src/prog/
TinyMAZE/src/softcode/
TinyMAZE/src/util/
#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));
}