/
teeny/db/
teeny/dbm/
teeny/docs/
teeny/includes/
teeny/misc/
teeny/news/
teeny/text/
/* wiz.c */

#include "copyright.h"
#include "config.h"

#include <stdio.h>
#ifdef STRING_H
#include <string.h>
#else
#include <strings.h>
#endif                                /* STRING_H */
#include <ctype.h>

#include "teeny.h"

/*
 * Admin only commands. 
 */

voidfunc 
do_boot(player, arg)
  int             player;
  char           *arg;
{
  int             victim;

  if (!iswiz(player))
  {
    notify_player(player, "You can't boot anyone!\r\n");
    return;
  }
  if (!arg || !*arg)
  {
    notify_player(player, "Boot whom?\r\n");
    return;
  }
  if ((victim = match_player(arg)) == -1)
  {
    notify_player(player, "I can't find that player.\r\n");
    return;
  }
  if (!isalive(victim))
  {
    notify_player(player, "That player is not connected.\r\n");
    return;
  }
  if (victim == GOD)
  {
    notify_player(player, "You can't boot God!\r\n");
    return;
  }
  notify_player(victim, "You have been booted off the game.\r\n");
  iobdisconnect(victim);
  disconnect_player(victim);
  autotoadcheck(victim);
  notify_player(player, "Booted.\r\n");
}

voidfunc 
do_chown(player, argone, argtwo)
  int             player;
  char           *argone, *argtwo;
{
  int             owner, obj, flags;

  if (!iswiz(player))
  {
    notify_player(player, "Permission denied.\r\n");
    return;
  }
  if (!argone || !*argone || !argtwo || !*argtwo)
  {
    notify_player(player, "Chown what to who?\r\n");
    return;
  }
  if ((owner = resolve_player(player, argtwo, 1)) == -1)
  {
    notify_player(player, "I can't find that owner.\r\n");
    return;
  }
  if ((obj = resolve_object_or_exit(player, argone, 0)) == -1)
  {
    notify_player(player, "I can't find that object.\r\n");
    return;
  }
  if (obj == -2)
  {
    notify_player(player, "I can't tell which one you mean.\r\n");
    return;
  }
  if (get_int_elt(obj, FLAGS, &flags) == -1)
    goto chownbomb;
  if (((flags & TYPE_MASK) == TYP_PLAYER) && (player != GOD))
  {
    notify_player(player, "Players always own themselves.\r\n");
    return;
  }
  /* OK. Do it. */
#ifdef TIMESTAMPS
  stamp(obj);
#endif

  if (set_int_elt(obj, OWNER, owner) == -1)
    goto chownbomb;
  notify_player(player, "Owner changed.\r\n");
  return;

chownbomb:

  notify_bad(player);
}

voidfunc 
do_dump(player)
  int             player;
{
  if (!iswiz(player))
  {
    notify_player(player, "You're in a no dumping zone.\r\n");
    return;
  }
  notify_player(player, "Dumping...\r\n");
  dump_db();
}

voidfunc 
do_force(player, argone, argtwo)
  int             player;
  char           *argone, *argtwo;
{
  int             obj;

  if (!iswiz(player))
  {
    notify_player(player, "Permission denied.\r\n");
    return;
  }
  if (!argone || !*argone || !argtwo || !*argtwo)
  {
    notify_player(player, "Force who to do what?\r\n");
    return;
  }
  if ((obj = resolve_player(player, argone, 1)) == -1)
  {
    notify_player(player, "I can't find that player.\r\n");
    return;
  }
  if (obj == GOD)
  {
    notify_player(player, "You can't force God to do anything!\r\n");
    return;
  }
  handle_cmd(obj, argtwo);
  notify_player(player, "Ok.\r\n");
}

