wileymud-1.187b/
wileymud-1.187b/attic/
wileymud-1.187b/attic/bin/
wileymud-1.187b/attic/lib/
wileymud-1.187b/attic/lib/adm/
wileymud-1.187b/attic/lib/man/
wileymud-1.187b/attic/lib/new-wld/
wileymud-1.187b/attic/lib/new-wld/default/
wileymud-1.187b/attic/lib/old/
wileymud-1.187b/attic/lib/wld/
wileymud-1.187b/attic/public_html/
wileymud-1.187b/attic/public_html/gfx/
wileymud-1.187b/attic/src/bin/
wileymud-1.187b/attic/src/etc/
wileymud-1.187b/attic/src/libauth-4.0-p5/
wileymud-1.187b/attic/src/sedna/
wileymud-1.187b/backups/
wileymud-1.187b/bin/
wileymud-1.187b/docs/
wileymud-1.187b/etc/
wileymud-1.187b/lib/
wileymud-1.187b/lib/adm/
wileymud-1.187b/lib/boards/
wileymud-1.187b/lib/log/
wileymud-1.187b/lib/man/
wileymud-1.187b/lib/ply/
wileymud-1.187b/lib/ply/a/
wileymud-1.187b/lib/ply/b/
wileymud-1.187b/lib/ply/c/
wileymud-1.187b/lib/ply/d/
wileymud-1.187b/lib/ply/g/
wileymud-1.187b/lib/ply/k/
wileymud-1.187b/lib/ply/m/
wileymud-1.187b/lib/ply/s/
wileymud-1.187b/lib/ply/t/
wileymud-1.187b/public_html/gfx/
wileymud-1.187b/src/bin/
wileymud-1.187b/src/convert/attic/
wileymud-1.187b/src/convert/obj/
wileymud-1.187b/src/convert/perl/
wileymud-1.187b/src/convert/perl/MudConvert/
wileymud-1.187b/src/convert/perl/MudConvert/DUMP/
wileymud-1.187b/src/convert/perl/MudConvert/Report/
wileymud-1.187b/src/convert/perl/MudConvert/WileyMUD/
wileymud-1.187b/src/convert/perl/output/
wileymud-1.187b/src/convert/perl/output/DUMP/
wileymud-1.187b/src/convert/perl/output/Report/
wileymud-1.187b/src/convert/perl/output/WileyMUD/
wileymud-1.187b/src/etc/
wileymud-1.187b/src/etc/init.d/
wileymud-1.187b/src/etc/rc.d/
wileymud-1.187b/src/etc/rc.d/init.d/
wileymud-1.187b/src/lib/
wileymud-1.187b/src/lib/adm/
wileymud-1.187b/src/lib/boards/
wileymud-1.187b/src/lib/log/
wileymud-1.187b/src/lib/man/
wileymud-1.187b/src/lib/ply/
wileymud-1.187b/src/lib/ply/a/
wileymud-1.187b/src/lib/ply/b/
wileymud-1.187b/src/lib/ply/c/
wileymud-1.187b/src/lib/ply/d/
wileymud-1.187b/src/lib/ply/e/
wileymud-1.187b/src/lib/ply/f/
wileymud-1.187b/src/lib/ply/g/
wileymud-1.187b/src/lib/ply/h/
wileymud-1.187b/src/lib/ply/i/
wileymud-1.187b/src/lib/ply/j/
wileymud-1.187b/src/lib/ply/k/
wileymud-1.187b/src/lib/ply/l/
wileymud-1.187b/src/lib/ply/m/
wileymud-1.187b/src/lib/ply/n/
wileymud-1.187b/src/lib/ply/o/
wileymud-1.187b/src/lib/ply/p/
wileymud-1.187b/src/lib/ply/q/
wileymud-1.187b/src/lib/ply/r/
wileymud-1.187b/src/lib/ply/s/
wileymud-1.187b/src/lib/ply/t/
wileymud-1.187b/src/lib/ply/u/
wileymud-1.187b/src/lib/ply/v/
wileymud-1.187b/src/lib/ply/w/
wileymud-1.187b/src/lib/ply/x/
wileymud-1.187b/src/lib/ply/y/
wileymud-1.187b/src/lib/ply/z/
wileymud-1.187b/src/obj/
wileymud-1.187b/src/utils/
wileymud-1.187b/src/utils/mobmaker/
/*
 * file: spells.c , handling of magic.                   Part of DIKUMUD
 * Usage : Procedures handling all offensive magic.
 * Copyright (C) 1990, 1991 - see 'license.doc' for complete information.
 */

#include <stdio.h>
#include <stdlib.h>
/* #include <unistd.h> */
#include <sys/types.h>
#include <strings.h>

#include "global.h"
#include "bug.h"
#include "utils.h"
#include "comm.h"
#include "db.h"
#include "interpreter.h"
#include "handler.h"
#include "constants.h"
#include "multiclass.h"
#include "act_move.h"
#define _SPELLS_C
#include "spells.h"
#include "spell_parser.h"
#include "fight.h"

void cast_armor(char level, struct char_data *ch, const char *arg, int type,
		struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (affected_by_spell(victim, SPELL_ARMOR)
		|| affected_by_spell(victim, SPELL_STONE_SKIN)) {
		cprintf(ch, "Nothing seems to happen.\r\n");
		return;
	    }
	    if (ch != victim)
		act("$N is protected.", FALSE, ch, 0, victim, TO_CHAR);

	    spell_armor(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    if (affected_by_spell(ch, SPELL_ARMOR))
		return;
	    spell_armor(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    if (affected_by_spell(victim, SPELL_ARMOR))
		return;
	    spell_armor(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    if (affected_by_spell(victim, SPELL_ARMOR))
		return;
	    spell_armor(level, ch, ch, 0);
	    break;
	default:
	    log_error("Serious screw-up in armor!");
	    break;
    }
}

void cast_teleport(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_POTION:
	case SPELL_TYPE_SPELL:
	    if (!victim)
		victim = ch;
	    spell_teleport(level, ch, victim, 0);
	    break;

	case SPELL_TYPE_WAND:
	    if (!victim)
		victim = ch;
	    spell_teleport(level, ch, victim, 0);
	    break;

	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_teleport(level, ch, victim, 0);
	    break;

	default:
	    log_error("Serious screw-up in teleport!");
	    break;
    }
}

void cast_bless(char level, struct char_data *ch, const char *arg, int type,
		struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (tar_obj) {				       /* It's an object */
		if (IS_SET(tar_obj->obj_flags.extra_flags, ITEM_BLESS)) {
		    cprintf(ch, "Nothing seems to happen.\r\n");
		    return;
		}
		spell_bless(level, ch, 0, tar_obj);

	    } else {					       /* Then it is a PC | NPC */

		if (affected_by_spell(victim, SPELL_BLESS)
		    || (GET_POS(victim) == POSITION_FIGHTING)) {
		    cprintf(ch, "Nothing seems to happen.\r\n");
		    return;
		}
		spell_bless(level, ch, victim, 0);
	    }
	    break;
	case SPELL_TYPE_POTION:
	    if (affected_by_spell(ch, SPELL_BLESS) || (GET_POS(ch) == POSITION_FIGHTING))
		return;
	    spell_bless(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj) {				       /* It's an object */
		if (IS_SET(tar_obj->obj_flags.extra_flags, ITEM_BLESS))
		    return;
		spell_bless(level, ch, 0, tar_obj);

	    } else {					       /* Then it is a PC | NPC */

		if (!victim)
		    victim = ch;

		if (affected_by_spell(victim, SPELL_BLESS)
		    || (GET_POS(victim) == POSITION_FIGHTING))
		    return;
		spell_bless(level, ch, victim, 0);
	    }
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj) {				       /* It's an object */
		if (IS_SET(tar_obj->obj_flags.extra_flags, ITEM_BLESS))
		    return;
		spell_bless(level, ch, 0, tar_obj);

	    } else {					       /* Then it is a PC | NPC */

		if (affected_by_spell(victim, SPELL_BLESS)
		    || (GET_POS(victim) == POSITION_FIGHTING))
		    return;
		spell_bless(level, ch, victim, 0);
	    }
	    break;
	default:
	    log_error("Serious screw-up in bless!");
	    break;
    }
}

