/* Copyright 1989, 1990 by James Aspnes, David Applegate, and Bennet Yee */
/* See the file COPYING for distribution information */
#include "db.h"
#include "globals.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;
}