untermud/DOC/
untermud/DOC/U/
untermud/DOC/U/U-examples/
untermud/DOC/internals/
untermud/DOC/wizard/
untermud/MISC/
untermud/MISC/dbchk/
untermud/RWHO/
untermud/RWHO/rwhod/
/*
    Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/

/* configure all options BEFORE including system stuff. */
#include    "config.h"
#include    "mud.h"
#include    "look.h"
#include    "vars.h"

/*
core implementation of player movement
*/

int player_go (int argc, char *argv[], char *who, char *from, char *to)
{
  char *cp;
  char *dst;
  char hm[MAXOID];

  dst = ut_getatt (to, 0, typ_obj, var_dest, (char *) 0);

  /* make sure destination is valid && exists */
  if (dst == (char *) 0)
    goto fail;

  /* check locks */
  if (bool_locked (who, to, from, var_lock, 0))
    goto fail;

  /* Try to move. If not in cache, try a remote go */

  if (!strcmp (dst, "home")) {
    if (!ut_home (who, hm))
      goto fail;
    dst = hm;                   /* ut_home() guarantees that it's local */
  }
  if (!cache_check (dst)) {
    if (xact_sendplayer (who, from, dst)) {
      /* Failed remote go. */

      goto fail;
    } else {
      /* Succeeded remote go. succ/osucc & 'has left' */

      (void) activate (ACTIV_PONLY, who, to, from, var_succ, argc, argv);
      if (!ut_flagged (who, var_isdark))
        (void) activate (ACTIV_ECAST, who, to, from, var_osucc, argc, argv);
      if (!ut_flagged (who, var_isdark)) {
        cp = ut_name (who);
        ut_roombcast (from, who, cp, " has left.\n", (char *) 0);
      }

      /* TinyLink */

      xact_tinylink (who);
      io_logoff (who);
      return (0);
    }
  }

  /* Local go operation. */

  /*  DO FIRST. MOVE THIS CODE AND DIE, OK? */
  /* arrived/left */
  if (!ut_flagged (who, var_isdark)) {

    /* succ/osucc. */
    (void) activate (ACTIV_PONLY, who, to, from, var_succ, argc, argv);
    if (!ut_flagged (who, var_isdark))
      (void) activate (ACTIV_ECAST, who, to, from, var_osucc, argc, argv);
    cp = ut_name (who);
    ut_roombcast (from, who, cp, " has left.\n", (char *) 0);
    ut_roombcast (dst, who, cp, " has arrived.\n", (char *) 0);
  }

  /* move - any of these fail, and, well, whoops. */
  if (ut_listdel (who, from, var_ply, who))
    return (1);
  if (ut_listadd (who, dst, var_ply, who))
    return (1);
  if (ut_set (who, who, typ_obj, var_loc, dst))
    return (1);

  /* drop/odrop. DO LAST. MOVE THIS CODE AND YOU WILL ALSO DIE. */
  (void) activate (ACTIV_PONLY, who, to, dst, var_drop, argc, argv);
  if (!ut_flagged (who, var_isdark))
    (void) activate (ACTIV_ECAST, who, to, dst, var_odrop, argc, argv);


  /* print thang's @desc */
  lookat (who, ut_loc (who), LOOK_NAME | LOOK_PLAY | LOOK_CONT);
  return (0);

fail:
  if (!activate (ACTIV_PONLY, who, to, from, var_fail, argc, argv))
    say (who, "you can't go there.\n", (char *) 0);
  if (!ut_flagged (who, var_isdark))
    (void) activate (ACTIV_ECAST, who, to, from, var_ofail, argc, argv);
  return (1);
}