voidfunc 
do_newpassword(player, argone, argtwo)
  int             player;
  char           *argone, *argtwo;
{
  int             obj;
  char           *name, *p;
  extern char     cmdwork[];

  if (!iswiz(player))
  {
    notify_player(player, "Permission denied.\r\n");
    return;
  }
  if (!argone || !*argone || !argtwo || !*argtwo)
  {
    notify_player(player, "Change who's password to what?\r\n");
    return;
  }
  if ((obj = resolve_player(player, argone, 1)) == -1)
  {
    notify_player(player, "I can't find that player.\r\n");
    return;
  }
  if (obj == GOD && player != GOD)
  {
    notify_player(player, "You can't change God's password!\r\n");
    return;
  }
  if (get_str_elt(obj, NAME, &name) == -1)
    goto newbomb;

  for (p = cmdwork; *name != ' ' && *name; *p++ = *name++);
  *p++ = ' ';
  while (*argtwo)
  {
    *p++ = *argtwo++;
  }
  *p++ = '\0';

  if (set_str_elt(obj, NAME, cmdwork) == -1)
    goto newbomb;

  notify_player(obj, "Your password has been changed to \"");
  notify_player(obj, argtwo);
  notify_player(obj, "\".\r\n");
  notify_player(player, "Password changed.\r\n");
  return;

newbomb:
  notify_bad(player);
  return;
}

voidfunc 
do_textdump(player, file)
  int             player;
  char           *file;
{
  if (!iswiz(player))
  {
    notify_player(player, "You're in a no textdumping zone.\r\n");
    return;
  }
  if (mudstat() == DUMPING)
  {				/* eeek */
    notify_player(player, "Come back later.\r\n");
    return;
  }

  unlock_cache();     /* whoever said text_dump() was meant to run with
                         a locked cache?? */

  if (!file || !*file || (player != GOD))
  {
    text_dump(DEFAULT_TEXTDUMP);
  } else
  {
    text_dump(file);
  }
  lock_cache();               /* handle_at_cmd() will (re)unlock it.. */

  notify_player(player, "Ok.\r\n");
}

