/
area/city/
area/crypts/
area/guilds/
area/psuedowild/
area/religion/
data/documents/MPDocs/
data/html/
data/mobprogs/
data/quest/
data/world/
data/world/_utilities/
data/world/images/
design/html/
notes/
player/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
#include "magic.h"
#include "balance.h"


            /*****************************************\
            *       First Circle Spells              *
            \*****************************************/
            
/*
Spell Name:         Cure Light Wounds
Base Mana Cost:     10
Heal                10-20 + 1d4 per level
*/
void spell_1_cure_light (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    int heal;

    heal = number_range (10, 20) + level;
    heal_char(victim, heal, TRUE);
    update_pos (victim);
    send_to_char ("You feel better!\n\r", victim);
    if (ch != victim)
        send_to_char ("Ok.\n\r", ch);
    return;
}

/*
Spell Name:         Cause Light Wounds
Base Mana Cost:     10
Damage              10-20 + 1d4 per level
*/
void spell_1_cause_light (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    int dam = number_range (10, 20) + level;

    damage (ch, (CHAR_DATA *) vo, dam, sn, DAM_HARM, TRUE, TRUE);
    return;
}

/*
Spell Name:         Bane
Base Mana Cost:     20
Type:               Offensive Enchantment
Effect:             Target has a 15% chance to miss melee
*/
void spell_1_bane (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if (is_affected (victim, sn))
    {
        if (victim == ch)
            send_to_char ("You are already baned!\n\r", ch);
        else
            act ("$N can't be baned yet again.", ch, NULL, victim, TO_CHAR);
        return;
    }

    af.where = TO_AFFECTS;
    af.type = sn;
    af.level = level;
    af.duration = level;
    af.location = APPLY_HITROLL;
    af.modifier = -1;
    af.bitvector = 0;
    affect_to_char (victim, &af);
    send_to_char ("Your feel the the curse of the bane!\n\r", victim);
    act ("$n's has been cursed with bane.", victim, NULL, NULL, TO_ROOM);
    return;
}


/*
SPell Name:         Bless
Base mana Cost:     10
Effect              +2 hitroll +1 per level
*/
void spell_1_bless (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if (is_affected (victim, sn))
    {
        if (victim == ch)
            send_to_char ("You are already blessed!\n\r", ch);
        else
            act ("$N is already blessed.", ch, NULL, victim, TO_CHAR);
        return;
    }

    af.where = TO_AFFECTS;
    af.type = sn;
    af.level = level;
    af.duration = level;
    af.location = APPLY_HITROLL;
    af.modifier = 2 + level;
    af.bitvector = 0;
    affect_to_char (victim, &af);
    send_to_char ("Your are blessed!\n\r", victim);
    act ("$n's has been blessed.", victim, NULL, NULL, TO_ROOM);
    return;
}



/*
 * Spell ideas..
 *
 
 *adept              - Can see spells names when cast
 cleanse            - Super cancel
 *holy sight         - can 'see' everything
 *rejuvination       - spell effect regen, super
 *suppression        - victim's spells do 50% less
 *word of god        - High level single hit damage spell
 *bark skin          - High -ac spell
 *brushfire          - high damage fire spell
 *divinity           - Highest damage harm spell. Ouchy
 *sun's ritual       - Mid level defense sanct
 *hurricane          - area effect spell
 *earthquake         - area effect spell
 *wall of ice        - defensive ac spell, -damage taken
 *sanctify           - anti-pk spell
 *replenish          - highly draining low level room restore
 *grudge             - low level elemental damage spell
 *malady             - prevents target from healing
 sticks to snakes   - Low level damage attack spel
 restore            - Single hit restoration spell (hp/move)
 *fire storm         - High level damage spell
 fireseeds          - damage spell, mid level
 chant              - temporarily increases spell damage to target
 holy might         - increases str/damroll and melee damage
 divine insight     - increases wis/int and spell damage
 luck of the irish  - increases 'luck'
 divine armor       - VERY high ac spell
 retrubution        - enemy effect, enemy takes 33% damage back
 thorns             - damage spell, slows enemy
 wolf spirit        - 'speed' increases, haste, roundtime
 hawk spirit        - 'hit' increases, hitroll, damroll
 owl spirit         - 'magic' increases, damage, reduced spell cost
 viper spirit       - 'poison' all spells do poison damage, weapons deal poison, imm poison
 mouse spirit       - 'flee' increases, flee/recall 100% regardless
 oliphaunt armor    - damage reduction
 insect swarm       - Charmmies, 6x of em at 105
 treant             - Strong charmie
 confusion          - makes enemy attack themselves
*/


