/*
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);
}