voidfunc 
do_toad(player, argone, argtwo)
  int             player;
  char           *argone, *argtwo;
{
  int             newowner, victim, total, flags, loc, list, next;
  char           *name, *p, *q, ch, *buff = (char *)0;
  char            work[128];


  if (!iswiz(player))
  {
    notify_player(player, "The spell fizzles and dies.\r\n");
    return;
  }
  if (!argone || !*argone)
  {
    notify_player(player, "Toad whom?\r\n");
    return;
  }
  if (!argtwo || !*argtwo)
  {
    newowner = -1;		/* purge */
  } else
  {
    if ((newowner = resolve_player(player, argtwo, 1)) == -1 ||
        newowner == -2)
    {
      notify_player(player, "I can't find that owner.\r\n");
      return;
    }
  }

  if ((victim = resolve_player(player, argone, 1)) == -1 || victim == -2)
  {
    notify_player(player, "I can't find who you want to toad.\r\n");
    return;
  }

  /* check for dipshits */

  if (victim == player)
  {
    notify_player(player,
        "Your magic isn't strong enough to toad yourself.\r\n");
    return;
  }
  if (victim == GOD)
  {
    notify_player(player, "God may not be toaded.\r\n");
    return;
  }
  if (iswiz(victim) && (player != GOD))
  {
    notify_player(player, "You can't toad another wizard!\r\n");
    return;
  }
  /* ok, let's do it */

  notify_player(victim,
      "You sense that everything you own is vanishing...\r\n");
  if (newowner != -1)
  {
    total = chownall(victim, newowner);
  } else
  {
    total = purgepossessions(victim);
  }

  if (get_int_elt(victim, FLAGS, &flags) == -1)
    goto toadbomb;
  flags = flags & ~TYPE_MASK;
  flags = flags | TYP_THING;
  if (set_int_elt(victim, FLAGS, flags) == -1)
    goto toadbomb;

  if(isalive(victim))
  {
    notify_player(victim, "yoo haf been turned inna slimy toad.\r\n");
    disconnect_player(victim);
    iobdisconnect(victim);
  }

  if (set_int_elt(victim, SITE, 0) == -1)
    goto toadbomb;

  if (get_str_elt(victim, NAME, &name) == -1)
    goto toadbomb;
  for (p = name; p && *p && *p != ' '; p++);
  *p = '\0';
  buff = ty_malloc(strlen(name) + 1, "do_toad");
  (void) strcpy(buff, name);

  (void) sprintf(work, "A slimy toad named %s.", buff);
  if (set_str_elt(victim, NAME, work) == -1)
    goto toadbomb;

  if (get_int_elt(victim, LOC, &loc) == -1)
    goto toadbomb;
  if(exists_object(loc))
  {
    (void)strcpy(work, buff);
    (void)strcat(work, " turns into a slimy toad before your eyes.\r\n");
    notify_oall(victim, work);
    list_drop(victim, loc, CONTENTS_LIST);
    list_add(victim, player, CONTENTS_LIST);
    if (set_int_elt(victim, LOC, player) == -1)
      goto toadbomb;
  }

  /* ok, now we fix up some lists... */

  if (get_int_elt(victim, CONTENTS, &list) == -1)
    goto toadbomb;
  while (list != -1)
  {
    int             home;

    if (get_int_elt(list, NEXT, &next) == -1)
    {
      warning("do_toad", "bad next ref, list is spam");
      goto toadbomb;
    }
    if (get_int_elt(list, HOME, &home) == -1)
    {
      list = next;
      continue;
    }
    if (!exists_object(home))
    {				/* argh */
      int owner;
      if (get_int_elt(list, OWNER, &owner) == -1)
      {
        list = next;
        continue;
      }
      if (get_int_elt(owner, HOME, &home) == -1)
      {
        list = next;
        continue;
      }
      home = STARTING_LOC;
    }
    if (set_int_elt(list, LOC, home) == -1)
    {
      list = next;
      continue;
    }
    list_drop(list, victim, CONTENTS_LIST);
    list_add(list, home, CONTENTS_LIST);

    list = next;
  }

  if (get_int_elt(victim, EXITS, &list) == -1)
    goto toadbomb;
  if(list)
  {
    while (list != -1)
    {
      if (get_int_elt(list, NEXT, &next) == -1)
      {
        warning("do_toad", "bad next ref, list is spam");
        goto toadbomb;
      }
      recycleobj(list);		/* boom! */
      list = next;
    }
    if(set_int_elt(victim, EXITS, -1) == -1)
      goto toadbomb;
  }

#ifdef TIMESTAMPS
  stamp(victim);
#endif				/* TIMESTAMPS */

  (void)sprintf(work, "Toaded.  %d objects %s.\r\n", total, (newowner == -1) ?
	  "purged" : "chowned");
  notify_player(player, work);

  if (set_int_elt(victim, OWNER, player) == -1)
    goto toadbomb;

  /* log it */

  if (get_str_elt(player, NAME, &q) == -1)
    goto toadbomb;		/* ya, right */
  for (p = q; p && *p && *p != ' '; p++);
  ch = *p;
  *p = '\0';
  log_command("TOAD: %s(#%d) toaded by %s(#%d).\n", buff, victim, q, player);
  *p = ch;

  ty_free(buff);

  return;

toadbomb:

  if (buff)
    ty_free(buff);

  notify_bad(player);
}

voidfunc 
do_wall(player, arg)
  int             player;
  char           *arg;
{
  char           *name, *p, ch;

  if (!iswiz(player))
  {
    notify_player(player, "But what do you want to do with a wall?\r\n");
    return;
  }
  if (!arg || !*arg)
  {
    notify_player(player, "@wall what, silly?\r\n");
    return;
  }
  if (get_str_elt(player, NAME, &name) == -1)
    goto wallbomb;

  /* Temporarily terminate the name */

  for (p = name; !isspace(*p) && *p;)
    p++;
  ch = *p;
  *p = '\0';

  notify_wall(name);

  log_command("WALL: %s(#%d)  \"%s\"\n", name, player, arg);

  *p = ch;

  notify_wall(" shouts, \"");
  notify_wall(arg);
  notify_wall("\"\r\n");
  return;
wallbomb:
  notify_bad(player);
  return;
}

