/* Copyright 1989, 1990 by James Aspnes, David Applegate, and Bennet Yee */
/* See the file COPYING for distribution information */
#include "db.h"
#include "globals.h"
#include "externs.h"
/* returns 0 if the move fails, 1 if it succeeds */
datum move (datum thing, datum dest)
{
struct object *t;
struct object *d;
if ((t = object (thing)) == NOTHING || (d = object (dest)) == NOTHING)
return 0;
/* short-circuit null moves */
if (t->location == dest)
return 1;
/* check authorization */
/* thing must be either you, controlled by me,
or in a location controlled by me */
if (!(thing == you || controls (me, thing)
|| controls (me, thing)
|| controls (me, t->location)))
return 0;
/* dest must either be you, controlled by me, or OPEN */
if (!(dest == you || oflag_set (d, F_OPEN)
|| controls (me, dest)))
return 0;
/* can't move a player into a player */
if (oflag_set (t, F_PLAYER) && oflag_set (d, F_PLAYER))
return 0;
/* move is allowed, do it */
/* remove t from old location */
take_from_internal (t->location, CONTENTS_NAME, thing);
/* add t to new location */
add_to_internal (dest, CONTENTS_NAME, thing);
/* set location */
t->location = dest;
/* and we win */
return 1;
}