/* scribe a spell onto a scroll */ #include <spell.h> #define MAX_SPELL_LEVEL SPELL_LEVEL + 10 /* < caster level */ #define GET_LOADED_SPELL(XXX) \ (mixed *)clone_object("obj/shadows/get_spell")->get_loaded_spell(XXX,0,0,1) string *casting_msg(string targ, int size) { int i; string *msg, *data; data = ({ "You gather magical energies about you.\n", "You pull in magic from all around you.\n", "You feel the magic gathering all around you.\n", "You gaze carefully at the paper.\n", "You scribe "+ targ +".\n", "You direct the energies into the paper.\n", "You chant slowly.\n", "You wave your arms.\n", "You stamp you legs.\n", }); for(msg = ({}),i = 0; i < size; i++) { msg += ({ data[random(sizeof(data))], }); } return msg; } status scribe(string targ, mixed alt_type) { int i; string file; if(!alt_type) alt_type = "level"; if(!targ) { notify_fail("scribe <spell name>?\n"); return 0; } if(!(present("parchment",this_player()) || present("paper",this_player()))) { write("You have to scribe onto a piece of parchment.\n"); return 1; } file = file_name(this_object()); sscanf(file,"%s#%d",file,i); this_player()->load_spell(({ "target", this_player(), "name", "Scribe", "sphere", alt_type, "level", 20, "cast time", 150, "spell object", file, "argument", targ, "component", "parchment#paper", "passive", "casting msg", casting_msg(targ, 149), "casting msg room", ({ "@@query_name:$this_player()$@@ starts scribing.\n", "@@query_name:$this_player()$@@ continues to scribe.\n", }), })); return 1; } string make_spell_name(string str) { int i; string tmp; while(sscanf(str,"%s %s", str, tmp)) str += tmp; str += (string)this_player()->query_name(1); str = crypt(str,0); str = lower_case(str); for(i = 0; i < strlen(str); i++) { if(str[i] < 'a' || str[i] > 'z') { str = str[0..(i-1)] + str[(i+1)..(strlen(str)-1)]; i -= 1; } } if(strlen(str) > 4) str = str[0..3]; return str; } status cast_spell(object caster,object target,object prev,int dmg) { int i; mixed *loaded_spell; string spell_name; string spell_trigger, spell_info; string tmp1, tmp2; object item; /* get a loaded spell array for spell enchantment */ spell_name = (string)caster->query_spell_argument(); loaded_spell = GET_LOADED_SPELL(spell_name); if(!sizeof(loaded_spell)) { destruct(this_object()); return 1; } /* check for max. spell level able to be enchanted by caster */ if(objectp(SPELL_TYPE)) { if(MAX_SPELL_LEVEL > (int)SPELL_TYPE->query_cast_level()) { write("The "+ SPELL_TYPE->query_name() +" is not powerful enough to scribe the spell "+ SPELL_NAME +".\n"); destruct(this_object()); return 1; } } else { if(MAX_SPELL_LEVEL > (int)this_player()->query(SPELL_TYPE)) { write("You are not powerful enough to scribe the parchment with "+ SPELL_NAME +".\n"); destruct(this_object()); return 1; } } item = clone_object("objects/magic_scroll"); call_other(caster,"adj_"+ SPELL_TYPE +"_points", (SPELL_COST*(-3))/2); spell_trigger = make_spell_name(spell_name); item->set_spells(({ spell_trigger, spell_name, })); spell_info = "@@query_classes_string:$this_object()$@@"+ "@@query_level_string:$this_object()$@@"+ "@@query_spell_triggers:$this_object()$@@"; item->set_info(spell_info); item->set_cast_level(SPELL_LEVEL); item->set_class((string *)caster->query_classes()); item->set_enchanted(1); move_object(item, caster); write("You scribe spell "+ SPELL_NAME +" on the parchment.\n"+ "It is triggered by the command word '"+ spell_trigger +"'.\n"); say(caster->query_name()+" scribes a"); if(SPELL_LEVEL < 5) say(" small "); else if(SPELL_LEVEL < 10) say(" "); else if(SPELL_LEVEL < 15) say(" powerful "); else if(SPELL_LEVEL < 20) say(" very powerful "); else say("n extremely powerful "); if(sscanf(SPELL_TYPE,"%ssphere%s", tmp1, tmp2)) say("prayer on a scroll.\n"); else say("spell on a scroll.\n"); if(COMPONENT) { /* destruct component list */ for(i = 0; i < sizeof(COMPONENT); i++) { if(COMPONENT[i]) COMPONENT[i]->drop(1); if(COMPONENT[i]) destruct(COMPONENT[i]); } } destruct(this_object()); return 1; } /* Native Mode Move */ #include <move.h>