/*
 * spell_adept()
 *
 * Good effect, target can 'see' spells that are being cast
 * also slight bonus to spell power
 */
void spell_adept (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if (IS_AFFECTED2 (victim, AFF2_ADEPT))
    {
        if (victim == ch)
            send_to_char ("You can already reconize spells!\n\r", ch);
        else
            act ("$N can already reconize spells!", ch, NULL, victim, TO_CHAR);
        return;
    }
    af.where = TO_AFFECTS2;
    af.type = sn;
    af.level = level;
    af.duration = level;
    af.modifier = 0;
    af.location = APPLY_NONE;
    af.bitvector = AFF2_ADEPT;
    affect_to_char (victim, &af);
    send_to_char ("You become adept at reconizing spells.\n\r", victim);
    if (ch != victim)
        send_to_char ("Ok.\n\r", ch);
    return;
}

/*
 * spell_holy_sight()
 *
 * Good effect, target can see 'everything'
 */
void spell_holy_sight (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if (is_affected (victim, sn))
    {
        if (victim == ch)
            send_to_char ("You already have true sight.\n\r", ch);
        else
            act ("$N already has true sight.", ch, NULL, victim, TO_CHAR);
        return;
    }

    af.where = TO_AFFECTS;
    af.type = sn;
    af.level = level;
    af.duration = level / 3;
    af.location = APPLY_NONE;
    af.modifier = 0;
    af.bitvector = AFF_DETECT_HIDDEN;
    affect_to_char (victim, &af);
    af.bitvector = AFF_DETECT_INVIS;
    affect_to_char (victim, &af);
    af.bitvector = AFF_DETECT_MAGIC;
    affect_to_char (victim, &af);
    af.bitvector = AFF_DETECT_GOOD;
    affect_to_char (victim, &af);
    af.bitvector = AFF_DETECT_EVIL;
    affect_to_char (victim, &af);
    af.bitvector = AFF_DARK_VISION;
    affect_to_char (victim, &af);
    af.bitvector = AFF_INFRARED;
    affect_to_char (victim, &af);

    send_to_char ("Your sight becomes true.\n\r", victim);
    if (ch != victim)
        send_to_char ("Ok.\n\r", ch);
    return;
}


/*
 * spell_rejuvination()
 *
 * Good effect spell, victim heals 1000x faster
 */
void spell_rejuvination (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if (IS_AFFECTED2 (victim, AFF2_REJUVINATION))
    {
        if (victim == ch)
            send_to_char ("You body is already rejuvinating\n\r", ch);
        else
            act ("$N's body is already rejuvinating!", ch, NULL, victim, TO_CHAR);
        return;
    }
    af.where = TO_AFFECTS2;
    af.type = sn;
    af.level = level;
    af.duration = level;
    af.modifier = 0;
    af.location = APPLY_NONE;
    af.bitvector = AFF2_REJUVINATION;
    affect_to_char (victim, &af);
    send_to_char ("Your body regenerates VERY quickly!\n\r", victim);
    if (ch != victim)
        send_to_char ("Ok.\n\r", ch);
    return;
}


/*
 * spell_suppression()
 *
 * Offensive spell, victim's spells and spell based damage do 1/2 damage
 */