voidfunc 
do_shutdown(player)
  int             player;
{
  if (iswiz(player))
  {
    set_mudstat(STOPPED);
    log_command("SHUTDOWN: by #%d\n", player);
    notify_player(player, "Ok.\r\n");
  } else
  {
    notify_player(player, "Permission denied. Doof.\r\n");
  }
}

voidfunc 
do_teleport(player, argone, argtwo)
  int             player;
  char           *argone;
  char           *argtwo;
{
  int             object, loc, dest, link, objflags, locflags, destflags;
  int             teleport_ok;
  char           *name, *p, *oarr, *olea, ch;

  if (!argone || !*argone)
  {
    notify_player(player, "Usage: @teleport <thing> = <destination>\r\n");
    notify_player(player, "or use @teleport <destination> to move yourself.\r\n");
    return;
  }
  if (!argtwo || !*argtwo)
  {
    object = player;
    if (strcmp(argone, "home") == 0)
    {
      dest = -3;
    } else
    if ((dest = resolve_object(player, argone, 0)) == -1)
    {
      notify_player(player, "I can't find that destination.\r\n");
      return;
    } else
    if (dest == -2)
    {
      notify_player(player, "I don't know which destination you mean.\r\n");
      return;
    }
  } else
  {
    if ((object = resolve_object_or_exit(player, argone, iswiz(player))) == -1)
    {
      notify_player(player, "I can't find what you wish to teleport.\r\n");
      return;
    }
    if (object == -2)
    {
      notify_player(player, "I can't tell which one you wish to teleport.\r\n");
      return;
    }
    if (strcmp(argtwo, "home") == 0)
    {
      if (get_int_elt(object, HOME, &dest) == -1)
        goto telbomb;
    } else
    if ((dest = resolve_object(player, argtwo, iswiz(player))) == -1)
    {
      notify_player(player, "I can't find that destination.\r\n");
      return;
    } else
    if (dest == -2)
    {
      notify_player(player, "I don't know which destination you mean.\r\n");
      return;
    }
  }

  /* do it */

  if (get_int_elt(object, FLAGS, &objflags) == -1)
    goto telbomb;
  if (get_int_elt(object, LOC, &loc) == -1)
    goto telbomb;

  switch (objflags & TYPE_MASK)
  {
  case TYP_ROOM:		/* no go */
  case TYP_EXIT:
    notify_player(player, "You can't teleport that!\r\n");
    return;
  case TYP_PLAYER:		/* our most complex */
    if (get_int_elt(loc, FLAGS, &locflags) == -1)
      goto telbomb;

    if (dest == -3)
    {				/* home */
      int             home;

      if (get_int_elt(object, HOME, &home) == -1)
	goto telbomb;
      if (!exists_object(home))
	home = STARTING_LOC;

      dest = home;
    }
    if (dest == player)
      if (get_int_elt(player, LOC, &dest) == -1)
        goto telbomb;
    if (get_int_elt(dest, FLAGS, &destflags) == -1)
      goto telbomb;
    if ((destflags & TYPE_MASK) != TYP_ROOM)
    {
      notify_player(player, "You can't teleport a player to that!\r\n");
      return;
    }
    if ((player != object) &&
        (!(controls(player, loc) || (objflags & JUMP_OK))))
    {
      notify_player(player, "You're not allowed to teleport that player.\r\n");
      return;
    }
    if (!(controls(player, loc) || (locflags & JUMP_OK)) ||
	!(controls(player, dest) || (destflags & JUMP_OK)))
    {
      notify_player(player, "Permission denied.\r\n");
      return;
    }
    notify_player(object, "You feel a wrenching sensation...\r\n");

    if (get_str_elt(object, NAME, &name) == -1)
      goto telbomb;
    for (p = name; *p && *p != ' '; p++);
    ch = *p;
    *p = '\0';

    if (!(locflags & DARK) && !isdark(object))
    {
      if (get_str_elt(object, SUC, &olea) == -1)
        goto telbomb;
      if (olea != NULL)
      {
        notify_oall(object, name);
        notify_oall(object, " ");
        notify_oall(object, olea);
        notify_oall(object, "\r\n");
      }
      notify_oall(object, name);
      notify_oall(object, " has left.\r\n");
    }
    list_drop(object, loc, CONTENTS_LIST);
    list_add(object, dest, CONTENTS_LIST);
    if (set_int_elt(object, LOC, dest) == -1)
      goto telbomb;
    if (!(destflags & DARK) && !isdark(object))
    {
      if (get_str_elt(object, FAIL, &oarr) == -1)
        goto telbomb;
      if (oarr != NULL)
      {
        notify_oall(object, name);
        notify_oall(object, " ");
        notify_oall(object, oarr);
        notify_oall(object, "\r\n");
      }
      notify_oall(object, name);
      notify_oall(object, " has arrived.\r\n");
    }
    *p = ch;

    do_look(object, (char *) 0);
    flush_room(loc);

    break;
  case TYP_THING:		/* gotta check for non-sticky drop-tos... */
    teleport_ok = FALSE;
    if (dest == -3)
    {
      int             home;

      if (get_int_elt(object, HOME, &home) == -1)
	goto telbomb;
      if (!exists_object(home))
      {
	int             owner;

	if (get_int_elt(object, OWNER, &owner) == -1)
	  goto telbomb;
	if (get_int_elt(owner, HOME, &home) == -1)
	  goto telbomb;
	if (!exists_object(home))
	  home = STARTING_LOC;

      }
      dest = home;
      teleport_ok = TRUE;
    }
    if (get_int_elt(dest, FLAGS, &destflags) == -1)
      goto telbomb;

    if (!(controls(player, object) || (objflags & JUMP_OK) ||
          controls(player, loc)))
    {
      notify_player(player, "Permission denied.\r\n");
      return;
    }
    if ( (!teleport_ok) &&
         (((destflags & TYPE_MASK) == TYP_PLAYER) && (dest != player)) ||
         ((destflags & TYPE_MASK) == TYP_EXIT) ||
         ((destflags & TYPE_MASK) == TYP_THING) ||
         !(controls(player, dest) || (destflags & JUMP_OK)) )
    {
      notify_player(player, "You can't teleport an object to there!\r\n");
      return;
    }
#ifdef TIMESTAMPS
    stamp(object);
#endif				/* TIMESTAMPS */

    list_drop(object, loc, CONTENTS_LIST);
    list_add(object, dest, CONTENTS_LIST);
    if (set_int_elt(object, LOC, dest) == -1)
      goto telbomb;

    if ((destflags & TYPE_MASK) == TYP_ROOM && !(destflags & STICKY))
    {
      char           *odrop;
      int             dropto;

      if (get_int_elt(dest, DROPTO, &dropto) == -1)
	goto telbomb;
      if (dropto != -1)
      {
        if (dropto == -3)
        {
          int             home;

          if (get_int_elt(object, HOME, &home) == -1)
            goto telbomb;
          if (!exists_object(home))
          {
            int             owner;

            if (get_int_elt(object, OWNER, &owner) == -1)
              goto telbomb;
            if (get_int_elt(owner, HOME, &home) == -1)
              goto telbomb;
            if (!exists_object(home))
              home = STARTING_LOC;
          }
          dropto = home;
        }

#ifdef DROP_FIELDS
	if (get_str_elt(object, NAME, &name) == -1)
	  goto telbomb;
	if (get_str_elt(dest, ODROP, &odrop) == -1)
	  goto telbomb;
	if (*odrop)
	{
	  notify_oall(object, name);
	  notify_oall(object, " ");
	  notify_oall(object, odrop);
	  notify_oall(object, "\r\n");
	} else
	{
	  notify_oall(object, name);
	  notify_oall(object, " falls through the floor!\r\n");
	}
#endif				/* DROP_FIELDS */
	list_drop(object, dest, CONTENTS_LIST);
	list_add(object, dropto, CONTENTS_LIST);
	if (set_int_elt(object, LOC, dropto) == -1)
	  goto telbomb;
      }
    }
    break;
  default:
    goto telbomb;
  }

  notify_player(player, "Teleported.\r\n");
  return;

telbomb:

  notify_bad(player);
}

