cdirt/ascii/
cdirt/data/BULL/
cdirt/data/ZONES/PENDING/
cdirt/pending/
cdirt/src/utils/
cdirt/utils/
#include "kernel.h"
#include "pflags.h"
#include "lflags.h"
#include "mflagnames.h"
#include "pflagnames.h"
#include "sflagnames.h"
#include "lflagnames.h"
#include "nflagnames.h"
#include "eflagnames.h"
#include "sflags.h"
#include "nflags.h"
#include "eflags.h"
#include "sendsys.h"
#include "bprintf.h"
#include "parse.h"
#include "rooms.h"
#include "mobile.h"
#include "uaf.h"
#include "log.h"
#include "objsys.h"
#include "aflagnames.h"

char *TF[3] =
{"False", "True", TABLE_END};
char *OO[3] =
{"Off", "On", TABLE_END};

/* Prototype */
void dump_lflags (int loc);

void
show_bits (int *bits, int n, char **table)
{
  int *b;
  int bno;
  int xno;
  int cno;
  int c2;
  char **t;
  char *p;
  Boolean t_end;
  char buff[16];


  cno = n;
  b = bits + n - 1;
  bno = 0;
  xno = 0;
  c2 = 0;
  t = table;
  t_end = False;
  for (; b >= bits; --b, ++cno) {
    for (bno = 0; bno < 32; bno++, xno++, t++) {
      if (((*b) & (1 << bno)) != 0) {
	if (t_end)
	  p = NULL;
	else if ((p = *t) == TABLE_END) {
	  t_end = True;
	  p = NULL;
	}
	if (p == NULL) {
	  sprintf (buff, "<Spare%d>", xno);
	  p = buff;
	}
	if (++c2 == 6) {
	  bprintf ("\n");
	  c2 = 1;
	}
	bprintf ("%-14s\t", p);
      }
    }
  }
  bprintf ("\n");
}

Boolean
dump_pflags (void)
{
  static char *t[] =
  {"Pflags", "Mask", TABLE_END};
  int k, k2;

  if (plev (mynum) < LVL_ARCHWIZARD)
    return False;
  if (brkword () == -1)
    return False;
  if ((k = tlookup (wordbuf, t)) < 0)
    return False;
  if (brkword () == -1)
    return False;
  if ((k2 = tlookup (wordbuf, MWizLevels)) >= LEV_APPRENTICE)
    bprintf ("%s for %s:\n", t[k], MWizLevels[k2]);
  else if ((k2 = tlookup (wordbuf, FWizLevels)) >= LEV_APPRENTICE)
    bprintf ("%s for %s:\n", t[k], FWizLevels[k2]);
  else
    return False;

  if (k == 0) {
    show_bits ((int *) &the_world->w_pflags[k2 - 1],
	       sizeof (PFLAGS) / sizeof (int), Pflags);
  } else {
    show_bits ((int *) &the_world->w_mask[k2 - 1],
	       sizeof (PFLAGS) / sizeof (int), Pflags);
  }
  return True;
}

void
xshow_lflags (int loc)
{
  LFLAGS *p;

  p = &(xlflags (loc));
  bprintf ("Room: %s\nLflags:\n", showname (loc));
  bprintf ("Light: %s           Temp: %s\n",
	   Lflags[check_light (loc)], Lflags[check_temp (loc)]);
  show_bits ((int *) p, sizeof (LFLAGS) / sizeof (int), Lflags);
}

void
dump_lflags (int loc)
{
  LFLAGS *p;

  p = &(xlflags (loc));

  show_bits ((int *) p, sizeof (LFLAGS) / sizeof (int), Lflags);
}