void spell_suppression (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if (IS_AFFECTED2 (victim, AFF2_SUPPRESSION))
    {
        if (victim == ch)
            send_to_char ("{RYour magic casting abilities are already suppressed!{\n\r", ch);
        else
            act ("{R$N's magic casting abilities are already suppressed!{", ch, NULL, victim, TO_CHAR);
        return;
    }
    af.where = TO_AFFECTS2;
    af.type = sn;
    af.level = level;
    af.duration = number_range(1, 3);
    af.modifier = 0;
    af.location = APPLY_NONE;
    af.bitvector = AFF2_SUPPRESSION;
    affect_to_char (victim, &af);
    send_to_char ("{RYou feel your magical abilities suppressed!{x\n\r", victim);
    if (ch != victim)
        send_to_char ("{ROk. Target is suppressed\n\r", ch);
    return;
}

/*
 * spell_word_of_god()
 *
 * Medium level holy damage spell.
 * 3x damage is victim is evil.
 * Note: Some serious damage to evil creatures at high levels
 */
void spell_word_of_god (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    int i = ch->level / 20;
    int dam;

    while (i != 0)
    {
        dam = dice(10, 20);
        dam *= ch->level / 20;
        
        if (victim->alignment <= -250)
            dam *= 3;
        
        damage (ch, (CHAR_DATA *) vo, dam, sn, DAM_HOLY, TRUE, TRUE);
        i--;
    }
    return;
}

/*
 * spell_bark_skin()
 *
 * Low level, but all level effective defensive spell.
 * lowers AC, and reduces damage slightly
 */
void spell_bark_skin (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if (IS_AFFECTED2 (victim, AFF2_BARK_SKIN))
    {
        if (victim == ch)
            send_to_char ("Your skin is already covered in bark!\n\r", ch);
        else
            act ("$N's skin is already covered in bark!", ch, NULL, victim, TO_CHAR);
        return;
    }
    af.where = TO_AFFECTS2;
    af.type = sn;
    af.level = level;
    af.duration = level;
    af.modifier = -50 * ch->level / 3;
    af.location = APPLY_AC;
    af.bitvector = AFF2_BARK_SKIN;
    affect_to_char (victim, &af);
    send_to_char ("Your body covers itself in a brownish bark.\n\r", victim);
    if (ch != victim)
        send_to_char ("Your body covers itself in a brownish bark.\n\r", victim);
    return;
}


/*
 * spell_fire_storm()
 *
 * Low level fire spell
 */
void spell_fire_storm (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    int i = level / 25;
    int dam;


    while (i > 0)
    {
        dam = fix_spell_damage(level, i);
        if (!IS_NPC(ch))
            dam = dam * ch->pcdata->learned[skill_lookup("fire storm")] / 100;
        
        i--;
        damage (ch, (CHAR_DATA *) vo, dam, sn, DAM_FIRE, TRUE, TRUE);
    
        if (!saves_spell (level, ch, DAM_FIRE))
            fire_effect ((void *) ch, level / 2, dam, TARGET_CHAR);
    }
    return;
}

/*
 * spell_brushfire()
 *
 * mid level fire spell
 */
void spell_brushfire (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    int i = level / 33;
    int dam;

    while (i > 0)
    {

        dam = fix_spell_damage(level + 20, i);
        if (!IS_NPC(ch))
            dam = dam * ch->pcdata->learned[skill_lookup("brushfire")] / 100;
        
        i--;
        damage (ch, (CHAR_DATA *) vo, dam, sn, DAM_FIRE, TRUE, TRUE);
    
        if (!saves_spell (level, ch, DAM_FIRE))
            fire_effect ((void *) ch, level / 2, dam, TARGET_CHAR);
    }
    return;
}

/*
 * spell_divinity()
 *
 * Mid/Low level damage spell for White magic.
 * Does multiple damage types.
 * FIXME: Damage
 */
void spell_divinity (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    int i = 3;
    int dam;

    while (i != 0)
    {
        dam = fix_spell_damage(level + 100, i);
        if (!IS_NPC(ch))
            dam = dam * ch->pcdata->learned[skill_lookup("divinity")] / 100;
        
        damage (ch, (CHAR_DATA *) vo, dam, sn, DAM_HARM, TRUE, TRUE);
        i--;
    }
    return;
}

