talker/
talker/bin/
talker/files/whois/
talker/update/
talker/update/bin/
/*
 * admin2.c -- added to speed up compiling in general --
 * All non-su / admin routines, and some simple staff routines, have
 * been moved here
 */

#include <string.h>
#include <memory.h>
#include <time.h>
#include <malloc.h>

#include "config.h"
#include "player.h"
 
/* externs */
extern void         swap_list_names(char *, char *);
extern void         lower_case(char *);
extern char         *do_crypt(char *, player *);
extern char         *end_string(), *next_space(), *tag_string(), *bit_string();
extern player       *find_player_global(), *find_player_global_quiet(char *),
                    *create_player();
extern saved_player *find_saved_player();
extern int          remove_player_file(), set_update();
extern int          get_flag();
extern void         hard_load_one_file(), sync_to_file(), remove_entire_list(),
                    destroy_player();
extern player       *find_player_absolute_quiet(char *);
extern int          match_banish(), emote_no_break();
extern void         soft_eject(player *, char *);
extern player       *find_player_absolute_quiet(char *);
extern char         *self_string(player *p), *first_char(player *);
extern char          shutdown_reason[];
extern time_t        shutdown_count;
extern file 	     load_file_verbose();
extern room         *comfy;
extern list_ent     *fle_from_save();
extern int check_privs();
#ifdef TRACK
extern int addfunction(char *);
#endif

/* view logs */