void
pflagscom (void)
{
  int a, b, c, l;
  char *n;
  Boolean f;
  PFLAGS *p;
  PERSONA d;

  f = False;
  if (brkword () == -1) {
    a = mynum;
    p = &(pflags (a));
    n = pname (a);
    l = plev (a);
  } 
  else if ((a = fmbn (wordbuf)) != -1) {
    if (a != mynum && !ptstflg (mynum, PFL_PFLAGS)) {
      bprintf ("You can only change/see your own P-flags.\n");
      return;
    }
    p = &(pflags (a));
    n = pname (a);
    l = plev (a);
  } else if (!ptstflg (mynum, PFL_UAF)) {
    bprintf ("Who's that?\n");
    return;
  } else if (!ptstflg (mynum, PFL_PFLAGS)) {
    bprintf ("You can only change/see your own P-flags.\n");
    return;
  } else if (!getuaf (wordbuf, &d)) {
    bprintf ("No such persona in system.\n");
    return;
  } else {
    f = True;
    p = &(d.ublock.pflags);
    n = d.ublock.pname;
    l = d.ublock.plev;
  }

  if (((a != mynum && wlevel (plev (mynum)) <= wlevel (l) && plev (mynum) < LVL_GOD)
      || (a >= max_players && plev (mynum) < LVL_WIZARD))) {
    bprintf ("That is beyond your powers.\n");
    return;
  }
  if (brkword () == -1) {
    bprintf ("Player: %s\n", n);
    bprintf ("Privileges:\n");
    show_bits ((int *) p, sizeof (PFLAGS) / sizeof (int), Pflags);
    return;
  } else if ((b = tlookup (wordbuf, Pflags)) == -1
             || (!ptstmsk (mynum, b) && (!OPERATOR (pname (mynum))))) {
    bprintf ("%s: No such P-Flag.\n", wordbuf);
    return;
  } else if (brkword () == -1) {
    c = dtst_bit (p, b) ? 1 : 0;
    bprintf ("Value of %s is %s\n", Pflags[b], TF[c]);
    return;
  } else if (a != mynum && !ptstflg (mynum, PFL_PFLAGS)) {
    bprintf ("You can only change your own P-flags.\n");
    return;
  } else if ((c = tlookup (wordbuf, TF)) == -1) {
    bprintf ("Value must be True or False.\n");
    return;
  }
  if (!EQ (n, pname (mynum))) {
    mudlog ("PFLAG: %s by %s, %s := %s", n, pname (mynum), Pflags[b], TF[c]);
  }
  if (c == 0) {
    dclr_bit (p, b);
  } else {
    dset_bit (p, b);
  }
  if (f) {
    putuaf (&d);
  }
}

void
maskcom (void)
{
  int a, b, c;
  char *n;
  Boolean f;
  PFLAGS *p;
  PERSONA d;

  f = False;
  if (brkword () == -1 || !ptstflg (mynum, PFL_MASK)) {
    a = mynum;
    p = &(pmask (a));
    n = pname (a);
  } 
  else if ((a = fpbn (wordbuf)) != -1) {
    p = &(pmask (a));
    n = pname (a);
  } 
  else if (!ptstflg (mynum, PFL_UAF)) {
    bprintf ("Who's that?\n");
    return;
  } 
  else if (!getuaf (wordbuf, &d)) {
    bprintf ("No such persona in system.\n");
    return;
  } 
  else {
    f = True;
    p = &(d.ublock.pmask);
    n = d.ublock.pname;
  }

  if (brkword () == -1) {
    bprintf ("Player: %s\nMask:\n", n);
    show_bits ((int *) p, sizeof (PFLAGS) / sizeof (int), Pflags);

    return;
  } else if ((b = tlookup (wordbuf, Pflags)) == -1
	     || (!ptstmsk (mynum, b) && !ptstflg (mynum, PFL_MASK))) {
    bprintf ("%s: No such Mask-bit.\n", wordbuf);
    return;
  } else if ((!ptstflg (mynum, PFL_MASK) || brkword () == -1)) {  
    c = dtst_bit (p, b) ? 1 : 0;
    bprintf ("Value of %s is %s\n", Pflags[b], TF[c]);
    return;
  } else if ((c = tlookup (wordbuf, TF)) == -1) {
    bprintf ("Value must be True or False. Not %s.\n", wordbuf);
    return;
  }
  mudlog ("MASK: %s by %s, %s := %s", n, pname (mynum), Pflags[b], TF[c]);

  if (c == 0) {
    dclr_bit (p, b);
  } else {
    dset_bit (p, b);
  }
  if (f) {
    putuaf (&d);
  }
}

void
mflagscom (void)
{
  int a, b, c;

  if (plev (mynum) < LVL_WIZARD) {
    bprintf ("Pardon?\n");
    return;
  }
  if (brkword () == -1) {
    bprintf ("Whose MFlags?\n");
    return;
  }
  if ((a = fmbn (wordbuf)) < max_players) {
    bprintf ("No mobile with this name!\n");
    return;
  }
  if (brkword () == -1 || (b = tlookup (wordbuf, Mflags)) == -1) {
    bprintf ("Mobile: %s\n", pname (a));
    bprintf ("Mflags:\n");
    show_bits ((int *) (&mflags (a)), sizeof (MFLAGS) / sizeof (int), Mflags);

    return;
  }
  if (brkword () == -1) {
    c = mtstflg (a, b) ? 1 : 0;
    bprintf ("Value of %s is %s\n", Mflags[b], TF[c]);
    return;
  }
  if (!ptstflg (mynum, PFL_MFLAGS)) {
    bprintf ("You are not authorised to do this...\n");
    return;
  }
  if ((c = tlookup (wordbuf, TF)) == -1) {
    bprintf ("\001A\033[31m\003Set flag to True or False.\001A\033[0m\003\n");
    return;
  }
#ifdef LOG_MFLAG
  mudlog ("MFLAG: %s by %s, %s := %s", pname (a), pname (mynum), Mflags[b], TF[c]);
#endif

  if (c == 0) {
    mclrflg (a, b);
  } else {
    msetflg (a, b);
  }
}

