/* -*- LPC -*- */
/*
* $Locker: $
* $Id: move.c,v 1.8 2001/07/27 20:59:09 tannah Exp $
* $Log: move.c,v $
* Revision 1.8 2001/07/27 20:59:09 tannah
* removed "there" property in move()
*
* Revision 1.7 2000/03/28 10:15:52 shaggy
* Forcibly unlocked by ceres
*
* Revision 1.6 1999/12/14 23:28:13 turrican
* Don't call event_enter when the destination is the rubbish room
*
* Revision 1.5 1999/09/21 03:12:56 pinkfish
* Pretty it up a little and make the move_flag private.
*
* Revision 1.4 1999/07/20 08:47:28 wodan
* don't move_object if we're already there, no need to do al those inits again.
*
* Revision 1.3 1999/03/16 15:23:57 wodan
* change to disable event_enter in /room/virtual, them npcs shouldn't see eachother enter :)
*
* Revision 1.2 1998/08/20 08:44:43 pinkfish
* *** empty log message ***
*
* Revision 1.1 1998/01/06 03:59:10 ceres
* Initial revision
*
*/
/**
* This class defines the basic move function and support functions.
* @author Pinkfish
*/
#include <move_failures.h>
#define DROP 1
#define GET 2
private int move_flag;
/**
* The basic move method. The destination can be an object or a string.
* if it is neither of these then the failure MOVE_EMPTY_DEST is
* returned. If the function test_add() was called on the
* destination and it returns 0 then MOVE_NO_GET is returned as
* a failure. If the destination is this_object() then
* MOVE_INVALID_DEST is returned as the failure. If the
* function test_remove is called on the current environment and it
* returns 0 then MOVE_NO_DROP is returned as the move failure.
* <p>
* The events "enter" and "exit" are generated as part of the
* move process. Both of these events are passed two
* arguments. The exit event is passed the exit message
* and the destination. The enter event is passed the
* enter message and the place we came from.
* <p>
* The function event_move_object() is called (call_other)
* on the object if the move was successful (MOVE_OK).
* @param dest where to move to
* @param messin the message to print when entering
* @param messout the message to print when leaving
* @see /include/move_failures.h
* @return MOVE_OK on success, or a failure reason on failure
* @see /secure/simul_efun->event()
* @see event_move_object()
* @example
* move(find_player("pinkfish"));
* @example
* move("/d/am/am/mendeddrum");
* @example
* move (environment(find_player("ceres")),
* the_short()+" flaps in hopelessly.\n",
* the_short()+" flaps away hopelessly.\n");
*/
varargs int move( mixed dest, string messin, string messout ) {
object prev;
if ( !objectp( dest ) ) {
if ( !stringp( dest ) || !( dest = find_object( dest ) ) ) {
return MOVE_EMPTY_DEST;
}
}
if ( !dest->test_add( this_object(), this_object()->get(dest) ) ) {
return MOVE_NO_GET;
}
if(dest == this_object()) {
return MOVE_INVALID_DEST;
}
prev = environment();
if ( prev ) {
if ( !prev->test_remove( this_object(),
this_object()->drop(dest),
dest ) ) {
return MOVE_NO_DROP;
} else if (prev != find_object("/room/virtual")) {
event( prev, "exit", messout, dest );
}
}
if (dest != environment()) {
// remove the "there" property. It can be readded in
// event_move_object if desired. Don't remove it if it's not
// yet in an environment, however.
if( environment() )
this_object()->remove_property( "there" );
move_object (dest);
this_object()->event_move_object( prev, dest );
}
if (!(dest == find_object("/room/rubbish") || dest == find_object("/room/virtual"))) {
event( dest, "enter", messin, prev );
}
this_object()->remove_hide_invis( "concealed" );
this_object()->remove_hide_invis( "secreted" );
return MOVE_OK;
} /* move() */
/**
* Turns off the get flag.
* @see move()
* @see set_get()
* @see get()
*/
void reset_get() { move_flag |= GET; }
/**
* Turns on the get flag.
* @see move()
* @see reset_get()
* @see get()
*/
void set_get() { move_flag &= ~GET; }
/**
* Turns off the drop flag.
* @see move()
* @see set_drop()
* @see drop()
*/
void reset_drop() { move_flag |= DROP; }
/**
* Turns on the drop flag.
* @see move()
* @see reset_drop()
* @see drop()
*/
void set_drop() { move_flag &= ~DROP; }
/**
* This method destructs the object. Zap us totally! It generates
* the event "dest_me", which is passed no arguments.
* The function event_destruct() is called (call_other) on
* the object for special last minute actions however
* the destruct will not prevented. If you need to prevent
* the destruction mask dest_me() or do_death().
* @see efun::destruct()
* @see event_dest_me()
* @see event_destruct()
* @see do_death()
* @see dwep()
* @see /secure/simul_efun->event()
*/
void dest_me() {
if ( environment() ) {
event( environment(), "dest_me" );
}
this_object()->event_destruct();
efun::destruct( this_object() );
} /* dest_me() */
/* Do not, I repeat, do not mask this function.
* It is used when all else fails to destruct the object...
* If we find you masking this function, we will cut you up
* into many little bits... slowly.
*/
/**
* Dest with extreme predejuce. This is the last way to destruct an
* object. Used if all other methods fail.
* @return a string "Destructed With Extreme Prejudice"
*/
nomask mixed dwep() {
efun::destruct( this_object() );
return "Destructed With Extreme Prejudice";
} /* dwep() */
/**
* The current value of the drop flag. This function is called by the
* test_remove() function in the living object. So it allows you to
* move the object out of inanimate objects, just not out of the
* players.
* @return 1 if it is set, 0 if it is reset
* @see set_drop()
* @see reset_drop()
* @see get()
*/
int drop( mixed dest ) { return move_flag & DROP; }
/**
* The current value of the get flag. This function is called by the
* test_add() function in the living object. So it allows you to
* move the object into innimate objects, just not into player
* characters.
* @return 1 if it is set, 0 if it is reset
* @see set_get()
* @see reset_get()
* @see drop()
*/
int get( mixed dest ) { return move_flag & GET; }
/** @ignore yes This is a debugging call. */
void set_move_flag( int i ) { move_flag = i; }