pdirt/data/
pdirt/data/HELP/
pdirt/data/HELP/0/
pdirt/data/HELP/F/
pdirt/data/HELP/G/
pdirt/data/HELP/H/
pdirt/data/HELP/J/
pdirt/data/HELP/K/
pdirt/data/HELP/O/
pdirt/data/HELP/Q/
pdirt/data/HELP/R/
pdirt/data/HELP/U/
pdirt/data/HELP/V/
pdirt/data/HELP/Y/
pdirt/data/HELP/Z/
pdirt/data/MESSAGES/
pdirt/data/POWERINFO/
pdirt/data/WIZ_ZONES/
pdirt/drv/
pdirt/drv/bin/
pdirt/drv/compiler/converter/
pdirt/drv/compiler/libs/
pdirt/drv/compiler/scripts/
pdirt/drv/include/AberChat/
pdirt/drv/include/InterMud/
pdirt/drv/include/machine/
pdirt/drv/src/InterMud/
pdirt/drv/src/Players/
pdirt/drv/utils/UAFPort/
pdirt/drv/utils/dnsresolv/
pdirt/drv/utils/gdbm/
/****************************************************************************
 ** Project    : pDirt (Aber IV MUD daemon)
 ** Module     : infosys.c
 ** Author     : various 
 ** Description: Some functions used to show info/help on things.
 ****************************************************************************/
#define INFOSYS_C

#include "kernel.h"
#include <unistd.h>
#include "bprintf.h"
#include "sendsys.h"
#include "sflags.h"
#include "mobile.h"
#include "parse.h"
#include "quest.h"

/***************************************************************************
 ** PROTOTYPES
 ***************************************************************************/
A_COMMAND(helpcom);                /* General help command */
A_COMMAND(infocom);                /* Informations system command */
A_COMMAND(qinfocom);               /* Quest information systemcommand */
A_COMMAND(powerinfocom);

int  showhelp(char *verb);         /* Used by helpcom */

 
A_COMMAND(helpcom)
{ int a, b;

  if (item1[0] != 0)
  {   if (showhelp (item1) < 0)
        return;
      if ((a = vichere ()) < 0)
        return;
      if ((b = phelping (mynum)) >= 0)
      {   sillytp (b, "stopped helping you.");
          bprintf ("Stopped helping \001p%s\003.\n", pname (b));
          return;
      }
      if (a == mynum)
      {   bprintf ("You are beyond help.\n");
          return;
      }
      setphelping (mynum, a);
      sillytp (a, "has offered to help you.");
      bprintf ("Started helping \001p%s\003.\n", pname (phelping (mynum)));
      return;
  }

  if (cur_player->aliased || cur_player->polymorphed != -1)
  {  bprintf("Not while aliased.\n");
     return;
  }
  
  if (plev (mynum) >= LVL_GOD)
    read_file (HELP, NULL, False, NULL);
  else if (plev (mynum) >= LVL_DEMI)
    read_file (HELP, "GOD", False, NULL);
  else if (plev (mynum) >= LVL_ARCHWIZARD)
    read_file (HELP, "DEMIGOD", False, NULL);
  else if (plev (mynum) >= LVL_APPREN)
    read_file (HELP, "ARCHWIZARD", False, NULL);
  else
    read_file (HELP, "WIZARD", False, NULL);
  
  return;
}

int showhelp (char *verb)
{ char file[256];
  char line[80];
  char ext;
  int scanreturn = 0;
  int v;
  FILE *fp;
  
  ext = toupper(verb[0]);
  if(!isalpha(ext)) 
       ext = '0';

  
  sprintf(line,"HELP/%c/%s.h",ext,lowercase(verb));
  sprintf (file, ROOTDIR"/drv/bin/pfilter %d 0x%08lx:0x%08lx:0x%08lx 0x%08lx:0x%08lx:0x%08lx %s",
           plev (mynum), pflags (mynum).b3, pflags (mynum).b2, pflags(mynum).b1,
           pmask (mynum).b3, pmask (mynum).b2, pmask(mynum).b1,line);
  
  if ((fp = popen (file, "r")) == NULL)
  {   bprintf ("Someone's editing the help file.\n");
      return -1;
  }
  ssetflg (mynum, SFL_BUSY);
  pbfr ();
  v = strlen (verb);

  if (fgets (line, sizeof (line), fp) == NULL)
  {   scanreturn = EOF;
  }
  
  if (scanreturn == EOF)
  {                           /* command not found in extern list */
      pclose (fp);
      sclrflg (mynum, SFL_BUSY);
      return 0;
  }
 
  bprintf("&+w%s",DASHLINE); 
  bprintf ("\n&+wUsage: &+w%s\n", line);
  while (fgets (line, sizeof (line), fp) != 0 && line[0] != '^')
  { bprintf ("%s", line);
  }
  bprintf ("&+w%s&*\n",DASHLINE);
  
  pclose (fp);
  sclrflg (mynum, SFL_BUSY);
  return -1;
}


/***************************************************************************
 ** Main viewer by QINFO and INFO.
 ** The Boolean is used to indicate if we want to use the Quests info dir.
 ***************************************************************************/ 
PRIVATE void info_viewer(Boolean Qinfo)
{ char file[100];
  char file1[110];
  
  if (brkword () == -1)
  {  if (Qinfo)
     {  /*strcpy (file,QINDEX);*/ qinfo_list();
        return;
     }
     else
       strcpy (file, INFO);
  }
  else
  {   if (strlen(wordbuf) > 15) 
      {	bprintf("Filename too long.\n");
	return; 
      }
      if (Qinfo)
      {  sprintf(file, "%s/%s.i",QUEST_DIR,lowercase(wordbuf));
         sprintf(file1,"%s/%s.i.Z",QUEST_DIR,lowercase(wordbuf));
      } 
      else
      {  sprintf (file, "INFO/%s.i", lowercase (wordbuf));
         sprintf (file1, "INFO/%s.i.Z", lowercase (wordbuf));
      }

      if (access (file, R_OK) < 0 && access (file1, R_OK) < 0)
      {   bprintf ("No info available on that topic.\n");
	  return;
      }
  }
  read_file(file,NULL,True,NULL);
}

/* The INFO command. */
A_COMMAND(infocom)
{  info_viewer(False);
}

/* The QINFO command. 
 * Show information about a specific quest
 */
A_COMMAND(qinfocom)
{  info_viewer(True);
}

A_COMMAND(powerinfocom)
{   char file[255];

    if (plev(mynum) < LVL_ARCHWIZARD)
    {   erreval();
        return;
    }

    if (EMPTY(item1))
    {  strcpy(file,"POWERINFO/index.pi");
    }
    else
    {   sprintf(file,"POWERINFO/%s.pi",lowercase(item1));

        if (access(file,R_OK) < 0)
        {  bprintf("No info on %s.\n",item1);
           return;
        }
        bprintf("&+wPowers Information System&*\n");
    }
    read_file(file,NULL,True,NULL);  
}