void
lflagscom (void)
{
  int a, b, c, d = 0;

  if (plev (mynum) < LVL_WIZARD) {
    bprintf ("Pardon?\n");
    return;
  }
  if ((a = getroomnum ()) == 0)
    a = ploc (mynum);

  if (brkword () == -1) {
    xshow_lflags (a);
    return;
  }
  if ((b = tlookup (wordbuf, Lflags)) == -1) {
    if ((b = tlookup (wordbuf, L_Light)) > -0)
      d = 1;
    else if ((b = tlookup (wordbuf, L_Temp)) >= 0)
      d = 2;
    else {
      bprintf ("%s: No such Location-Flag.\n", wordbuf);
      return;
    }
  }
  if (brkword () == -1) {
    if (d == 1) {
      bprintf ("Value of Light in %s is %s\n", showname(a),
	       Lflags[check_light (a)]);
    } else if (d == 2) {
      bprintf ("Value of Temp in %s is %s\n", showname(a),
	       Lflags[check_temp (a)]);
    } else {
      c = ltstflg (a, b);
      c = (c != 0);
      bprintf ("Value of %s in %s is %s\n", Lflags[b], showname(a), TF[c]);
    }
    return;
  }
  if (!ptstflg (mynum, PFL_ROOM)) {
    bprintf ("You are not authorised to do this.\n");
    return;
  }
  if (!ltstflg (a, LFL_PUBLIC)) {
    if (!EQ (pname (mynum), lowner (a)) && plev (mynum) < LVL_DEMI) {
      bprintf ("You can only change the lflags of your own rooms.\n");
      return;
    }
  }
  if ((c = tlookup (wordbuf, TF)) == -1) {
    bprintf ("Set flag to True or False.n");
    return;
  }
#ifdef LOG_LFLAG
  mudlog ("LFLAG: %s in %s, %s := %s", pname (mynum), showname(a), 
           Lflags[b], TF[c]);
#endif

  if (c)
    lsetflg (a, b);
  else
    lclrflg (a, b);
}

void
set_xpflags (int y, PFLAGS * p, PFLAGS * m)
{

  if (y >= LVL_CREATOR) {
    *p = the_world->w_pflags[7];
    *m = the_world->w_mask[7];
  } else if (y >= LVL_GOD) {
    *p = the_world->w_pflags[6];
    *m = the_world->w_mask[6];
  } else if (y >= LVL_DEMI) {
    *p = the_world->w_pflags[5];
    *m = the_world->w_mask[5];
  } else if (y >= LVL_SHALAFI) {
    *p = the_world->w_pflags[4];
    *m = the_world->w_mask[4];
  } else if (y >= LVL_ARCHWIZARD) {
    *p = the_world->w_pflags[4];
    *m = the_world->w_mask[3];
  } else if (y >= LVL_ISTARI) {
    *p = the_world->w_pflags[2];
    *m = the_world->w_mask[2];
  } else if (y > LVL_WIZARD) {
    *p = the_world->w_pflags[1];
    *m = the_world->w_mask[1];
  } else if (y == LVL_WIZARD) {
    *p = the_world->w_pflags[0];
    *m = the_world->w_mask[0];
  } else if (y < LVL_WIZARD) {
    p->u = p->h = p->l = 0;
    *m = *p;
    dset_bit (p, PFL_TITLES);
    dset_bit (p, PFL_EMOTE);
    dset_bit (p, PFL_ABERCHAT);
  } else {
    p->u = p->h = p->l = 0;
    *m = *p;
  }
}

/*
 * ** Sflagscom() written by Feldene for SharkMUD.
 * ** Just add this function to the end of flags.c and add the appropriate
 * ** verbs.
 */

