/** shadow door **/
#define NAME "@@query_name:$this_player()$@@"
status shadow(mixed str, mixed alt_type) {
int jumps, i;
string file;
if(!str || !(str == "door" || str == "monster")) {
write("Usage: shadow door\n"+
" shadow monster\n");
return 1;
}
if(!alt_type) alt_type = "illusion";
jumps = (objectp(alt_type))
? (int)alt_type->query_cast_level()
: (int)call_other(this_player(),"query_"+alt_type);
if(str == "door") {
if(jumps > 30) jumps = 30;
file = file_name(this_object());
sscanf(file, "%s#%d", file, i);
this_player()->load_spell(({
"target", this_player(),
"name", "Shadow Door",
"sphere", alt_type,
"cost", 11,
"damage", jumps,
"level", 11, /* 10 + 5 no component - 4 cast time */
"cast time", 2,
"spell object", file,
"casting msg", "A door starts to appear in front of you.\n",
"casting msg room", "A doors starts to form in front of "+NAME+".\n",
"passive",
}));
}
else if(str == "monster") {
file = "skills/obj/sh_monster";
this_player()->load_spell(({
"target", environment(this_player()),
"name", "Shadow Monster",
"sphere", alt_type,
"cost", 15,
"damage", jumps,
"level", 15, /* 10 + 5 no component - 4 cast time */
"cast time", 2,
"spell object", file,
"casting msg", "An awesome monster starts to form in front of "+
"you.\n",
"casting msg room", "An awesome monster starts to form in front of "+
NAME +".\n",
"passive",
}));
}
return 1;
}
status cast_spell(object caster,object target,object prev,int jumps) {
int i;
string file, *exits;
file = (string)caster->query_current_room();
while(++i < jumps) {
exits = (string *)call_other(file, "query_all_exits");
if(!exits) exits = (string *)call_other(file, "query_dest_dir");
if(!exits) break;
file = exits[(random(sizeof(exits))/2)*2];
}
tell_object(caster,"You step through a shadow door.\n");
caster->move_player("through a dark door#"+ file);
destruct(this_object());
return 1;
}
status id(string str) { return (str == "spell"); }
/* Native Mode Move */
#include <move.h>