/*
 * spell_sun_ritual()
 *
 * Mid-level White magic defensive spell.
 * cuts all damage by 1/3
 */
void spell_sun_ritual (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if (IS_AFFECTED2 (victim, AFF2_SUN_RITUAL))
    {
        if (victim == ch)
            send_to_char ("You are already basking in the sunlight!\n\r", ch);
        else
            act ("$N is already basking in the sunlight!", ch, NULL, victim, TO_CHAR);
        return;
    }
    af.where        = TO_AFFECTS2;
    af.type         = sn;
    af.level        = level;
    af.duration     = level * 5;
    af.modifier     = -500;
    af.location     = APPLY_AC;
    af.bitvector    = AFF2_BARK_SKIN;
    affect_to_char (victim, &af);
    send_to_char ("You begin basking in the sunlight.\n\r", victim);
    if (ch != victim)
        send_to_char ("You begin basking in the sunlight.\n\r", victim);
    return;
}

/*
 * spell_earthquake()
 *
 * Low/mid level area effect spell
 * Useful most levels
 */
void spell_earthquake (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *vch;
    CHAR_DATA *vch_next;
    int dam;

    send_to_char ("The earth trembles beneath your feet!\n\r", ch);
    act ("$n makes the earth tremble and shiver.", ch, NULL, NULL, TO_ROOM);

    for (vch = char_list; vch != NULL; vch = vch_next)
    {
        vch_next = vch->next;
        if (vch->in_room == NULL)
            continue;
        if (vch->in_room == ch->in_room)
        {
            if (vch != ch && !is_safe_spell (ch, vch, TRUE))
            {

                dam = fix_spell_damage(level, 1);
                if (!IS_NPC(ch))
                    dam = dam * ch->pcdata->learned[skill_lookup("earthquake")] / 100;

                if (IS_AFFECTED (vch, AFF_FLYING))
                    damage (ch, vch, 0, sn, DAM_BASH, TRUE, TRUE);
                else
                    damage (ch, vch, dam, sn, DAM_BASH, TRUE, TRUE);
            }
            continue;
        }

        if (vch->in_room->area == ch->in_room->area)
            send_to_char ("The earth trembles and shivers.\n\r", vch);
    }

    return;
}

/*
 * spell_hurricane()
 *
 * Low/mid level area effect spell
 * Useful most levels
 * Answer to earthquake
 */
void spell_hurricane (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *vch;
    CHAR_DATA *vch_next;
    int dam;
    
    send_to_char ("The skies turn black and a hurricane appears!\n\r", ch);
    act ("$n makes the skies turn black and a hurricane appears.", ch, NULL, NULL, TO_ROOM);

    for (vch = char_list; vch != NULL; vch = vch_next)
    {
        vch_next = vch->next;
        if (vch->in_room == NULL)
            continue;
        if (vch->in_room == ch->in_room)
        {
            if (vch != ch && !is_safe_spell (ch, vch, TRUE))
            {
                dam = fix_spell_damage(level, 1);
                if (!IS_NPC(ch))
                    dam = dam * ch->pcdata->learned[skill_lookup("hurricane")] / 100;
                
                if (!IS_AFFECTED (vch, AFF_FLYING))
                    damage (ch, vch, 0, sn, DAM_BASH, TRUE, TRUE);
                else
                    damage (ch, vch, dam, sn, DAM_BASH, TRUE, TRUE);
            }
            continue;
        }

        if (vch->in_room->area == ch->in_room->area)
            send_to_char ("The skies scream in a raging hurricane!\n\r", vch);
    }

    return;
}

/*
 * spell_wall_of_ice()
 *
 * Mid level defensive spell, yet another sanct
 */
