TinyMAZE/
TinyMAZE/config/
TinyMAZE/doc/
TinyMAZE/run/msgs/
TinyMAZE/src/
TinyMAZE/src/db/
TinyMAZE/src/ident/
TinyMAZE/src/io/
TinyMAZE/src/prog/
TinyMAZE/src/softcode/
TinyMAZE/src/util/
#include <stdio.h>
#include "externs.h"
#include "db.h"
#include "powers.h"

void do_teleport(OBJ *player, char *arg1, char *arg2)
{
  OBJ *victim;
  OBJ *destination;
  char *to;

  if(!power(player, POW_TELEPORT))
  {
    notify(player, perm_denied());
    return;
  }

/* Get victim */
  if(!*arg2)
  {
    victim = player;
    to = arg1;
  }
  else
  {
    victim = match_object(player, arg1, TYPE_PLAYER|TYPE_THING);
    if(!victim)
    {
      notify(player, no_match(arg1));
      return;
    }
    to = arg2;
  }

/* Get destination */
  if(!string_compare(to, "home"))
  {
    if(!controls(player, victim, POW_TELEPORT) &&
      victim->location->owner != player)
    {
      notify(player, perm_denied());
      return;
    }
    destination = victim->link;
  }
  else if(!string_compare(to, "back"))
    destination = find_object(atoi(atr_get(victim, "LASTLOC")));
  else
    destination = match_object(player, to, TYPE_ROOM);

  if(!destination || Typeof(destination) == TYPE_EXIT)
  {
    notify(player, no_match(to));
    return;
  }

  if(!controls(player, victim, POW_TELEPORT))
  {
    notify(player, perm_denied());
    return;
  }

  did_it(victim, victim->location, "LEAVE", NULL, "PLEAVE");
  safe_tel(victim, destination);
  did_it(victim, victim->location, "ENTER", NULL, "PENTER");
}

void do_join(OBJ *player, char *arg)
{
  OBJ *victim;

  if(!(victim = match_object(player, arg, NOTYPE)))
    if(!(victim = match_player(NULL, arg)))
    {
      notify(player, no_match(arg));
      return;
    }

  if((!controls(player, victim, POW_JOIN) &&
    !controls(player, victim->location, POW_JOIN)) ||
    get_class(player->owner) == CLASS_CITIZEN)
  {
    notify(player, perm_denied());
    return;
  }

  moveto(player, victim->location);
}

void do_summon(OBJ *player, char *arg)
{
  OBJ *victim;
  OBJ *dest;

  dest = player->location;

  if(!(victim = match_object(player, arg, TYPE_PLAYER)))
    if(!(victim = match_player(NULL, arg)))
    {
      notify(player, no_match(arg));
      return;
    }

  if(Typeof(player) != TYPE_PLAYER &&
    get_class(player->owner) == CLASS_CITIZEN)
  {
    notify(player, perm_denied());
    return;
  }

  if(!controls(player, victim, POW_SUMMON) ||
    !controls(player, victim->location->owner, POW_SUMMON) ||
    !controls(player, player->location->owner, POW_SUMMON))
  {
    notify(player, perm_denied());
    return;
  }

  moveto(victim, dest);
}