void
sflagscom (void)
{
  int a, b, c, l;
  char *n;
  Boolean f;
  SFLAGS *p;
  PERSONA d;

  if (!ptstflg (mynum, PFL_SFLAGSEE)) {
    bprintf ("Pardon?\n");
    return;
  }
  f = False;
  if (brkword () == -1) {
    a = mynum;
    p = &(sflags (a));
    n = pname (a);
    l = plev (a);
  }
  else if ((a = fmbn(wordbuf)) != -1) {
    if (plev (mynum) < LVL_ARCHWIZARD) {
      erreval ();
      return;
    }
    p = &(sflags (a));
    n = pname (a);
    l = plev (a);
  } else if (!ptstflg (mynum, PFL_UAF)) {
    bprintf ("Who's that?\n");
    return;
  } else if (plev (mynum) < LVL_ARCHWIZARD && !ptstflg(mynum, PFL_SFLAGEDIT)) {
    bprintf ("You can't do that now.\n");
    return;
  } else if (!getuaf (wordbuf, &d)) {
    bprintf ("No such persona in system.\n");
    return;
  } else {
    f = True;
    p = &(d.ublock.psflags);
    n = d.ublock.pname;
    l = d.ublock.plev;
  }

  if (a != mynum && wlevel (plev (mynum)) <= wlevel (l) && plev (mynum) < LVL_GOD) {
    bprintf ("That is beyond your powers.\n");
    return;
  }
  if (brkword () == -1) {
    bprintf ("Player: %s\n", n);
    bprintf ("Sflags:\n");
    show_bits ((int *) p, sizeof (SFLAGS) / sizeof (int), Sflags);

    return;
  } else if ((b = tlookup (wordbuf, Sflags)) == -1) {
    bprintf ("%s: No such Sflag.\n", wordbuf);
    return;
  } else if (brkword () == -1) {
    c = tst_bit (p, b) ? 1 : 0;
    bprintf ("Value of %s is %s\n", Sflags[b], TF[c]);
    return;
  } else if (a != mynum && plev (mynum) < LVL_ARCHWIZARD && plev (a) >= plev (mynum)) {
    bprintf ("That is beyond your powers.\n");
    return;
  } else if ((c = tlookup (wordbuf, TF)) == -1) {
    bprintf ("Value must be True or False.\n");
    return;
  }
  if (!EQ (n, pname (mynum))) {
    mudlog ("SFLAG: %s by %s, %s = %s", n, pname (mynum), Sflags[b], TF[c]);
  }
  if (c == 0) {
    clr_bit (p, b);
  } else {
    set_bit (p, b);
  }
  if (f) {
    putuaf (&d);
  }
}

void nflagscom (void)
{
  int a, b, c, l;
  char *n;
  Boolean f;
  NFLAGS *p;
  PERSONA d;

  if (!ptstflg (mynum, PFL_NFLAGEDIT)) {
    bprintf ("Pardon?\n");
    return;
  }
  f = False;
  if (brkword () == -1) {
    a = mynum;
    p = &(nflags (a));
    n = pname (a);
    l = plev (a);
  } 
  else if ((a = fmbn(wordbuf)) != -1) {
    if (plev (mynum) < LVL_ARCHWIZARD) {
      erreval ();
      return;
    }
    p = &(nflags (a));
    n = pname (a);
    l = plev (a);
  } 
  else if (!ptstflg (mynum, PFL_UAF)) {
    bprintf ("Who's that?\n");
    return;
  } 
  else if (plev (mynum) < LVL_ARCHWIZARD) {
    bprintf ("You can't do that now.\n");
    return;
  } 
  else if (!getuaf (wordbuf, &d)) {
    bprintf ("No such persona in system.\n");
    return;
  } 
  else {
    f = True;
    p = &(d.ublock.pnflags);
    n = d.ublock.pname;
    l = d.ublock.plev;
  }

  if (a != mynum && wlevel (plev (mynum)) <= wlevel (l) && plev (mynum) < LVL_GOD) {
    bprintf ("That is beyond your powers.\n");
    return;
  }
  if (brkword () == -1) {
    bprintf ("Player: %s\n", n);
    bprintf ("Nflags:\n");
    show_bits ((int *) p, sizeof (NFLAGS) / sizeof (int), Nflags);

    return;
  } else if ((b = tlookup (wordbuf, Nflags)) == -1) {
    bprintf ("%s: No such Nflag.\n", wordbuf);
    return;
  } else if (brkword () == -1) {
    c = xtstbit (*p, b) ? 1 : 0;
    bprintf ("Value of %s is %s\n", Nflags[b], TF[c]);
    return;
  } else if (a != mynum && plev (mynum) < LVL_ARCHWIZARD && plev (a) >= plev (mynum)) {
    bprintf ("That is beyond your powers.\n");
    return;
  } else if ((c = tlookup (wordbuf, TF)) == -1) {
    bprintf ("Value must be True or False.\n");
    return;
  }
  if (!EQ (n, pname (mynum))) {
    mudlog ("NFLAG: %s by %s, %s = %s", n, pname (mynum), Nflags[b], TF[c]);
  }
  if (c == 0) {
    xclrbit (*p, b);
  } else {
    xsetbit (*p, b);
  }
  if (f) {
    putuaf (&d);
  }
}

