/* ************************************************************************
*  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 "os.h"

#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "db.h"
#include "interpreter.h"
#include "spells.h"
#include "handler.h"
#include "prototypes.h"


/* Global data */

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

/* Extern functions */

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



void cast_burning_hands (int 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_call_lightning (int level, struct char_data *ch, char *arg,
  int type, struct char_data *victim, struct obj_data *tar_obj)
{
  extern struct weather_data weather_info;

  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 ("Serious screw-up in call lightning!");
    break;
  }
}


void cast_chill_touch (int 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 (int 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 (int 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 (int 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 (int 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_fireball (int 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 (int 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_lightning_bolt (int 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 (int 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;

  }
}