inherit"obj/treasure"; #define SPELLS "players/auronthas/spells/spells" string spells; reset(ar) { if(ar) return; name="book"; alias_name="tome"; short_desc="spell book"; long_desc="This is an ancient book of spells for use by the\n"+ "magicians of Collegium Magicus.\n"+ "Type 'read index' to see what's in the book.\n"; local_weight=5; info="This is a spell book.\n"; } get() { return; } init() { add_action("read_me","read"); add_action("study","study"); } read_me(str) { int page,t; if(str=="index") { write("The book's contents are:\n"); for(t=0;t<sizeof(spells);t++) { write("Page "+extract((t+1)+" ",0,2)+": "+capitalize(spells[t])+"\n"); } write("Type 'read <page>' to get info, 'study spell name' to learn.\n"); say(this_player()->query_name()+" reads the index of the book.\n"); return 1; } notify_fail("Type 'read index' or 'read <page>', where <page> is a number.\n"); if(!sscanf(str,"%d",page)) return; notify_fail("Not that many pages!\n"); if(page > sizeof(spells)) return; notify_fail("Please be reasonable..\n"); if(page < 1) return; page--; write(page+" "+spells[page]+"\n"); SPELLS->spell_help(SPELLS->regognize_spell_name(spells[page])); say(this_player()->query_name()+" reads about the spell "+spells[page]+".\n"); return 1; } study(str) { int t,c,level,spell,xp1,xp2,xp3; string school; object skill; notify_fail("You are unable to learn spells!\n"); skill=present("spell_skill",this_player()); if(!skill) return; notify_fail("Please give a spell to study.\n"); if(!str) return; str=lower_case(str); notify_fail("No spell of that name in the book!\n"); for(t=0;t<sizeof(spells);t++) { if(str==spells[t]) { spell=SPELLS->recognize_spell_name(str); level=SPELLS->query_spell_level(spell); school=SPELLS->query_school(spell); if(test_bit(skill->query_known(),spell)) { write("You already know that spell!\n"); return 1; } if(school == skill->query_forbidden()) { write("You can't learn "+school+" spells!\n"); return 1; } if(school == skill->query_specialization()) level-=2; else if(skill->query_specialization() != "none") level++; if(level < 1) level=1; if(this_player()->query_level() < level) { write("You are not high enough level to learn that spell.\n"+ "Level "+level+" is required.\n"); return 1; } if(this_player()->query_int() < level) { write("You are not intelligent enough to understand the concept of the spell.\n"+ "Intelligence required is "+level+".\n"); return 1; } xp1=(level*10)*(level*10); xp2=this_player()->query_exp(); if(this_player()->query_level() == 1) xp3=0; else { c=this_player()->query_level(); if(c > 19) c=19; xp3="room/adv_guild"->get_next_exp(c); } if((xp2-xp1) < xp3) { write("You have not enough experience!\n"); write("This spell costs "+xp1+" experience points to learn, and you only\n"+ "have "+(xp2-xp3)+" to spend.\n"); return 1; } this_player()->add_exp(-xp1); c=skill->learn_spell(spell); if(c == 0) { write("You learn "+str+".\nCongratulations!\n"); return 1; } else { write("Unable to learn spell!\nPlease send a bug report!|n"); return 1; } } } }