#include <mudlib.h>
#include <spell.h>
#include <rnd_name.h>
#include <exchange.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 "+ targ +".\n",
"You enchant the "+ targ +".\n",
"You direct the energies into the "+ targ +".\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 enchant(string targ, mixed alt_type) {
int i;
string file, spell_name;
if(!alt_type) alt_type = "level";
if(!targ || sscanf(targ,"%s with %s", targ, spell_name) != 2) {
notify_fail("enchant <item> with <spell name>?\n");
return 0;
}
file = file_name(this_object());
sscanf(file,"%s#%d",file,i);
this_player()->load_spell(({
"target", targ,
"name", "Enchant an Item",
"sphere", alt_type,
"level", 20,
"cast time", 30,
"spell object", file,
"argument", spell_name,
"passive",
"casting msg", casting_msg(targ, 29),
"casting msg room", ({
"@@query_name:$this_player()$@@ starts enchant an item.\n",
"@@query_name:$this_player()$@@ continues to enchant an item.\n",
}),
}));
return 1;
}
status cast_spell(object caster,object target,object prev,int dmg) {
int i;
mixed *loaded_spell;
string spell_name, *spell_list, *caster_classes, *wand_class;
string spell_trigger, spell_info;
string tmp1, tmp2;
object item;
string protection;
target->drop(1);
if(!target) {
write("It explodes!\n");
destruct(this_object());
return 1;
}
if(living(target)) {
write("You cannot enchant "+ target->query_objective() +".\n");
destruct(this_object());
return 1;
}
if(target->query_quest_item()) {
write("The "+ target->query_name() +" is already enchanted.\n");
destruct(this_object());
return 1;
}
caster_classes = (string *)caster->query_classes();
if(!(wand_class = (string *)target->query_class())) wand_class = ({});
if(!pointerp(wand_class)) wand_class = ({});
if(function_exists("query_cast_level", target)) { /* wand */
for(i = 0; i < sizeof(caster_classes); i++) {
if(member_array(caster_classes[i], wand_class) != -1) break;
}
if(i == sizeof(caster_classes)) {
write("The "+ target->query_name() +" is already enchanted.\n");
destruct(this_object());
return 1;
}
}
/* 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 enchant the "+
target->query_name() +" with 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 enchant the "+
target->query_name() +" with the spell "+ SPELL_NAME +".\n");
destruct(this_object());
return 1;
}
}
switch((string)target->query_object_type()) {
case "Armour":
if(target->query_protection()) {
write("The "+ target->query_name() +" is already enchanted.\n"+
"It cannot be enchanted any further.\n");
destruct(this_object());
return 1;
}
item = clone_object(MAGIC_ARMOUR);
exchange(target, item);
if(!item->query_spells()) {
if(sscanf(lower_case(SPELL_NAME),"protection from %s",protection)
|| sscanf(lower_case(SPELL_NAME),"resist %s",protection)) {
item->set_protection(protection);
}
}
item->set_max_charges(80);
break;
case "Weapon":
if(function_exists("weapon_hit", target)) {
write("The "+ target->query_name() +" is already enchanted.\n"+
"It cannot be enchanted any further.\n");
destruct(this_object());
return 1;
}
item = clone_object(MAGIC_WEAPON);
exchange(target, item);
item->set_max_charges(80);
break;
default:
if(target->query_ac() || target->query_wc()) {
write("The "+ target->query_name() +" explodes!\n");
say("You see a flash of light from "+ caster->query_name() +".\n");
destruct(target);
if(!this_object()) return 1;
destruct(this_object());
return 1;
}
if(target->id("stick") || target->id("torch")
|| target->id("branch") || target->id("wand")
|| target->id("staff") || target->id("rod")
|| target->id("gem")) {
item = clone_object(WAND);
exchange(target, item);
item->set_max_charges(100);
if(target->id("staff")) {
item->set_name("staff");
}
else if(target->id("rod")) {
item->set_name("rod");
}
else if(!target->id("gem")) {
item->set_name("wand");
item->set_short("Wand");
}
item->set_long("It looks like a "+ target->query_name() +
" with runes carved in it.\n");
item->set_read("The runes are magical, you cannot read them.\n");
break;
}
write("You cannot enchant the "+ target->query_name() +".\n");
destruct(this_object());
return 1;
break;
}
if(objectp(SPELL_TYPE)) {
SPELL_TYPE->adj_charges((SPELL_COST*(-3))/2);
}
else {
call_other(caster,"adj_"+ SPELL_TYPE +"_points", (SPELL_COST*(-3))/2);
}
item->set_info("@@query_charges_string:$this_object()$@@"+
"@@query_classes_string:$this_object()$@@"+
"@@query_level_string:$this_object()$@@"+
"@@query_protection_string:$this_object()$@@"+
"@@query_spell_triggers:$this_object()$@@");
if(!protection) {
item->add_spell(spell_name);
for(i = 0; i < sizeof(caster_classes); i++) {
if(member_array(caster_classes[i], wand_class) == -1) {
wand_class += ({ caster_classes[i], });
}
}
item->set_class(wand_class);
item->adj_charges(SPELL_COST);
if(SPELL_LEVEL > (int)item->query_cast_level()) {
item->set_cast_level(SPELL_LEVEL);
}
}
item->set_enchanted(1);
move_object(item, caster);
write("You enchant the spell "+ SPELL_NAME +" into the "+
target->query_name() +".\n");
item->info();
say(caster->query_name()+" enchants 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 into the "+ target->query_name() +".\n");
else
say("spell into the "+ target->query_name() +".\n");
if(COMPONENT) { /* destruct component list */
for(i = 0; i < sizeof(COMPONENT); i++) {
if(COMPONENT[i]) COMPONENT[i]->drop(1);
if(COMPONENT[i] && COMPONENT[i] != target) destruct(COMPONENT[i]);
}
}
move_object(this_object(), caster);
destruct(target);
destruct(this_object());
return 1;
}
/* Native Mode Move */
#include <move.h>