void spell_wall_of_ice (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if (IS_AFFECTED2 (victim, AFF2_WALL_OF_ICE))
    {
        if (victim == ch)
            send_to_char ("You already have a wall of ice surrounding you!\n\r", ch);
        else
            act ("$N already has a wall of ice surrounding them!", ch, NULL, victim, TO_CHAR);
        return;
    }
    af.where = TO_AFFECTS2;
    af.type = sn;
    af.level = level;
    af.duration = level;
    af.modifier = -50 * ch->level / 4;
    af.location = APPLY_AC;
    af.bitvector = AFF2_WALL_OF_ICE;
    affect_to_char (victim, &af);
    send_to_char ("You surround yourself in a wall of ice.\n\r", victim);
    if (ch != victim)
        send_to_char ("Ok.\n\r", ch);
    return;
}

/*
 * spell_sanctify()
 *
 * Sanctify is a low level anti-PK spell.
 */
void spell_sanctify (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if (is_affected (victim, sn))
    {
        if (victim == ch)
            send_to_char ("You are already sanctified.\n", ch);
        else
            act ("$N is already sanctified.", ch, NULL, victim, TO_CHAR);
        return;
    }

    af.where        = TO_AFFECTS;
    af.type         = sn;
    af.level        = level;
    af.duration     = level;
    af.location     = APPLY_NONE;
    af.modifier     = 0;
    af.bitvector    = AFF_SANCTIFY;
    affect_to_char (victim, &af);
    act ("$n's aura becomes serene.", victim, NULL, NULL, TO_ROOM);
    send_to_char ("You become serene as the effects of sanctity take over.\n", victim);
    return;
}

/*
 * spell_replenish()
 *
 * Highest level cure spell. Heals all in the room to max health/mana/move
 * and removes some bad effects.
 */
void spell_replenish (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *vch_next;
    CHAR_DATA *vch;
    AFFECT_DATA af;

    for (vch = ch->in_room->people; vch != NULL; vch = vch_next)
    {
        vch_next = vch->next_in_room;
        
        if (vch == ch)
            continue;
    
        vch->hit        = vch->max_hit;
        vch->mana       = vch->max_mana;
        vch->move       = vch->max_move;
        update_pos (vch);
        send_to_char ("Your body completely regenrates itself!\n", vch);
    }
    
    af.where        = TO_AFFECTS2;
    af.type         = sn;
    af.level        = level;
    af.duration     = 5;
    af.location     = AFF2_REPLENISH;
    af.modifier     = 0;
    af.bitvector    = 0;
    affect_to_char (ch, &af);
    
    stc("You feel drained...\n", ch);
    stc("You will be able to replenish again in 5 hours.\n", ch);

    return;
}

/*
 * spell_grudge()
 *
 * Mid/Low level damage spell for White magic.
 * Does multiple damage types.
 * FIXME: Count + Damage mods
 */
void spell_grudge (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    int i = 6;
    int dam;
    int type;
    while (i != 0)
    {
        dam = fix_spell_damage(level + 50, i);
        if (!IS_NPC(ch))
            dam = dam * ch->pcdata->learned[skill_lookup("grudge")] / 100;
    
        type = number_range(1, 19);
        damage (ch, (CHAR_DATA *) vo, dam, sn, type, TRUE, TRUE);
        i--;
    }
    return;
}

/*
 * spell_malady()
 *
 * Vulgar offensive enchantment
 * Target cannot heal.
 */
void spell_malady (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if (IS_AFFECTED2 (victim, AFF2_MALADY))
    {
        if (victim == ch)
            send_to_char ("Your body is already effected by an unknown malady!\n\r", ch);
        else
            act ("$N's body is already effected by an unknown malady!", ch, NULL, victim, TO_CHAR);
        return;
    }
    af.where = TO_AFFECTS2;
    af.type = sn;
    af.level = level;
    af.duration = number_range(1, 3);
    af.modifier = 0;
    af.location = APPLY_NONE;
    af.bitvector = AFF2_MALADY;
    affect_to_char (victim, &af);
    send_to_char ("{mYour body feels strange. You feel sickly.\n\r", victim);
    if (ch != victim)
        send_to_char ("Ok.\n\r", ch);
    return;
}