void            vlog(player * p, char *str)
{
   char *oldstack;
   file logb;

#ifdef TRACK
   sprintf(functionin,"vlog(%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;

   switch (*str)
   {
      case 0:
      case '?':
         tell_player(p, " Log files you can view: angel, ask, assist,"
                     " backup, banish, blanks, boot, bug, builder, bump,"
 		     " channel, chlim, connection, decap, drag, dumb, dump,"
		     " duty, edtime, error, forcehelp, forever, git, grant,"
 		     " help, idea, idle, item_delete, item_grant, jail, lag,"
		     " marry, minister, msg, newbies, newconn, nuke, pennies,"
		     " rename, reportto, resident, rm_move, rm_shout, rm_sing,"
		     " session, shutdown, sigpipe, site, sneeze, stack, su,"
		     " sufailpass, suicide, suicide_debug, sync, timeouts," 
		     " wall, warn, yoyo.\n");
         return;
      case '.':
         tell_player(p, " Uh-uh, you can't do that !\n");
         return;
   }
   sprintf(stack, "logs/%s.log", str);
   stack = end_string(stack);
   logb = load_file_verbose(oldstack, 0);
   stack = oldstack;
   if (logb.where)
   {
      if (*(logb.where))
         pager(p, logb.where, 1);
      else
         TELLPLAYER(p, " Couldn't find logfile 'logs/%s.log'\n", str);
      free(logb.where);
   }
   stack = oldstack;
}

/* warn someone */

void warn(player * p, char *str)
{
   char *oldstack, *msg, *pstring, *final;
   player **list, **step;
   int i,n, old_com, r=0, self = 0;

#ifdef TRACK
   sprintf(functionin,"show_malloc(%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   align(stack);
   command_type = PERSONAL | SEE_ERROR | WARNING;

   if (p->tag_flags & BLOCK_TELLS)
   {
      tell_player(p, " You are currently BLOCKING TELLS. It might be an idea to"                     
                     " unblock so they can reply, eh?\n");
   }
   msg = next_space(str);
   if (*msg)
      *msg++ = 0;
   if (!*msg)
   {
      tell_player(p, " Format: warn <player(s)> <message>\n");
      stack = oldstack;
      return;
   }

   CHECK_DUTY(p);

   /* no warns to groups */
   if (!strcasecmp(str, "everyone") || !strcasecmp(str, "friends")
       || !strcasecmp(str, "supers") || !strcasecmp(str, "sus")
       || strstr(str, "everyone"))
   {
      tell_player(p, " Now that would be a bit silly wouldn't it?\n");
      stack = oldstack;
      return;
   }
   if (!strcasecmp(str, "room")) r = 1;
   /* should you require warning, the consequences are somewhat severe */
   if (!strcasecmp(str, "me"))
   {
      tell_player(p, " Ummmmmmmmmmmmmmmmmmmmmm no. \n");
      stack = oldstack;
      return;
   }
   list = (player **) stack;
   n = global_tag(p, str);
   if (!n)
   {
      stack = oldstack;
      return;
   }
   final = stack;
  if (r) {
   if (p->gender==PLURAL)
     sprintf(stack, "-=*> %s warn everyone in this room: %s\n\n", p->name, msg);
   else
     sprintf(stack, "-=*> %s warns everyone in this room: %s\n\n", p->name, msg);
	}
  else {
   if (p->gender==PLURAL)
     sprintf(stack, "-=*> %s warn you: %s\n\n", p->name, msg);
   else
     sprintf(stack, "-=*> %s warns you: %s\n\n", p->name, msg);
	}
   stack = end_string(stack);
   for (step = list, i = 0; i < n; i++, step++)
   {
      if (*step != p)
      {
         command_type |= HIGHLIGHT;
         if ((*step)->residency & SU && (*step)->tag_flags & NOBEEPS)
                tell_player(*step, "\n");
         else   tell_player(*step, "\a\n");
         tell_player(*step, final);
         (*step)->warn_count++;
         p->num_warned++;
         command_type &= ~HIGHLIGHT;
      }
   }
   stack = final;

   pstring = tag_string(p, list, n);
   final = stack;
   if (p->gender==PLURAL)
     sprintf(stack, " -=*> %s warn %s: %s", p->name, pstring, msg);
   else
     sprintf(stack, " -=*> %s warns %s: %s", p->name, pstring, msg);
   stack = end_string(stack);
   log("warn", final);
   strcat(final, "\n");
   stack = end_string(final);
   command_type = 0;
   su_wall(final);

   cleanup_tag(list, n);
   stack = oldstack;
}


/* trace someone and check against email */

void trace(player * p, char *str)
{
   char *oldstack;
   player *p2, dummy;

#ifdef TRACK
   sprintf(functionin,"trace (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: trace <person>\n");
      return;
   }
   p2 = find_player_absolute_quiet(str);
   if (!p2)
   {
      sprintf(stack, " \'%s\' not logged on, checking saved files...\n",
              str);
      stack = end_string(stack);
      tell_player(p, oldstack);
      stack = oldstack;
      strcpy(dummy.lower_name, str);
      lower_case(dummy.lower_name);
      dummy.fd = p->fd;
      if (!load_player(&dummy))
      {
         tell_player(p, " Not found.\n");
         return;
      }
      if (dummy.residency == BANISHD)
      {
         tell_player(p, " That is a banished name.\n");
          return;
      }
      if ( dummy.email[0] )
      {
         if ( dummy.email[0] == -1 )
         {
            sprintf(stack, " %s has declared no email address.\n", dummy.name);
            stack = strchr(stack, 0);
         } else if ( p->residency & ADMIN )
         {
            sprintf(stack, " %s [%s]\n", dummy.name, dummy.email);
            if (dummy.custom_flags & PRIVATE_EMAIL)
            {
               while (*stack != '\n')
                  stack++;
               strcpy(stack, " (private)\n");
            }
            stack = strchr(stack, 0);
         }
      }
      sprintf(stack, " %s last connected from %s\n   and disconnected at ",
               dummy.name, dummy.saved->last_host);
      stack = strchr(stack, 0);
      if (p->jetlag)
         sprintf(stack, "%s\n", convert_time(dummy.saved->last_on
                                                 + (p->jetlag * 3600)));
      else
         sprintf(stack, "%s\n", convert_time(dummy.saved->last_on));
      stack = end_string(stack);
      tell_player(p, oldstack);
      stack = oldstack;
      return;
   }

   if (p2->residency == NON_RESIDENT)
   {
      sprintf(stack, " %s is non resident.\n", p2->name);
      stack = strchr(stack, 0);
   }
   else if (p2->email[0])
   {
      if (p2->email[0] == -1)
      {
         sprintf(stack, " %s has declared no email address.\n", p2->name);
         stack = strchr(stack, 0);
      } else if ( p->residency & ADMIN )
      {
         sprintf(stack, " %s [%s]\n", p2->name, p2->email);
         if (p2->custom_flags & PRIVATE_EMAIL)
         {
            while (*stack != '\n')
               stack++;
            strcpy(stack, " (private)\n");
         }
         stack = strchr(stack, 0);
      }
   } else
   {
      sprintf(stack, " %s has not set an email address.\n", p2->name);
      stack = strchr(stack, 0);
   }
   sprintf(stack, " %s is connected from %s.\n", p2->name, p2->inet_addr);
   stack =end_string(stack);
   tell_player(p, oldstack);
   stack = oldstack;
}


/* list people who are from the same site */

void same_site(player * p, char *str)
{
   char *oldstack, *text;
   player *p2;

#ifdef TRACK
   sprintf(functionin,"same_site (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif
   oldstack = stack;
   if (isalpha(*str))
   {
      if (!strcasecmp(str, "me"))
      {
         p2 = p;
      } else
      {
         p2 = find_player_global(str);
      }
      if (!p2)
      {
         stack = oldstack;
         return;
      }
      str = stack;
      text = p2->num_addr;
      while (isdigit(*text))
         *stack++ = *text++;
      *stack++ = '.';
      *text++;
      while (isdigit(*text))
         *stack++ = *text++;
      *stack++ = '.';
      *stack++ = '*';
      *stack++ = '.';
      *stack++ = '*';
      *stack++ = 0;
   }
   if (!isdigit(*str))
   {
      tell_player(p, " Format: site <inet_number> or site <person>\n");
      stack = oldstack;
      return;
   }
   text = stack;
   sprintf(stack, "People from .. %s\n", str);
   stack = strchr(stack, 0);
   for (p2 = flatlist_start; p2; p2 = p2->flat_next)
   {
      if (match_banish(p2, str))
      {
         sprintf(stack, "(%s) %s : %s ", p2->num_addr, p2->inet_addr, p2->name);         
	 stack = strchr(stack, 0);
         if (p2->residency == NON_RESIDENT)
         {
            strcpy(stack, "non resident.\n");
            stack = strchr(stack, 0);
         } else if (p2->email[0])
         {
            if (p2->email[0] == -1)
               strcpy(stack, "No email address.");
            else
            {
               if (((p2->custom_flags & PRIVATE_EMAIL) &&
                                        (p->residency & ADMIN))
                    || !(p2->custom_flags & PRIVATE_EMAIL))
               {

                  sprintf(stack, "[%s]", p2->email);
                  stack = strchr(stack, 0);
               }
               if (p2->custom_flags & PRIVATE_EMAIL)
               {
                  strcpy(stack, " (private)");
                  stack = strchr(stack, 0);
               }
            }
            *stack++ = '\n';
         } else
         {
            strcpy(stack, "Email not set\n");
            stack = strchr(stack, 0);
         }
      }
   }
   *stack++ = 0;
   tell_player(p, text);
   stack = oldstack;
}


/* similar to shout but only goes to super users (eject and higher) */

void su(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"su (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   command_type = 0;

   if (!*str)
   {
      tell_player(p, " Format: su <message>\n");
      return;
   }
   CHECK_DUTY(p);
   sys_color_atm = SUCsc;
      if ( p->flags & FROGGED )
         SUWALL("<%s> %s and WHERE'S MY RATTLE!!^N\n", p->name, str);
      else
         SUWALL("<%s> %s^N\n", p->name, str);
   sys_color_atm = SYSsc;
}


/* su-emote.. it's spannerish, I know, but what the hell */
void suemote(player * p, char *str)
{

#ifdef TRACK
   sprintf(functionin,"suemote (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   command_type = 0;

   if (!*str)
   {
      tell_player(p, " Format: se <message>\n");
      return;
   }
   CHECK_DUTY(p);
   sys_color_atm = SUCsc;
   if ( p->flags & FROGGED )
      SUWALL( "<%s %s ^Nwhile shaking a broken rattle>\n", p->name, str);
   else
        {
        if (emote_no_break(*str))
                SUWALL( "<%s%s^N>\n", p->name, str);
        else
                SUWALL( "<%s %s^N>\n", p->name, str);
        }
   sys_color_atm = SYSsc;
}
/* SU sing, muhahahahahahaha */
void susing(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"susing (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   command_type = 0;

   if (!*str)
   {
      tell_player(p, " Format: ss <message>\n");
      return;
   }
   CHECK_DUTY(p);
   sys_color_atm = SUCsc;
   if ( p->flags & FROGGED )
      SUWALL("<%s sings o/~ %s ^No/~ while shaking a broken rattle>\n", p->name, str);
   else
      SUWALL("<%s sings o/~ %s ^No/~>\n", p->name, str);
   sys_color_atm = SYSsc;
}

/* Su think */

void suthink(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"suthink (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   command_type = 0;
   if (!*str)
   {
      tell_player(p, " Format: st <message>\n");
      return;
   }
   CHECK_DUTY(p);
   sys_color_atm = SUCsc;
   if ( p->flags & FROGGED )
      SUWALL("<%s thinks in an infantile fashion . o O ( %s ^N)>\n", p->name, str);
   else
      SUWALL("<%s thinks . o O ( %s ^N)>\n", p->name, str);
   sys_color_atm = SYSsc;
}

/* Admino Say, quick fargle by Nogard 29/4/94 (Its 95 Hans.) */
/* Muhaha, you unix nuts will love this admin channel :) - Chris */
void ad(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"ad (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif
   command_type = 0;

   if (!*str)
   {
      tell_player(p, " Format: ad <message>\n");
      return;
   }
   if (p->flags & BLOCK_SU)
   {
      tell_player(p, " You can't ad anything when you're ignoring them.\n");
      return;
   }
   sys_color_atm = ADCsc;
         AUWALL("/" "*" " %s " "*" "/ %s^N\n", p->name, str);
   sys_color_atm = SYSsc;
}


/* admin emotes, quick fargle by Nogard  29/4/95 */
void adminemote(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"ae (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif
   command_type = 0;

   if (!*str)
   {
      tell_player(p, " Format: ae <message>\n");
      return;
   }
   if (p->flags & BLOCK_SU)
   {
      tell_player(p, " You can't do ae's when you're ignoring them.\n");
      return;
   }
   sys_color_atm = ADCsc;
        if (emote_no_break(*str))
      AUWALL("/" "*" " %s%s ^N" "*" "/\n", p->name, str);
        else
      AUWALL("/" "*" " %s %s ^N" "*" "/\n", p->name, str);
   sys_color_atm = SYSsc;
}

/* Admin think , quick kludge by Nogard  29/4/95 */

void adminthink(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"at (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif
   command_type = 0;

   if (!*str)
   {
      tell_player(p, " Format: at <message>\n");
      return;
   }
   if (p->flags & BLOCK_SU)
   {
      tell_player(p, " You can't do admin thinks when you're ignoring them.\n");      
	return;
   }
   sys_color_atm = ADCsc;
      AUWALL("/" "*" " %s thinks . o O ( %s ^N) " "*" "/ \n", p->name, str);
   sys_color_atm = SYSsc;
}

/* toggle whether the su channel is highlighted or not */

void su_hilited(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"su_hilited (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if (p->misc_flags & SU_HILITED)
   {
      tell_player(p, " You will not get the su channel hilited.\n");
      p->misc_flags &= ~SU_HILITED;
   } else
   {
      tell_player(p, " You will get the su channel hilited.\n");
      p->misc_flags |= SU_HILITED;
   }
}

/* toggle whether the program is globally closed to newbies */

void close_to_newbies(player * p, char *str)
{
   int wall = 0;

#ifdef TRACK
   sprintf(functionin,"close_to_newbies (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif
   if (p->flags & BLOCK_SU )
     {
       tell_player(p," You cant do THAT when off_duty.\n");
       return;
     }

   if ((!strcasecmp("on", str)||!strcasecmp("open",str))
       && sys_flags & CLOSED_TO_NEWBIES)
   {
      sys_flags &= ~CLOSED_TO_NEWBIES;

      /*log the open*/
      LOGF("newbies","Program opened to newbies by %s",p->name);
      wall = 1;
   } else if ((!strcasecmp("off", str)||!strcasecmp("close",str))
              && !(sys_flags & CLOSED_TO_NEWBIES))
   {
      sys_flags |= CLOSED_TO_NEWBIES;

      /*log the close*/
      LOGF("newbies","Program closed to newbies by %s",p->name);
      wall = 1;
   } else
      wall = 0;

   if (sys_flags & CLOSED_TO_NEWBIES)
   {
      if (!wall)
         tell_player(p, " Program is closed to all newbies.\n");
      else
      SUWALL("\n -=*> %s closes the prog to newbies.\n\n", p->name);
   } else
   {
      if (!wall)
         tell_player(p, " Program is open to newbies.\n");
      else
      SUWALL("\n -=*> %s opens the prog to newbies.\n\n", p->name);
   }
}

/* toggle whether the program is globally closed to ressies */

void close_to_ressies(player * p, char *str)
{
   int wall = 0;
#ifdef TRACK
   sprintf(functionin,"close_to_newbies (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif
   if (p->flags & BLOCK_SU )
     {
       tell_player(p," You cant do THAT when off_duty.\n");
       return;
     }

   if ((!strcasecmp("on", str)||!strcasecmp("open",str))
       && sys_flags & CLOSED_TO_RESSIES)
   {
      sys_flags &= ~CLOSED_TO_RESSIES;

      /*log the open*/
      LOGF("ressies","Program opened to ressies by %s",p->name);
      wall = 1;
   } else if ((!strcasecmp("off", str)||!strcasecmp("close",str))
              && !(sys_flags & CLOSED_TO_RESSIES))
   {
      sys_flags |= CLOSED_TO_RESSIES;

      /*log the close*/
      LOGF("ressies","Program closed to ressies by %s",p->name);
      wall = 1;
   } else
      wall = 0;

   if (sys_flags & CLOSED_TO_RESSIES)
   {
      if (!wall)
         tell_player(p, " Program is closed to all ressies.\n");
      else
      SUWALL( "\n -=*> %s closes the prog to ressies.\n\n", p->name);
   } else
   {
      if (!wall)
         tell_player(p, " Program is open to ressies.\n");
      else
      SUWALL("\n -=*> %s opens the prog to ressies.\n\n", p->name);
   }
}

/* Sync all player files */

void sync_all_by_user(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"sync_all_by_user (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   tell_player(p, " Starting to sync ALL players...");
   sync_all();
   tell_player(p, " Completed\n\r");
}

/* command to list lots of info about a person */

void check_info(player * p, char *str)
{
   player dummy, *p2;
   char *oldstack;

#ifdef TRACK
   sprintf(functionin,"check_info (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: check info <player>\n");
      return;
   }
   memset(&dummy, 0, sizeof(player));

   p2 = find_player_absolute_quiet(str);
   if (p2)
      memcpy(&dummy, p2, sizeof(player));
   else
   {
      strcpy(dummy.lower_name, str);
      lower_case(dummy.lower_name);
      dummy.fd = p->fd;
      if (!load_player(&dummy))
      {
         tell_player(p, " No such person in saved files.\n");
         return;
      }
   }

   switch (dummy.residency)
   {
      case SYSTEM_ROOM:
         tell_player(p, " Standard rooms file\n");
         return;
      default:
         if (dummy.residency & BANISHD)
         {
            if (dummy.residency == BANISHD)
               tell_player(p, "BANISHED (Name only).\n");
            else
               tell_player(p, "BANISHED.\n");
         }
         sprintf(stack, "            <   Res   >ch misc  upper <SU+> \n"
                        "            Bx+TbsMLBSsFR CWtH  D STK LHpSAg\n"
                        "Residency   %s\n", bit_string(dummy.residency));
         break;
   }
   stack = strchr(stack, 0);

   sprintf(stack, "%s %s %s\n", dummy.pretitle, dummy.name, dummy.title);
   stack = strchr(stack, 0);
   sprintf(stack, "EMAIL: %s\n", dummy.email);
   stack = strchr(stack, 0);
   sprintf(stack, "SPOD_CLASS: %s\n", dummy.spod_class);
   stack = strchr(stack, 0);
   if (dummy.term) {
        sprintf(stack, "Hitells turned on.\n");
        stack = strchr(stack, 0);
        }
   if ((dummy.password[0]) <= 0)
   {
      strcpy(stack, "NO PASSWORD SET\n");
      stack = strchr(stack, 0);
   }
   sprintf(stack, "            !D$LdJmM--fnemMmLAIiDsb---------\n"
                  "SystemFlags %s\n", bit_string(dummy.system_flags));
   stack = strchr(stack, 0);
   sprintf(stack, "            >-!]+e#^^--!>*+dm$c=B#?pILB------\n"
                  "TagFlags    %s\n", bit_string(dummy.tag_flags));
   stack = strchr(stack, 0);
   sprintf(stack, "            hESes-----gmnpeSPrfxCq----------\n"
                  "CustomFlags %s\n", bit_string(dummy.custom_flags));
   stack = strchr(stack, 0);
   sprintf(stack, "            PG--------csCSg-----------------\n"
                  "MiscFlags   %s\n", bit_string(dummy.misc_flags));
   stack = strchr(stack, 0);
   sprintf(stack, "            PRNREPCPTLCEISDRUbSWAFSlC-------\n"
                  "flags       %s\n", bit_string(dummy.flags));
   stack = strchr(stack, 0);
   sprintf(stack, "            0123456789012345678901234567890-\n"
                  "chanflags   %s\n", bit_string(dummy.chanflags));
   stack = strchr(stack, 0);
   sprintf(stack, "opflags     %s\n", bit_string(dummy.opflags));
   stack = strchr(stack, 0);
   sprintf(stack, "c_invites   %s\n", bit_string(dummy.c_invites));
   stack = strchr(stack, 0);
   sprintf(stack, "Max: rooms %d, exits %d, autos %d, list %d, mails %d\n",
           dummy.max_rooms, dummy.max_exits, dummy.max_autos,
           dummy.max_list, dummy.max_mail);
   stack = strchr(stack, 0);
   sprintf(stack, "Term: width %d, wrap %d\n",
           dummy.term_width, dummy.word_wrap);
   stack = strchr(stack, 0);
   if (dummy.script)
   {
      sprintf(stack, "Scripting on for another %s.\n",
              word_time(dummy.script));
      stack = strchr(stack, 0);
   }
   *stack++ = 0;
   tell_player(p, oldstack);
   stack = oldstack;
}


/* command to check IP addresses */

void view_ip(player * p, char *str)
{
   player *scan;
   char *oldstack, middle[80];
   int page, pages, count;

#ifdef TRACK
   sprintf(functionin,"view_ip (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   if (isalpha(*str))
   {
      scan = find_player_global(str);
      stack = oldstack;
      if (!scan)
         return;
      if (scan->gender==PLURAL)
        sprintf(stack, "%s are logged in from %s.\n", scan->name,
                scan->inet_addr);
      else
        sprintf(stack, "%s is logged in from %s.\n", scan->name,
                scan->inet_addr);
      stack = end_string(stack);
      tell_player(p, oldstack);
      stack = oldstack;
      return;
   }
   page = atoi(str);
   if (page <= 0)
      page = 1;
   page--;

   pages = (current_players - 1) / (TERM_LINES - 2);
   if (page > pages)
      page = pages;

   if (current_players == 1)
      strcpy(middle, "There is only you on the program at the moment. Doh!");
   else
      sprintf(middle, "There are %s people on the program",
              number2string(current_players));
   pstack_mid(middle);
   count = page * (TERM_LINES - 2);
   for (scan = flatlist_start; count; scan = scan->flat_next)
   {
      if (!scan)
      {
         tell_player(p, " Bad where listing, abort.\n");
         log("error", "Bad where list");
         stack = oldstack;
         return;
      } else if (scan->name[0])
         count--;
   }

   for (count = 0; (count < (TERM_LINES - 1) && scan); scan = scan->flat_next)
   {
      if (scan->name[0] && scan->location)
      {
         if (scan->flags & SITE_LOG)
            *stack++ = '*';
         else
            *stack++ = ' ';
         if (scan->gender==PLURAL)
           sprintf(stack, "%s are logged in from %s.\n", scan->name,
                   scan->inet_addr);
         else
           sprintf(stack, "%s is logged in from %s.\n", scan->name,
                   scan->inet_addr);
         stack = strchr(stack, 0);
         count++;
      }
   }
   sprintf(middle, "Page %d of %d", page + 1, pages + 1);
   pstack_mid(middle);

   *stack++ = 0;
   tell_player(p, oldstack);
   stack = oldstack;
}


/* command to view email status about people on the prog */

void view_player_email(player * p, char *str)
{
   player *scan;
   char *oldstack, middle[80];
   int page, pages, count;

#ifdef TRACK
   sprintf(functionin,"view_player_email (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   page = atoi(str);
   if (page <= 0)
      page = 1;
   page--;

   pages = (current_players - 1) / (TERM_LINES - 2);
   if (page > pages)
      page = pages;

   if (current_players == 1)
      strcpy(middle, "There is only you on the program at the moment. Doh!");
   else
      sprintf(middle, "There are %s people on the program",
              number2string(current_players));
   pstack_mid(middle);

   count = page * (TERM_LINES - 2);
   for (scan = flatlist_start; count; scan = scan->flat_next)
   {
      if (!scan)
      {
         tell_player(p, " Bad where listing, abort.\n");
         log("error", "Bad where list");
         stack = oldstack;
         return;
      } else if (scan->name[0])
         count--;
   }

   for (count = 0; (count < (TERM_LINES - 1) && scan); scan = scan->flat_next)
   {
      if (scan->name[0] && scan->location)
      {
         if (scan->residency == NON_RESIDENT)
            sprintf(stack, "%s is non resident.\n", scan->name);
         else if (scan->email[0])
         {
            if (scan->email[0] == -1)
               sprintf(stack, "%s has declared no email address.\n",
                       scan->name);
            else if (scan->email[0] == -2)
            {
               sprintf(stack, "%s has not yet set an email address.\n",
                       scan->name);
            } else
            {
               sprintf(stack, "%s [%s]\n", scan->name, scan->email);
               if (scan->custom_flags & PRIVATE_EMAIL)
               {
                  while (*stack != '\n')
                     stack++;
                  strcpy(stack, " (private)\n");
               }
            }
         } else
         sprintf(stack, "%s has not set an email address.\n", scan->name);
         stack = strchr(stack, 0);
         count++;
      }
   }
   sprintf(middle, "Page %d of %d", page + 1, pages + 1);
   pstack_mid(middle);

   *stack++ = 0;
   tell_player(p, oldstack);
   stack = oldstack;
}

/* command to validate lack of email */

void validate_email(player * p, char *str)
{
   player *p2;
   char *oldstack;

   oldstack=stack;

#ifdef TRACK
   sprintf(functionin,"validate_email (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if (p->flags & BLOCK_SU)
     {
       tell_player(p," You cant validate emails when off_duty.\n");
       return;
     }

   p2 = find_player_global(str);
   if (!p2)
      return;
   p2->email[0] = ' ';
   p2->email[1] = 0;
   p2->saved->email[0] = ' ';
   p2->saved->email[1] = 0;
   tell_player(p, " Set player as having no email address.\n");

   sprintf(stack,"%s validated email for %s",p->name,p2->name);
   stack=end_string(oldstack);
   log("validate_email",oldstack);
   stack=oldstack;

}

/* a test fn to test things */

void test_fn(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"test_fn (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   do_birthdays();
}

void remove_saved_lag(player *p, char *str)
{
   char *oldstack;
   player *p2, dummy;

#ifdef TRACK
   sprintf(functionin,"unjail (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;

      tell_player(p, " Checking saved files... ");
      strcpy(dummy.lower_name, str);
      lower_case(dummy.lower_name);
      dummy.fd = p->fd;
      if (!load_player(&dummy))
      {
         tell_player(p, " Not found.\n");
         return;
      } else
      {
         tell_player(p, "\n");
         p2 = &dummy;
         p2->location = (room *) -1;
      }


   if (!(p2->system_flags & SAVE_LAGGED))
      {
         tell_player(p, " That player is not lagged.\n");
         return;
      }

   p2->system_flags ^= SAVE_LAGGED;

   sprintf(stack, " -=*> %s unlags %s.\n", p->name, p2->name);
   stack = end_string(stack);
   au_wall_but(p, oldstack);
   stack = oldstack;
     sprintf(stack, "%s unlags %s.", p->name, p2->name);
   stack = end_string(stack);
   log("lag", oldstack);
   stack = oldstack;
   save_player(&dummy);
}


/* give someone lag ... B-) */

void            add_lag(player * p, char *str)
{
   char           *size;
   int             new_size, plag = 0;
   char           *oldstack;
   player         *p2;

#ifdef TRACK
   sprintf(functionin,"add_lag (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if (p->flags & BLOCK_SU)
     {
       tell_player(p," Lagging isnt nice at the best of times, the least "
                   "you can do is go on_duty before you torture the poor "
                   "victim :P \n");
       return;
     }

   oldstack = stack;
   size = next_space(str);
   *size++ = 0;
   new_size = atoi(size);

   /*change minutes to seconds*/
   new_size*=60;

   /* can't check with new_size == 0 as we need that for unlagging */
   /* check for duff command syntax */
   if (strlen(size) == 0)
   {
      tell_player(p, " Format: lag <player> <time in minutes>\n");
      return;
   }
   /* find them and return if they're not on */
   p2 = find_player_global(str);
   if (!p2)
      {
        if (new_size == 0)
                remove_saved_lag(p, str);
      return;
        }
   /* thou shalt not lag those above you */
   if (!check_privs(p->residency, p2->residency))
   {
       tell_player(p, " You can't do that... Bad idea... !!\n");
       sprintf(oldstack, " -=*> %s tried to lag you.\n", p->name);
       stack = end_string(oldstack);
       tell_player(p2, oldstack);
       stack = oldstack;
       return;
   }

   /* check for silly or nasty amounts of lag */
   if (new_size < 0)
   {
        plag = 1;   /* yes, we can lag forever now :P */
        new_size = 1; /* just for the hell of it */
   }
   if (new_size > 600 && !(p->residency & ADMIN))
   {
       tell_player(p, "That's kinda excessive, set to 10 minutes.\n");
       new_size = 600;
   }
   /* lag 'em */
   p2->lagged = new_size;
   if (plag)
        p2->system_flags |= SAVE_LAGGED;
   else
        p2->system_flags &= ~SAVE_LAGGED;
   /* report success */
   if (new_size == 0)
   {
       sprintf(oldstack, " %s has been unlagged.\n", p2->name);
       stack = end_string(oldstack);
       tell_player(p, oldstack);
       stack = oldstack;
       sprintf(oldstack," -=*> %s unlags %s. (darn!)\n",p->name,p2->name);
       stack=end_string(oldstack);
       su_wall_but(p,oldstack);
       stack=oldstack;
       sprintf(oldstack,"%s unlags %s",p->name,p2->name);
       stack=end_string(oldstack);
       log("lag",oldstack);
       stack=oldstack;
   }
   else
   {
       tell_player(p, " Tis Done ..\n");
       stack = oldstack;
      if (plag)
sprintf(oldstack," -=*> %s lags %s like a bitch ass for...ever !!\n",p->name,p2->name);
      else
       sprintf(oldstack," -=*> %s lags %s like a bitch ass for %d minutes.\n",p->name,p2->name,new_size/60);
       stack=end_string(oldstack);
       su_wall(oldstack);
       stack=oldstack;
     if (plag)
       sprintf(oldstack,"%s lags %s for...ever -- muhahahaha",p->name,
               p2->name);

     else
       sprintf(oldstack,"%s lags %s for %d minutes",p->name,
               p2->name,new_size/60);
       stack=end_string(oldstack);
       log("lag",oldstack);
     if (plag)
        log("forever", oldstack);
       stack=oldstack;
   }
}

/* manual command to sync files to disk */

void sync_files(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"sync_files (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if (!isalpha(*str))
   {
      tell_player(p, " Argument must be a letter.\n");
      return;
   }
   sync_to_file(tolower(*str), 1);
   tell_player(p, " Sync succesful.\n");
}

/* manual retrieve from disk */

void restore_files(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"restore_files (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if (!isalpha(*str))
   {
      tell_player(p, " Argument must be a letter.\n");
      return;
   }
   remove_entire_list(tolower(*str));
   hard_load_one_file(tolower(*str));
   tell_player(p, " Restore succesful.\n");
}


/* shut down the program */

void pulldown(player * p, char *str)
{
   char *oldstack, *reason, *i;

#ifdef TRACK
   sprintf(functionin,"pulldown (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if (p->flags & BLOCK_SU)
   {
       tell_player(p," You need to be on_duty for that\n");
       return;
   }
   oldstack = stack;
   command_type &= ~HIGHLIGHT;

   if (!(p->residency & (LOWER_ADMIN|ADMIN)))
   {
       /* SUs can see a shutdown but not start one */
       if (*str)
       {
           /* lest they try... */
           tell_player(p, " Access denied :P\n");
           return;
       }
       if (shutdown_count > 1)
           /* if a shutdown is in progress */
       {
           /* contruct the message to tell them and send it to them */
           sprintf(stack, "\n %s, in %d seconds.\n",
                   shutdown_reason, shutdown_count);
           stack = end_string(stack);
           tell_player(p, oldstack);
           /* clean up stack and exit */
           stack = oldstack;
           return;
       }
       else
       {
           /* tell them no joy */
           tell_player(p, " No shutdown in progress.\n");
           return;
       }
   }
   if (!*str)
   {
       if (shutdown_count > -1)
       {
      sprintf(stack, "\n %s, in %d seconds.\n  \'shutdown -1\' to abort.\n\n",
                shutdown_reason, shutdown_count);
           stack = end_string(stack);
           tell_player(p, oldstack);
           stack = oldstack;
           return;
       } else
       {
           tell_player(p, " Format: shutdown <countdown> [<reason>]\n");
           return;
       }
   }
   reason = strchr(str, ' ');
   if (!reason)
   {
      sprintf(shutdown_reason, "%s is shutting the program down - it is "
              "probably for a good reason too\n",p->name);
   } else
   {
      *reason++ = 0;
      sprintf(shutdown_reason, "%s is shutting the program down - %s",
              p->name, reason);
   }
   if (!strcmp(str, "-1"))
   {
      shutdown_reason[0] = '\0';
      if (shutdown_count < 300)
      {
         raw_wall("\n\nShutdown aborted "
                  "(If you ever knew one was in progress...)\n\n");
      } else
      {
         tell_player(p, " Shutdown Aborted.\n");
      }
      shutdown_count = -1;
      return;
   }
   i = str;
   while (*i != 0)
   {
      if (!isdigit(*i))
      {
         tell_player(p, " Format: shutdown <countdown> [<reason>]\n");
         return;
      }
      *i++;
   }
   shutdown_count = atoi(str);
   sprintf(stack, " -=*> Program set to shutdown in %d seconds...\n",
           shutdown_count);
   stack = end_string(stack);
   tell_player(p, oldstack);
   stack = oldstack;
   command_type &= ~HIGHLIGHT;
}

/* wall to everyone, non blockable */

void wall(player * p, char *str)
{
   char *oldstack;

#ifdef TRACK
   sprintf(functionin,"wall (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if(p->flags & BLOCK_SU)
     {
       tell_player (p,"Burble had some pretty stupid jokes in this code... \n"
                    "No, seriously, you cant use wall when off_duty.\n");
       return;
     }

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: wall <arg>\n");
      return;
   }
   sprintf(oldstack, "  %s announces -=*> %s ^N<*=-\007\n", p->name, str);
   stack = end_string(oldstack);
   command_type |= HIGHLIGHT;
   raw_wall(oldstack);
   command_type &= ~HIGHLIGHT;
   stack = oldstack;
   LOGF("wall", "%s walls \"%s\"", p->name, str);
}

void edtime(player * p, char *str)
{
   player *p2;
   char *oldstack;
   int temp_time;
   char *temp;

   oldstack = stack;
   temp = next_space(str);
   *temp++ = 0;

   if (!*str || !*temp)
   {
      tell_player(p, " Format: edtime <player> [-] time (hours)>\n");
        return;
   }
   if (p->flags & BLOCK_SU)
   {
      tell_player(p, " Go back on duty first beavis.\n");
       return;
   }

   /* p2 = find_player_absolute_quiet(str); */
        p2 = find_player_global(str);
      if ((!p2))
      {
         tell_player(p, " Only when the player is logged on, chief!\n");
         stack = oldstack;
         return;
      }
      if ((p2->residency == NON_RESIDENT))
      {
         tell_player(p, " That player is non-resident!\n");
         stack = oldstack;
         return;
      }
      if ((p2->residency == BANISHD || p2->residency == SYSTEM_ROOM))
      {
         tell_player(p, " That is a banished NAME, or System Room.\n");
         stack = oldstack;
         return;
      }
      if (p==p2) {
	 TELLPLAYER(p, " Sorry. That would be cheating. That's immoral.\n");
	 LOGF(".ed", "%s tried to edit their own time (%d)", p->name, p->total_login);
	 AUWALL(" -=*> %s tried to edit their own time...\n", p->name);
	 p->total_login /= 4;
	return;
	}
      sprintf(oldstack, "\n -=*> %s has changed your total login time...\n",
       p->name);
      stack = end_string(oldstack);
      tell_player(p2, oldstack);
      stack = oldstack;
      temp_time = atoi(temp);
      /* convert to hours */
      temp_time *=3600;
      p2->total_login += temp_time;
      sprintf(stack, "%s changed the total login time of %s by %s hours.",
                p->name, p2->name, temp);
      stack = end_string(stack);
      log("edtime",oldstack);
      save_player(p2);
      tell_player(p, " Tis Done...\n");
      stack = oldstack;
      sprintf(stack, " -=*> %s changes the total login time of %s.\n",p->name,
      p2->name);
      stack = end_string(stack);
      au_wall_but(p, stack);
       stack = oldstack;
}

/* List the Super Users who're on */


void lsu(player * p, char *str)
{
  int count = 0;
  char *oldstack, *prestack;
  player *scan;
  int current_supers;

  current_supers = count_su();

  oldstack = stack;
    strcpy(stack, "========================== Super Users connected "
                  "==========================\n");
   stack = strchr(stack, 0);
  for (scan = flatlist_start; scan; scan = scan->flat_next)
  {
    prestack = stack;
    if (scan->residency & PSU && scan->location)
    {
      if (p->residency & PSU && *str != '-')
      {
        count++;
        *stack = ' ';
        stack++;
        sprintf(stack, " %-18s  ", scan->name);
        stack = strchr(stack, 0);
        if (scan->saved_residency & CODER)
            strcpy(stack, "< Coder >          ");
        else if (scan->saved_residency & ADMIN)
            strcpy(stack, "< Admin >          ");
        else if (scan->saved_residency & LOWER_ADMIN)
            strcpy(stack, "< Lower Admin >    ");
        else if (scan->saved_residency & ASU)
            strcpy(stack, "< Super User >     ");
        else if (scan->saved_residency & SU)
            strcpy(stack, "< SU in Training > ");
        else if (scan->saved_residency & PSU)
            strcpy(stack, "< SU Channel Only >");
        stack = strchr(stack, 0);
        if (scan->flags & BLOCK_SU)
        {
          strcpy(stack,  "  Off Duty   ");
          stack = strchr(stack, 0);
        }
        else if ((scan->flags & OFF_LSU) && !(scan->flags & BLOCK_SU))
        {
          strcpy(stack,  "  Invis      ");
          stack = strchr(stack, 0);
        }
        else if ((!strcmp(scan->location->owner->lower_name,"main")||
             !strcmp(scan->location->owner->lower_name,"system")))
        {
          sprintf(stack, "  @%-10s", scan->location->id);
        }
        else
        {
          strcpy(stack,  "             ");
        }
      stack = strchr(stack, 0);
      sprintf(stack, " %3d:%.2d idle ", scan->idle/60,scan->idle%60);
      stack = strchr(stack, 0);
        if ((scan->tag_flags & (BLOCK_SHOUT|BLOCK_TELLS|BLOCKCHANS|SINGBLOCK)))
        {
          strcpy(stack, " Blk ");
          stack = strchr(stack, 0);
          if ((scan->tag_flags & BLOCK_TELLS))
                {
          strcpy(stack, ">");
          stack = strchr(stack, 0);
                }
          if ((scan->tag_flags & BLOCK_SHOUT))
                {
          strcpy(stack, "!");
          stack = strchr(stack, 0);
                }
          if ((scan->tag_flags & BLOCKCHANS))
                {
          strcpy(stack, "%");
          stack = strchr(stack, 0);
                }

          if((scan->tag_flags & SINGBLOCK))
                {
          strcpy(stack, "$");
          stack = strchr(stack, 0);
                }
        } /* end scan for blocks */
      *stack++ = '\n';
    /* ok here's what the ressies see (i hope) */
   } /* end if psu */

/* ok, here's what this if checks. (traP)
        If su is on duty, and is not off_lsu, and is either
        not admin, or is admin (with less than 5 sus around)
        and is not 5 minutes idle (unless that would cause there to be
        no one on lsu) -- simple, huh? :P */
/* my god, Mike. You're a spoon !!!!!!!! */

    else if (!(scan->flags & OFF_LSU) && !(scan->flags & BLOCK_SU) &&
                ((scan->residency & ADMIN && current_supers < 5) ||
                (scan->residency & SU && !(scan->residency & ADMIN)))
                && (scan->idle < 300 || (!current_supers && !count)))
    {
        count++;
        *stack = ' ';
        stack++;
        sprintf(stack, " %-18s  ", scan->name);
        stack = strchr(stack, 0);
        if ((scan->saved_residency & ADMIN))
            strcpy(stack, "< Administrator >   ");
        else if (scan->saved_residency & LOWER_ADMIN)
            strcpy(stack, "< Lower Admin >     ");
        else if (scan->saved_residency & SU)
            strcpy(stack, "< Super User >      ");
        stack = strchr(stack, 0);
        if ((!strcmp(scan->location->owner->lower_name,"main")||
             !strcmp(scan->location->owner->lower_name,"system")))
        {
          sprintf(stack, "  @%-12s", scan->location->id);
        }
        else
        {
          strcpy(stack,  "               ");
        }
         stack = strchr(stack, 0);
      sprintf(stack, " %3d:%.2d idle", scan->idle/60,scan->idle%60);
      stack = strchr(stack, 0);
      *stack++ = '\n';
  /*    o.    I can't say how much I love these conversations that we
    have between comments though, but isnt that bad programming style? */
  /* are you turning in this code to a prof? :P */
  } /* end if '-' or ressie */
 } /* end scan one player -- ? */
} /* end for */
  if (count > 1)
    sprintf(stack, "==================== There are %2d Super Users connected"
              " ===================\n", count);
  else
    if (count == 1)
      sprintf(stack, "==================== There is one Super User connected "
              "====================\n", count);
  stack = end_string(stack);
  if (count) tell_player(p, oldstack);
  else
        tell_player(p, " -=*> There are no super users on at the moment. \n"
                " If you want to get residency, send mail to (our email address).\n");
	stack = oldstack;
}


/* List the Newbies that're on */

void lnew(player * p, char *str)
{
   char *oldstack;
   int count = 0;
   player *scan;

#ifdef TRACK
   sprintf(functionin,"lnew (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   command_type = EVERYONE;
   strcpy(stack, "================================ Newbies on "
                 "===============================\n");
   stack = strchr(stack, 0);
   for (scan = flatlist_start; scan; scan = scan->flat_next)
   {
      if (scan->residency == NON_RESIDENT && scan->location)
      {
         count++;
         sprintf(stack, "%-20s ", scan->name);
         stack = strchr(stack, 0);
         sprintf(stack, "%-40s ", scan->inet_addr);
         stack = strchr(stack, 0);
         if (scan->assisted_by[0] != '\0')
         {
            sprintf(stack, "[%s]", scan->assisted_by);
            stack = strchr(stack, 0);
         }
         *stack++ = '\n';
      }
   }

   if (count > 1)
      sprintf(stack, "===================== There are %2d Newbies connected "
                      "=====================\n", count);
   else if (count == 1)
      sprintf(stack, "====================== There is one Newbie connected "
                     "======================\n", count);
   stack = end_string(stack);

   if (count == 0)
      tell_player(p, " No newbies on at the moment.\n");
   else
      tell_player(p, oldstack);
   stack = oldstack;
}


/* lets see if we cant spoon this for list gits*/

void listgits(player * p, char *str)
{
   char *oldstack;
   int count = 0;
   player *scan;

#ifdef TRACK
   sprintf(functionin,"lnew (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   command_type = EVERYONE;
   strcpy(stack, "================================= Gits on "
                 "=================================\n");
   stack = strchr(stack, 0);
   for (scan = flatlist_start; scan; scan = scan->flat_next)
   {
      if (scan->git_string[0] != '\0' && !(scan->residency & PSU))
      {
         count++;
         sprintf(stack, "%-20s ", scan->name);
         stack = strchr(stack, 0);
         sprintf(stack, "%-40s ", scan->inet_addr);
         stack = strchr(stack, 0);
         sprintf(stack, "\n  [%s]", scan->git_by);
         stack = strchr(stack, 0);
         sprintf(stack, " : %s", scan->git_string);
         stack = strchr(stack, 0);
         *stack++ = '\n';
      }
   }

   sprintf(stack, "======================================================"
                  "=====================\n");
   stack = end_string(stack);

   if (count == 0)
      tell_player(p, " No dorkballs on at the moment.\n");
   else
      tell_player(p, oldstack);
   stack = oldstack;
}




/* And why not list tweedles? :P */

void listdumb(player * p, char *str)
{
   char *oldstack;
   int count = 0;
   player *scan;

   oldstack = stack;
   command_type = EVERYONE;
   strcpy(stack, "=============================== Tweedles on "
                 "===============================\n");
   stack = strchr(stack, 0);
   for (scan = flatlist_start; scan; scan = scan->flat_next)
   {
      if (scan->flags & FROGGED)
      {
         count++;
         sprintf(stack, "%-20s ", scan->name);
         stack = strchr(stack, 0);
         sprintf(stack, "%-40s ", scan->inet_addr);
         stack = strchr(stack, 0);
         *stack++ = '\n';
      }
   }

   sprintf(stack, "======================================================"
                  "=====================\n");
   stack = end_string(stack);

   if (count == 0)
      tell_player(p, " No tweedles on at the moment.\n");
   else
      tell_player(p, oldstack);
   stack = oldstack;
}




/* help for superusers */

void super_help(player * p, char *str)
{
   char *oldstack;
   file help;

#ifdef TRACK
   sprintf(functionin,"super_help (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   if (!*str || (!strcasecmp(str, "admin") && !(p->residency & ADMIN)))
   {
      tell_player(p, " SuperUser help files that you can read are:\n   " 
                     "shelp basic, advanced, commands, res\n");
      return;
   }
   if (*str == '.')
   {
      tell_player(p, " Uh-uh, cant do that ...\n");
      return;
   }
   sprintf(stack, "doc/%s.doc", str);
   stack = end_string(stack);
   help = load_file_verbose(oldstack, 0);
   if (help.where)
   {
      if (*(help.where))
      {
         if (p->custom_flags & NO_PAGER)
            tell_player(p, help.where);
         else
            pager(p, help.where, 1);
      } else
      {
         tell_player(p, " Couldn't find that help file ...\n");
      }
      FREE(help.where);
   }
   stack = oldstack;
}

/* assist command */

void assist_player(player * p, char *str)
{
   char *oldstack, *comment;
   player *p2, *p3;

#ifdef TRACK
   sprintf(functionin,"assist_player (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if (p->flags & BLOCK_SU)
     {
       tell_player(p," Go on_duty first.\n");
       return;
     }

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: assist <person>\n");
      return;
   }
   if (!strcasecmp(str, "me"))
   {
      p2 = p;
   } else
   {
      p2 = find_player_global(str);
      if (!p2)
         return;
   }
   if (p != p2)
   {
      if (p2->residency != NON_RESIDENT)
      {
         tell_player(p, " That person isn't a newbie though ...\n");
         return;
      }
   }
   if (p2->flags & ASSISTED)
   {
      p3 = find_player_absolute_quiet(p2->assisted_by);
      if (p3)
      {
         if (p != p3)
         {
            sprintf(stack, " That person is already assisted by %s.\n",
                    p2->assisted_by);
         } else
         {
            sprintf(stack, " That person has already been assisted by %s."
                           " Oh! That's you that is! *smirk*\n",
                           p2->assisted_by);
         }
         stack = end_string(stack);
         tell_player(p, oldstack);
         stack = oldstack;
         return;
      }
   }
   if (p!=p2)
   {
      p2->flags |= ASSISTED;
      strcpy(p2->assisted_by, p->name);
   }
   oldstack = stack;
   if (p->gender == PLURAL)
     sprintf(stack, "\n -=*> %s are superusers, and would be "
             "happy to assist you in any problems you may have, including "
             "gaining residency, so that you can have your own rooms, and "
             "have your character saved between visits (type \'help "
             "residency\') for " "more information about that.) "
             "To talk to %s, type 'tell %s <whatever>\', "
             "short forms of names usually work as well.\n\n", p->name,
             get_gender_string(p), p->lower_name);
   else
     sprintf(stack, "\n -=*> %s is a superuser, and would be "
             "happy to assist you in any problems you may have, including "
             "gaining residency, so that you can have your own rooms, and "
             "have your character saved between visits (type \'help "
             "residency\') for more information about that.) "
             "To talk to %s, type 'tell %s <whatever>\', "
             "short forms of names usually work as well.\n\n", p->name,
             get_gender_string(p), p->lower_name);

   stack = end_string(stack);
   tell_player(p2, oldstack);
   stack = oldstack;
   if (p!=p2)
   {
      sprintf(stack, " -=*> %s jumps on %s.\n", p->name, p2->name);
      stack = end_string(stack);
      p->flags |= NO_SU_WALL;
      su_wall(oldstack);
      stack = oldstack;
      sprintf(stack, " You assist %s.\n", p2->name);
      stack = end_string(stack);
      tell_player(p, oldstack);
      stack = oldstack;
      sprintf(stack, "%s assists %s", p->name, p2->name);
      stack = end_string(stack);
      log("assist", oldstack);
      stack = oldstack;
   }
}


/* dibbs command */

void dibbs(player * p, char *str)
{
   char *oldstack, *comment;
   player *p2;

   if (p->flags & BLOCK_SU)
     {
       tell_player(p," Go on_duty first.\n");
       return;
     }

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: dibbs <person>\n");
      return;
   }
   if (!strcasecmp(str, "me"))
   {
      p2 = p;
   } else
   {
      p2 = find_player_global(str);
      if (!p2)
         return;
   }
   if (p!=p2)
   {
      sprintf(stack, " -=*> %s calls dibbs on %s.\n", p->name, p2->name);
      stack = end_string(stack);
      p->flags |= NO_SU_WALL;
      su_wall(oldstack);
      stack = oldstack;
      sprintf(stack, " You call dibbs on %s.\n", p2->name);
      stack = end_string(stack);
      tell_player(p, oldstack);
      stack = oldstack;
      sprintf(stack, "%s calls dibbs on %s", p->name, p2->name);
      stack = end_string(stack);
      log("assist", oldstack);
      stack = oldstack;
   }
}

/* Confirm if password and email are set on a resident */

void confirm_password(player * p, char *str)
{
   char *oldstack;
   player *p2;

#ifdef TRACK
   sprintf(functionin,"confirm_password (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if (!*str)
   {
      tell_player(p, " Format: confirm <name>\n");
      return;
   }
   p2 = find_player_global(str);
   if (!p2)
      return;

   if (p2->residency == NON_RESIDENT)
   {
      tell_player(p, " That person is not a resident.\n");
      return;
   }
   oldstack = stack;

   p2->residency |= NO_SYNC;
   /* check email */
   if (p2->email[0] == 2)
   {
      strcpy(stack, " Email has not yet been set.");
   } else if (p2->email[0] == ' ')
   {
      strcpy(stack, " Email validated set.");
      p2->residency &= ~NO_SYNC;
   } else if (!strstr(p2->email, "@") || !strstr(p2->email, "."))
   {
      strcpy(stack, " Probably not a correct email.");
      p2->residency &= ~ NO_SYNC;
   } else
   {
      strcpy(stack, " Email set.");
      p2->residency &= ~ NO_SYNC;
   }
   stack = strchr(stack, 0);
   if (p2->email[0] != 2 && p2->email[0] != ' ')
   {
      if (p->residency & ADMIN || !(p2->custom_flags & PRIVATE_EMAIL))
      {
         sprintf(stack, " - %s", p2->email);
         stack = strchr(stack, 0);
         if (p2->custom_flags & PRIVATE_EMAIL)
         {
            strcpy(stack, " (private)\n");
         } else
         {
            strcpy(stack, "\n");
         }
      } else
      {
         strcpy(stack, "\n");
      }
   } else
   {
      strcpy(stack, "\n");
   }
   stack = strchr(stack, 0);

   /* password */
   if (p2->password[0] && p2->password[0] != -1)
   {
      strcpy(stack, " Password set.\n");
   } else
   {
      strcpy(stack, " Password NOT-set.\n");
      p2->residency |= NO_SYNC;
   }
   stack = strchr(stack, 0);

   if (p2->residency & NO_SYNC)
      sprintf(stack, " Character '%s' won't be saved.\n", p2->name);
   else
      sprintf(stack, " Character '%s' will be saved.\n", p2->name);
   stack = end_string(stack);
   tell_player(p, oldstack);
   stack = oldstack;
}


/* Now this is just plain silly, probly worst than 'crash' */

void hang(player * p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"hang (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   while (1)
      sleep(1);
}


/* Make someone a minister (changed from a ptriv cause it keeps fucking
up the priv checks and is just pointless as a priv) - asty */

void minister(player *p, char *str)
{
   char *oldstack;
   player *d;

#ifdef TRACK
   sprintf(functionin,"minister (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if (p->flags & BLOCK_SU)
     {
       tell_player(p," Go on_duty first beavis!\n");
       return;
     }

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: minister <player>\n");
      return;
   }
   d = find_player_global(str);
   if (d)
   {
      if (d->system_flags & MINISTER)
      {
      sprintf(stack, " You take the minister's guide from %s.\n", d->name);
      stack = end_string(oldstack);
      tell_player(p, oldstack);
      stack = oldstack;
      sprintf(stack, " -=*> %s take%s the collar from your neck!\n",
p->name,single_s(p));
      stack = end_string(stack);
      tell_player(d, oldstack);
      stack = oldstack;
      sprintf(oldstack, " -=*> %s take%s the duties of minister from %s\n", p->name, 
              single_s(p), d->name);
      stack = end_string(oldstack);
      su_wall_but(p, oldstack);
      log("minister",oldstack);
      stack = oldstack;
      d->system_flags &= ~MINISTER;
      save_player(d);
     }

   else
      {
      sprintf(stack, " You give the title of minister to %s.\n", d->name);
      stack = end_string(oldstack);
      tell_player(p, oldstack);
      stack = oldstack;
      sprintf(stack, " -=*> %s %s made you a minister. =)\n",
p->name,havehas(p));
      stack = end_string(stack);
      tell_player(d, oldstack);
      stack = oldstack;
      sprintf(oldstack, " -=*> %s make%s %s minister\n", p->name,
              single_s(p), d->name);
      stack = end_string(oldstack);
      su_wall_but(p, oldstack);
      log("minister",oldstack);
      stack = oldstack;
      d->system_flags |= MINISTER;
      save_player(d);
   }}
   else
   {
   tell_player(p, " No such player on the program - tough :P\n");
   stack = oldstack;
   }
}


/* unconverse, get idiots out of converse mode */

void unconverse(player *p, char *str)
{
   player *p2;
   saved_player *sp;
   char *oldstack;

#ifdef TRACK
   sprintf(functionin,"unconverse (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if (p->flags & BLOCK_SU)
     {
       tell_player(p," Go on_duty first... Please..... Thanx.\n");
       return;
     }

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: unconverse <player>\n");
      return;
   }
   lower_case(str);
   p2 = find_player_global_quiet(str);
   if (!p2)
   {
      tell_player(p, " Player not logged on, checking saved player files...\n");      
      sp = find_saved_player(str);
      if (!sp)
      {
         tell_player(p, " Can't find saved player file.\n");
         return;
      }
      if (!(sp->residency & SU) && !(sp->residency & ADMIN))
      {
         if (!(sp->custom_flags & CONVERSE))
         {
            tell_player(p, " They aren't IN converse mode!!!\n");
            return;
         }
         sp->custom_flags &= ~CONVERSE;
         set_update(*str);
         sprintf(stack, " You take \'%s' out of converse mode.\n",
                 sp->lower_name);
         stack = end_string(stack);
         tell_player(p, oldstack);
         stack = oldstack;
      } else
      {
         tell_player(p, " You can't do that to them!\n");
      }
      return;
   }
   if (!(p2->custom_flags & CONVERSE))
   {
      tell_player(p, " But they're not in converse mode!!!\n");
      return;
   }
   if (!(p2->residency & SU) && !(p2->residency & ADMIN))
   {
      p2->custom_flags &= ~CONVERSE;
      p2->mode &= ~CONV;
      if (p->gender == PLURAL)
        sprintf(stack, " -=*> %s have taken you out of converse mode.\n",
                p->name);
      else
        sprintf(stack, " -=*> %s has taken you out of converse mode.\n",
                p->name);
      stack = end_string(stack);
      tell_player(p2, oldstack);
      stack = oldstack;
      do_prompt(p2, p2->prompt);
      sprintf(stack, " You take %s out of converse mode.\n", p2->name);
      stack = end_string(stack);
      tell_player(p, oldstack);
      stack = oldstack;
   } else
   {
      tell_player(p, " You can't do that to them!\n");
      sprintf(stack, " -=*> %s tried to unconverse you!\n", p->name);
      stack = end_string(stack);
      tell_player(p2, oldstack);
      stack = oldstack;
   }
}

void unjail(player *p, char *str)
{
   char *oldstack;
   player *p2, dummy;

#ifdef TRACK
   sprintf(functionin,"unjail (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;

   if (p->flags & BLOCK_SU)
     {
       tell_player(p," Go on_duty first.\n");
       return;
     }

   if (!*str)
   {
      tell_player(p, " Format: unjail <player>\n");
      return;
   }

   if (!strcasecmp(str, "me"))
      p2 = p;
   else
      p2 = find_player_global(str);
   if (!p2)
   {
      tell_player(p, " Checking saved files... ");
      strcpy(dummy.lower_name, str);
      lower_case(dummy.lower_name);
      dummy.fd = p->fd;
      if (!load_player(&dummy))
      {
         tell_player(p, " Not found.\n");
         return;
      } else
      {
         tell_player(p, "\n");
         p2 = &dummy;
         p2->location = (room *) -1;
      }
   }
   if (p2 == p)
   {
      if (p->location == prison)
      {
         tell_player(p, " You struggle to open the door, but to no avail.\n");
         if (p->gender == PLURAL)
           sprintf(stack, " -=*> %s try to unjail %s. *grin*\n", p->name,
                   self_string(p));
         else
           sprintf(stack, " -=*> %s tries to unjail %s. *grin*\n", p->name,
                   self_string(p));
         stack = end_string(stack);
         su_wall_but(p, oldstack);
         stack = oldstack;
      } else
      {
         tell_player(p, " But you're not in jail!\n");
      }
      return;
   }

   if (p2 == &dummy)
   {
      if (!(p2->system_flags & SAVEDJAIL))
      {
         tell_player(p, " Erm, how can I say this? They're not in jail...\n");
         return;
      }
   } else if (p2->jail_timeout == 0 || p2->location != prison)
   {
      tell_player(p, " Erm, how can I say this? They're not in jail...\n");
      return;
   }

   p2->jail_timeout = 0;
   p2->system_flags &= ~SAVEDJAIL;
   if (p2 != &dummy)
   {
     if (p->gender== PLURAL)
       sprintf(stack, " -=*> The %s release you from prison.\n", p->name);
     else
       sprintf(stack, " -=*> %s releases you from prison.\n", p->name);
      stack = end_string(stack);
      tell_player(p2, oldstack);
      stack = oldstack;
      move_to(p2, ENTRANCE_ROOM, 0);
   }

   if (p->gender== PLURAL)
     sprintf(stack, " -=*> The %s release %s from jail.\n", p->name,
p2->name);
   else
     sprintf(stack, " -=*> %s releases %s from jail.\n", p->name, p2->name);
   stack = end_string(stack);
   su_wall(oldstack);
   stack = oldstack;
   sprintf(stack, "%s releases %s from jail.", p->name, p2->name);
   stack = end_string(stack);
   log("jail", oldstack);
   stack = oldstack;
   if (p2 == &dummy)
   {
      save_player(&dummy);
   }
}

/* cut down version of lsu() to just return number of SUs on */
/* This shows only sus that RESSIES can see.. not the REAL amount on */
int count_su()
{
  int count=0;
  player *scan;

  for (scan=flatlist_start;scan;scan=scan->flat_next)
    if (scan->residency & SU && scan->location &&
                !(scan->flags &(BLOCK_SU|OFF_LSU))
                && scan->idle < 300)
      count++;

  return count;
}

/* needed for statistics */
int true_count_su()
{
  int count=0;
  player *scan;

  for (scan=flatlist_start;scan;scan=scan->flat_next)
    if (scan->residency & SU && scan->location)
      count++;

  return count;
}

/*
   Now that we know:
   the number of SUs,
   the number of newbies,
   and the number of ppl on the prog (current_players),
   we can output some stats
   */

void player_stats(player *p, char *str)
{
  char *oldstack;
  player *scan;
  int new = 0,sus = 0;

#ifdef TRACK
   sprintf(functionin,"player_stats (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

  oldstack=stack;

  for (scan=flatlist_start;scan;scan=scan->flat_next)
        {
    if (scan->residency==NON_RESIDENT && scan->location)
      new++;
    if (scan->residency & PSU && scan->location)
        sus++;
        }

  tell_player(p,"Current Program/Player stats:\n");
  sprintf(oldstack," Players on program: %3d\n"
          "      Newbies on   : %3d\n"
          "      Supers on    : %3d\n"
          "      Normal res.  : %3d\n\n",
          current_players,
          new, sus, (current_players-(sus+new)));
  stack=strchr(stack,0);
  *stack++=0;
  tell_player(p,oldstack);
  stack=oldstack;
}

/* Go to the SUs study */

void go_comfy(player *p, char *str)
{
#ifdef TRACK
   sprintf(functionin,"go_comfy (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   command_type |= ADMIN_BARGE;
   if (p->location == comfy)
   {
      tell_player(p, " You're already in the study!\n");
      return;
   }
   if (p->no_move)
   {
      tell_player(p, " You seem to be stuck to the ground.\n");
      return;
   }
   move_to(p, "main.comfy", 0);
}

/* Tell you what mode someone is in */

void mode(player *p, char *str)
{
   player *p2;
   char *oldstack;

#ifdef TRACK
   sprintf(functionin,"mode(%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: mode <player>\n");
      return;
   }

   p2 = find_player_global(str);
   if (!p2)
      return;

   if (p2->mode == NONE)
   {
      sprintf(stack, " %s is in no particular mode.\n", p2->name);
   } else if (p2->mode & PASSWORD)
   {
      sprintf(stack, " %s is in Password Mode.\n", p2->name);
   } else if (p2->mode & ROOMEDIT)
   {
      sprintf(stack, " %s is in Room Mode.\n", p2->name);
   } else if (p2->mode & MAILEDIT)
   {
      sprintf(stack, " %s is in Mail Mode.\n", p2->name);
   } else if (p2->mode & NEWSEDIT)
   {
      sprintf(stack, " %s is in News Mode.\n", p2->name);
   } else if (p2->mode & CONV)
   {
      sprintf(stack, " %s is in Converse Mode.\n", p2->name);
   } else
   {
      sprintf(stack, " Ermmm, %s doesn't appear to be in any mode at all.\n",
                 p2->name);
   }
   stack = end_string(stack);
   tell_player(p, oldstack);
   stack = oldstack;
}
void abort_shutdown(player *p,char *str)
{
  pulldown(p,"-1");
  return;
}

void echoroomall(player *p,char *str)
{
  char *oldstack;
  oldstack=stack;
  if (strlen(str)<1)
    {
      tell_player(p,"Usage: becho <message>\n");
      return;
    }
  sprintf(oldstack,"%s\n",str);
  stack=end_string(oldstack);
  raw_room_wall(p->location, oldstack);
  stack=oldstack;
  return;
}
void echoall(player *p,char *str)
{
  char *oldstack;
  oldstack=stack;
  if (strlen(str)<1)
    {
      tell_player(p,"Usage: aecho <message>\n");
      return;
    }
  sprintf(oldstack,"%s\n",str);
  stack=end_string(oldstack);
  raw_wall(oldstack);
  stack=oldstack;
  return;
}


/* chlim command, combines all 5 chlims.  */
/* but now there are 6 !! */
/* soon to be 7 !! */

void change_player_limits(player * p, char *str)
{
   char *size;
   int new_size;
   char *oldstack;
   player *p2;
   player dummy;
   char *player;

#ifdef TRACK
   sprintf(functionin,"change_player_limits (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   player = next_space(str);
   *player++ = 0;
   size = next_space(player);
   *size++ = 0;
   new_size = atoi(size);

   if (!str || !player || !size) {
        tell_player(p, " Format: chlim <area> <player> <new limit>\n"
                " Valid areas are: mail, list, room, auto, exit, alias, item\n");
        stack = oldstack;
        return;
        }

   if (new_size < 0)
   {
      tell_player(p, " Now try a _positive_ limit...\n");
      stack = oldstack;
      return;
   }
   p2 = find_player_absolute_quiet(player);
   if (!p2)
   {
     /* load them if they're not logged in */
      strcpy(dummy.lower_name, player);
      lower_case(dummy.lower_name);
      dummy.fd = p->fd;
      /* if they don't exist, say so and return */
      if (!load_player(&dummy))
      {
         tell_player(p, " That player does not exist.\n");
         stack = oldstack;
         return;
      }
      p2 = &dummy;
   }

   /* ok lets get the valid areas */
   if (strcasecmp(str,"room") && strcasecmp(str,"list") &&
        strcasecmp(str,"alias") && strcasecmp(str,"item") && 
        (!(p->residency & ADMIN) || (strcasecmp(str,"exit") &&
        strcasecmp(str,"auto") && strcasecmp(str,"mail")))) {

        tell_player(p, " You can't change THAT limit !! \n");
        stack = oldstack;
        return; }

   if (!check_privs(p->residency, p2->residency))
   {
     /* now now, no messing with your superiors */
      tell_player(p, " You can't do that !!\n");
      sprintf(oldstack, " -=*> %s tried to change your %s limit.\n",
                        p->name, str);
      stack = end_string(oldstack);
      tell_player(p2, oldstack);
      stack = oldstack;
      return;
   }
   /* otherwise change the limit */
   if (!strcasecmp(str,"list")) p2->max_list = new_size;
   else if (!strcasecmp(str,"room")) p2->max_rooms = new_size;
   else if (!strcasecmp(str,"alias")) p2->max_alias = new_size;
   else if (!strcasecmp(str,"mail")) p2->max_mail = new_size;
   else if (!strcasecmp(str,"item")) p2->max_items = new_size; 
   else if (!strcasecmp(str,"exit")) p2->max_exits = new_size;
   else if (!strcasecmp(str,"auto")) p2->max_autos = new_size;

   /* and if they are logged in, tell them */
   if (p2 != &dummy)
   {
      sprintf(oldstack, " -=*> %s has changed your %s limit to %d.\n",
              p->name,str,new_size);
      stack = end_string(oldstack);
      tell_player(p2, oldstack);
   } else
   {
      save_player(&dummy);
   }
   /* now log that change please? */
   stack = oldstack;
   if (p2 != &dummy)
     sprintf(oldstack, "%s changed %s's %s limit to %d",
                        p->name,p2->name,str,new_size);
   else
     sprintf(oldstack, "%s changed %s's %s limit to %d - (logged out)",
                        p->name,p2->name,str,new_size);
     stack = end_string(oldstack);
     log("chlim", oldstack);

   tell_player(p, " Tis Done ..\n");
   stack = oldstack;
}

void extend(player * p, char *str) {
   char *size;
   char *oldstack;
   player *p2;
   player dummy;

   oldstack = stack;
   p2 = find_player_global(str);

   if (!str || !p2) {
        tell_player(p, " Format: extend <player>\n");
        stack = oldstack;
        return;
        }
   if (!check_privs(p->residency, p2->residency) && (p != p2))
   {
     /* now now, no messing with your superiors */
      tell_player(p, " You can't do that !!\n");
      sprintf(oldstack, " -=*> %s tried to extend your list limit.\n",
                        p->name, str);
      stack = end_string(oldstack);
      tell_player(p2, oldstack);
      stack = oldstack;
      return;
   }
   if (!(p2->residency & LIST)) {
        /* whats the point? */
        tell_player(p, " That person has no list to extend.\n");
        stack = oldstack;
        return;
        }
   /* otherwise change the limit */
   if (p2->max_list >= 50 && !(p->residency & ADMIN))
tell_player(p, "Sorry, their list is too full, ask an admin to extend it.\n");
   else if (p2->max_list >= 45 && !(p->residency & ADMIN)) {
      p2->max_list = 50;
      sprintf(oldstack, " -=*> %s has increased your list limit to 40.\n",
        p->name);
      stack = end_string(oldstack);
      tell_player(p2, oldstack);
      tell_player(p, " Tis done ...\n");
      stack = oldstack;
      sprintf(oldstack, "%s extended %s's list to 50", p->name,p2->name);
      stack = end_string(oldstack);
      log("chlim", oldstack);
   } else {
      p2->max_list += 5;
      sprintf(oldstack, " -=*> %s has increased your list limit to %d.\n",
                p->name, p2->max_list);
      stack = end_string(oldstack);
      tell_player(p2, oldstack);
      tell_player(p, " Tis done ...\n");
      stack = oldstack;
      sprintf(oldstack, "%s extended %s's list to %d", p->name,p2->name,
        p2->max_list);
      stack = end_string(oldstack);
      log("chlim", oldstack);
      }
   stack = oldstack;
}


void blank_something(player *p, char *str)
{
   char           *oldstack;
   player         *p2, dummy;
   char           *person;

#ifdef TRACK
   sprintf(functionin,"blank_something (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if (p->flags & BLOCK_SU)
     {
       tell_player(p," Go on_duty first.\n");
       return;
     }

   oldstack = stack;
   person = next_space(str);
   *person++ = 0;

   if (*person)
     {
       p2 = find_player_absolute_quiet(person);
       if (p2)
         {
   if (!check_privs(p->residency, p2->residency))
             {
               tell_player(p, " You can't do that to THAT person.\n");
               sprintf(stack, " -=*> %s tried to blank %s\'s %s!\n",
                       p->name, p2->name, str);
               stack = end_string(stack);
               su_wall_but(p, oldstack);
               stack = oldstack;
               return;
             }
        if (!strcasecmp(str,"prefix")) p2->pretitle[0] = 0;
        else if (!strcasecmp(str,"desc")) p2->description[0] = 0;
        else if (!strcasecmp(str,"plan")) p2->plan[0] = 0;
        else if (!strcasecmp(str,"title")) p2->title[0] = 0;
        else if (!strcasecmp(str,"comment")) p2->comment[0] = 0;
        else if (!strcasecmp(str, "entermsg")) p2->enter_msg[0] = 0;
        else if (!strcasecmp(str, "url")) p2->alt_email[0] = 0;
        else if (!strcasecmp(str, "logonmsg")) p2->logonmsg[0] = 0;
        else if (!strcasecmp(str, "logoffmsg")) p2->logoffmsg[0] = 0;
        else if (!strcasecmp(str, "irl_name")) p2->irl_name[0] = 0;
        else if (!strcasecmp(str, "exitmsg")) p2->exitmsg[0] = 0;
        else if (!strcasecmp(str, "hometown")) p2->hometown[0] = 0;
        else if (!strcasecmp(str, "madefrom")) p2->ingredients[0] = 0;
        else if (!strcasecmp(str, "fav1")) p2->favorite1[0] = 0;
        else if (!strcasecmp(str, "fav2")) p2->favorite2[0] = 0;
        else if (!strcasecmp(str, "fav3")) p2->favorite3[0] = 0;

         else {
        /* too many sprintf's on the brain... sorry */
                tell_player(p, "Wanna tell me what a ");
                tell_player(p, str);
                tell_player(p, " is exactly? =)\n");
                return; }

         sprintf(stack, " -=*> %s has blanked your %s.\n", p->name, str);
           stack = end_string(stack);
           tell_player(p2, oldstack);
           stack = oldstack;
           sprintf(stack, "%s blanked %s's %s.", p->name, p2->name, str);
           stack = end_string(stack);
           log("blanks", oldstack);
           stack = oldstack;
           sprintf(stack, " -=*> %s has blanked %s's %s.\n", p->name, p2->name, str);
           stack = end_string(stack);
           su_wall(oldstack);
           tell_player(p, " Blanked.\n");
           stack = oldstack;
           return;
         }
       strcpy(dummy.lower_name, person);
       dummy.fd = p->fd;
       if (load_player(&dummy))
         {
   if (!check_privs(p->residency, dummy.residency))
             {
               tell_player(p, " You can't do that to THAT person.\n");
               sprintf(stack, " -=*> %s tried to blank %s\'s %s!\n",
                       p->name, dummy.name, str);
               stack = end_string(stack);
               su_wall_but(p, oldstack);
              stack = oldstack;
               return;
             }
        if (!strcasecmp(str,"prefix")) dummy.pretitle[0] = 0;
        else if (!strcasecmp(str,"desc")) dummy.description[0] = 0;
        else if (!strcasecmp(str,"plan")) dummy.plan[0] = 0;
        else if (!strcasecmp(str,"title")) dummy.title[0] = 0;
        else if (!strcasecmp(str, "entermsg")) dummy.enter_msg[0] = 0;
        else if (!strcasecmp(str, "url")) dummy.alt_email[0] = 0;
        else if (!strcasecmp(str, "logonmsg")) dummy.logonmsg[0] = 0;
        else if (!strcasecmp(str, "logoffmsg")) dummy.logoffmsg[0] = 0;
        else if (!strcasecmp(str, "irl_name")) dummy.irl_name[0] = 0;
        else if (!strcasecmp(str, "exitmsg")) dummy.exitmsg[0] = 0;
        else if (!strcasecmp(str, "hometown")) dummy.hometown[0] = 0;
        else if (!strcasecmp(str, "madefrom")) dummy.ingredients[0] = 0;
        else if (!strcasecmp(str, "fav1")) dummy.favorite1[0] = 0;
        else if (!strcasecmp(str, "fav2")) dummy.favorite2[0] = 0;
        else if (!strcasecmp(str, "fav3")) dummy.favorite3[0] = 0;
         else {
                tell_player(p, "Wanna tell me what a ");
                tell_player(p, str);
                tell_player(p, " is exactly? =)\n");
                return; }

           sprintf(stack, "%s blanked %s's %s.", p->name, dummy.name, str);
           stack = end_string(stack);
           log("blanks", oldstack);
           stack = oldstack;
           sprintf(stack, " -=*> %s has blanked %s's %s (logged out)\n", p->name, dummy.name, str);
           stack = end_string(stack);
           su_wall(oldstack);
           stack = oldstack;
           dummy.location = (room *) -1;
           save_player(&dummy);
           tell_player(p, " Blanked in saved file.\n");
           return;
         }
       else
           tell_player(p, " Can't find that person on the program or in the "
                       "files.\n");
     }
   else
       tell_player(p, " Format: blank <something> <player>\n"
                " You can blank: title, plan, desc, comment, prefix, exitmsg, "
                "url, entermsg, logonmsg, logoffmsg, hometown, irl_name, "
		"madefrom, fav1, fav2, fav3.\n");
 }


/* nice little bump command - might have to make this more nasty... */
void bump_off(player * p, char *str)
{
   char *oldstack, *text;
   player *e;

#ifdef TRACK
   sprintf(functionin,"bump_off (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: bump <person>\n");
      return;
   }

   if ((p->flags & BLOCK_SU) && !(p->residency & HCADMIN))
     {
       tell_player(p," Its generally best to be on_duty to do that...\n");
       return;
     }
   e = find_player_global(str);
   if (e)
   {
      text = stack;
   if (!check_privs(p->residency, e->residency))
      {
         tell_player(p, " Sorry, you can't...\n");
         tell_player(e, " Someone just tried to bump you...\n");
         sprintf(stack, "%s tried to pull %s's away", p->name, e->name);
         stack = end_string(stack);
         log("bump", text);
         stack = text;
      } else
      {
/* asty again gets moral - shouldnt have let me touch the code */
      if (p->gender==PLURAL)
    sprintf(stack, " -=*> The %s all bump %s off the program - naughty!!\n",
        p->name, e->name);
      else
    sprintf(stack, " -=*> %s bumps %s off the program - naughty!!.\n",
        p->name, e->name);
         stack = end_string(stack);
         au_wall_but (p, oldstack);
         stack = oldstack;
         sprintf(stack, " -=*> %s pulled %s off the prog",
                   p->name, e->name);
         stack = end_string(stack);
         quit(e, 0);
         log("bump", text);
         stack = text;
      }
   }
   stack = oldstack;
}

void emoted_wall(player * p, char *str)
{
   char *oldstack;

#ifdef TRACK
   sprintf(functionin,"emoted_wall (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if((p->flags & BLOCK_SU) && !(p->residency & HCADMIN))
     {
       tell_player (p,"Permissions changed...\nOnly kidding {:-) \n"
                    "No, seriously, you cant use ewall when off_duty.\n");
       return;
     }

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: ewall <emote>\n");
      return;
   }
   if (emote_no_break(*str))
     sprintf(oldstack, "  -=*> %s%s ^N<*=- \007\n", p->name, str);
   else
     sprintf(oldstack, "  -=*> %s %s ^N<*=- \007\n", p->name, str);

   stack = end_string(oldstack);
   command_type |= HIGHLIGHT;
   raw_wall(oldstack);
   command_type &= ~HIGHLIGHT;
   stack = oldstack;
   if (emote_no_break(*str))
   LOGF("wall", "%s%s", p->name, str);
   else
   LOGF("wall", "%s %s", p->name, str);
}

/* Ah hell, why the fuck not? ][ */
void thinkin_wall(player * p, char *str)
{
   char *oldstack;

#ifdef TRACK
   sprintf(functionin,"thinkin_wall (%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   if((p->flags & BLOCK_SU) && !(p->residency & HCADMIN))
     {
       tell_player (p,"Permissions changed...\nOnly kidding {:-) \n"
                    "No, seriously, you cant use twall when off_duty.\n");
       return;
     }

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: twall <think>\n");
      return;
   }
     sprintf(oldstack, "  -=*> %s think%s . o O ( %s ^N) <*=- \007\n",
                        p->name, single_s(p), str);

   stack = end_string(oldstack);
   command_type |= HIGHLIGHT;
   raw_wall(oldstack);
   command_type &= ~HIGHLIGHT;
   stack = oldstack;
   LOGF("wall", "%s thinks . o O ( %s )", p->name, str);
}


void            superview(player * p, char *str)
{
   char *oldstack;
   file logb;

   oldstack = stack;

   if (*str)
   {
      tell_player(p, " Format: snews\n");
      return;
   }
   sprintf(stack, "logs/sunews.log", str);
   stack = end_string(stack);
   logb = load_file_verbose(oldstack, 0);
   if (logb.where)
   {
      if (*(logb.where))
         pager(p, logb.where, 1);
         free(logb.where);
   }
   stack = oldstack;
   }

void            new(player * p, char *str)
{
   char *oldstack;
   file logb;

   oldstack = stack;
   sprintf(stack, "files/version.msg", str);
   stack = end_string(stack);
   logb = load_file_verbose(oldstack, 0);
   if (logb.where)
   {
      if (*(logb.where))
         pager(p, logb.where, 1);
         free(logb.where);
   }
   stack = oldstack;
   }

void            adminview(player * p, char *str)
{
   char *oldstack;
   file logb;

   oldstack = stack;

   if (*str)
   {
      tell_player(p, " Format: anews\n");
      return;
   }
   sprintf(stack, "logs/adnews.log", str);
   stack = end_string(stack);
   logb = load_file_verbose(oldstack, 0);
   if (logb.where)
   {
      if (*(logb.where))
         pager(p, logb.where, 1);
         free(logb.where);
   }
   stack = oldstack;
   }

/* Post to the superuser memo log */

void superpost(player * p, char *str)
{
   char *oldstack;
   if (!*str)
   {
      tell_player(p, " Format: spost <message>\n");
      return;
   }
   if (strlen(str) > 500)
   {
      tell_player(p, " spam the logs? Not likely...\n");
      return;
   }
   oldstack = stack;
   sprintf(stack, "%s :- %s", p->name, str);
   stack = end_string(oldstack);
   log("sunews", oldstack);
   /* echo it to the sus now */
   stack = oldstack;
   sprintf(oldstack, " -(SNEWS)=*> %s :- %s\n", p->name, str);
   stack = end_string(oldstack);
   su_wall(oldstack);
   stack = oldstack;
}

void adminpost(player * p, char *str)
{
   char *oldstack;
   if (!*str)
   {
      tell_player(p, " Format: apost <message>\n");
      return;
   }
   if (strlen(str) > 500)
   {
      tell_player(p, " spam the logs? Not likely...\n");
      return;
   }
   tell_player(p, " Administrator memo logged ...\n");
   oldstack = stack;
   sprintf(stack, "%s :- %s", p->name, str);
   stack = end_string(stack);
   log("adnews", oldstack);
   stack = oldstack;
}

void list_ministers(player * p, char *str)
{
  int count = 0;
  char *oldstack, *prestack;
  player *scan;

  oldstack = stack;
  strcpy(stack, "============================ Ministers on "
"=================================\n");
  stack = strchr(stack, 0);
  for (scan = flatlist_start; scan; scan = scan->flat_next)
  {
    prestack = stack;
    /* hey asty -- you forgot to update this.. I think this is right now.. */
    if (scan->system_flags & MINISTER && scan->location)
    {
      {
        count++;
        *stack = ' ';
        stack++;
        sprintf(stack, "%-20s ", scan->name);
        stack = strchr(stack, 0);
        sprintf(stack, "   ");
        stack = strchr(stack, 0);
        if (count%3 == 0)       *stack++ = '\n';
      }
    }
  }
  if (count%3 != 0)   *stack++ = '\n';
  if (count > 1)
    sprintf(stack, "================== There are %2d Ministers connected"
                  " =======================\n", count);
  else
   if (count == 1)
    sprintf(stack, "================ There is only one Minister connected "
                   "=====================\n", count);
  stack = end_string(stack);
  if (count) tell_player(p, oldstack);
  else  tell_player(p, " There are no ministers on at the moment.\n");
  stack = oldstack;
}
/* list spods =P */

void list_spods(player * p, char *str)
{
  int count = 0;
  char *oldstack, *prestack;
  player *scan;

  oldstack = stack;
  strcpy(stack, "================================ Spods on "
         "=================================\n");
  stack = strchr(stack, 0);
  for (scan = flatlist_start; scan; scan = scan->flat_next)
  {
    prestack = stack;
    if (scan->residency & SPOD && scan->location)
    {
           if (scan->residency & SPOD)
      {
        count++;
        *stack = ' ';
        stack++;
        sprintf(stack, "%-20s ", scan->name);
        stack = strchr(stack, 0);
        if (strlen(scan->spod_class) > 0)
        sprintf(stack, " { %s }                                               ",
                                scan->spod_class);
        else  sprintf(stack, " { No title set }                                     ");
        stack += 50;
        *stack = '\0';
        *stack++ = '\n';
      }
    }
  }
  if (count > 1)
    sprintf(stack, "========================== There are %2d Spods connected"
                  " ===================\n", count);
  else
   if (count == 1)
    sprintf(stack, "======================== There is only one spod connected "
                   "=================\n", count);
  stack = end_string(stack);
  if (count) tell_player(p, oldstack);
  else tell_player(p, " There are no spods on at the moment.\n");
  stack = oldstack;
}

void switch_channel_style(player * p, char *str)
{
        if (p->residency & FOREST_STYLE_CHAN)
        {
                p->residency &= ~FOREST_STYLE_CHAN;
                p->residency |= REGULAR_STYLE_CHAN;
tell_player(p, "You are now using NORMAL su channel commands.\n");
        }
        else if (p->residency & REGULAR_STYLE_CHAN)
        {
                p->residency &= ~REGULAR_STYLE_CHAN;
                p->residency |= FOREST_STYLE_CHAN;
tell_player(p, "You declare yourself a clanlander, and use forest cmds.\n");
        }
        else
        {
                p->residency |= REGULAR_STYLE_CHAN;
                tell_player(p, "No style found, defaulting to normal.\n");
        }
}
void see_player_whois(player * p, char *str)
{
   char *oldstack;
   file help;

   oldstack = stack;
   if (!*str)
   {
      tell_player(p, " Format: whois <player>\n" );
      return;
   }
   lower_case(str);
   if (*str == '.')
   {
      tell_player(p, " Uh-uh, cant do that ...\n");
      return;
   }
   sprintf(stack, "files/whois/%s.who", str);
   stack = end_string(stack);
   help = load_file_verbose(oldstack, 0);
   if (help.where)
   {
      if (*(help.where))
      {
         if (p->custom_flags & NO_PAGER)
            tell_player(p, help.where);
         else
            pager(p, help.where, 1);
      } else
      {
         tell_player(p, " Couldn't find a whois for that player ...\n");
      }
      FREE(help.where);
   }
   stack = oldstack;
}


void wall_to_supers(player * p, char *str)
{
   char *oldstack;

   oldstack = stack;
   command_type = 0;

   if (!*str)
   {
      tell_player(p, " Format: suwall <message>\n");
      return;
   }
   if (p->flags & BLOCK_SU)
   {
      tell_player(p, " You can't do su walls when you're ignoring them.\n");
      return;
   }
   sprintf(stack, " -=*> %s\n", str);
   stack = end_string(stack);
   su_wall(oldstack);
   stack = oldstack;
}

/* your lsp is so cool I stole it for lsa */
void list_admins(player * p, char *str)
{
  int count = 0;
  char *oldstack, *prestack;
  player *scan;

  oldstack = stack;
  strcpy(stack, "=============================== Admins on "
         "=================================\n");
  stack = strchr(stack, 0);
  for (scan = flatlist_start; scan; scan = scan->flat_next)
  {
    prestack = stack;
   if (scan->residency & (LOWER_ADMIN|ADMIN|TESTCHAR))
      {
        count++;
         if ((count == 1) || (count ==2))
            sprintf(stack, " Name : ");
         else
            sprintf(stack, "        ");
        stack = strchr(stack, 0);
       /*         if (count%2 ==1)
           sprintf(stack, "%-15s ", scan->name);
        else */
           sprintf(stack, "%-15s ", scan->name);
        stack = strchr(stack, 0);
        if ((count ==1) || (count ==2))
           sprintf(stack, " Idle : ");
        else
           sprintf(stack, "        ");
        stack = strchr(stack, 0);
        if (scan->idle%60 < 10)
        sprintf(stack, "%d:0%d  ", scan->idle/60,scan->idle%60);
        else
        sprintf(stack, "%d:%2d  ", scan->idle/60,scan->idle%60);
        stack = strchr(stack, 0);
        if (count%2 == 0)
           *stack++ = '\n';
        else
           *stack++ = '|';
      }
  }
  if (count%2 == 1)  *stack++ = '\n';
  if (count >= 1)
    sprintf(stack, "========================================================"
              "===================\n");
  stack = end_string(stack);
  if (count) tell_player(p, oldstack);
  else
        tell_player (p, " *wibble* no admins on?!\n");
  stack = oldstack;
}

void reset_total_idle(player * p, char *str)
{
        player *p2, dummy;
        char *oldstack, *temp;
        int temp_time;

   oldstack = stack;
   temp = next_space(str);
   *temp++ = 0;

   if (!*str)
   {
      tell_player(p, " Format: reset_idle <player>\n");
        return;
   }
   if (p->flags & BLOCK_SU)
   {
      tell_player(p, " Go back on duty first beavis.\n");
       return;
   }

   /* p2 = find_player_absolute_quiet(str); */
        p2 = find_player_global(str);
     if(p2) {
      if ((p2->residency == NON_RESIDENT))
      {
         tell_player(p, " That player is non-resident!\n");
         stack = oldstack;
         return;
      }
      if ((p2->residency == BANISHD || p2->residency == SYSTEM_ROOM))
      {
         tell_player(p, " That is a banished NAME, or System Room.\n");
         stack = oldstack;
         return;
      }
      sprintf(oldstack, "\n -=*> %s has reset your idle time...\n",
       p->name);
      stack = end_string(oldstack);
      tell_player(p2, oldstack);
      stack = oldstack;
      p2->total_idle_time = 0;
      sprintf(stack, "%s reset the idle time on %s.", p->name, p2->name);
      stack = end_string(stack);
      log("edtime",oldstack);
      save_player(p2);
      tell_player(p, " Tis Done...\n");
      stack = oldstack;
      sprintf(stack, " -=*> %s resets %s's idle time.\n",p->name,
      p2->name);
      stack = end_string(stack);
      au_wall_but(p, stack);
       stack = oldstack;
        return;
        }
        /* else, load the dummy */
        strcpy(dummy.lower_name, str);
        dummy.fd = p->fd;
        if(load_player(&dummy)) {
     if ((dummy.residency == BANISHD || dummy.residency == SYSTEM_ROOM))
                {
                tell_player(p, " That is a banished NAME, or System Room.\n");
                stack = oldstack;
                return;
                }
      dummy.total_idle_time = 0;
      sprintf(stack, "%s reset the idle time on %s.", p->name, dummy.name);
      stack = end_string(stack);
      log("edtime",oldstack);
      dummy.location = (room *) -1;
      save_player(&dummy);
      tell_player(p, " Tis Done...\n");
      stack = oldstack;
      sprintf(stack, " -=*> %s resets %s's idle time.\n",p->name,
      dummy.name);
      stack = end_string(stack);
      au_wall_but(p, stack);
      stack = oldstack;
      return;
        }

}

/* use this to reset the disclaimer bit for email residency */
void disclaim(player * p, char *str) {

        player *p2;

        if (!*str) {
                tell_player(p, " Format: disclaim <player>\n");
                return;
                }
        p2 = find_player_global(str);
        if (!p2) return;

        p2->system_flags &= ~AGREED_DISCLAIMER;
}
void make_git(player * p, char *str) {

        char *gitstr;
        player *git;

        if (!*str) {
                tell_player(p, " Format: git <player> <gitstring>\n");
                return;
                }
        gitstr = next_space(str);
        if (*gitstr)
                *gitstr++ = 0;
        else {
                tell_player(p, " Format: git <player> <gitstring>\n");
                return;
                }
        git = find_player_global(str);
        if (!git)
                return;

        if (!check_privs(p->residency, git->residency)) {
                tell_player(p, " No way, Jose!\n");
                return;
                }
        /* else, dooooooooooooooooooooooo eeeeeeeeeeeeeeeeeeeet */

        strncpy(git->git_string, gitstr, MAX_DESC - 3);
        strncpy(git->git_by, p->name, MAX_NAME - 3);
        tell_player(p, " All done =) \n");
/*        oldstack = stack; */
        SUWALL(" -=*> %s declares %s to be a git -- %s\n",
                p->name, git->name, gitstr);
	LOGF("git", "%s gits %s - %s", p->name, git->name, gitstr);
}

void clear_git(player * p, char *str) {

        player *p2;

        if (!*str) {
                tell_player(p, " Format: ungit <player>\n");
                return;
                }
        p2 = find_player_global(str);

        if (!p2)        return;

        if (!check_privs(p->residency, p2->residency))
                {       tell_player(p, " No way, Jose! \n");
                        return;
                }
        p2->git_string[0] = 0;
        p2->git_by[0] = 0;

        tell_player(p, " All done.\n");
	SUWALL(" -=*> %s ungits %s.\n", p->name, p2->name);
	LOGF("git", "%s ungits %s.", p->name, p2->name);
}


/* A "lesser warn" -- idea from kw, but code is spoon of old warn command */

void lesser_warn(player * p, char *str)
{
   char *oldstack, *msg, *pstring, *final;
   player **list, **step;
   int i,n, old_com, r=0, self = 0;

#ifdef TRACK
   sprintf(functionin,"show_malloc(%s , SOMETHING)",p->name);
   addfunction(functionin);
#endif

   oldstack = stack;
   align(stack);
   command_type = PERSONAL | SEE_ERROR | WARNING;

   if (p->tag_flags & BLOCK_TELLS)
   {
    tell_player(p, " You are currently BLOCKING TELLS. It might be an idea to"
                     " unblock so they can reply, eh?\n");
   }
   msg = next_space(str);
   if (*msg)
      *msg++ = 0;
   if (!*msg)
   {
      tell_player(p, " Format: ask <player(s)> <message>\n");
      stack = oldstack;
      return;
   }

   if (p->flags & BLOCK_SU)
     {
       tell_player(p," You cannot ask when off_duty\n");
       stack=oldstack;
       return;
     }

   /* no warns to groups */
   if (!strcasecmp(str, "everyone") || !strcasecmp(str, "friends")
       || !strcasecmp(str, "supers") || !strcasecmp(str, "sus")
       || strstr(str, "everyone"))
   {
      tell_player(p, " Now that would be a bit silly wouldn't it?\n");
      stack = oldstack;
      return;
   }
   if (!strcasecmp(str, "room")) r=1;
   /* should you require warning, the consequences are somewhat (less) severe */   
   if (!strcasecmp(str, "me"))
   {
      tell_player(p, " Ummmmmmmmmmmmmmmmmmmmmm no. \n");
      stack = oldstack;
      return;
   }
   list = (player **) stack;
   n = global_tag(p, str);
   if (!n)
   {
      stack = oldstack;
      return;
   }
   final = stack;
   if (r) {
   if (p->gender==PLURAL)
     sprintf(stack, " %s caution everyone in the room '%s'\n", p->name, msg);
   else
     sprintf(stack, " %s cautions everyone in the room '%s'\n", p->name, msg);
   } else {
   if (p->gender==PLURAL)
     sprintf(stack, " %s caution you '%s'\n", p->name, msg);
   else
     sprintf(stack, " %s cautions you '%s'\n", p->name, msg);
   }
   stack = end_string(stack);
   for (step = list, i = 0; i < n; i++, step++)
   {
      if (*step != p)
      {
         command_type |= HIGHLIGHT;
         tell_player(*step, final);
         (*step)->warn_count++;
         p->num_warned++;
         command_type &= ~HIGHLIGHT;
      }
   }
   stack = final;

   pstring = tag_string(p, list, n);
   final = stack;
   if (p->gender==PLURAL)
     sprintf(stack, " -=*> %s caution %s '%s'", p->name, pstring, msg);
   else
     sprintf(stack, " -=*> %s cautions %s '%s'", p->name, pstring, msg);
   stack = end_string(stack);
   log("ask", final);
   strcat(final, "\n");
   stack = end_string(final);
   command_type = 0;
   su_wall(final);

   cleanup_tag(list, n);
   stack = oldstack;
}


void edfirst(player * p, char *str)
{
   player *p2;
   char *oldstack;
   int temp_time;
   char *temp;

   oldstack = stack;
   temp = next_space(str);
   *temp++ = 0;

   if (!*str || !*temp)
   {
      tell_player(p, " Format: edfirst <player> [-] time (days)>\n");
        return;
   }
   if (p->flags & BLOCK_SU)
   {
      tell_player(p, " Go back on duty first beavis.\n");
       return;
   }
   /* p2 = find_player_absolute_quiet(str); */
        p2 = find_player_global(str);
      if ((!p2))
      {
         tell_player(p, " Only when the player is logged on, chief!\n");
         stack = oldstack;
         return;
      }
      if ((p2->residency == NON_RESIDENT))
      {
         tell_player(p, " That player is non-resident!\n");
         stack = oldstack;
         return;
      }
      if ((p2->residency == BANISHD || p2->residency == SYSTEM_ROOM))
      {
         tell_player(p, " That is a banished NAME, or System Room.\n");
         stack = oldstack;
         return;
      }
      sprintf(oldstack, "\n -=*> %s has changed your date of first login...\n",
       p->name);
      stack = end_string(oldstack);
      tell_player(p2, oldstack);
      stack = oldstack;
      temp_time = atoi(temp);
      /* convert to hours */
      temp_time *=3600;
      /* and to days */
      temp_time *= 24;
      p2->first_login_date += temp_time;
      sprintf(stack, "%s changed the initial login date of %s by %s days.", 
	p->name, p2->name, temp);
      stack = end_string(stack);
      log("edtime",oldstack);
      save_player(p2);
      tell_player(p, " Tis Done...\n");
      stack = oldstack;
      sprintf(stack, " -=*> %s changes the initial login date of %s.\n",p->name,      
	p2->name);
      stack = end_string(stack);
      au_wall_but(p, stack);
       stack = oldstack;
}



void edidle(player * p, char *str)
{
   player *p2;
   char *oldstack;
   int temp_time;
   char *temp;

   oldstack = stack;
   temp = next_space(str);
   *temp++ = 0;

   if (!*str || !*temp)
   {
      tell_player(p, " Format: edidle <player> [-] time (hours)>\n");
        return;
   }
   if (p->flags & BLOCK_SU)
   {
      tell_player(p, " Go back on duty first beavis.\n");
       return;
   }

   /* p2 = find_player_absolute_quiet(str); */
        p2 = find_player_global(str);
      if ((!p2))
      {
         tell_player(p, " Only when the player is logged on, chief!\n");
         stack = oldstack;
         return;
      }
      if ((p2->residency == NON_RESIDENT))
      {
         tell_player(p, " That player is non-resident!\n");
         stack = oldstack;
         return;
      }
      if ((p2->residency == BANISHD || p2->residency == SYSTEM_ROOM))
      {
         tell_player(p, " That is a banished NAME, or System Room.\n");
         stack = oldstack;
         return;
      }
      sprintf(oldstack, "\n -=*> %s has changed your total login time...\n",
       p->name);
      stack = end_string(oldstack);
      tell_player(p2, oldstack);
      stack = oldstack;
      temp_time = atoi(temp);
      /* convert to hours */
      temp_time *=3600;
      p2->total_idle_time += temp_time;
      sprintf(stack, "%s changed the idle time of %s by %s hours.",
                p->name, p2->name, temp);
      stack = end_string(stack);
      log("edtime",oldstack);
      save_player(p2);
      tell_player(p, " Tis Done...\n");
      stack = oldstack;
      sprintf(stack, " -=*> %s changes the truespod login time of %s.\n",p->name,
      p2->name);
      stack = end_string(stack);
      au_wall_but(p, stack);
       stack = oldstack;
}


void marry_edit(player * p, char *str) {

        char *newmn;
        player *p2;

        if (!*str) {
                tell_player(p, " Format: medit <player> <new spouce>\n");
                return;
                }
        newmn = next_space(str);
        if (*newmn)
                *newmn++ = 0;
        else {
                tell_player(p, " Format: medit <player> <new spouce>\n");
                return;
                }
        p2 = find_player_global(str);
        if (!p2)
                return;

        strncpy(p2->married_to, newmn, MAX_NAME - 3);
	p2->system_flags |= MARRIED;
        tell_player(p, " All done =) \n");
	TELLPLAYER(p2, " -=*> %s has married you to %s.\n", p->name, p2->married_to);
	LOGF("marry", "%s medits %s's spouses name to %s", p->name, p2->name, p2->married_to);
}

void list_builders(player * p, char *str)
{
  int count = 0;
  char *oldstack, *prestack;
  player *scan;

  oldstack = stack;
  strcpy(stack, "============================ Builders on "
"==================================\n");
  stack = strchr(stack, 0);
  for (scan = flatlist_start; scan; scan = scan->flat_next)
  {
    prestack = stack;
    /* hey asty -- you forgot to update this.. I think this is right now.. */
    if (scan->system_flags & BUILDER && scan->location)
    {
      {
        count++;
        *stack = ' ';
        stack++;
        sprintf(stack, "%-20s ", scan->name);
        stack = strchr(stack, 0);
        sprintf(stack, "   ");
        stack = strchr(stack, 0);
        if (count%3 == 0)       *stack++ = '\n';
      }
    }
  }
  if (count%3 != 0)   *stack++ = '\n';
  if (count > 1)
    sprintf(stack, "================= There are %2d Builders connected"
                  " =========================\n", count);
  else
   if (count == 1)
    sprintf(stack, "=============== There is only one Builder connected "
                   "=======================\n", count);
  stack = end_string(stack);
  if (count) tell_player(p, oldstack);
  else  tell_player(p, " There are no builders on at the moment.\n");
  stack = oldstack;
}