dyrt/
dyrt/bin/
dyrt/data/MAIL/
dyrt/data/WIZ_ZONES/
dyrt/include/machine/
dyrt/src/misc/cpp/
#include "kernel.h"
#include "stdinc.h"

extern char *WizLevels[];

struct _w
{
  struct _w *next;
  char name[PNAME_LEN + 1];
  char wlev;
};

struct _w *wizlist;
char wizfile[256];

void set_wizfile (char *f)
{
  strcpy(wizfile, f);
}

int boot_wizlist (FILE *f, char *fname)
{
  int mused = 0;
  int plev;
  struct _w *first = NULL;
  struct _w *p, *q, *r;
  char buff[256];
  char name[100];
  char lev[100];
  
  if (f == NULL)
    {
      wizlist = NULL;
      return 0;
    }
  while (fgets (buff, sizeof buff, f) != NULL)
    {
      char *pp= buff; 
      sscanf(buff, "%s ",name);
      pp += (strlen(name)) +1;
      pp[strlen(pp)-1] = '\0';
      strcpy(lev,pp);
      if ((plev = tlookup(lev, WizLevels)) < 0)
	{
	  printf("Error in wizlist, invalid wizlevel %s.\n", lev);
	  continue;
	}
      if (strlen(name) > PNAME_LEN)
	{
	  printf("Error in wizlist, name %s is too long.\n", name);
	  continue;
	}
      r = NEW(struct _w, 1);
      mused += sizeof(struct _w);
      strcpy (r->name, name);
      r->wlev = plev;
      q = NULL;
      for (p = first; p != NULL && p->wlev >= plev;
	   q = p, p = p-> next);
      r->next = p;
      if (q == NULL)
	{
	  first = r;
	}
      else
	{
	  q->next = r;
	}
    }
  if (!feof(f))
    {
      printf("Error while reading wizlist.");
      ferror(f);
    }
  wizlist = first;
  return mused;
}

void dump_wizlist(void)
{
  struct _w *p;
  FILE *f;
  
  if ((f = fopen(wizfile, "w")) == NULL)
    {
      mudlog("Error when dumping wizfile \"%s\".", wizfile);
      progerror(wizfile);
      return;
    }
  for (p = wizlist; p != NULL; p = p->next)
    {
      if (p->wlev > LEV_MORTAL && p->wlev <= LEV_MASTER)
	{
	  fprintf(f, "%s %s\n", p->name, WizLevels[(int)p->wlev]);
	}
    }
  fclose(f);
}

void update_wizlist (char *name, int new_wlevel)
{
  struct _w *p, *q, *r;
  Boolean m = False;
  
  for (q = NULL, p = wizlist; p != NULL && !EQ (p->name, name);
       q = p, p = p->next);
  if (p != NULL)
    {
      if (new_wlevel == p->wlev && new_wlevel != LEV_MORTAL)
	return;
      if (q == NULL)
	{
	  wizlist = p->next;
	}
      else
	{
	  q->next = p->next;
	}
      m = True;
    }
  if (new_wlevel > LEV_MORTAL && new_wlevel <= LEV_MASTER)
    {
      if (p == NULL)
	{
	  p = NEW(struct _w, 1);
	  strcpy(p->name, name);
	}
      p->wlev = new_wlevel;
      
      for (q = NULL, r = wizlist; r != NULL && r->wlev >= p->wlev;
	   q = r, r= r->next);
      p->next = r;
      if (q == NULL)
	{
	  wizlist = p;
	}
      else
	{
	  q->next = p;
	}
      m = True;
    }
  if (m)
    {
      dump_wizlist();
    }
}

/* Function to parse a string s assumed to be on one of the following forms:
 *
 * +wizlevel      return low = wizlevel, high = god, return '+';
 * -wizlevel      return low = apprentice, high = wizlevel, return '-';
 * =wizlevel      return low = high = wizlevel, return '=';
 * wizlevel1:wizlevel2 return low = wizlevel1, high = wizlevel2, return ':';
 * nickname       return low = pointer to node in wizlist describing
 *                nickname. high = 0, return -2
 * wizlevel       return low = high = wizlevel, return 0;
 *
 * if invalid wizlevel, return -3; */