voidfunc 
do_pcreate(player, argone, argtwo)
  int             player;
  char           *argone;
  char           *argtwo;
{
  extern char     cmdwork[];
  int             loc, newplayer;

#ifdef GOD_ONLY_PCREATE
  if (player != GOD)
  {
    notify_player(player, "Permission denied.\r\n");
    return;
  }
#else
  if (!iswiz(player))
  {
    notify_player(player, "Permission denied.\r\n");
    return;
  }
#endif				/* GOD_ONLY_PCREATE */
  if (!argone || !*argone || !argtwo || !*argtwo)
  {
    notify_player(player, "Usage: @pcreate <name> = <password>\r\n");
    return;
  }
  if (match_player(argone) != -1)
  {
    notify_player(player, "A player with that name already exists.\r\n");
    return;
  }
#ifndef REGISTRATION
  if (get_int_elt(player, LOC, &loc) == -1)
  {
    notify_player(player, "I can't get your location!\r\n");
    return;
  }
#endif				/* REGISTRATION */
  strncpy(cmdwork, argone, 16);
  if (strlen(argone) > 16)
    cmdwork[15] = '\0';
  strcat(cmdwork, " ");
  strcat(cmdwork, argtwo);
#ifndef REGISTRATION
  if ((newplayer = create_player(cmdwork, loc)) == -1)
  {
#else
  if ((newplayer = create_player(cmdwork, STARTING_LOC)) == -1)
  {
#endif				/* REGISTRATION */
    notify_player(player, "Pcreate failed.\r\n");
  } else
  {
    char           *p;

    for (p = cmdwork; *p && *p != ' '; p++);
    *p++ = '\0';

    notify_player(player, "Player \"");
    notify_player(player, cmdwork);
    notify_player(player, "\" created with password \"");
    notify_player(player, p);
    notify_player(player, "\".\r\n");

    log_command("PCREATED: %s(#%d) created by player #%d.\n", cmdwork,
		newplayer, player);
  }
}
voidfunc 
do_purge(player, arg)
  int             player;
  char           *arg;
{
  extern char     cmdwork[];
  int             victim;

  if (!iswiz(player))
  {
    notify_player(player, "Someone doesn't want you doing that.\r\n");
    return;
  }
  if (!arg || !*arg)
  {
    notify_player(player, "But who's possessions do you want to purge?\r\n");
    return;
  }
  if ((victim = resolve_player(player, arg, 1)) == -1)
  {
    notify_player(player, "That person does not exist.\r\n");
    return;
  }
  if (victim == GOD)
  {
    notify_player(player, "You may not purge God's possessions.\r\n");
    return;
  }
  sprintf(cmdwork, "Purged %d objects.\r\n", purgepossessions(victim));
  notify_player(player, cmdwork);
}
voidfunc 
do_chownall(player, argone, argtwo)
  int             player;
  char           *argone;
  char           *argtwo;
{
  extern char     cmdwork[];
  int             oldowner, newowner;

  if (!iswiz(player))
  {
    notify_player(player, "Someone doesn't want you doing that.\r\n");
    return;
  }
  if (!argone || !*argone || !argtwo || !argtwo)
  {
    notify_player(player, "Usage: @chownall <oldowner> = <newowner>\r\n");
    return;
  }
  if ((oldowner = resolve_player(player, argone, 1)) == -1)
  {
    notify_player(player, "I can't find that person.\r\n");
    return;
  }
  if ((newowner = resolve_player(player, argtwo, 1)) == -1)
  {
    notify_player(player, "I couldn't find the new owner.\r\n");
    return;
  }
  if (oldowner == GOD)
  {
    notify_player(player, "You may not chown all of God's possessions.\r\n");
    return;
  }
  sprintf(cmdwork, "Chowned %d objects to #%d.\r\n", chownall(oldowner, newowner),
	  newowner);
  notify_player(player, cmdwork);
}