circle-2.01/circle/
circle-2.01/circle/lib/boards/
circle-2.01/circle/lib/misc/
circle-2.01/circle/lib/plrobjs/
circle-2.01/circle/lib/text/
circle-2.01/circle/lib/world/shp/
/* ************************************************************************
*  file: spells1.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 "structs.h"
#include "utils.h"
#include "comm.h"
#include "db.h"
#include "interpreter.h"
#include "spells.h"
#include "handler.h"


/* Global data */

extern struct room_data *world;
extern struct char_data *character_list;

/* Extern functions */

void	spell_burning_hands(byte level, struct char_data *ch, 
struct char_data *victim, struct obj_data *obj);
void	spell_call_lightning(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj);
void	spell_chill_touch(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj);
void	spell_shocking_grasp(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj);
void	spell_colour_spray(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj);
void	spell_earthquake(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj);
void	spell_energy_drain(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj);
void	spell_fireball(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj);
void	spell_harm(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj);
void	spell_lightning_bolt(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj);
void	spell_magic_missile(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj);



void	cast_burning_hands( byte level, struct char_data *ch, char *arg, int type,
struct char_data *victim, struct obj_data *tar_obj )
{
   switch (type) {
   case SPELL_TYPE_SPELL:
      spell_burning_hands(level, ch, victim, 0);
      break;
   default :
      log("SYSERR: Serious screw-up in burning hands!");
      break;
   }
}


void	cast_call_lightning( byte level, struct char_data *ch, char *arg, int type,
struct char_data *victim, struct obj_data *tar_obj )
{

   switch (type) {
   case SPELL_TYPE_SPELL:
      if (OUTSIDE(ch) && (weather_info.sky >= SKY_RAINING)) {
	 spell_call_lightning(level, ch, victim, 0);
      } else {
	 send_to_char("You fail to call upon the lightning from the sky!\n\r", ch);
      }
      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 = world[ch->in_room].people ; 
	     victim ; victim = victim->next_in_room )
	    if (victim != ch)
	       spell_call_lightning(level, ch, victim, 0);
      }
      break;
   default :
      log("SYSERR: Serious screw-up in call lightning!");
      break;
   }
}


void	cast_chill_touch( byte level, struct char_data *ch, char *arg, int type,
struct char_data *victim, struct obj_data *tar_obj )
{
   switch (type) {
   case SPELL_TYPE_SPELL:
      spell_chill_touch(level, ch, victim, 0);
      break;
   default :
      log("SYSERR: Serious screw-up in chill touch!");
      break;
   }
}


void	cast_shocking_grasp( byte level, struct char_data *ch, char *arg, int type,
struct char_data *victim, struct obj_data *tar_obj )
{
   switch (type) {
   case SPELL_TYPE_SPELL:
      spell_shocking_grasp(level, ch, victim, 0);
      break;
   default :
      log("SYSERR: Serious screw-up in shocking grasp!");
      break;
   }
}


void	cast_colour_spray( byte level, struct char_data *ch, char *arg, int type,
struct char_data *victim, struct obj_data *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("SYSERR: Serious screw-up in colour spray!");
      break;
   }
}


void	cast_earthquake( byte level, struct char_data *ch, char *arg, int type,
struct char_data *victim, struct obj_data *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("SYSERR: Serious screw-up in earthquake!");
      break;
   }
}


void	cast_energy_drain( byte level, struct char_data *ch, char *arg, int type,
struct char_data *victim, struct obj_data *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 = world[ch->in_room].people ; 
          victim ; victim = victim->next_in_room )
	 if (victim != ch)
	    spell_energy_drain(level, ch, victim, 0);
      break;
   default :
      log("SYSERR: Serious screw-up in energy drain!");
      break;
   }
}


void	cast_fireball( byte level, struct char_data *ch, char *arg, int type,
struct char_data *victim, struct obj_data *tar_obj )
{
   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("SYSERR: Serious screw-up in fireball!");
      break;

   }
}


void	cast_harm( byte level, struct char_data *ch, char *arg, int type,
struct char_data *victim, struct obj_data *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 = world[ch->in_room].people ; 
          victim ; victim = victim->next_in_room )
	 if (victim != ch)
	    spell_harm(level, ch, victim, 0);
      break;
   default :
      log("SYSERR: Serious screw-up in harm!");
      break;

   }
}


void	cast_lightning_bolt( byte level, struct char_data *ch, char *arg, int type,
struct char_data *victim, struct obj_data *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("SYSERR: Serious screw-up in lightning bolt!");
      break;

   }
}


void	cast_magic_missile( byte level, struct char_data *ch, char *arg, int type,
struct char_data *victim, struct obj_data *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("SYSERR: Serious screw-up in magic missile!");
      break;

   }
}