/* * The spell casting skill. * * (C) Vikingmud 1992 * Non-commercial users may distribute or modify. Ask first. * * Contributors: Stig Saether Bakken (Auronthas) * * * Function descriptions: * * newsay(str) Converts normal english to old english. * Crude, but it works! * cast_spell(str) Checks if the caster knows the spell, has enough spell * points and if he's wearing bad armour before calling * the spell function in spells.c. * wearing_bad_armour()Returns a 1 if this_player() is wearing a piece of * armour with an individual class of more that one and * this piece of armour does not return a 1 in the * function mage_friendly(). * learn_spell(int) Checks if the character can learn a spell or if he * knows it already before setting the spell's bit in * the global string 'known'. * Return values: * LEARN_SUCCESS - The spell was learned successfully. * LEARN_UNKNOWN - The spell does not exist. * LEARN_ALREADY_KNOWN - The spell was already known. * LEARN_NOT_ALLOWED - The character can not learn this spell. */ #include "/std/include/std.h" #include "/std/include/levels.h" #include "defines.h" #include "spells.h" int t, n, i; /* Universal counter variables. */ int max_spells; /* Simply the number of spells. */ string known; /* Bit-array of which spell the character knows. */ string specialization; /* Which school the character is specialized in. */ string forbidden; /* The school the character has chosen to sack. */ string mess1,mess2,mess3; int oldspeak; string prepmess1,prepmess2; string damage_type; int spell_damage; int spell_cost; reset(arg) { max_spells = SPELLS->query_max_spells(); if(!known) { known=" "; known = set_bit(known,max_spells); known = clear_bit(known,5); } if(!forbidden) forbidden = "none"; if(!specialization) specialization = "none"; } id(str) { /* if(TP->query_level() < 20) return;*/ return str=="skill" || str=="spell_skill" || str=="guild"; } init() { int lev; string spl,name; if (ENV != TP) return; add_action("cast_spell","", 1); add_action("help","help"); add_action("do_help","help"); add_action("learn","learn"); add_action("bits","bits"); add_action("learnall","learnall"); #if 0 add_action("newsay","say"); add_action("oldspeak","oldspeak"); add_action("newspeak","newspeak"); #endif add_action("forget","forget"); add_action("do_spells","spells"); } forget(str) { if(str!="skill") { notify_fail("Nope!\n"); return 0; } write("Ok.. You forget the skill.\n"); destruct(this_object()); return 1; } oldspeak() { notify_fail("You already speak old english.\n"); if(oldspeak) return; oldspeak = 1; write("You will now talk old english.\n"); return 1; } newspeak() { notify_fail("You already speak modern english.\n"); if(!oldspeak) return; oldspeak = 0; write("You will now talk modern english.\n"); return 1; } learnall() { for(t=0;t<max_spells+1;t++) { learn_spell(t); } write("Learned all spells...\n"); return 1; } bits() { write("known: "); for (t=0;t<max_spells;t++) { if(test_bit(known,t)) write("1"); else write("0"); } write("\n"); return 1; } get() { return 1; } drop() { return 1; } short() { return "spell casting skill"; } query_auto_load() { string temp; temp = SPELLDIR + "skill" + ":" + known + "##" + specialization + "##" + forbidden + "##"; return temp; } init_arg(str) { string temp1, temp2, temp3; if (sscanf(str, "%s##%s##%s##", temp1, temp2, temp3) != 3) { tell_object(ENV,"Loading error in you spell casting skill!!!\n"); return; } known = temp1; specialization = temp2; forbidden = temp3; } query_known() { return known; } help(str) { if(!str) return; return 0; } do_help(str) { int spell; if (!str) return 0; if(str == "spells") { TP->more_file(HOMEDIR+"docs/spells.list1"); return 1; } spell = SPELLS->recognize_spell(str); if (spell == -1) return 0; SPELLS->spell_help(spell); return 1; } list(str) { if(str!="spells") return; write("The spells you know are:\n"); if(!known || known=="") { write("Absolutely none!\n"); return; } n=0; for (t=0;t<max_spells;t++) { if(test_bit(known,t)) { write(extract(SPELLS->query_spell_name(t) + " ", 0, 18)); if(n==3) { n=-1; write("\n"); } n++; } } if(n!=4) write("\n"); return 1; } newsay(str) { string temp1,temp2; if (!oldspeak) return 0; /* Leave it to the soul, then */ if (!str) { write("Say what?\n"); return 1; } while(sscanf(str,"%syours%s",temp1,temp2)) { str=temp1+"thine"+temp2; } while(sscanf(str,"%sYours%s",temp1,temp2)) { str=temp1+"Thine"+temp2; } while(sscanf(str,"%syour%s",temp1,temp2)) { str=temp1+"thy"+temp2; } while(sscanf(str,"%sYour%s",temp1,temp2)) { str=temp1+"Thy"+temp2; } while(sscanf(str,"%syou%s",temp1,temp2)) { str=temp1+"thou"+temp2; } while(sscanf(str,"%sYou%s",temp1,temp2)) { str=temp1+"Thou"+temp2; } while(sscanf(str,"%sshall%s",temp1,temp2)) { str=temp1+"shallt"+temp2; } while(sscanf(str,"%sShall%s",temp1,temp2)) { str=temp1+"Shallt"+temp2; } while(sscanf(str,"%sdone%s",temp1,temp2)) { str=temp1+"doneth"+temp2; } while(sscanf(str,"%sDone%s",temp1,temp2)) { str=temp1+"Doneth"+temp2; } while(sscanf(str,"%shave%s",temp1,temp2)) { str=temp1+"hath"+temp2; } while(sscanf(str,"%sHave%s",temp1,temp2)) { str=temp1+"Hath"+temp2; } while(sscanf(str,"%sare%s",temp1,temp2)) { str=temp1+"art"+temp2; } while(sscanf(str,"%sAre%s",temp1,temp2)) { str=temp1+"Art"+temp2; } say(CAP(TP->QN)+" says: "+str+"\n"); write("Ok.\n"); return 1; } cast_spell(str) { int sp, cost; string spell, arg, temp1; spell = query_verb(); if (!function_exists("do_" + spell, find_object(SPELLS)) || SPELLS->recognize_spell(spell) == -1) return 0; if(this_player()->query_ghost()) { notify_fail("You can't do that in your immaterial state.\n"); return 0; } if(!str) { notify_fail("Syntax: cast 'spell name' [(at) target]\n"); return 0; } if(arg) { if (sscanf(arg, "at %s", temp1)) arg = temp1; else if (sscanf(arg, "on %s", temp1)) arg = temp1; } if (!test_bit(known,sp)) { write("You do not know that spell!\n"); return 1; } if (EN(TP)->query_property("no_magic") && TP->QL < APPRENTICE_WIZ) { write("Your magic doesn't seem to work here.\n"); return 1; } if (wearing_bad_armour()) { notify_fail("Your wear armour preventing the spell.\n"); return 0; } #if 0 if(TP->query_busy()) { write("You are already doing something this round!\n"); return 1; } #endif cost = SPELLS->query_spell_cost(sp); write("SP: "+cost+"\n"); if (cost > TP->QSP) { write("You are too low on power!\n"); say(CAP(TP->QN) + " tries to cast a spell, but fails.\n"); return 1; } spell = SPELLS->query_spell_abbr(sp); if(ENV->QN == "Auronthas") { write("spell = "+spell+"\n"); write("abbr = "+spell+"\n"); } if (call_other(SPELLS, "do_" + spell, arg)) { /* TP->set_busy(""); */ TP->restore_spell_points(-cost); return 1; } return 1; } #define TEST(OO) call_other(call_other(this_player(),"query_head_armour"),"test_type",OO) wearing_bad_armour() { object all; string type; if(!this_player()->query_head_armour()) return 0; if(TEST("gaunlets")||TEST("armour")||TEST("shield")||TEST("helmet")) return 1; return 0; } learn(str) { int sn,res; write("Trying to learn..\n"); sn = SPELLS->recognize_spell(str); res=learn_spell(sn); if(res == LEARN_SUCCESS) { write("Everything fine!\n"); return 1; } if(res == LEARN_UNKNOWN) { write("What spell?\n"); return 1; } if(res == LEARN_ALREADY_KNOWN) { write("Already known.\n"); return 1; } if(res == LEARN_NOT_ALLOWED) { write("Forbidden school. ("+forbidden+")\n"); return 1; } write("This is not possible. BUGBUGBUGBUG!!!! Mail Auronthas!!\n"); return 1; } long() { write("Commands available for magicians:\n\n"+ "help <spell> - Info about a spell.\n"+ "help spells - Lists all spells.\n" + "spells - Gives a list of the spells you know.\n"+ "forget skill - Sad thing.\n"+ "oldspeak - Switch to old english language.\n"+ "newspeak - Switch back to modern english.\n"+ "learnall (temp)- Teaches you all spells.\n"+ "bits (temp)- Prints out the bits of known spells.\n"+ "\nThat's about all, I think..\n"); } set_damage_type(str) { damage_type = str; } set_spell_damage(d) { spell_damage = d; } query_cost() { return spell_cost; } query_damage() { return spell_damage; } damage_done(dmg,who) { string arg; arg=lower_case(who->query_name()+"#"+damage_type+"#"+dmg); "obj/dmg_mess"->damage_message(arg); } set_forbidden(s) { forbidden = s; } set_specialization(s) { specialization = s; } query_forbidden() { return forbidden; } query_specialization() { return specialization; }