int parse_wizlevel (char *s, int *low, int *high)
{
  int t, x;
  char *a;
  struct _w *p;
  
  a = NULL;
  
  if ((t = *s++) != '+' && t != '-' && t != '=')
    {
      if ((a = strchr(--s, ':')) == NULL)
	t = 0;
      else
	{
	  *a++ = '\0';
	  t = ':';
	}
    }
  if (t != 0)
    {
      if ((x = tlookup(s, WizLevels)) < 0)
	return -3;
      switch (t)
	{
	case '+':
	  *low = x;
	  *high = LEV_MASTER;
	  break;
	case '-':
	  *low = LEV_APPRENTICE;
	  *high = x;
	  break;
	case '=':
	  *low = *high = x;
	  break;
	case ':':
	  *low = x;
	  if ((*high = tlookup(a, WizLevels)) < 0)
	    return -3;
	  break;
	}
    }
  else 
    {
      for (p = wizlist; p != NULL && !EQ (s, p->name); p = p->next);
      if (p != NULL)
	{
	  *low = (int)p;
	  *high = 0;
	  return -2;
	}
      if ((x = tlookup(s, WizLevels)) < 0)
	return -3;
      *low = *high = x;
    }
  return t;
}

/* wizlist command
 *
 * WIZLIST [+-=]wizlevel         wizard level
 * WIZLIST wizlevel:wizlevel     range of wizard levels
 * WIZLIST nickname              nickname
 *
 * each of the arguments may be repeated. */

void wizlistcom (void)
{
  static char *w[] =
    {NULL, "Apprentice Wizards", "Emeriti", "Wizards", "Senior Wizards", 
     "ArchWizards", "High Archwizards", "DemiGods", "High DemiGods -- Honorary",
     "Gods", "Masters"};
  char *s;
  int t;
  int x = -1;
  int low, high;
  struct _w *p;
  Boolean h = False;
  int k = 10;
  Boolean full_title = False;
  PERSONA pers;
  low = 0;
  high = 0;
  s = NULL;
  
  if ((t = brkword()) == -1)
    {
      low = LEV_APPRENTICE;
      high = LEV_MASTER;
    }
  do
    {
      if (t != -1)
	t = parse_wizlevel (wordbuf, &low, &high);
      if (t == -3)
	{
	  bprintf("No such immortal or immortal level: \"%s\".\n", wordbuf);
	}
      else if (t == -2)
	{
	  p = (struct _w *) low;
	  low = p->wlev;
	  bprintf("%s is %s %s.\n", p->name,
		  (low == LEV_APPRENTICE || low == LEV_ARCHWIZARD) ?
		  "an" : "a",
		  WizLevels[low]);
	}
      else
	{
	  for (p = wizlist; p != NULL && p->wlev >= low; p = p->next)
	    {
	      if (p->wlev <= high)
		{
		  if (!h)
		    {
		      bprintf("%s", "&+BThe following players have risen to power in the lands of AberMUD:&*");
		      if (low > LEV_APPRENTICE || high < LEV_MASTER)
			{
			  bprintf("\n&+G(Only the levels chosen are shown)&*");
			}
		      h = True;
		    }
		  if (p->wlev != x)
		    {
		      bprintf("\n\n&+Y%s&*\n", w[x = p->wlev]);
		      for (t = 0; t != strlen (w[x = p->wlev]); t++)
			bprintf ("-");
		      if (x >= 5)
			full_title = True;
		      else
			full_title = False;
		      bprintf ("\n");
		      k = 5;
		    }
		  if (!full_title)
		    bprintf("%-14.14s ", p->name);
		  else
		    {
		      int lf;
		      if (find_player(p->name, &pers, (Boolean*)&lf) != -1)
			bprintf("%s\n", make_title (pers.p_title, pers.p_name));
		      else
			bprintf("%s\n", p->name);
		    }
		  if (--k == 0 && !full_title)
		    {
		      bprintf("\n");
		      k = 5;
		    }
		}
	    }
	  if (k < 6 && !full_title)
	    bprintf("\n");
	}
    }
  while ((t = brkword()) != -1);
}

void powerscom(void)
{
  static char *w[] = 
    {NULL, "Apprentice Wizards", "Emeriti", "Wizards", "Senior Wizards", 
     "ArchWizards", "High Archwizards", "DemiGods", "High DemiGods", "Gods", 
     "Masters"};
  
  int x = -1;
  int low, high;
  struct _w *p;
  Boolean h = False;
  int count = 0;
  low = LEV_ARCHWIZARD;
  high = LEV_MASTER;
  for (p = wizlist; p != NULL && p->wlev >= low; p = p->next)
    {
      if (p->wlev <= high)
	{
	  if (!h)
	    {
	      bprintf ("\n&+BThe following powers are here to help you.&*\n");
	      h = True;
	    }
	  if (p->wlev != x)
	    {
	      bprintf("\n&+Y%-15.15s&*: ", w[x = p->wlev]);
	      count = 18;
	    }
	  else
	    bprintf (", ");
	  count = count + strlen (p->name) + 2;
	  if (count >= 75)
	    {
	      bprintf("\n");
	      bprintf("%17.17s", " ");
	      count = 17;
	    }
	  bprintf("%s", p->name);
	}
    }
  bprintf("\n\n");
}