void cast_blindness(char level, struct char_data *ch, const char *arg, int type,
		    struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (IS_AFFECTED(victim, AFF_BLIND)) {
		cprintf(ch, "Nothing seems to happen.\r\n");
		return;
	    }
	    spell_blindness(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    if (IS_AFFECTED(ch, AFF_BLIND))
		return;
	    spell_blindness(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    if (IS_AFFECTED(victim, AFF_BLIND))
		return;
	    spell_blindness(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    if (IS_AFFECTED(victim, AFF_BLIND))
		return;
	    spell_blindness(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(ch, victim))
		    if (!(IS_AFFECTED(victim, AFF_BLIND)))
			spell_blindness(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in blindness!");
	    break;
    }
}

void cast_burning_hands(char level, struct char_data *ch, const char *arg, int type,
			struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_STAFF:
	case SPELL_TYPE_SCROLL:
	    spell_burning_hands(level, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in burning hands!");
	    break;
    }
}

void cast_call_lightning(char level, struct char_data *ch, const char *arg, int type,
			 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_call_lightning(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    if (OUTSIDE(ch) && (weather_info.sky >= SKY_RAINING)) {
		spell_call_lightning(level, ch, ch, 0);
	    }
	    break;
	case SPELL_TYPE_SCROLL:
	    if (OUTSIDE(ch) && (weather_info.sky >= SKY_RAINING)) {
		if (victim)
		    spell_call_lightning(level, ch, victim, 0);
		else if (!tar_obj)
		    spell_call_lightning(level, ch, ch, 0);
	    }
	    break;
	case SPELL_TYPE_STAFF:
	    if (OUTSIDE(ch) && (weather_info.sky >= SKY_RAINING)) {
		for (victim = real_roomp(ch->in_room)->people; victim;
		     victim = victim->next_in_room)
		    if (!in_group(victim, ch))
			spell_call_lightning(level, ch, victim, 0);
	    }
	    break;
	default:
	    log_error("Serious screw-up in call lightning!");
	    break;
    }
}

void cast_charm_person(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_charm_person(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (!victim)
		return;
	    spell_charm_person(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(victim, ch))
		    spell_charm_person(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in charm person!");
	    break;
    }
}

void cast_chill_touch(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_chill_touch(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in chill touch!");
	    break;
    }
}

#define GLASS_MIRROR	1133

void cast_clone(char level, struct char_data *ch, const char *arg, int type,
		struct char_data *victim, struct obj_data *tar_obj)
{
    struct char_data                       *this_victim = NULL;
    struct char_data                       *next_victim = NULL;
    struct obj_data                        *sac = NULL;

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    if (!ch->equipment[HOLD]) {
	cprintf(ch, "You must be holding the component for this spell.\r\n");
	return;
    }
    sac = unequip_char(ch, HOLD);
    if (sac) {
	obj_to_char(sac, ch);
	if (ObjVnum(sac) != GLASS_MIRROR) {
	    cprintf(ch, "That is not the correct item.\r\n");
	    return;
	}
    } else {
	cprintf(ch, "You must be holding the component for this spell.\r\n");
	return;
    }
    cprintf(ch, "You shatter %s %s into thousands of tiny shards.\r\n", SANA(sac),
	    sac->short_description);
    act("$n shatters %s %s into thousands of tiny shards.\r\n", FALSE, ch, 0, 0,
	TO_ROOM, SANA(sac), sac->short_description);
    obj_from_char(sac);
    extract_obj(sac);

    for (this_victim = character_list; this_victim; this_victim = next_victim) {
	next_victim = this_victim->next;
	if ((ch->in_room == this_victim->in_room)) {
	    if (IS_IMMORTAL(this_victim))
		continue;
	    if (affected_by_spell(this_victim, SPELL_SHIELD)) {
		act("Tiny shards of glass knife through the air bouncing off your shield!\r\n",
		    FALSE, ch, 0, this_victim, TO_VICT);
		continue;
	    }
	    damage(this_victim, this_victim, dice(2, 4), TYPE_SUFFERING);
	    act("Tiny shards of glass knife through the air and strike you!\r\n",
		FALSE, ch, 0, this_victim, TO_VICT);
	}
    }

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (victim) {
		spell_clone(level, ch, victim, 0);
	    } else {
		cprintf(ch, "You create a duplicate of %s %s.\r\n", SANA(tar_obj),
			tar_obj->short_description);
		act("$n creates a duplicate of %s %s,\r\n", FALSE, ch, 0, 0,
		    TO_ROOM, SANA(tar_obj), tar_obj->short_description);
		spell_clone(level, ch, 0, tar_obj);
	    }
	    break;
	default:
	    log_error("Serious screw-up in clone!");
	    break;
    }
}

void cast_colour_spray(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_colour_spray(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (victim)
		spell_colour_spray(level, ch, victim, 0);
	    else if (!tar_obj)
		spell_colour_spray(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (victim)
		spell_colour_spray(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in colour spray!");
	    break;
    }
}

void cast_control_weather(char level, struct char_data *ch, const char *arg, int type,
			  struct char_data *victim, struct obj_data *tar_obj)
{
    char                                    buffer[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:

	    one_argument(arg, buffer);

	    if (str_cmp("better", buffer) && str_cmp("worse", buffer)) {
		cprintf(ch, "Do you want it to get better or worse?\r\n");
		return;
	    }
	    if (!OUTSIDE(ch)) {
		cprintf(ch, "You need to be outside.\r\n");
	    }
	    if (!str_cmp("better", buffer)) {
		if (weather_info.sky == SKY_CLOUDLESS)
		    return;
		if (weather_info.sky == SKY_CLOUDY) {
		    oprintf("The clouds disappear.\r\n");
		    weather_info.sky = SKY_CLOUDLESS;
		}
		if (weather_info.sky == SKY_RAINING) {
		    if ((time_info.month > 3) && (time_info.month < 14))
			oprintf("The rain has stopped.\r\n");
		    else
			oprintf("The snow has stopped. \r\n");
		    weather_info.sky = SKY_CLOUDY;
		}
		if (weather_info.sky == SKY_LIGHTNING) {
		    if ((time_info.month > 3) && (time_info.month < 14))
			oprintf("The lightning has gone, but it is still raining.\r\n");
		    else
			oprintf("The blizzard is over, but it is still snowing.\r\n");
		    weather_info.sky = SKY_RAINING;
		}
		return;
	    } else {
		if (weather_info.sky == SKY_CLOUDLESS) {
		    oprintf("The sky is getting cloudy.\r\n");
		    weather_info.sky = SKY_CLOUDY;
		    return;
		}
		if (weather_info.sky == SKY_CLOUDY) {
		    if ((time_info.month > 3) && (time_info.month < 14))
			oprintf("It starts to rain.\r\n");
		    else
			oprintf("It starts to snow. \r\n");
		    weather_info.sky = SKY_RAINING;
		}
		if (weather_info.sky == SKY_RAINING) {
		    if ((time_info.month > 3) && (time_info.month < 14))
			oprintf("You are caught in lightning storm.\r\n");
		    else
			oprintf("You are caught in a blizzard. \r\n");
		    weather_info.sky = SKY_LIGHTNING;
		}
		if (weather_info.sky == SKY_LIGHTNING) {
		    return;
		}
		return;
	    }
	    break;

	default:
	    log_error("Serious screw-up in control weather!");
	    break;
    }
}

void cast_create_food(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    act("$n magically creates a mushroom.", FALSE, ch, 0, 0, TO_ROOM);
	    spell_create_food(level, ch, 0, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (victim)
		return;
	    spell_create_food(level, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in create food!");
	    break;
    }
}

void cast_create_water(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (tar_obj->obj_flags.type_flag != ITEM_DRINKCON) {
		cprintf(ch, "It is unable to hold water.\r\n");
		return;
	    }
	    spell_create_water(level, ch, 0, tar_obj);
	    break;
	default:
	    log_error("Serious screw-up in create water!");
	    break;
    }
}

void cast_cure_blind(char level, struct char_data *ch, const char *arg, int type,
		     struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_cure_blind(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_cure_blind(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_cure_blind(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in cure blind!");
	    break;
    }
}

/* Offensive */

void cast_shocking_grasp(char level, struct char_data *ch, const char *arg, int type,
			 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_shocking_grasp(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in shocking grasp!");
	    break;
    }
}

#define HAMMER_1	5055
#define HAMMER_2	5932
#define HAMMER_3	9713

void cast_new_earthquake(char level, struct char_data *ch, const char *arg, int type,
			 struct char_data *victim, struct obj_data *tar_obj)
{
    int                                     vnum = 0;
    int                                     done = FALSE;
    struct obj_data                        *sac = NULL;

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    if (ch->equipment[HOLD]) {
	vnum = ObjVnum(ch->equipment[HOLD]);
	if (vnum == HAMMER_1 || vnum == HAMMER_2 || vnum == HAMMER_3) {
	    if ((sac = unequip_char(ch, HOLD))) {
		obj_to_char(sac, ch);
		done = 1;
	    }
	}
    }
    if (!done) {
	if (ch->equipment[WIELD]) {
	    vnum = ObjVnum(ch->equipment[WIELD]);
	    if (vnum == HAMMER_1 || vnum == HAMMER_2 || vnum == HAMMER_3) {
		if ((sac = unequip_char(ch, WIELD))) {
		    obj_to_char(sac, ch);
		    done = 1;
		}
	    }
	}
    }
    if (!done) {
	if (ch->equipment[WIELD_TWOH]) {
	    vnum = ObjVnum(ch->equipment[WIELD_TWOH]);
	    if (vnum == HAMMER_1 || vnum == HAMMER_2 || vnum == HAMMER_3) {
		if ((sac = unequip_char(ch, WIELD_TWOH))) {
		    obj_to_char(sac, ch);
		    done = 1;
		}
	    }
	}
    }
    if (!done) {
	cprintf(ch, "You must have the component for this spell ready.\r\n");
	return;
    }
    act("You smash $o into the ground and cause it to split asunder!\r\n",
	FALSE, ch, sac, 0, TO_VICT);
    act("$n smashes $o into the ground and the earth splits open!\r\n",
	FALSE, ch, sac, 0, TO_ROOM);
    obj_from_char(sac);
    extract_obj(sac);

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_STAFF:
	    spell_new_earthquake(level, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in new earthquake!");
	    break;
    }
}

void cast_earthquake(char level, struct char_data *ch, const char *arg, int type,
		     struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_STAFF:
	    spell_earthquake(level, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in earthquake!");
	    break;
    }
}

void cast_energy_drain(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_energy_drain(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_energy_drain(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (victim)
		spell_energy_drain(level, ch, victim, 0);
	    else if (!tar_obj)
		spell_energy_drain(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (victim)
		spell_energy_drain(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(ch, victim))
		    if (victim != ch)
			spell_energy_drain(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in energy drain!");
	    break;
    }
}

void cast_fireball(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_STAFF:
	    spell_fireball(level, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in fireball");
	    break;
    }

/*
 * switch (type) {
 * case SPELL_TYPE_SPELL:
 * spell_fireball(level, ch, victim, 0);
 * break;
 * case SPELL_TYPE_SCROLL:
 * if(victim)
 * spell_fireball(level, ch, victim, 0);
 * else if(!tar_obj)
 * spell_fireball(level, ch, ch, 0);
 * break;
 * case SPELL_TYPE_WAND:
 * if(victim)
 * spell_fireball(level, ch, victim, 0);
 * break;
 * default : 
 * log_error("Serious screw-up in fireball!");
 * break;
 * 
 * }
 */

}

void cast_harm(char level, struct char_data *ch, const char *arg, int type,
	       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_harm(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_harm(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(ch, victim))
		    spell_harm(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in harm!");
	    break;

    }
}

void cast_lightning_bolt(char level, struct char_data *ch, const char *arg, int type,
			 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_lightning_bolt(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (victim)
		spell_lightning_bolt(level, ch, victim, 0);
	    else if (!tar_obj)
		spell_lightning_bolt(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (victim)
		spell_lightning_bolt(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in lightning bolt!");
	    break;

    }
}

void cast_acid_blast(char level, struct char_data *ch, const char *arg, int type,
		     struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_acid_blast(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (victim)
		spell_acid_blast(level, ch, victim, 0);
	    else
		spell_acid_blast(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (victim)
		spell_acid_blast(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in acid blast!");
	    break;

    }
}

void cast_cone_of_cold(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	    spell_cone_of_cold(level, ch, 0, 0);
	    break;

	default:
	    log_error("Serious screw-up in cone of cold!");
	    break;

    }
}

void cast_ice_storm(char level, struct char_data *ch, const char *arg, int type,
		    struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	    spell_ice_storm(level, ch, 0, 0);
	    break;

	default:
	    log_error("Serious screw-up in acid blast!");
	    break;

    }
}

void cast_meteor_swarm(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_meteor_swarm(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (victim)
		spell_meteor_swarm(level, ch, victim, 0);
	    else
		spell_meteor_swarm(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (victim)
		spell_meteor_swarm(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in meteor swarm!");
	    break;

    }
}

void cast_flamestrike(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_flamestrike(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (victim)
		spell_flamestrike(level, ch, victim, 0);
	    else if (!tar_obj)
		spell_flamestrike(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (victim)
		spell_flamestrike(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in flamestrike!");
	    break;

    }
}

void cast_magic_missile(char level, struct char_data *ch, const char *arg, int type,
			struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_magic_missile(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (victim)
		spell_magic_missile(level, ch, victim, 0);
	    else if (!tar_obj)
		spell_magic_missile(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (victim)
		spell_magic_missile(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in magic missile!");
	    break;

    }
}

void cast_cause_light(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_cause_light(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_cause_light(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(ch, victim))
		    spell_cause_light(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in cause light wounds!");
	    break;

    }
}

void cast_cause_serious(char level, struct char_data *ch, const char *arg, int type,
			struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_cause_serious(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_cause_serious(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_cause_serious(level, ch, victim, 0);
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(ch, victim))
		    spell_cause_serious(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in cause serious wounds!");
	    break;

    }
}

void cast_cause_critic(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_cause_critical(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_cause_critical(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(ch, victim))
		    spell_cause_critical(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in cause critical!");
	    break;

    }
}

void cast_geyser(char level, struct char_data *ch, const char *arg, int type,
		 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_STAFF:
	    spell_geyser(level, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in geyser!");
	    break;
    }
}

void cast_green_slime(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_green_slime(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (victim)
		spell_green_slime(level, ch, victim, 0);
	    else if (!tar_obj)
		spell_green_slime(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (victim)
		spell_green_slime(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in green Slime!");
	    break;
    }
}

/*
 * file: spells2.c , Implementation of magic.             Part of DIKUMUD
 * Usage : All the non-offensive magic handling routines.
 * Copyright (C) 1990, 1991 - see 'license.doc' for complete information.
 */

void cast_resurrection(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (!tar_obj)
		return;
	    spell_resurrection(level, ch, 0, tar_obj);
	    break;
	case SPELL_TYPE_STAFF:
	    if (!tar_obj)
		return;
	    spell_resurrection(level, ch, 0, tar_obj);
	    break;
	default:
	    log_error("Serious problem in 'resurrection'");
	    break;
    }

}

void cast_mana(char level, struct char_data *ch, const char *arg, int type,
	       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_POTION:
	    spell_mana(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (!victim)
		victim = ch;
	    spell_mana(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_mana(level, ch, victim, 0);
	default:
	    log_error("Serious problem in 'mana'");
	    break;
    }

}

void cast_stone_skin(char level, struct char_data *ch, const char *arg, int type,
		     struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (affected_by_spell(ch, SPELL_STONE_SKIN) ||
		affected_by_spell(ch, SPELL_ARMOR) || affected_by_spell(ch, SPELL_SHIELD)) {
		cprintf(ch, "Nothing seems to happen.\r\n");
		return;
	    }
	    spell_stone_skin(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_POTION:
	    if (affected_by_spell(ch, SPELL_STONE_SKIN))
		return;
	    spell_stone_skin(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (affected_by_spell(ch, SPELL_STONE_SKIN))
		return;
	    spell_stone_skin(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    if (affected_by_spell(ch, SPELL_STONE_SKIN))
		return;
	    spell_stone_skin(level, ch, ch, 0);
	    break;
	default:
	    log_error("Serious screw-up in stone_skin!");
	    break;
    }
}

void cast_astral_walk(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_POTION:
	case SPELL_TYPE_SPELL:

	    if (!victim)
		cprintf(ch, "Yes, but who do you wish to walk to?\n");
	    else
		spell_astral_walk(level, ch, victim, 0);
	    break;

	default:
	    log_error("Serious screw-up in astral walk!");
	    break;
    }
}

void cast_visions(char level, struct char_data *ch, const char *arg, int type,
		  struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_POTION:
	case SPELL_TYPE_SPELL:

	    if (!victim)
		cprintf(ch, "Yes, but who do you wish to spy on?\n");
	    else
		spell_visions(level, ch, victim, 0);
	    break;

	default:
	    log_error("Serious screw-up in visions!");
	    break;
    }
}

void cast_infravision(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (IS_AFFECTED(victim, AFF_INFRAVISION)) {
		cprintf(ch, "Nothing seems to happen.\r\n");
		return;
	    }
	    spell_infravision(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    if (IS_AFFECTED(ch, AFF_INFRAVISION))
		return;
	    spell_infravision(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    if (IS_AFFECTED(victim, AFF_INFRAVISION))
		return;
	    spell_infravision(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    if (IS_AFFECTED(victim, AFF_INFRAVISION))
		return;
	    spell_infravision(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    if (!(IS_AFFECTED(victim, AFF_INFRAVISION)))
			spell_infravision(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in infravision!");
	    break;
    }

}

void cast_true_seeing(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (IS_AFFECTED(victim, AFF_TRUE_SIGHT)) {
		cprintf(ch, "Nothing seems to happen.\r\n");
		return;
	    }
	    spell_true_seeing(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    if (IS_AFFECTED(ch, AFF_TRUE_SIGHT))
		return;
	    spell_true_seeing(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    if (IS_AFFECTED(victim, AFF_TRUE_SIGHT))
		return;
	    spell_true_seeing(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    if (IS_AFFECTED(victim, AFF_TRUE_SIGHT))
		return;
	    spell_true_seeing(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    if (!(IS_AFFECTED(victim, AFF_TRUE_SIGHT)))
			spell_true_seeing(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in true_seeing!");
	    break;
    }

}

void cast_light(char level, struct char_data *ch, const char *arg, int type,
		struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_light(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    spell_calm(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    spell_calm(level, ch, ch, 0);
	    break;
	default:
	    log_error("Serious screw-up in light!");
	    break;
    }
}

void cast_cont_light(char level, struct char_data *ch, const char *arg, int type,
		     struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_cont_light(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    spell_cont_light(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    spell_cont_light(level, ch, ch, 0);
	    break;
	default:
	    log_error("Serious screw-up in continual light!");
	    break;
    }
}

void cast_calm(char level, struct char_data *ch, const char *arg, int type,
	       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_calm(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_calm(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_calm(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		spell_calm(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in continual light!");
	    break;
    }
}

void cast_water_breath(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_water_breath(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_water_breath(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    spell_water_breath(level, ch, victim, 0);
	    break;

	default:
	    log_error("Serious screw-up in water breath");
	    break;
    }
}

void cast_flying(char level, struct char_data *ch, const char *arg, int type,
		 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    if (MOUNTED(ch)) {
	cprintf(ch, "Not while you are mounted!\r\n");
	return;
    }
    if (MOUNTED(victim)) {
	cprintf(ch, "Not while they are mounted!\r\n");
	return;
    }
    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_fly(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_fly(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    spell_fly(level, ch, victim, 0);
	    break;

	default:
	    log_error("Serious screw-up in fly");
	    break;
    }
}

void cast_goodberry(char level, struct char_data *ch, const char *arg, int type,
		    struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_goodberry(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    spell_goodberry(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    spell_goodberry(level, ch, ch, 0);
	    break;
	default:
	    log_error("Serious screw-up in continual light!");
	    break;
    }
}

void cast_cure_critic(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_cure_critic(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_cure_critic(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (!victim)
		victim = ch;
	    spell_cure_critic(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_cure_critic(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in cure critic!");
	    break;

    }
}

void cast_cure_light(char level, struct char_data *ch, const char *arg, int type,
		     struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_cure_light(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_cure_light(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (!victim)
		victim = ch;
	    spell_cure_light(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_cure_light(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in cure light!");
	    break;
    }
}

void cast_cure_serious(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_cure_serious(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_cure_serious(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (!victim)
		victim = ch;
	    spell_cure_serious(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_cure_serious(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in cure serious!");
	    break;
    }
}

void cast_refresh(char level, struct char_data *ch, const char *arg, int type,
		  struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_refresh(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_refresh(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (!victim)
		victim = ch;
	    spell_refresh(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_refresh(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in refresh!");
	    break;
    }
}

void cast_second_wind(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_second_wind(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_second_wind(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:

	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_second_wind(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in second_wind!");
	    break;
    }
}

void cast_shield(char level, struct char_data *ch, const char *arg, int type,
		 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (affected_by_spell(victim, SPELL_STONE_SKIN)) {
		cprintf(ch, "Nothing seems to happen.\r\n");
		return;
	    }
	    spell_shield(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_shield(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (!victim)
		victim = ch;
	    spell_shield(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_shield(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in shield!");
	    break;
    }

}

void cast_curse(char level, struct char_data *ch, const char *arg, int type,
		struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (tar_obj)				       /* It is an object */
		spell_curse(level, ch, 0, tar_obj);
	    else {					       /* Then it is a PC | NPC */
		spell_curse(level, ch, victim, 0);
	    }
	    break;
	case SPELL_TYPE_POTION:
	    spell_curse(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)				       /* It is an object */
		spell_curse(level, ch, 0, tar_obj);
	    else {					       /* Then it is a PC | NPC */
		if (!victim)
		    victim = ch;
		spell_curse(level, ch, victim, 0);
	    }
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_curse(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in curse!");
	    break;
    }
}

void cast_detect_evil(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (affected_by_spell(victim, SPELL_DETECT_EVIL)) {
		cprintf(victim, "Nothing seems to happen.\r\n");
		return;
	    }
	    spell_detect_evil(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    if (affected_by_spell(ch, SPELL_DETECT_EVIL))
		return;
	    spell_detect_evil(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    if (!(IS_AFFECTED(victim, AFF_DETECT_EVIL)))
			spell_detect_evil(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in detect evil!");
	    break;
    }
}

void cast_detect_invisibility(char level, struct char_data *ch, const char *arg, int type,
			      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (IS_AFFECTED(victim, AFF_DETECT_INVISIBLE)) {
		cprintf(victim, "Nothing seems to happen.\r\n");
		return;
	    }
	    spell_detect_invisibility(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    if (IS_AFFECTED(ch, AFF_DETECT_INVISIBLE))
		return;
	    spell_detect_invisibility(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (in_group(ch, victim))
		    if (!(IS_AFFECTED(victim, AFF_DETECT_INVISIBLE)))
			spell_detect_invisibility(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in detect invisibility!");
	    break;
    }
}

void cast_detect_magic(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (affected_by_spell(victim, SPELL_DETECT_MAGIC)) {
		cprintf(victim, "Nothing seems to happen.\r\n");
		return;
	    }
	    spell_detect_magic(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    if (affected_by_spell(ch, SPELL_DETECT_MAGIC))
		return;
	    spell_detect_magic(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    if (!(IS_AFFECTED(victim, SPELL_DETECT_MAGIC)))
			spell_detect_magic(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in detect magic!");
	    break;
    }
}

void cast_detect_poison(char level, struct char_data *ch, const char *arg, int type,
			struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_detect_poison(level, ch, victim, tar_obj);
	    break;
	case SPELL_TYPE_POTION:
	    spell_detect_poison(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj) {
		spell_detect_poison(level, ch, 0, tar_obj);
		return;
	    }
	    if (!victim)
		victim = ch;
	    spell_detect_poison(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in detect poison!");
	    break;
    }
}

void cast_dispel_evil(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_dispel_evil(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_dispel_evil(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_dispel_evil(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    spell_dispel_evil(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(victim, ch))
		    spell_dispel_evil(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in dispel evil!");
	    break;
    }
}

void cast_dispel_good(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_dispel_good(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_dispel_good(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_dispel_good(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    spell_dispel_good(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(victim, ch))
		    spell_dispel_good(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in dispel good!");
	    break;
    }
}

void cast_faerie_fire(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_faerie_fire(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_faerie_fire(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_faerie_fire(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    spell_faerie_fire(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(victim, ch))
		    spell_faerie_fire(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in dispel good!");
	    break;
    }
}

void cast_enchant_weapon(char level, struct char_data *ch, const char *arg, int type,
			 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_enchant_weapon(level, ch, 0, tar_obj);
	    break;

	case SPELL_TYPE_SCROLL:
	    if (!tar_obj)
		return;
	    spell_enchant_weapon(level, ch, 0, tar_obj);
	    break;
	default:
	    log_error("Serious screw-up in enchant weapon!");
	    break;
    }
}

void cast_enchant_armor(char level, struct char_data *ch, const char *arg, int type,
			struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
/*                      spell_enchant_armor(level, ch, 0,tar_obj);
 * break;
 */
	case SPELL_TYPE_SCROLL:
/*                      if(!tar_obj) return;
 * spell_enchant_armor(level, ch, 0,tar_obj);
 * break;
 */
	default:
	    log_error("Serious screw-up in enchant armor!");
	    break;
    }
}

void cast_heal(char level, struct char_data *ch, const char *arg, int type,
	       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    act("$n heals $N.", FALSE, ch, 0, victim, TO_NOTVICT);
	    act("You heal $N.", FALSE, ch, 0, victim, TO_CHAR);
	    spell_heal(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_heal(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_heal(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in heal!");
	    break;
    }
}

void cast_invisibility(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    if (tar_obj) {
		if (IS_SET(tar_obj->obj_flags.extra_flags, ITEM_INVISIBLE))
		    cprintf(ch, "Nothing new seems to happen.\r\n");
		else
		    spell_invisibility(level, ch, 0, tar_obj);
	    } else {					       /* victim */
		if (IS_AFFECTED(victim, AFF_INVISIBLE))
		    cprintf(ch, "Nothing new seems to happen.\r\n");
		else
		    spell_invisibility(level, ch, victim, 0);
	    }
	    break;
	case SPELL_TYPE_POTION:
	    if (!IS_AFFECTED(ch, AFF_INVISIBLE))
		spell_invisibility(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj) {
		if (!(IS_SET(tar_obj->obj_flags.extra_flags, ITEM_INVISIBLE)))
		    spell_invisibility(level, ch, 0, tar_obj);
	    } else {					       /* victim */
		if (!victim)
		    victim = ch;

		if (!(IS_AFFECTED(victim, AFF_INVISIBLE)))
		    spell_invisibility(level, ch, victim, 0);
	    }
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj) {
		if (!(IS_SET(tar_obj->obj_flags.extra_flags, ITEM_INVISIBLE)))
		    spell_invisibility(level, ch, 0, tar_obj);
	    } else {					       /* victim */
		if (!(IS_AFFECTED(victim, AFF_INVISIBLE)))
		    spell_invisibility(level, ch, victim, 0);
	    }
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    if (!(IS_AFFECTED(victim, AFF_INVISIBLE)))
			spell_invisibility(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in invisibility!");
	    break;
    }
}

void cast_locate_object(char level, struct char_data *ch, const char *arg, int type,
			struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_locate_object(level, ch, 0, (char *)tar_obj);
	    break;
	default:
	    log_error("Serious screw-up in locate object!");
	    break;
    }
}

void cast_poison(char level, struct char_data *ch, const char *arg, int type,
		 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_poison(level, ch, victim, tar_obj);
	    break;
	case SPELL_TYPE_POTION:
	    spell_poison(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_poison(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in poison!");
	    break;
    }
}

void cast_protection_from_evil(char level, struct char_data *ch, const char *arg, int type,
			       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_protection_from_evil(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_protection_from_evil(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_protection_from_evil(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_protection_from_evil(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in protection from evil!");
	    break;
    }
}

void cast_remove_curse(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_remove_curse(level, ch, victim, tar_obj);
	    break;
	case SPELL_TYPE_POTION:
	    spell_remove_curse(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj) {
		spell_remove_curse(level, ch, 0, tar_obj);
		return;
	    }
	    if (!victim)
		victim = ch;
	    spell_remove_curse(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_remove_curse(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in remove curse!");
	    break;
    }
}

void cast_remove_poison(char level, struct char_data *ch, const char *arg, int type,
			struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_remove_poison(level, ch, victim, tar_obj);
	    break;
	case SPELL_TYPE_POTION:
	    spell_remove_poison(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_remove_poison(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in remove poison!");
	    break;
    }
}

void cast_remove_paralysis(char level, struct char_data *ch, const char *arg, int type,
			   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_remove_paralysis(level, ch, victim, tar_obj);
	    break;
	case SPELL_TYPE_POTION:
	    spell_remove_paralysis(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (!victim)
		victim = ch;
	    spell_remove_paralysis(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_remove_paralysis(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in remove paralysis!");
	    break;
    }
}

void cast_sanctuary(char level, struct char_data *ch, const char *arg, int type,
		    struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_sanctuary(level, ch, victim, 0);
	    break;

	case SPELL_TYPE_WAND:
	case SPELL_TYPE_POTION:
	    spell_sanctuary(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_sanctuary(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_sanctuary(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in sanctuary!");
	    break;
    }
}

void cast_fireshield(char level, struct char_data *ch, const char *arg, int type,
		     struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_fireshield(level, ch, victim, 0);
	    break;

	case SPELL_TYPE_WAND:
	case SPELL_TYPE_POTION:
	    spell_sanctuary(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_fireshield(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_fireshield(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in fireshield!");
	    break;
    }
}

void cast_sleep(char level, struct char_data *ch, const char *arg, int type,
		struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_sleep(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_sleep(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_sleep(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    spell_sleep(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_sleep(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in sleep!");
	    break;
    }
}

void cast_strength(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_strength(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_strength(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_strength(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_strength(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in strength!");
	    break;
    }
}

void cast_ventriloquate(char level, struct char_data *ch, const char *arg, int type,
			struct char_data *victim, struct obj_data *tar_obj)
{
    struct char_data                       *tmp_ch = NULL;
    char                                    buf1[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    buf2[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    buf3[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    if (type != SPELL_TYPE_SPELL) {
	log_error("Attempt to ventriloquate by non-cast-spell.");
	return;
    }
    for (; *arg && (*arg == ' '); arg++);
    if (tar_obj) {
	sprintf(buf1, "The %s says '%s'\r\n", fname(tar_obj->name), arg);
	sprintf(buf2, "Someone makes it sound like the %s says '%s'.\r\n",
		fname(tar_obj->name), arg);
    } else {
	sprintf(buf1, "%s says '%s'\r\n", GET_NAME(victim), arg);
	sprintf(buf2, "Someone makes it sound like %s says '%s'\r\n", GET_NAME(victim), arg);
    }

    sprintf(buf3, "Someone says, '%s'\r\n", arg);

    for (tmp_ch = real_roomp(ch->in_room)->people; tmp_ch; tmp_ch = tmp_ch->next_in_room) {

	if ((tmp_ch != ch) && (tmp_ch != victim)) {
	    if (saves_spell(tmp_ch, SAVING_SPELL))
		cprintf(tmp_ch, "%s", buf2);
	    else
		cprintf(tmp_ch, "%s", buf1);
	} else {
	    if (tmp_ch == victim)
		cprintf(victim, "%s", buf3);
	}
    }
}

void cast_word_of_recall(char level, struct char_data *ch, const char *arg, int type,
			 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_word_of_recall(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_word_of_recall(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_word_of_recall(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    spell_word_of_recall(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_word_of_recall(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in word of recall!");
	    break;
    }
}

void cast_summon(char level, struct char_data *ch, const char *arg, int type,
		 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_summon(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in summon!");
	    break;
    }
}

void cast_charm_monster(char level, struct char_data *ch, const char *arg, int type,
			struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_charm_monster(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (!victim)
		return;
	    spell_charm_monster(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(victim, ch))
		    spell_charm_monster(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in charm monster!");
	    break;
    }
}

void cast_sense_life(char level, struct char_data *ch, const char *arg, int type,
		     struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_sense_life(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_sense_life(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_sense_life(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in sense life!");
	    break;
    }
}

void cast_identify(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SCROLL:
	    spell_identify(level, ch, victim, tar_obj);
	    break;
	default:
	    log_error("Serious screw-up in identify!");
	    break;
    }
}

#define MAX_BREATHS 3
struct pbreath {
    int                                     vnum,
                                            spell[MAX_BREATHS];
} breath_potions[] = {

    {
	3970, {
	201, 0}
    }, {
	3971, {
	202, 0}
    }, {
	3972, {
	203, 0}
    }, {
	3973, {
	204, 0}
    }, {
	3974, {
	205, 0}
    }, {
0},};

void cast_dragon_breath(char level, struct char_data *ch, const char *arg, int type,
			struct char_data *victim, struct obj_data *tar_obj)
{
    struct pbreath                         *scan = NULL;
    int                                     i = 0;
    struct affected_type                    af;

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    for (scan = breath_potions;
	 scan->vnum && scan->vnum != obj_index[tar_obj->item_number].virtual; scan++);
    if (scan->vnum == 0) {
	char                                    buf[MAX_STRING_LENGTH];

	cprintf(ch, "Hey, this potion isn't in my list!\r\n");
	sprintf(buf, "unlisted breath potion %s %d", tar_obj->short_description,
		obj_index[tar_obj->item_number].virtual);
	log_error("%s", buf);
	return;
    }
    for (i = 0; i < MAX_BREATHS && scan->spell[i]; i++) {
	if (!affected_by_spell(ch, scan->spell[i])) {
	    af.type = scan->spell[i];
	    af.duration = 1 + dice(1, 2);
	    if (GET_CON(ch) < 4) {
		cprintf(ch,
			"You are too weak to stomach the potion and spew it all over the floor.\r\n");
		act("$n gags and pukes glowing goop all over the floor.", FALSE, ch, 0, ch,
		    TO_NOTVICT);
		break;
	    }
	    if (level > MIN(GET_CON(ch) - 1, GetMaxLevel(ch))) {
		cprintf(ch,
			"!GACK! You are too weak to handle the full power of the potion.\r\n");
		act("$n gags and flops around on the floor a bit.", FALSE, ch, 0, ch,
		    TO_NOTVICT);
		level = MIN(GET_CON(ch) - 1, GetMaxLevel(ch));
	    }
	    af.modifier = -level;
	    af.location = APPLY_CON;
	    af.bitvector = 0;
	    affect_to_char(ch, &af);
	    cprintf(ch, "You feel powerful forces build within your stomach...\r\n");
	}
    }
}

void cast_fire_breath(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_fire_breath(level, ch, victim, 0);
	    break;					       /* It's a spell.. But people can'c cast it! */
	default:
	    log_error("Serious screw-up in firebreath!");
	    break;
    }
}

void cast_frost_breath(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_frost_breath(level, ch, victim, 0);
	    break;					       /* It's a spell.. But people can'c cast it! */
	default:
	    log_error("Serious screw-up in frostbreath!");
	    break;
    }
}

void cast_acid_breath(char level, struct char_data *ch, const char *arg, int type,
		      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_acid_breath(level, ch, victim, 0);
	    break;					       /* It's a spell.. But people can'c cast it! */
	default:
	    log_error("Serious screw-up in acidbreath!");
	    break;
    }
}

void cast_gas_breath(char level, struct char_data *ch, const char *arg, int type,
		     struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_gas_breath(level, ch, victim, 0);
	    break;
	    /*
	     * THIS ONE HURTS!! 
	     */
	default:
	    log_error("Serious screw-up in gasbreath!");
	    break;
    }
}

void cast_lightning_breath(char level, struct char_data *ch, const char *arg, int type,
			   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_lightning_breath(level, ch, victim, 0);
	    break;					       /* It's a spell.. But people can'c cast it! */
	default:
	    log_error("Serious screw-up in lightningbreath!");
	    break;
    }
}

void cast_knock(char level, struct char_data *ch, const char *arg, int type,
		struct char_data *victim, struct obj_data *tar_obj)
{
    int                                     door = 0;
    int                                     other_room = 0;
    char                                    dir[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    otype[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    struct room_direction_data             *back = NULL;
    struct obj_data                        *obj = NULL;
    struct char_data                       *this_victim = NULL;

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:{

		argument_interpreter(arg, otype, dir);

		if (!*otype) {
		    cprintf(ch, "Knock on what?\r\n");
		    return;
		}
		if (generic_find(arg, FIND_OBJ_INV | FIND_OBJ_ROOM, ch, &this_victim, &obj)) {
		    if (obj->obj_flags.type_flag != ITEM_CONTAINER) {
			sprintf(buf, " %s is not a container.\r\n ", obj->name);
		    } else if (!IS_SET(obj->obj_flags.value[1], CONT_CLOSED)) {
			sprintf(buf, " Silly! %s isn't even closed!\r\n ", obj->name);
		    } else if (obj->obj_flags.value[2] < 0) {
			sprintf(buf, "%s doesn't have a lock...\r\n", obj->name);
		    } else if (!IS_SET(obj->obj_flags.value[1], CONT_LOCKED)) {
			sprintf(buf, "Hehe.. %s wasn't even locked.\r\n", obj->name);
		    } else
/*
 * if (IS_SET(obj->obj_flags.value[1], CONT_PICKPROOF)) 
 * {
 * sprintf(buf,"%s resists your magic.\r\n",obj->name);
 * }
 * else
 */
		    {
			REMOVE_BIT(obj->obj_flags.value[1], CONT_LOCKED);
			sprintf(buf, "<Click>\r\n");
			act("$n magically opens $p", FALSE, ch, obj, 0, TO_ROOM);
		    }
		    cprintf(ch, "%s", buf);
		    return;
		} else if ((door = find_door(ch, otype, dir)) >= 0) {
		    if (!IS_SET(EXIT(ch, door)->exit_info, EX_ISDOOR))
			cprintf(ch, "That's absurd.\r\n");
		    else if (!IS_SET(EXIT(ch, door)->exit_info, EX_CLOSED))
			cprintf(ch, "You realize that the door is already open.\r\n");
		    else if (EXIT(ch, door)->key < 0)
			cprintf(ch, "You can't seem to spot any lock to knock.\r\n");
		    else if (!IS_SET(EXIT(ch, door)->exit_info, EX_LOCKED))
			cprintf(ch, "Oh.. it wasn't locked at all.\r\n");
		    else
/*
 * if (IS_SET(EXIT(ch, door)->exit_info, EX_PICKPROOF))
 * cprintf(ch, "You seem to be unable to knock this...\r\n");
 * else
 */
		    {
			REMOVE_BIT(EXIT(ch, door)->exit_info, EX_LOCKED);
			if (EXIT(ch, door)->keyword)
			    act("$n magically opens the lock of the $F.", 0, ch, 0,
				EXIT(ch, door)->keyword, TO_ROOM);
			else
			    act("$n magically opens the lock.", TRUE, ch, 0, 0, TO_ROOM);
			cprintf(ch, "The lock quickly yields to your skills.\r\n");
			if ((other_room = EXIT(ch, door)->to_room) != NOWHERE)
			    if ((back = real_roomp(other_room)->dir_option[rev_dir[door]]))
				if (back->to_room == ch->in_room)
				    REMOVE_BIT(back->exit_info, EX_LOCKED);
		    }
		}
	    }
	    break;
	default:
	    log_error("serious error in Knock.");
	    break;
    }
}

void cast_know_alignment(char level, struct char_data *ch, const char *arg, int type,
			 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_know_alignment(level, ch, victim, tar_obj);
	    break;
	case SPELL_TYPE_POTION:
	    spell_know_alignment(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (!victim)
		victim = ch;
	    spell_know_alignment(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in know alignment!");
	    break;
    }
}

void cast_weakness(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_weakness(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_weakness(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_weakness(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(victim, ch))
		    spell_weakness(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in weakness!");
	    break;
    }
}

void cast_dispel_magic(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_dispel_magic(level, ch, victim, tar_obj);
	    break;
	case SPELL_TYPE_POTION:
	    spell_dispel_magic(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
/*
 * if(tar_obj) {
 * spell_dispel_magic(level, ch, 0, tar_obj);
 * return;
 * }
 */
	    if (!victim)
		victim = ch;
	    spell_dispel_magic(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_dispel_magic(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in dispel magic");
	    break;
    }
}

void cast_animate_dead(char level, struct char_data *ch, const char *arg, int type,
		       struct char_data *victim, struct obj_data *tar_obj)
{
    struct obj_data                        *i = NULL;

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	    if (tar_obj) {
		if (IS_CORPSE(tar_obj)) {
		    spell_animate_dead(level, ch, 0, tar_obj);
		} else {
		    cprintf(ch, "That's not a corpse!\r\n");
		    return;
		}
	    } else {
		cprintf(ch, "That isn't a corpse!\r\n");
		return;
	    }
	    break;
	case SPELL_TYPE_POTION:
	    cprintf(ch, "Your body revolts against the magic liquid.\r\n");
	    ch->points.hit = 0;
	    break;
	case SPELL_TYPE_STAFF:
	    for (i = real_roomp(ch->in_room)->contents; i; i = i->next_content) {
		if (GET_ITEM_TYPE(i) == ITEM_CONTAINER && i->obj_flags.value[3]) {
		    spell_animate_dead(level, ch, 0, i);
		}
	    }
	    break;
	default:
	    log_error("Serious screw-up in animate_dead!");
	    break;
    }
}

void cast_succor(char level, struct char_data *ch, const char *arg, int type,
		 struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_STAFF:
	    spell_succor(level, ch, 0, 0);
    }

}

void cast_paralyze(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_paralyze(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_paralyze(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_paralyze(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    spell_paralyze(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (victim != ch)
		    spell_paralyze(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in paralyze");
	    break;
    }
}

void cast_fear(char level, struct char_data *ch, const char *arg, int type,
	       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_fear(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_fear(level, ch, ch, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_fear(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_fear(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(victim, ch))
		    spell_fear(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in fear");
	    break;
    }
}

void cast_turn(char level, struct char_data *ch, const char *arg, int type,
	       struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_turn(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_SCROLL:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_turn(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_WAND:
	    if (tar_obj)
		return;
	    if (!victim)
		victim = ch;
	    spell_turn(level, ch, victim, 0);
	    break;
	case SPELL_TYPE_STAFF:
	    for (victim = real_roomp(ch->in_room)->people; victim;
		 victim = victim->next_in_room)
		if (!in_group(victim, ch))
		    spell_turn(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in turn");
	    break;
    }
}

void cast_faerie_fog(char level, struct char_data *ch, const char *arg, int type,
		     struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_STAFF:
	case SPELL_TYPE_SCROLL:
	    spell_faerie_fog(level, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in faerie fog!");
	    break;
    }
}

const struct PolyType                   PolyList[] = {
/* name         level #number */
    {"", 0, 200},
    {"goblin", 10, 201},
    {"orc", 10, 202},
    {"badger", 10, 203},
    {"beetle", 10, 204},
    {"troglodyte", 10, 205},
    {"cow", 10, 206},
    {"dog", 10, 207},
    {"frog", 10, 208},
    {"hobgoblin", 11, 209},
    {"spider", 11, 210},
    {"gnoll", 11, 211},
    {"ant", 11, 213},
    {"lemure", 12, 216},
    {"toad", 12, 217},
    {"stirge", 12, 218},
    {"fighter", 12, 220},
    {"bugbear", 13, 221},
    {"ghoul", 13, 223},
    {"lizard", 13, 224},
    {"rat", 13, 225},
    {"ogre", 14, 226},
    {"tick", 14, 228},
    {"weazal", 15, 229},
    {"black dragon", 16, 230},
    {"ape", 16, 231},
    {"blue dragon", 17, 233},
    {"gargoyle", 17, 235},
    {"ghast", 17, 236},
    {"lupan", 18, 237},
    {"owlbear", 18, 238},
    {"shadow", 18, 239},
    {"displacer", 19, 242},
    {"white dragon", 20, 243},
    {"hill giant", 20, 261},
    {"troll", 20, 262},
    {"red dragon", 51, 5030}
};

#define LAST_POLY_MOB 37

void cast_poly_self(char level, struct char_data *ch, const char *arg, int type,
		    struct char_data *victim, struct obj_data *tar_obj)
{
    char                                    buffer[40] = "\0\0\0\0\0\0\0";
    int                                     mobn = 0;
    int                                     X = LAST_POLY_MOB;
    int                                     found = FALSE;
    struct char_data                       *mob = NULL;

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    /*
     * one_argument(arg, buffer); 
     */
    only_argument(arg, buffer);
    if (IS_NPC(ch)) {
	cprintf(ch, "You don't really want to do that.\r\n");
	return;
    }
    switch (type) {
	case SPELL_TYPE_SPELL:
	    {
		while (!found) {
		    if (PolyList[X].level > level) {
			X--;
		    } else {
			if (number(0, 99) < 10 || !str_cmp(PolyList[X].name, buffer)) {
			    mobn = PolyList[X].number;
			    found = TRUE;
			} else {
			    X--;
			}
			if (X < 0)
			    break;
		    }
		}

		if (!found) {
		    for (X = LAST_POLY_MOB; X >= 0 && PolyList[X].level > level; X--);
		    mobn = PolyList[number(0, X)].number;
		}
		{
		    mob = read_mobile(mobn, VIRTUAL);
		    if (mob) {
			spell_poly_self(level, ch, mob, 0);
		    } else {
			cprintf(ch, "You couldn't summon an image of that creature\r\n");
		    }
		    return;
		}

	    }
	    break;

	default:{
		log_error("Problem in poly_self");
	    }
	    break;
    }
}

#define NUT_CRACKED 1131

void cast_shelter(char level, struct char_data *ch, const char *arg, int type,
		  struct char_data *victim, struct obj_data *tar_obj)
{
    struct obj_data                        *sac = NULL;

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    if (!ch->equipment[HOLD]) {
	cprintf(ch, " You must be holding the component for this spell.\r\n");
	return;
    }
    sac = unequip_char(ch, HOLD);
    if (sac) {
	obj_to_char(sac, ch);
	if (ObjVnum(sac) != NUT_CRACKED) {
	    cprintf(ch, "That is not the correct item.\r\n");
	    return;
	}
    } else {
	cprintf(ch, "You must be holding the component for this spell.\r\n");
	return;
    }

    switch (type) {
	case SPELL_TYPE_SPELL:
	    spell_shelter(level, ch, ch, sac);
	    break;
	default:
	    log_error("serious screw-up in shelter.");
	    break;
    }
}

#define LONG_SWORD   3032
#define SHIELD       5045
#define BOAT         6101
#define BAG          3017
#define WATER_BARREL 3005
#define BREAD        3010
#define PAPER        6
#define PEN          5
#define SIGN         35
#define GOOD_WALNUT  1130
#define BAD_WALNUT   1132

void cast_minor_creation(char level, struct char_data *ch, const char *arg, int type,
			 struct char_data *victim, struct obj_data *tar_obj)
{
    char                                    buffer[40] = "\0\0\0\0\0\0\0";
    int                                     obj = 0;
    struct obj_data                        *o = NULL;

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    one_argument(arg, buffer);

    if (!str_cmp(buffer, "sword")) {
	obj = LONG_SWORD;
    } else if (!str_cmp(buffer, "shield")) {
	obj = SHIELD;
    } else if (!str_cmp(buffer, "boat")) {
	obj = BOAT;
    } else if (!str_cmp(buffer, "raft")) {
	obj = BOAT;
    } else if (!str_cmp(buffer, "bag")) {
	obj = BAG;
    } else if (!str_cmp(buffer, "barrel")) {
	obj = WATER_BARREL;
    } else if (!str_cmp(buffer, "bread")) {
	obj = BREAD;
    } else if (!str_cmp(buffer, "walnut")) {
	if (number(0, 99) < 2)
	    obj = GOOD_WALNUT;
	else
	    obj = BAD_WALNUT;
    } else if (!str_cmp(buffer, "sign")) {
	obj = SIGN;
    } else if (!str_cmp(buffer, "paper")) {
	obj = PAPER;
    } else if (!str_cmp(buffer, "pen")) {
	obj = PEN;
    } else {
	cprintf(ch, "There is nothing of that available\r\n");
	return;
    }

    o = read_object(obj, VIRTUAL);
    if (!o) {
	cprintf(ch, "There is nothing of that available\r\n");
	return;
    }
    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	    spell_minor_create(level, ch, 0, o);
	    break;
	default:
	    log_error("serious screw-up in minor_create.");
	    break;
    }

}

#define FIRE_ELEMENTAL  10
#define WATER_ELEMENTAL 11
#define AIR_ELEMENTAL   13
#define EARTH_ELEMENTAL 12

#define RED_STONE       1120
#define PALE_BLUE_STONE 1124
#define CLEAR_STONE     1125
#define GREY_STONE      1126

void cast_conjure_elemental(char level, struct char_data *ch, const char *arg, int type,
			    struct char_data *victim, struct obj_data *tar_obj)
{
    char                                    buffer[40] = "\0\0\0\0\0\0\0";
    int                                     mob = 0;
    int                                     obj = 0;
    struct obj_data                        *sac = NULL;
    struct char_data                       *el = NULL;

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    one_argument(arg, buffer);

    if (!str_cmp(buffer, "fire")) {
	mob = FIRE_ELEMENTAL;
	obj = RED_STONE;
    } else if (!str_cmp(buffer, "water")) {
	mob = WATER_ELEMENTAL;
	obj = PALE_BLUE_STONE;
    } else if (!str_cmp(buffer, "air")) {
	mob = AIR_ELEMENTAL;
	obj = CLEAR_STONE;
    } else if (!str_cmp(buffer, "earth")) {
	mob = EARTH_ELEMENTAL;
	obj = GREY_STONE;
    } else {
	cprintf(ch, "There are no elementals of that type available\r\n");
	return;
    }
    if (!ch->equipment[HOLD]) {
	cprintf(ch, " You must be holding the correct stone\r\n");
	return;
    }
    sac = unequip_char(ch, HOLD);
    if (sac) {
	obj_to_char(sac, ch);
	if (ObjVnum(sac) != obj) {
	    cprintf(ch, "You must have the correct item to sacrifice.\r\n");
	    return;
	}
	el = read_mobile(mob, VIRTUAL);
	if (!el) {
	    cprintf(ch, "There are no elementals of that type available\r\n");
	    return;
	}
    } else {
	cprintf(ch, "You must be holding the correct item to sacrifice.\r\n");
	return;
    }

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	    spell_conjure_elemental(level, ch, el, sac);
	    break;
	default:
	    log_error("serious screw-up in conjure_elemental.");
	    break;
    }
}

#define DEMON_TYPE_I     20
#define DEMON_TYPE_II    21
#define DEMON_TYPE_III   22
#define DEMON_TYPE_IV    23
#define DEMON_TYPE_V     24
#define DEMON_TYPE_VI    25

#define SWORD_ANCIENTS   25000
#define SHADOWSHIV       25014
#define FIRE_SWORD       25015
#define SILVER_TRIDENT   25016
#define JEWELLED_DAGGER  25019
#define SWORD_SHARPNESS  25017

void cast_cacaodemon(char level, struct char_data *ch, const char *arg, int type,
		     struct char_data *victim, struct obj_data *tar_obj)
{
    char                                    buffer[40] = "\0\0\0\0\0\0\0";
    int                                     mob = 0;
    int                                     obj = 0;
    struct obj_data                        *sac = NULL;
    struct char_data                       *el = NULL;

    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    one_argument(arg, buffer);

    if (!str_cmp(buffer, "one")) {
	mob = DEMON_TYPE_I;
	obj = SWORD_SHARPNESS;
    } else if (!str_cmp(buffer, "two")) {
	mob = DEMON_TYPE_II;
	obj = JEWELLED_DAGGER;
    } else if (!str_cmp(buffer, "three")) {
	mob = DEMON_TYPE_III;
	obj = SILVER_TRIDENT;
    } else if (!str_cmp(buffer, "four")) {
	mob = DEMON_TYPE_IV;
	obj = FIRE_SWORD;
    } else if (!str_cmp(buffer, "five")) {
	mob = DEMON_TYPE_V;
	obj = SHADOWSHIV;
    } else if (!str_cmp(buffer, "six")) {
	mob = DEMON_TYPE_VI;
	obj = SWORD_ANCIENTS;
    } else {
	cprintf(ch, "There are no demons of that type available\r\n");
	return;
    }
    if (!ch->equipment[WIELD]) {
	cprintf(ch, " You must be wielding the correct item\r\n");
	return;
    }
    sac = unequip_char(ch, WIELD);
    if (sac) {
	obj_to_char(sac, ch);
	if (ObjVnum(sac) != obj) {
	    cprintf(ch, "You must have the correct item to sacrifice.\r\n");
	    return;
	}
	el = read_mobile(mob, VIRTUAL);
	if (!el) {
	    cprintf(ch, "There are no demons of that type available\r\n");
	    return;
	}
    } else {
	cprintf(ch, "You must be holding the correct item to sacrifice.\r\n");
	return;
    }

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	    spell_cacaodemon(level, ch, el, sac);
	    break;
	default:
	    log_error("serious screw-up in conjure_elemental.");
	    break;
    }

}

void cast_mon_sum1(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_STAFF:
	    spell_Create_Monster(5, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in monster_summoning_1");
	    break;
    }
}

void cast_mon_sum2(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_STAFF:
	    spell_Create_Monster(7, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in monster_summoning_1");
	    break;
    }
}

void cast_mon_sum3(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_STAFF:
	    spell_Create_Monster(9, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in monster_summoning_1");
	    break;
    }
}

void cast_mon_sum4(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_STAFF:
	    spell_Create_Monster(11, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in monster_summoning_1");
	    break;
    }
}

void cast_mon_sum5(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_STAFF:
	    spell_Create_Monster(13, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in monster_summoning_1");
	    break;
    }
}

void cast_mon_sum6(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_STAFF:
	    spell_Create_Monster(15, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in monster_summoning_1");
	    break;
    }
}

void cast_mon_sum7(char level, struct char_data *ch, const char *arg, int type,
		   struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_STAFF:
	    spell_Create_Monster(17, ch, 0, 0);
	    break;
	default:
	    log_error("Serious screw-up in monster_summoning_1");
	    break;
    }
}

/*
 * file: spells2.c , Implementation of magic.             Part of DIKUMUD
 * Usage : All the non-offensive magic handling routines.
 * Copyright (C) 1990, 1991 - see 'license.doc' for complete information.
 */

void cast_fly_group(char level, struct char_data *ch, const char *arg, int type,
		    struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_STAFF:
	    spell_fly_group(level, ch, 0, 0);
	    break;
	case SPELL_TYPE_POTION:
	    spell_fly(level, ch, victim, 0);
	    break;
	default:
	    log_error("Serious screw-up in fly");
	    break;
    }
}

void cast_aid(char level, struct char_data *ch, const char *arg, int type,
	      struct char_data *victim, struct obj_data *tar_obj)
{
    if (DEBUG > 1)
	log_info("called %s with %d, %s, %s, %d, %s, %s", __PRETTY_FUNCTION__, level,
		 SAFE_NAME(ch), VNULL(arg), type, SAFE_NAME(victim), SAFE_ONAME(tar_obj));

    if (!victim)
	victim = ch;

    switch (type) {
	case SPELL_TYPE_SPELL:
	case SPELL_TYPE_SCROLL:
	case SPELL_TYPE_WAND:
	case SPELL_TYPE_STAFF:
	    spell_aid(level, ch, victim, 0);
	    break;
	default:
	    log_error("serious screw-up in scare.");
	    break;
    }
}