/* ROPE TRICK */
inherit "inherit/timer";
status rope_up;
string room;
#define NAME "@@query_name:$this_player()$@@" /* gives greater flexibilty */
#define TARG "@@query_name:$this_object()$@@"
status rope(string targ, mixed alt_type) {
int time, i;
string file;
if(targ != "trick") {
notify_fail("rope trick?\n");
return 0;
}
if(!alt_type) alt_type = "alteration";
time = (objectp(alt_type))
? (int)alt_type->query_cast_level()
: (int)call_other(this_player(),"query_"+alt_type);
file = file_name(this_object());
sscanf(file, "%s#%d", file, i);
this_player()->load_spell(({
"target", this_player(),
"name", "Rope Trick",
"sphere", alt_type,
"cost", 4,
"damage", time,
"level", 2, /* 5 dim. space - 8 */
"cast time", 3,
"spell object", file,
"casting msg", ({
"You take the rope and stand it in the air...\n",
"An interdimensional space is created at its top.\n",
}),
"casting msg room", ({
NAME +" takes a length of rope and stands it on "+
"its end...\n",
"The rope hangs in mid air!\n",
}),
"passive",
"component", "rope#cord",
/* other spell options...
"area",
"immune", 0,
"msg target", 0,
"msg room", 0,
"msg caster", 0,
*/
}));
return 1;
}
/************************************************************************/
/* call when this object is cloned to target */
status cast_spell(object caster, object target, object previous, int time) {
object trick;
trick = present("ropetrick", environment(target));
if(trick) {
tell_object(target,"It rips into an existing interdimensional "+
"space!!\nIt disrupts your spell.\n");
trick->dispel_magic();
destruct(this_object());
return 1;
}
room = (string)this_player()->query_current_room();
move_object(this_object(), environment(this_player()));
tell_object(target,"You climb the rope.\n");
move_object(this_player(), this_object());
tell_room(environment(),target->query_name()+" climbs the rope.\n");
adj_time(120 * time);
return 1; /* do not do damage */
}
status id(string str) {
return str == "spell"
|| str == "ropetrick";
}
void extra_long() {
if(!rope_up) {
write("There is a rope here, suspended in mid-air.\n");
}
}
string short(status wiz) {
if(environment(this_player()) == this_object()) {
return "A dimensional hole in space";
}
if(wiz) return file_name(this_object());
}
void long() {
if(environment(this_player()) == this_object()) {
write("You look down through a dimensional hole to see......\n");
call_other(room,"long");
extra_long();
if(!rope_up) write("Perhaps you can raise the rope.\n");
}
}
void time_out() {
int i;
object *inv;
if(environment()) {
inv = all_inventory();
for(i = 0; i < sizeof(inv); i++) {
if(!inv[i]) continue;
tell_room(environment(),inv[i]->query_name()+" falls out of the sky.\n");
move_object(inv[i], environment());
if(living(inv[i])) {
command("look",inv[i]);
tell_object(inv[i],"The interdimensional space collapses!\n");
}
}
}
::time_out();
}
void dispel_magic() { time_out(); }
void init() {
if(environment(this_player()) == this_object()) {
add_action("down","down");
add_action("raise","raise");
add_action("lower","lower");
}
if(environment(this_player()) == environment()) {
add_action("climb","climb");
}
}
status lower(string str) {
if(str == "rope") {
if(rope_up) {
write("You lower the rope.\n");
say(this_player()->query_name()+" lowers the rope.\n");
rope_up = 0;
}
else {
write("It is already down.\n");
}
return 1;
}
notify_fail("lower what?\n");
return 0;
}
status raise(string str) {
if(str == "rope") {
if(!rope_up) {
write("You raise the rope.\n");
say(this_player()->query_name()+" raises the rope.\n");
rope_up = 1;
}
else {
write("It is already down.\n");
}
return 1;
}
notify_fail("raise what?\n");
return 0;
}
status down() {
if(rope_up) {
write("You have to lower the rope first.\n");
}
else {
this_player()->move_player("climbs down the rope#"+room,0,1);
}
return 1;
}
status climb(string str) {
if(rope_up) return 0;
if(str == "rope") {
this_player()->move_player("climbs up the rope#"+
file_name(this_object()));
return 1;
}
notify_fail("climb what?\n");
return 0;
}
/* Native Mode Move */
#include <move.h>