/* ************************************************************************
*  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(short level, struct char_data *ch, 
  struct char_data *victim, struct obj_data *obj);
void spell_morphia(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_chill_touch(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_shocking_grasp(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_colour_spray(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_earthquake(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_energy_drain(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_fireball(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_harm(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_barf(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_lightning_bolt(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_magic_missile(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_sunburst(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_radiation(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_cyclone(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_nova(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_slime(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);
void spell_gas(short level, struct char_data *ch,
  struct char_data *victim, struct obj_data *obj);

void cast_burning_hands( short 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("Serious screw-up in burning hands!");
      break;
  }
}


void cast_morphia(short 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_morphia(level, ch, victim, 0);
        break;
      default : 
        log("Serious screw-up in morphia!");
        break;
  }
}


void cast_slime(short 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_slime(level, ch, victim, 0);
        break;
    case SPELL_TYPE_WAND:
         if(victim) 
            spell_slime(level, ch, victim, 0);
         break;
      default : 
        log("Serious screw-up in slime!");
        break;
  }
}

void cast_gas(short 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_gas(level, ch, victim, 0);
        break;
    case SPELL_TYPE_WAND:
         if(victim) 
            spell_gas(level, ch, victim, 0);
         break;
      default : 
        log("Serious screw-up in gas!");
        break;
  }
}


void cast_chill_touch( short 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("Serious screw-up in chill touch!");
         break;
  }
}


void cast_shocking_grasp( short 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("Serious screw-up in shocking grasp!");
         break;
  }
}


void cast_colour_spray( short 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("Serious screw-up in colour spray!");
         break;
  }
}


void cast_earthquake( short 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("Serious screw-up in earthquake!");
         break;
  }
}


void cast_energy_drain( short 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("Serious screw-up in energy drain!");
         break;
  }
}

void cast_sunburst( short 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_sunburst(level,ch,victim,0);
      break;
    case SPELL_TYPE_STAFF:
         for (victim = world[ch->in_room].people ;
              victim ; victim = victim->next_in_room )
            if(ch == victim->specials.fighting)
               spell_sunburst(level, ch, victim, 0);
         break;
    default:
         log("Serious screw-up in sunburst!");
         break;
  }
}
void cast_doppelganger( short 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_doppelganger(level,ch,victim,0);
      break;
    case SPELL_TYPE_STAFF:
         for (victim = world[ch->in_room].people ;
              victim ; victim = victim->next_in_room )
            if(ch == victim->specials.fighting)
               spell_doppelganger(level, ch, victim, 0);
         break;
    default:
         log("Serious screw-up in doppelganger!");
         break;
  }
}
void cast_jingle( short 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(!ch->specials.fighting)
        spell_jingle(level,ch,victim,0);
      else
        for(victim = world[ch->in_room].people ;
          victim ; victim = victim->next_in_room )
            if(ch == victim->specials.fighting)
              spell_jingle(level, ch, victim, 0);
      break;
    default:
      log("Serious screw-up in doppelganger!");
      break;
  }
}

void cast_fireball( short 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("Serious screw-up in fireball!");
         break;

  }
}

void cast_harm( short 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("Serious screw-up in harm!");
         break;
  }
}
void cast_barf( short 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_barf(level, ch, victim, 0);
         break;
    default : 
         log("Serious screw-up in barf!");
         break;
  }
}

void cast_lightning_bolt( short 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("Serious screw-up in lightning bolt!");
         break;

  }
}


void cast_magic_missile( short 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("Serious screw-up in magic missile!");
         break;

  }
}

void cast_clone( short level, struct char_data *ch, char *arg, int type,
  struct char_data *tar_ch, struct obj_data *tar_obj )
{
  spell_clone(level, ch, tar_ch, tar_obj);
}

void cast_cyclone( short 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_STAFF:
      spell_cyclone(level, ch, 0, 0);
      break;
    default : 
         log("Serious screw-up in cyclone!");
         break;
  }
}
void cast_radiation( short 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_STAFF:
    case SPELL_TYPE_WAND:
      spell_radiation(level, ch, 0, 0);
      break;
    default : 
         log("Serious screw-up in radiation!");
         break;
  }
}
void cast_nova( short 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_nova(level, ch, victim, 0);
      break;
    default : 
         log("Serious screw-up in nova!");
         break;
  }
}