void aflagscom (void)
{
  int a, b, c;
  char *n;
  AFLAGS *p;

  if (plev(mynum) < LVL_WIZARD) {
    bprintf ("Pardon?\n");
    return;
  }
  if (brkword () == -1) {
    bprintf("Aflags on what?\n");
    return;
  } 
  else if ((a = fobn(wordbuf)) != -1) {
    p = &(abits(a));
    n = oname (a);
  } 
  else {
    bprintf("What's that?\n");
    return;
  }

  if (brkword () == -1) {
    bprintf ("Object: %s\n", n);
    bprintf ("Aflags:\n");
    show_bits ((int *) p, sizeof (AFLAGS) / sizeof (int), Aflags);
    return;
  } 
  else if ((b = tlookup (wordbuf, Aflags)) == -1) {
    bprintf ("%s: No such Aflag.\n", wordbuf);
    return;
  } 
  else if (brkword () == -1) {
    c = xtstbit (*p, b) ? 1 : 0;
    bprintf ("Value of %s is %s\n", Aflags[b], TF[c]);
    return;
  }
  else if ((c = tlookup (wordbuf, TF)) == -1) {
    bprintf ("Value must be True or False.\n");
    return;
  }

  if (c == 0)
    xclrbit (*p, b);
  else
    xsetbit (*p, b);
}

void eflagscom (void) {
  int a, b, c, l;
  char *n;
  Boolean f;
  EFLAGS *p;
  PERSONA d;

  if (!ptstflg (mynum, PFL_EFLAGEDIT)) {
    bprintf ("Pardon?\n");
    return;
  }
  f = False;
  if (brkword () == -1) {
    a = mynum;
    p = &(eflags (a));
    n = pname (a);
    l = plev (a);
  } 
  else if ((a = fmbn (wordbuf)) != -1) {
    if (plev (mynum) < LVL_ARCHWIZARD) {
      erreval ();
      return;
    }
    p = &(eflags (a));
    n = pname (a);
    l = plev (a);
  } else if (!ptstflg (mynum, PFL_UAF)) {
    bprintf ("Who's that?\n");
    return;
  } else if (plev (mynum) < LVL_ARCHWIZARD) {
    bprintf ("You can't do that now.\n");
    return;
  } else if (!getuaf (wordbuf, &d)) {
    bprintf ("No such persona in system.\n");
    return;
  } else {
    f = True;
    p = &(d.ublock.peflags);
    n = d.ublock.pname;
    l = d.ublock.plev;
  }

  if (a != mynum && wlevel (plev (mynum)) <= wlevel (l) && plev (mynum) < LVL_GOD) {
    bprintf ("That is beyond your powers.\n");
    return;
  }
  if (brkword () == -1) {
    bprintf ("Player: %s\n", n);
    bprintf ("Eflags:\n");
    show_bits ((int *) p, sizeof (EFLAGS) / sizeof (int), Eflags);
    return;
  } else if ((b = tlookup (wordbuf, Eflags)) == -1) {
    bprintf ("%s: No such Eflag.\n", wordbuf);
    return;
  } else if (brkword () == -1) {
    c = tst_bit (p, b) ? 1 : 0;
    bprintf ("Value of %s is %s\n", Eflags[b], TF[c]);
    return;
  } else if (a != mynum && plev (mynum) < LVL_ARCHWIZARD && plev (a) >= plev (mynum)) {
    bprintf ("That is beyond your powers.\n");
    return;
  } else if ((c = tlookup (wordbuf, TF)) == -1) {
    bprintf ("Value must be True or False.\n");
    return;
  }
  if (!EQ (n, pname (mynum))) {
    mudlog ("EFLAG: %s by %s, %s = %s", n, pname (mynum), Eflags[b], TF[c]);
  }
  if (c == 0) {
    clr_bit (p, b);
  } else {
    set_bit (p, b);
  }
  if (f) {
    putuaf (&d);
  }
}