#include <position.h>
inherit COMMAND_BASE;
string position;
string up_down;
string position_type;
int query_position_command() {
return 1;
} /* query_position_command() */
string query_up_down() {
return up_down;
} /* query_up_down() */
string query_position() {
return position;
} /* query_position() */
string query_position_type() {
return position_type;
} /* query_position_type() */
void setup_position( string pos, string up, string type ) {
position = pos;
up_down = up;
position_type = type;
} /* setup_position() */
int position( object person, int silent ) {
string pos_type;
if( person->query_position() == position_type ) {
if( person == TP )
add_failed_mess("You are already "+position_type+".\n");
return 0;
}
if( !ENV(person) || !ENV(person)->is_allowed_position(position_type) ) {
if( person == TP )
add_failed_mess("You cannot "+position+" "+up_down+" here.\n");
return 0;
}
if( !silent ) {
if( up_down != "" ) {
if( person->query_position_on() ) {
pos_type = person->query_position_type();
tell_object( person, "You "+position+" "+up_down+" "+
pos_type+" "+person->query_position_on_short()+".\n");
tell_room( ENV(person), person->one_short()+" $V$0="+
position+"s,"+position+"$V$ "+up_down+" "+
pos_type+" "+person->query_position_on_short()+".\n",
({ person }));
} else { // LYING
tell_object( person, "You "+position+" "+up_down+".\n");
tell_room( ENV(person), person->one_short()+" $V$0="+
position+"s,"+position+"$V$ "+up_down+".\n",
({ person }));
}
} else {
if( person->query_position_on() ) {
pos_type = person->query_position_type();
tell_object( person, "You "+position+" "+pos_type+" "+
person->query_position_on_short()+".\n");
tell_room( ENV(person), person->one_short()+" $V$0="+
position+"s,"+position+"$V$ "+pos_type+" "+
person->query_position_on_short()+".\n",
({ person }));
} else {
tell_object( person, "You "+position+".\n");
tell_room( ENV(person), person->one_short()+" $V$0="+
position+"s,"+position+"$V$.\n", ({ person }));
}
}
}
person->set_position(position_type);
return 1;
} /* position() */
int position_floor( object person, int silent ) {
if( !ENV(person) || !ENV(person)->is_allowed_position(position_type) ) {
if( person == TP )
add_failed_mess("You cannot "+position+" "+up_down+" here.\n");
return 0;
}
if( person->query_position_on() ) {
if( !silent ) {
if( up_down != "" ) {
tell_object( person, "You get off "+
person->query_position_on_short()+" and "+position+" "+
up_down+".\n");
tell_room( ENV(person), person->one_short()+" gets off "+
person->query_position_on_short()+" and $V$0="+
position+"s,"+position+"$V$ "+up_down+".\n",
({ person }) );
} else {
tell_object( person, "You get off "+
person->query_position_on_short()+" and "+position+".\n");
tell_room( ENV(person), person->one_short()+" gets off "+
person->query_position_on_short()+" and $V$0="+
position+"s,"+position+"$V$.\n", ({ person }) );
}
}
person->set_position(position_type);
person->set_position_on(0);
person->set_position_type(0);
person->set_position_multiple(0);
return 1;
}
return position(person, 0);
} /* position_floor() */
string *query_position_strings(object person) {
string bit;
string bit_other;
switch( person->query_position_type() ) {
case AT_TYPE :
case BESIDE_TYPE :
bit = "move away from";
bit_other = "moves away from";
break;
case ON_TYPE :
default :
bit = "get off";
bit_other = "gets off";
break;
}
return ({ bit, bit_other });
} /* query_position_strings() */
int position_object( object *obs, string pos_type, object person ) {
int mult;
string rabbit, *pos_strings;
object ob;
if( !ENV(person) || !ENV(person)->is_allowed_position(position_type) ) {
if( person == TP )
add_failed_mess("You cannot "+position+" "+up_down+" here.\n");
return 0;
}
pos_strings = query_position_strings(person);
foreach( ob in obs ) {
if( ob->query_property(CAN_POSITION_PROPERTY) ) {
mult = ob->query_property(MULTIPLE_POSITION_PROPERTY);
if( person->query_position_on() ) {
if( person->query_position_on() == ob &&
person->query_position_type() == pos_type ) {
if( person->query_position() != position_type )
return position( person, 0 );
if( person == TP )
add_failed_mess("You are already "+position_type+" "+
pos_type+" $I.\n", ({ ob }) );
return 0;
}
tell_object( person, "You "+pos_strings[0]+" "+
person->query_position_on_short()+" and "+
position+" "+pos_type+" "+ob->a_short()+".\n");
tell_room( ENV(person), person->one_short()+" "+
pos_strings[1]+" "+person->query_position_on_short()+
" and $V$0="+position+"s,"+position+"$V$ "+pos_type+" "+
ob->a_short()+".\n", ({ person }) );
person->set_position(position_type);
person->set_position_on(ob);
person->set_position_type(pos_type);
person->set_position_multiple(mult);
return 1;
}
tell_object( person, "You "+position+" "+pos_type+" "+
ob->a_short()+".\n");
tell_room( ENV(person), person->one_short()+" $V$0="+
position+"s,"+position+"$V$ "+pos_type+" "+
ob->a_short()+".\n", ({ person }) );
person->set_position(position_type);
person->set_position_on(ob);
person->set_position_type(pos_type);
person->set_position_multiple(mult);
return 1;
} else {
rabbit = ob->query_position_string(position_type);
if( rabbit ) {
mult = ob->query_position_multiple(position_type);
if( person->query_position_on() ) {
if( person->query_position_on() == rabbit &&
person->query_position_type() == pos_type ) {
if( person->query_position() != position_type )
return position( person, 0 );
add_failed_mess("You are already "+position_type+" "+
pos_type+" $I.\n", ({ ob }) );
return 0;
}
tell_object( person, "You "+pos_strings[0]+" "+
person->query_position_on_short()+" and "+
position+" "+pos_type+" "+rabbit+".\n");
tell_room( ENV(person), person->one_short()+" "+
pos_strings[1]+" "+
person->query_position_on_short()+" and $V$0="+
position+"s,"+position+"$V$ "+pos_type+" "+
rabbit+".\n", ({ person }) );
person->set_position(position_type);
person->set_position_on(rabbit);
person->set_position_type(pos_type);
person->set_position_multiple(mult);
return 1;
}
tell_object( person, "You "+position+" "+pos_type+" "+
rabbit+".\n");
tell_room( ENV(person), person->one_short()+" $V$0="+
position+"s,"+position+"$V$ "+pos_type+" "+rabbit+".\n",
({ person }));
person->set_position(position_type);
person->set_position_on(rabbit);
person->set_position_type(pos_type);
person->set_position_multiple(mult);
return 1;
}
}
}
return 0;
} /* position_object() */
mixed *query_patterns() {
return ({ "", (: position( TP, 0 ) :),
"on [the] floor", (: position_floor( TP, 0 ) :),
"{on|at|in|beside} <indirect:object>",
(: position_object( $1, $4[0], TP ) :) });
} /* query_patterns() */