/*
One shot scrolls
For things like area spells that I DON'T want repeated
Taniwha 1995
Restricted to partly magical guilds only + thief by default
Added "all" option to include fighting classes
Raskolnikov October 1996
*/
inherit "/std/item";
#define ETP environment(this_player())
#define QN query_short()
int do_use(string str);
int query_size() { return 1; }
int valid_targets(string str);
/* Allow replacement of an existing spell */
int override = 0;
mapping guilds = ([
"wizard":5,
"drow_wizard":5,
"wizthief":8,
"bard":10,
"taniwha":10,
"hokemj":8,
"timion":12,
"Ducky":10,
"Cyrcia":10,
"Grimbrand":10,
"wiz-war":5,
"thief":20,
"paladin":15,
"antipaladin":15
]);
mapping query_guilds() { return guilds; }
mapping learnable = ([
]);
static int phrase;
string file;
string spellname;
string func;
int gp;
int deads;
void create() {
::create();
set_holdable(1);
}
int query_scroll() { return 1; }
string enchant_string()
{
return "It's a scroll O.K. Some animal gave it's all for this, then "
"there are all the octarine beetles that died providing "
"the ink and you really don't want to know what a waste "
"of a perfectly good virgin it is getting the spell to "
"stick.\n\n\n"
"Have you any idea how hard it is to find a virgin ant queen ?\n";
}
int query_enchant()
{
return 1;
}
void set_guilds(mapping map)
{
string *inds;
inds = keys(map);
if(member_array("all", inds) != -1)
{
guilds += ([
"warrior":20,
"fighter":20,
"ranger":20,
]);
return ;
}
if( !guilds) guilds = map;
else guilds = map;
}
void set_spell(string fil,string fun,int lock,int gpuse,int dds)
{
file = fil;
func = fun;
gp = gpuse;
deads = dds;
if(!func) func = "cast_spell";
}
void init()
{
int i;
add_action("do_use","scroll");
add_action("do_help","help");
add_action("do_xread","study");
::init();
}
int do_use(string str)
{
int i,level;
string *index,which;
object who,guild;
who = TP;
level = who->query_level();
guild = who->query_guild_name();
if(!query_in_use())
{
notify_fail("You have to hold scrolls to use them!.\n");
return 0;
}
if(who->query_property("BLIND"))
{
notify_fail("A blind person reading a scroll ?, perhaps not.\n");
return 0;
}
if(sizeof(guilds))
{
if(!guild)
{
write("Something bad happened. no guild.\n");
}
if(!guilds[guild])
{
write("Your guild cannot use this scroll.\n");
return 1;
}
if(level < guilds[guild])
{
write("You can not use this scroll at your level.\n");
return 1;
}
}
str = who->expand_nickname(str);
if( valid_targets(str) )
{
say((string)who->query_cap_name()+" waves a "+QN+".\n");
tell_object(who,"You wave a "+QN+" at "+str+".\n");
call_other(file,func,str,who,1);
who->adjust_gp(gp);
call_out("move",0,"/room/rubbish");
}
return 1;
}
int do_help(string str)
{
int i;
if( str == "scroll")
{
if(TP->query_property("BLIND"))
{
notify_fail("A blind person reading a scroll ?, perhaps not.\n");
return 0;
}
write(file->help());
write("\"scroll target\" to use the scroll.\n");
if(sizeof(learnable))
{
write("\"study scroll\" to learn the spell on the scroll.\n");
}
return 1;
}
return 0;
}
int valid_targets(string str)
{
object *olist;
int i;
olist = find_match(str,ETP);
if(deads) olist += find_match(str,TP);
if(ETP->query_property("nocast") || TP->query_property("nocast"))
{
write("Something blocks the magic!\n");
return 0;
}
if((int)this_player()->query_pacify_spell()==1)
{
write("Some magic blocks you from doing that!\n");
return 0;
}
if(!sizeof(olist))
{
write("There seems to be no "+str+" here.\n");
return 0;
}
if(!deads) for( i = 0; i < sizeof(olist); i++)
{
if( olist[i]->query_creator() && !this_player()->query_creator() )
{
write("You reconsider blasting an immortal with the scroll.\n");
return 0;
}
if( (!olist[i]->query_alive() &&
!file->query_allowed_on_ghosts() ) ||
olist[i]->query_pacify_shadow() )
{
write("You can't target "+olist[i]->query_cap_name()+".\n");
return 0;
}
}
return 1;
}
void set_learnable(mapping map,string name)
{
learnable = map;
spellname = name;
}
int do_xread(string str)
{
int i,level;
string *index,which;
object who,guild;
if(str != "scroll")
{
notify_fail("Study what ?.\n");
return 0;
}
who = TP;
level = who->query_level();
guild = who->query_guild_name();
index = explode(file,"/");
which = index[sizeof(index)-1];
if(!query_in_use())
{
notify_fail("You aren't holding the scroll.\n");
return 0;
}
if(who->query_property("BLIND"))
{
notify_fail("A blind person reading a scroll ?, perhaps not.\n");
return 0;
}
if(!sizeof(learnable))
{
write("This scroll is not clear enough to learn the spell from.\n");
return 1;
}
if(!learnable[guild])
{
write("Your guild cannot memorize this scroll.\n");
return 1;
}
if(level < learnable[guild])
{
write("You can not memorize this scroll at your level.\n");
return 1;
}
if(!override)
if( TP->query_spell(spellname) )
{
write("You already know this spell.\n");
return 1;
}
if( !TP->query_property("read_magic"))
{
write("You have to cast read magic before learning the spell.\n");
TP->remove_static_property("read_magic");
return 1;
}
write("You study the scroll intently and the meaning of the sigils "
"hidden within the writing becomes suddenly clear and a blast of "
"knowledge almost overwhelms your brain.\n"
"The shock is so great that you will be unable to cast for some time.\n");
say((string)TP->query_cap_name()+" studies a scroll intently.\n"
"Suddenly "+TP->query_cap_name()+" shudders and turns pale, "
"the scroll disintegrates under "+TP->query_possessive()+"'s shaking hands.\n"
, ({TP}) );
TP->add_timed_property("nocast",1,1800);
TP->add_spell(spellname,which);
say("The scroll crumbles into dust as the magic in it disappears.\n");
call_out("move",0,"/room/rubbish");
return 1;
}