exodus2/
exodus2/area/mobscr/
exodus2/area/mobvoc/
exodus2/bin/
exodus2/clans/
exodus2/gods/
exodus2/player/A/
exodus2/player/B/
exodus2/player/D/
exodus2/player/E/
exodus2/player/L/
exodus2/player/M/
exodus2/player/O/
exodus2/player/R/
exodus2/src/obj/clans/
/* Store Reaver Specific Stuff Here! */
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <malloc.h>
#include <sys/stat.h>
#include <stdlib.h>
#include "merc.h"
#include "recycle.h"
#include "lookup.h"
#include "tables.h"
#include "obj_trig.h"

//Iblis - File originally created and the vast majority of stuff done by Adeon, I just fixed a lot of
//the bugs that he left when he vanished after initially coding them

/* Local Functions */
void sword_upgrade (CHAR_DATA * ch, char *argument);
void sword_status (CHAR_DATA * ch);
void sword_dismiss (CHAR_DATA * ch);
//5-12-03 Iblis - Added to allow the affects of the sword to be viewed
void sword_affects (CHAR_DATA * ch);
//5-11-03 Iblis - Added to correctly computer hit/damroll directly after upgrading
void sword_reequip (CHAR_DATA * ch);

long get_next_cost (OBJ_DATA * sword, int value);
long get_slot_cost (OBJ_DATA * sword, int value);
long get_burst_cost (OBJ_DATA * sword, int value);
AFFECT_DATA *get_hit_affect (OBJ_DATA * sword);
AFFECT_DATA *get_dam_affect (OBJ_DATA * sword);
void upgrade_blade_spell (CHAR_DATA * sword, int type, long cost, int level);
void upgrade_burst_spell (CHAR_DATA * sword, int type, long cost, int level);
char *get_bs_name (int bs);
char *get_bb_name (int burst);
extern bool doub;
extern bool half;
extern bool quad;

/* Burst Invocation Subset */
void invoke_burst (CHAR_DATA * ch, OBJ_DATA * sword, int type);
void invoke_lightning_burst (CHAR_DATA * ch, OBJ_DATA * sword);
void invoke_ice_burst (CHAR_DATA * ch, OBJ_DATA * sword);
void invoke_fire_burst (CHAR_DATA * ch, OBJ_DATA * sword);
void invoke_unholy_burst (CHAR_DATA * ch, OBJ_DATA * sword);
void invoke_hellscape_burst (CHAR_DATA * ch, OBJ_DATA * sword);



/* This determines the number of souls gained per kill */
int compute_soul_gain (CHAR_DATA * ch, CHAR_DATA * victim)
{
	int gain;
	int level_value;
	int align_deviation;
	int align_penalty;
	int vict_align_diff;

	if (IS_SET(victim->act2,ACT_NO_ALIGN))
		return 0;
	align_penalty = ch->alignment + 1000;
	vict_align_diff = 1000 - victim->alignment;

	align_deviation = (vict_align_diff + align_penalty);
	level_value = (victim->level);

	gain = level_value - (align_deviation / 30);
	gain += ch->exp % 7;		/*randomize it a bit */

	if (gain < 0)
		gain = 1;			/*1 at least */
	if (doub)
		gain *= 1.5;
	else if (quad)
		gain *= 2;
	else if (half)
		gain *= .7;

	return gain;
}


void do_sword (CHAR_DATA * ch, char *argument)
{
	char buf[MAX_STRING_LENGTH];
	char arg1[MAX_STRING_LENGTH];
	char arg2[MAX_STRING_LENGTH];

	if (!IS_CLASS (ch, PC_CLASS_REAVER) || IS_NPC (ch))
	{
		send_to_char ("Only reavers may perform this operation.\n\r", ch);
		return;
	}

	if ((get_eq_char (ch, WEAR_WIELD_L) == NULL &&
		get_eq_char (ch, WEAR_WIELD_R) == NULL) ||  get_obj_wear (ch, "reaver sword") == NULL)

	{
		send_to_char ("You do not currently possess your sword.\n\r", ch);
		return;
	}

	argument = one_argument (argument, arg1);
	argument = one_argument (argument, arg2);

	if (!str_cmp (arg1, "status"))
	{
		sword_status (ch);
		return;
	}

	if (!str_cmp (arg1, "upgrade"))
	{
		sword_upgrade (ch, arg2);
		return;
	}

	if (!str_cmp (arg1, "dismiss"))
	{
		sword_dismiss (ch);
		return;
	}
	//Iblis 5/12/03 - Needed for sword_affects
	if (!str_cmp (arg1, "affects"))
	{
		sword_affects (ch);
		return;
	}

	sprintf(buf, "Sword options for %s:\n\r\n\r", ch->sword->short_descr);
	send_to_char(buf, ch);
	send_to_char("  sword status  - check soul energies and blade spells on your weapon\n\r", ch);
	//Iblis 5/12/03 - self-explanatory
	send_to_char("  sword affects - check the chants active on your weapon\n\r", ch);
	send_to_char("  sword upgrade - enhance your sword\n\r", ch);
	send_to_char("  sword dismiss - dismiss your sword for later recall\n\r", ch);
	return;



}

void sword_upgrade (CHAR_DATA * ch, char *argument)
{
	long cost_power;
	long cost_hatred;
	long cost_fury;
	long cost_strength;
	long cost_shocking_blade;
	long cost_frost_blade;
	long cost_flaming_blade;
	long cost_chaotic_blade;
	long cost_venemous_blade;
	long cost_vampiric_blade;
	long cost_apathy_blade;
	long cost_lightning_burst;
	long cost_ice_burst;
	long cost_fire_burst;
	long cost_unholy_burst;
	long cost_hellscape_burst;
	char buf[MAX_STRING_LENGTH];

	int level_to_use;

	AFFECT_DATA *paf;

	cost_power = get_next_cost (ch->sword, BLADE_POWER);
	cost_hatred = get_next_cost (ch->sword, BLADE_HATRED);
	cost_fury = get_next_cost (ch->sword, BLADE_FURY);
	cost_strength = get_next_cost (ch->sword, BLADE_STRENGTH);

	cost_shocking_blade = get_slot_cost (ch->sword, BLADE_SPELL_SHOCKING);
	cost_frost_blade = get_slot_cost (ch->sword, BLADE_SPELL_FROST);
	cost_flaming_blade = get_slot_cost (ch->sword, BLADE_SPELL_FLAMING);
	cost_chaotic_blade = get_slot_cost (ch->sword, BLADE_SPELL_CHAOTIC);
	cost_venemous_blade = get_slot_cost (ch->sword, BLADE_SPELL_VENEMOUS);
	cost_vampiric_blade = get_slot_cost (ch->sword, BLADE_SPELL_VAMPIRIC);
	cost_apathy_blade = get_slot_cost (ch->sword, BLADE_SPELL_APATHY);

	cost_lightning_burst = get_burst_cost (ch->sword, BURST_LIGHTNING);
	cost_ice_burst = get_burst_cost (ch->sword, BURST_ICE);
	cost_fire_burst = get_burst_cost (ch->sword, BURST_FIRE);
	cost_unholy_burst = get_burst_cost (ch->sword, BURST_UNHOLY);
	cost_hellscape_burst = get_burst_cost (ch->sword, BURST_HELLSCAPE);

	if (!IS_SET (ch->in_room->room_flags, ROOM_SHRINE))
	{
		send_to_char ("You may only do this at a dark shrine.\n\r", ch);
		return;
	}

	if (!str_cmp (argument, "power"))
	{
		if (ch->pcdata->souls < cost_power)
		{
			send_to_char("`aYou do not possess enough soul energy to upgrade power.``\n\r",	ch);
			return;
		}

		sprintf (buf, "`aYou submit `b%ld `asouls to the dark lord.``\n\r",	cost_power);
		send_to_char (buf, ch);
		send_to_char ("`iYour blade has increased in power!``\n\r", ch);
		ch->pcdata->souls -= cost_power;
		ch->sword->value[2]++;

		//5-10-03 Iblis - One of the lines of another dam/hitroll reaver bug..
		//update_sword(ch,ch->sword);
		//5-11-03 Iblis - Added so that hit/damroll would be computed directly after update
		sword_reequip (ch);
		return;
	}

	if (!str_cmp (argument, "hatred"))
	{
		if (ch->pcdata->souls < cost_hatred)
		{
			send_to_char("`aYou do not possess enough soul energy to upgrade hatred.``\n\r", ch);
			return;
		}

		sprintf (buf, "`aYou submit `b%ld `asouls to the dark lord.``\n\r",	cost_hatred);
		send_to_char (buf, ch);
		send_to_char ("`iYour blade has increased in hatred!``\n\r", ch);
		ch->pcdata->souls -= cost_hatred;
		ch->sword->value[1]++;

		//5-10-03 Iblis - One of the lines of another dam/hitroll reaver bug
		//update_sword(ch, ch->sword);
		//5-11-03 Iblis - Added so that hit/damroll would be computed directly after update
		sword_reequip (ch);
		return;
	}


	if (!str_cmp (argument, "fury"))
	{
		if (ch->pcdata->souls < cost_fury)
		{
			send_to_char("`aYou do not possess enough soul energy to upgrade fury.``\n\r", ch);
			return;
		}

		sprintf (buf, "`aYou submit `b%ld `asouls to the dark lord.``\n\r",	cost_fury);
		send_to_char (buf, ch);
		send_to_char ("`iYour blade has increased in fury!``\n\r", ch);
		ch->pcdata->souls -= cost_fury;


		if ((paf = get_hit_affect (ch->sword)) != NULL)
		{
			paf->type = 1;
			paf->modifier += 1;
			paf->level = UMAX (paf->level, ch->level);
			if (paf->modifier > 4)
				SET_BIT (ch->sword->extra_flags[0], ITEM_HUM);
		}
		else
		{			/* If we don't have any fury yet... */

			paf = new_affect ();
			paf->where = TO_OBJECT;
			paf->type = 1;
			paf->level = ch->level;
			paf->duration = -1;
			paf->location = APPLY_HITROLL;
			paf->modifier = 1;
			paf->bitvector = 0;
			paf->permaff = TRUE;
			paf->composition = FALSE;
			paf->comp_name = str_dup ("");
			paf->next = ch->sword->affected;
			ch->sword->affected = paf;
		}

		//5-10-03 Iblis - One of the lines of anohter dam/hitroll reaver bug
		//update_sword(ch, ch->sword);
		//5-11-03 Iblis - Added so that hit/damroll would be computed directly after update
		sword_reequip (ch);
		return;
	}

	if (!str_cmp (argument, "strength"))
	{
		if (ch->pcdata->souls < cost_strength)
		{
			send_to_char("`aYou do not possess enough soul energy to upgrade strength.``\n\r", ch);
			return;
		}

		sprintf (buf, "`aYou submit `b%ld `asouls to the dark lord.``\n\r",	cost_strength);
		send_to_char (buf, ch);
		send_to_char ("`iYour blade has increased in strength!``\n\r", ch);
		ch->pcdata->souls -= cost_strength;


		if ((paf = get_dam_affect (ch->sword)) != NULL)
		{
			paf->type = 1;
			paf->modifier += 1;
			paf->level = UMAX (paf->level, ch->level);
			if (paf->modifier > 4)
				SET_BIT (ch->sword->extra_flags[0], ITEM_HUM);
		}
		else
		{			/* If we don't have any strength yet... */

			paf = new_affect ();
			paf->where = TO_OBJECT;
			paf->type = 1;
			paf->level = ch->level;
			paf->duration = -1;
			paf->location = APPLY_DAMROLL;
			paf->modifier = 1;
			paf->bitvector = 0;
			paf->permaff = TRUE;
			paf->composition = FALSE;
			paf->comp_name = str_dup ("");
			paf->next = ch->sword->affected;
			ch->sword->affected = paf;
		}

		//5-10-03 Iblis - One of the lines of anohter dam/hitroll reaver bug
		//update_sword(ch, ch->sword);
		//5-11-03 Iblis - Added so that hit/damroll would be computed directly after update
		sword_reequip (ch);
		return;
	}

	if (!str_cmp (argument, "knightsblade"))
	{
		if (ch->level < 40)
		{
			send_to_char("You are not advanced enough to upgrade to a chaotic edge.\n\r", ch);
			return;
		}

		if (IS_SET (ch->sword->value[4], WEAPON_LANCE))
		{
			send_to_char ("You sword is already a KnightsBlade.\n\r", ch);
			return;
		}

		if (ch->pcdata->souls < 10000)
		{
			send_to_char("You do not posses enough soul energy to upgrade to a KnightsBlade.\n\r", ch);
			return;
		}
		//IBlis 7/29/03 Fixed bug that knightsblade is FREE
		ch->pcdata->souls -= 10000;
		SET_BIT (ch->sword->value[4], WEAPON_LANCE);

		send_to_char("`aYou submit `b10000`` `asouls to the dark lord.``\n\r", ch);
		send_to_char("`aYour blade seems to grow in length.``\n\r", ch);
		//5-11-03 Iblis - Added so that the lance flag is immediately added
		sword_reequip (ch);
		//update_sword(ch, ch->sword);

		return;
	}



	if (!str_cmp (argument, "shocking"))
	{
		level_to_use = 7;
		upgrade_blade_spell (ch, BLADE_SPELL_SHOCKING, cost_shocking_blade,	level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	if (!str_cmp (argument, "frost"))
	{
		level_to_use = 21;
		upgrade_blade_spell (ch, BLADE_SPELL_FROST, cost_frost_blade, level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	if (!str_cmp (argument, "apathy"))
	{
		level_to_use = 31;
		upgrade_blade_spell (ch, BLADE_SPELL_APATHY, cost_apathy_blade, level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	if (!str_cmp (argument, "flaming"))
	{
		level_to_use = 35;
		upgrade_blade_spell (ch, BLADE_SPELL_FLAMING, cost_flaming_blade, level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	if (!str_cmp (argument, "chaotic"))
	{
		level_to_use = 49;
		upgrade_blade_spell (ch, BLADE_SPELL_CHAOTIC, cost_chaotic_blade, level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	if (!str_cmp (argument, "venomous"))
	{
		level_to_use = 63;
		upgrade_blade_spell (ch, BLADE_SPELL_VENEMOUS, cost_venemous_blade, level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	if (!str_cmp (argument, "vampiric"))
	{
		level_to_use = 70;
		upgrade_blade_spell (ch, BLADE_SPELL_VAMPIRIC, cost_vampiric_blade, level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	if (!str_cmp (argument, "lightning"))
	{
		level_to_use = 14;
		upgrade_burst_spell (ch, BURST_LIGHTNING, cost_lightning_burst, level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	if (!str_cmp (argument, "ice"))
	{
		level_to_use = 28;
		upgrade_burst_spell (ch, BURST_ICE, cost_ice_burst, level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	if (!str_cmp (argument, "fire"))
	{
		level_to_use = 42;
		upgrade_burst_spell (ch, BURST_FIRE, cost_fire_burst, level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	if (!str_cmp (argument, "unholy"))
	{
		level_to_use = 56;
		upgrade_burst_spell (ch, BURST_UNHOLY, cost_unholy_burst, level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	if (!str_cmp (argument, "hellscape"))
	{
		level_to_use = 77;
		upgrade_burst_spell (ch, BURST_HELLSCAPE, cost_hellscape_burst,	level_to_use);
		update_sword (ch, ch->sword);
		return;
	}

	send_to_char ("`aUpgrades available       Cost``\n\r", ch);
	sprintf (buf, "  `ePower               `b%6ld`hSE``\n\r", cost_power);
	send_to_char (buf, ch);
	sprintf (buf, "  `eHatred              `b%6ld`hSE``\n\r", cost_hatred);
	send_to_char (buf, ch);
	sprintf (buf, "  `eFury                `b%6ld`hSE``\n\r", cost_fury);
	send_to_char (buf, ch);
	sprintf (buf, "  `eStrength            `b%6ld`hSE``\n\r", cost_strength);
	send_to_char (buf, ch);
	if (ch->level >= 40 && !IS_WEAPON_STAT (ch->sword, WEAPON_LANCE))
	{
		sprintf (buf, "  `eKnightsblade        `b%6d`hSE``\n\r", 10000);
		send_to_char (buf, ch);
	}
	if (ch->level >= 7)
	{
		sprintf (buf, "  `eShocking Blade      `b%6ld`hSE``\n\r", cost_shocking_blade);
		send_to_char (buf, ch);
	}
	if (ch->level >= 21)
	{
		sprintf (buf, "  `eFrost Blade         `b%6ld`hSE``\n\r", cost_frost_blade);
		send_to_char (buf, ch);
	}
	if (ch->level >= 31 && is_class_tiers(ch,PC_CLASS_REAVER,2))
	{
		sprintf (buf, "  `eApathy Blade        `b%6ld`hSE``\n\r", cost_apathy_blade);
		send_to_char (buf, ch);
	}
	if (ch->level >= 35 && is_class_tiers(ch,PC_CLASS_REAVER,2))
	{
		sprintf (buf, "  `eFlaming Blade       `b%6ld`hSE``\n\r", cost_flaming_blade);
		send_to_char (buf, ch);
	}
	if (ch->level >= 49 && is_class_tiers(ch,PC_CLASS_REAVER,2))
	{
		sprintf (buf, "  `eChaotic Blade       `b%6ld`hSE``\n\r", cost_chaotic_blade);
		send_to_char (buf, ch);
	}
	if (ch->level >= 63 && is_class_tiers(ch,PC_CLASS_REAVER,3))
	{
		sprintf (buf, "  `eVenomous Blade      `b%6ld`hSE``\n\r", cost_venemous_blade);
		send_to_char (buf, ch);
	}
	if (ch->level >= 70 && is_class_tiers(ch,PC_CLASS_REAVER,3))
	{
		sprintf (buf, "  `eVampiric Blade      `b%6ld`hSE``\n\r", cost_vampiric_blade);
		send_to_char (buf, ch);
	}
	if (ch->level >= 14)
	{
		sprintf (buf, "  `eLightning Burst     `b%6ld`hSE``\n\r", cost_lightning_burst);
		send_to_char (buf, ch);
	}
	if (ch->level >= 28)
	{
		sprintf (buf, "  `eIce Burst           `b%6ld`hSE``\n\r", cost_ice_burst);
		send_to_char (buf, ch);
	}
	if (ch->level >= 42 && is_class_tiers(ch,PC_CLASS_REAVER,2))
	{
		sprintf (buf, "  `eFire Burst          `b%6ld`hSE``\n\r", cost_fire_burst);
		send_to_char (buf, ch);
	}
	if (ch->level >= 56 && is_class_tiers(ch,PC_CLASS_REAVER,2))
	{
		sprintf (buf, "  `eUnholy Burst        `b%6ld`hSE``\n\r", cost_unholy_burst);
		send_to_char (buf, ch);
	}
	if (ch->level >= 77 && is_class_tiers(ch,PC_CLASS_REAVER,3))
	{
		sprintf (buf, "  `eHellscape           `b%6ld`hSE``\n\r", cost_hellscape_burst);
		send_to_char (buf, ch);
	}
	return;

}

void upgrade_blade_spell (CHAR_DATA * ch, int type, long cost, int level)
{
	char buf[MAX_STRING_LENGTH];

	if (ch->level < level)
	{
		send_to_char("`aYou are not advanced enough to upgrade that blade spell.``\n\r", ch);
		return;
	}

	if (ch->pcdata->souls < cost)
	{
		send_to_char("`aYou do not possess enough soul energy to upgrade that blade spell.``\n\r", ch);
		return;
	}

	sprintf (buf, "`aYou submit `b%ld `asouls to the dark lord.``\n\r", cost);
	send_to_char (buf, ch);

	ch->pcdata->souls -= cost;
	ch->sword->bs_capacity[type]++;

	switch (type)
	{
		case BLADE_SPELL_SHOCKING:
			send_to_char("`nYour blade buzzes with additional electric potential.``\n\r", ch);
			break;
		case BLADE_SPELL_FROST:
			send_to_char ("`nYour blade becomes more cool to the touch.``\n\r", ch);
			break;
		case BLADE_SPELL_FLAMING:
			send_to_char ("`iYour blade flickers with a glowing flame.``\n\r", ch);
			break;
		case BLADE_SPELL_CHAOTIC:
			send_to_char("`aYour blade glints a chaotic gleam in the light.``\n\r", ch);
			break;
		case BLADE_SPELL_VENEMOUS:
			send_to_char("`fThe edges of your blade glisten with a venomous coating.``\n\r", ch);
			break;
		case BLADE_SPELL_VAMPIRIC:
			send_to_char ("`aA horrendous howl eminates from your blade.``\n\r", ch);
			break;
		case BLADE_SPELL_APATHY:
			send_to_char ("`aA dark shroud envelops your blade.``\n\r",ch);
			break;
	}

	return;
}

void upgrade_burst_spell (CHAR_DATA * ch, int type, long cost, int level)
{
	char buf[MAX_STRING_LENGTH];

	if (ch->level < level)
	{
		send_to_char("`aYou are not advanced enough to upgrade that burst spell.``\n\r", ch);
		return;
	}

	if (ch->pcdata->souls < cost)
	{
		send_to_char("`aYou do not possess enough soul energy to upgrade that burst spell.``\n\r", ch);
		return;
	}

	sprintf (buf, "`aYou submit `b%ld `asouls to the dark lord.``\n\r", cost);
	send_to_char (buf, ch);

	ch->pcdata->souls -= cost;
	ch->sword->bb_capacity[type]++;

	switch (type)
	{
		case BURST_LIGHTNING:
			send_to_char ("`nStatic charges crackle along your blade.``\n\r", ch);
			break;
		case BURST_ICE:
			send_to_char ("`nYour blade briefly sparkles with frost.``\n\r", ch);
			break;
		case BURST_FIRE:
			send_to_char ("`iYour balde glows red with fiery power.``\n\r", ch);
			break;
		case BURST_UNHOLY:
			send_to_char ("`aYour blade takes on an eerie unholy glow.``\n\r", ch);
			break;
		case BURST_HELLSCAPE:
			send_to_char ("`aYour blade roars with hells fury!``\n\r", ch);
			break;
	}

	return;
}

void sword_status (CHAR_DATA * ch)
{
	char buf[MAX_STRING_LENGTH];
	int i;

	switch(ch->pcdata->souls)
	{
		case 0:
			send_to_char("`aThere are currently `bno `asoul energies stored in your blade.``\n\r", ch);
			break;

		case 1:
			send_to_char("`aThere is currently `b1 `asoul energy stored in your blade.``\n\r", ch);
			break;

		default:
			sprintf(buf, "`aThere are currently `b%ld `asoul energies stored in your blade.``\n\r", ch->pcdata->souls);
			send_to_char (buf, ch);
			break;
	}

	for (i = 0; i < MAX_BLADE_SPELLS; i++)
	{
		if (ch->sword->bs_capacity[i] > 0)
		{
			sprintf (buf, "`aYou have `b%d `aout of a possible `b%d `aspells of %s blade.``\n\r",
				ch->sword->bs_charges[i], ch->sword->bs_capacity[i],
				get_bs_name (i));
			send_to_char (buf, ch);
		}
	}

	for (i = 0; i < MAX_BURST; i++)
	{
		if (ch->sword->bb_capacity[i] > 0)
		{
			sprintf (buf, "`aYou have `b%d `aout of a possible `b%d `aspells of %s.``\n\r",
				ch->sword->bb_charges[i], ch->sword->bb_capacity[i],
				get_bb_name (i));
			send_to_char (buf, ch);
		}
	}

	return;
}

void sword_dismiss (CHAR_DATA * ch)
{
	OBJ_DATA *sword;
	char buf[MAX_STRING_LENGTH];

	if ((sword = get_obj_wear (ch, "reaver sword")) == NULL)
	{
		send_to_char ("You do not currently possess your sword.\n\r", ch);
		return;
	}

	sprintf (buf, "`a%s `adissapears in a puff of black smoke.``\n\r", sword->short_descr);
	send_to_char (buf, ch);
	act("`a$n utters the dark words of return, making the sword vanish in a puff of black smoke.``", ch, NULL, NULL, TO_ROOM);
	unequip_char (ch, sword);
	obj_from_char (sword);
	extract_obj (sword);
	reset_char (ch);
	return;
}


//Iblis 5/12/03 - Added a function that allows a reaver to see the affects on their weapon
//as well as how long the affect lasts for
void sword_affects (CHAR_DATA * ch)
{
	char buf[MAX_STRING_LENGTH];
	OBJ_DATA *sword;
	AFFECT_DATA *paf;
	bool affected = 0;
	if ((sword = get_obj_wear (ch, "reaver sword")) == NULL)
	{
		send_to_char ("You do not currently possess your sword.\n\r", ch);
		return;
	}
	if (sword->affected == NULL)
		send_to_char ("`aYour blade currently has no flags on it.\n\r", ch);
	for (paf = sword->affected; paf != NULL; paf = paf->next)
	{
		if (paf->bitvector)
		{
			if (paf->where == TO_WEAPON)
			{
				affected = 1;
				if (paf->duration == 1)
					sprintf (buf, "`aYour blade has the`b %s `aflag for`b %d `ahour.``\n",
					weapon_bit_name (paf->bitvector), paf->duration);
				else
					sprintf (buf, "`aYour blade has the`b %s `aflag for`b %d `ahours.``\n",
					weapon_bit_name (paf->bitvector), paf->duration);
			}
			else
				sprintf (buf, "`aUnknown bit`b %d: %d\n\r", paf->where,
				paf->bitvector);
			send_to_char (buf, ch);
		}
	}
	if (!affected)
		send_to_char ("`aYour blade currently has no flags on it.``\n\r", ch);
}



long get_next_cost (OBJ_DATA * sword, int value)
{
	long cost;
	int i;
	AFFECT_DATA *paf;
	int mod;

	switch (value)
	{
		case BLADE_POWER:
			cost = 8;			/*initial value */
			for (i = 1; i < sword->value[2]; i++)
				cost *= 2;
			break;

		case BLADE_HATRED:
			cost = 16;
			for (i = 1; i < sword->value[1]; i++)
				cost *= 4;
			break;

		case BLADE_FURY:
			paf = get_hit_affect (sword);
			if (paf == NULL)
				mod = 0;
			else
				mod = paf->modifier;
			cost = 8;
			for (i = 0; i < mod; i++)
				cost *= 2;
			break;

		case BLADE_STRENGTH:
			paf = get_dam_affect (sword);
			if (paf == NULL)
				mod = 0;
			else
				mod = paf->modifier;
			cost = 9;
			for (i = 0; i < mod; i++)
				cost *= 3;
			break;

		default:
			cost = 0;
			break;
	}

	return cost;
}

long get_slot_cost (OBJ_DATA * sword, int value)
{
	long cost=0;
	int i;

	switch (value)
	{
		case BLADE_SPELL_SHOCKING:
			cost = 100;
			for (i = 0; i < sword->bs_capacity[value]; i++)
				cost += 200;
			break;
		case BLADE_SPELL_FROST:
			cost = 200;
			for (i = 0; i < sword->bs_capacity[value]; i++)
				cost += 300;
			break;
		case BLADE_SPELL_FLAMING:
			cost = 300;
			for (i = 0; i < sword->bs_capacity[value]; i++)
				cost += 400;
			break;
		case BLADE_SPELL_CHAOTIC:
			cost = 600;
			for (i = 0; i < sword->bs_capacity[value]; i++)
				cost += 500;
			break;
		case BLADE_SPELL_VENEMOUS:
			cost = 900;
			for (i = 0; i < sword->bs_capacity[value]; i++)
				cost += 600;
			break;
		case BLADE_SPELL_VAMPIRIC:
			cost = 1000;
			for (i = 0; i < sword->bs_capacity[value]; i++)
				cost += 1000;
			break;
		case BLADE_SPELL_APATHY:
			cost = 1000;
			for (i=0; i < sword->bs_capacity[value]; i++)
				cost += 6000;
			break;
	}
	return cost;
}

long get_burst_cost (OBJ_DATA * sword, int value)
{
	long cost=0;
	int i;

	switch (value)
	{
		case BURST_LIGHTNING:
			cost = 1000;
			for (i = 0; i < sword->bb_capacity[value]; i++)
				cost += 1000;
			break;
		case BURST_ICE:
			cost = 2000;
			for (i = 0; i < sword->bb_capacity[value]; i++)
				cost += 2000;
			break;
		case BURST_FIRE:
			cost = 3500;
			for (i = 0; i < sword->bb_capacity[value]; i++)
				cost += 3500;
			break;
		case BURST_UNHOLY:
			cost = 10000;
			for (i = 0; i < sword->bb_capacity[value]; i++)
				cost += 1500;
			break;
		case BURST_HELLSCAPE:
			cost = 20000;
			for (i = 0; i < sword->bb_capacity[value]; i++)
				cost += 2500;
			break;
	}
	return cost;
}


AFFECT_DATA *get_hit_affect (OBJ_DATA * sword)
{
	AFFECT_DATA *paf;

	for (paf = sword->affected; paf != NULL; paf = paf->next)
	{
		if (paf->location == APPLY_HITROLL)
			return paf;
	}

	return NULL;
}



AFFECT_DATA *get_dam_affect (OBJ_DATA * sword)
{
	AFFECT_DATA *paf;

	for (paf = sword->affected; paf != NULL; paf = paf->next)
	{
		if (paf->location == APPLY_DAMROLL)
			return paf;
	}

	return NULL;
}

/*returns the name associated with the blade spell*/
char *get_bs_name (int bs)
{
	char buf[MAX_STRING_LENGTH];

	switch (bs)
	{
		case BLADE_SPELL_SHOCKING:
			sprintf (buf, "shocking");
			break;
		case BLADE_SPELL_FROST:
			sprintf (buf, "frost");
			break;
		case BLADE_SPELL_FLAMING:
			sprintf (buf, "flaming");
			break;
		case BLADE_SPELL_CHAOTIC:
			sprintf (buf, "chaotic");
			break;
		case BLADE_SPELL_VENEMOUS:
			sprintf (buf, "venomous");
			break;
		case BLADE_SPELL_VAMPIRIC:
			sprintf (buf, "vampiric");
			break;
		case BLADE_SPELL_APATHY:
			sprintf (buf, "apathy");
			break;
	}

	return str_dup (buf);
}

char *get_bb_name (int burst)
{
	char buf[MAX_STRING_LENGTH];

	switch (burst)
	{
		case BURST_LIGHTNING:
			sprintf (buf, "lightning burst");
			break;
		case BURST_ICE:
			sprintf (buf, "ice burst");
			break;
		case BURST_FIRE:
			sprintf (buf, "fire burst");
			break;
		case BURST_UNHOLY:
			sprintf (buf, "unholy burst");
			break;
		case BURST_HELLSCAPE:
			sprintf (buf, "hellscape");
			break;
	}

	return str_dup (buf);
}


//5-11-03 Iblis - This is cheap function, consisting of copy/paste of code
//from sword_dimiss and chant summon_sword.  This function allows the updated
//sword to be made and immediately worn by the character.
//ESSENTIALLY this is sword_update plus it remove the old sword, creates an
//updated sword, and make the character wear it.  This is probably what sword_update
//was originally forced to do, but since in several places you can get away with less
//work (IE only the work done in sword_update and not here), I chose to make this a 
//separate function
void sword_reequip (CHAR_DATA * ch)
{
	OBJ_DATA *sword;
	int i;
	sword = get_obj_wear (ch, "reaver sword");
	if (!sword)
	{
		bug ("REAVER SWORD REMOVE BUG",0);
		return;
	}
	unequip_char (ch, sword);
	obj_from_char (sword);
	extract_obj (sword);
	reset_char (ch);
	sword = create_object (get_obj_index (OBJ_VNUM_REAVER_SWORD), 0);
	clone_object (ch->sword, sword);
	for (i = 0; i < MAX_BLADE_SPELLS; i++)
	{
		sword->bs_capacity[i] = ch->sword->bs_capacity[i];
		sword->bs_charges[i] = ch->sword->bs_charges[i];
	}
	obj_to_char (sword, ch);
	switch (ch->pcdata->primary_hand)
	{
		case HAND_LEFT:
			equip_char (ch, sword, WEAR_WIELD_L);
			break;
		default:
			equip_char (ch, sword, WEAR_WIELD_R);
	}
	save_char_obj (ch);
}



void update_sword (CHAR_DATA * ch, OBJ_DATA * sword)
{
	OBJ_DATA *blade;
	int i;

	if (ch->pcdata->primary_hand == HAND_LEFT)
	{
		blade = get_eq_char (ch, WEAR_WIELD_L);
	}
	else
	{
		blade = get_eq_char (ch, WEAR_WIELD_R);
	}

	if (blade == NULL)
		return;

	//5-10-03 Iblis - I believe this to be the line that led to the famount
	//damroll bug, so I'm leaving it in for posterity.  The bug actually is more
	//with clone_object not removing affects from the object you are clonning to.
	//clone_object(sword, blade);

	for (i = 0; i < MAX_BLADE_SPELLS; i++)
	{
		blade->bs_charges[i] = ch->sword->bs_charges[i];
		blade->bs_capacity[i] = ch->sword->bs_capacity[i];
	}
	for (i = 0; i < MAX_BURST; i++)
	{
		blade->bb_charges[i] = ch->sword->bb_charges[i];
		blade->bb_capacity[i] = ch->sword->bb_capacity[i];
	}

	save_char_obj (ch);
}

void do_invoke (CHAR_DATA * ch, char *argument)
{
	OBJ_DATA *sword;
	int skill;
	int i, weapon_number = 1, count = 0;
	short bs;
	char buf[MAX_STRING_LENGTH];
	bool burst = FALSE;

	if (!IS_CLASS (ch, PC_CLASS_REAVER) || IS_NPC (ch))
	{
		send_to_char("Only reavers can practice this art.\n\r", ch);
		return;
	}
	// Iblis 9/13/04 - No Magic flag
	if (IS_SET (ch->in_room->room_flags2, ROOM_NOMAGIC) && !IS_IMMORTAL (ch))
	{
		send_to_char("There are no magical forces to draw power from.\n\r",ch);
		return;
	}


	if (ch->pcdata->primary_hand == HAND_LEFT)
	{
		sword = get_eq_char (ch, WEAR_WIELD_L);
	}
	else
	{
		sword = get_eq_char (ch, WEAR_WIELD_R);
	}

	if (sword == NULL)
	{
		send_to_char ("You do not possess your sword.\n\r", ch);
		return;
	}

	if (ch->alignment > -1)
	{
		send_to_char("You may not invoke the powers of evil when you yourself are not evil.\n\r", ch);
		return;
	}

	if ((skill = get_skill (ch, gsn_invocation)) < 1)
	{
		send_to_char("You are not practiced in that art.\n\r", ch);
		return;
	}

	if (argument[0] == '\0')
	{
		send_to_char("Invoke which blade spell?\n\r", ch);
		return;
	}
	//5-10-30 Iblis - Reavers sometimes have a problem with actually have the burst/blade spells on their blade, but
	//needing an update in order to properly allow them to use them.
	update_sword(ch, ch->sword);

	if (ch->pcdata->reaver_chant != -1)
	{
		send_to_char("You can only invoke one thing at a time.\n\r", ch);
		return;
	}

	if (!str_cmp(argument, "shocking"))
	{
		bs = BLADE_SPELL_SHOCKING;
	}
	else if (!str_cmp(argument, "frost"))
	{
		bs = BLADE_SPELL_FROST;
	}
	else if (!str_cmp(argument, "flaming"))
	{
		bs = BLADE_SPELL_FLAMING;
	}
	else if (!str_cmp(argument, "chaotic"))
	{
		bs = BLADE_SPELL_CHAOTIC;
	}
	else if (!str_cmp(argument, "venomous"))
	{
		bs = BLADE_SPELL_VENEMOUS;
	}
	else if (!str_cmp(argument, "vampiric"))
	{
		bs = BLADE_SPELL_VAMPIRIC;
	}
	else if (!str_cmp(argument, "apathy"))
	{
		bs = BLADE_SPELL_APATHY;
	}
	else if (!str_cmp(argument, "lightning"))
	{
		burst = TRUE;
		bs = BURST_LIGHTNING;
	}
	else if (!str_cmp(argument, "ice"))
	{
		burst = TRUE;
		bs = BURST_ICE;
	}
	else if (!str_cmp(argument, "fire"))
	{
		burst = TRUE;
		bs = BURST_FIRE;
	}
	else if (!str_cmp(argument, "unholy"))
	{
		burst = TRUE;
		bs = BURST_UNHOLY;
	}
	else if (!str_cmp(argument, "hellscape"))
	{
		burst = TRUE;
		bs = BURST_HELLSCAPE;
	}
	else
	{
		send_to_char("You know no blade spell by that name.\n\r", ch);
		return;
	}

	if (burst && ch->mana < skill_table[gsn_invocation].min_mana)
	{
		send_to_char("You don't have enough mana.\n\r", ch);
		return;
	}
	else if (!burst && ch->mana < 25)
	{
		send_to_char("You don't have enough mana.\n\r", ch);
		return;
	}


	if (!burst)
	{
		if (sword->bs_charges[bs] < 1)
		{
			sprintf (buf, "You have no charges of %s blade stored in %s.\n\r",
				get_bs_name (bs), sword->short_descr);
			send_to_char (buf, ch);
			return;
		}
	}
	else
	{
		if (sword->bb_charges[bs] < 1)
		{
			sprintf (buf, "You have no charges of %s stored in %s.\n\r",
				get_bb_name (bs), sword->short_descr);
			send_to_char (buf, ch);
			return;
		}
	}

	for (i = 1; i <= REAVER_WEAPON_MAX; i++, weapon_number *= 2)
		if (IS_WEAPON_STAT (sword, weapon_number))
			count++;

	if (count >= 2 && !burst)
	{
		send_to_char("You can have up to two active blades spells at a time.\n\r", ch);
		return;
	}



	act("You raise $p into the air, and begin the arcane ritual of invocation.", ch, sword, NULL, TO_CHAR);
	act("$n raises $p into the air, and begins the arcane ritual of invocation.", ch, sword, NULL, TO_ROOM);

	/* chant to do after wait */
	ch->pcdata->reaver_chant = bs;

	/* seconds to wait */
	ch->pcdata->chant_wait = 3;

	if (burst)
		ch->pcdata->reaver_chant -= 100;
	//IBLIS 6/20/03 - Such an unbelievably cheap fix I can't believe I'm putting it in,
	//but its easier than debuggin and finding out why invoke makes reavers pos = standing
	if (ch->mount != NULL)
		ch->position = POS_MOUNTED;
}

void perform_chant(CHAR_DATA * ch)
{

	OBJ_DATA* sword;
	int percent, 
		skill;
	AFFECT_DATA af;
	short bs = ch->pcdata->reaver_chant;
	bool burst = TRUE;
	short gsn = 0;
	int bitvector = 0;

	if( !IS_CLASS(ch, PC_CLASS_REAVER) || IS_NPC(ch) )
	{
		send_to_char("Only reavers can practice this art.\n\r", ch);
		return;
	}


	if(ch->pcdata->primary_hand == HAND_LEFT)
	{
		sword = get_eq_char(ch, WEAR_WIELD_L);
	}
	else
	{
		sword = get_eq_char(ch, WEAR_WIELD_R);
	}

	if (sword == NULL)
	{
		send_to_char ("You do not possess your sword.\n\r", ch);
		return;
	}

	if (bs < 0)
		bs += 100;
	else
		burst = FALSE;

	skill = get_skill(ch, gsn_invocation);

	if( (percent = number_percent()) < skill )
	{
		char buf[20];

		if(!burst)
		{
			af.where = TO_WEAPON;
			af.level = ch->level;
			af.duration = (int) ((ch->level / 2) * (ch->alignment / -1000.0));
			if(af.duration < 1)
				af.duration = 1;
			af.location = 0;
			af.modifier = 0;
			af.permaff = FALSE;
			af.composition = FALSE;
			af.comp_name = str_dup ("");

			sword->bs_charges[bs]--;
			ch->sword->bs_charges[bs]--;	/* ugly but effective */


			switch(bs)
			{
				case BLADE_SPELL_SHOCKING:
					{	
						if (IS_WEAPON_STAT (sword, WEAPON_SHOCKING))
						{
							act ("$p already has an electrical fury.", ch, sword, NULL, TO_CHAR);
							return;
						}
						gsn = skill_lookup ("shocking grasp");
						bitvector = WEAPON_SHOCKING;
						act ("$n invokes an electrical fury upon $p!", ch, sword, NULL, TO_ROOM);
						act ("You successfully invoke an electrical fury upon $p!",	ch, sword, NULL, TO_CHAR);
					}
					break;

				case BLADE_SPELL_FROST:
					{
						if (IS_WEAPON_STAT (sword, WEAPON_FROST))
						{
							act ("$p already has a deadly chill.", ch, sword, NULL, TO_CHAR);
							return;
						}
						gsn = skill_lookup ("chill touch");
						bitvector = WEAPON_FROST;

						act ("$n invokes a deadly chill upon $p!", ch, sword, NULL, TO_ROOM);
						act ("You successfully invoke a deadly chill upon $p!", ch, sword, NULL, TO_CHAR);
					}
					break;

				case BLADE_SPELL_FLAMING:
					{
						if (IS_WEAPON_STAT (sword, WEAPON_FLAMING))
						{
							act ("$p already has an fiery blaze.", ch, sword, NULL, TO_CHAR);
							return;
						}
						gsn = skill_lookup ("fire breath");
						bitvector = WEAPON_FLAMING;

						act ("$n invokes a fiery blaze upon $p!", ch, sword, NULL, TO_ROOM);
						act ("You successfully invoke a fiery blaze upon $p!", ch, sword, NULL, TO_CHAR);
					}
					break;

				case BLADE_SPELL_CHAOTIC:
					{
						if (IS_WEAPON_STAT (sword, WEAPON_SHARP))
						{
							act ("$p already has a chaotic shine.", ch, sword, NULL, TO_CHAR);
							return;
						}
						gsn = 1;
						bitvector = WEAPON_SHARP;

						act ("$n invokes a chaotic shine upon $p!", ch, sword, NULL, TO_ROOM);
						act ("You successfully invoke a sharpened gleam upon $p!", ch, sword, NULL, TO_CHAR);
					}
					break;

				case BLADE_SPELL_VENEMOUS:
					{
						if (IS_WEAPON_STAT (sword, WEAPON_POISON))
						{
							act ("$p already has a poisonous coating.", ch, sword, NULL, TO_CHAR);
							return;
						}
						gsn = gsn_poison;
						bitvector = WEAPON_POISON;

						act ("$n invokes a poisonous coating upon $p!", ch, sword, NULL, TO_ROOM);
						act ("You successfully invoke a venomous sheath upon $p!", ch, sword, NULL, TO_CHAR);
					}
					break;

				case BLADE_SPELL_VAMPIRIC:
					{
						if (IS_WEAPON_STAT (sword, WEAPON_VAMPIRIC))
						{
							act ("$p already has a life leeching spell.", ch, sword, NULL, TO_CHAR);
							return;
						}
						gsn = 1;
						bitvector = WEAPON_VAMPIRIC;

						act ("$n invokes a life leeching spell upon $p!", ch, sword, NULL, TO_ROOM);
						act ("You successfully invoke vampiric blade upon $p!", ch, sword, NULL, TO_CHAR);
					}
					break;

				case BLADE_SPELL_APATHY:
				{
					if (IS_WEAPON_STAT (sword, WEAPON_APATHY))
					{
						act ("$p already has an alignment nullifying spell.", ch, sword, NULL, TO_CHAR);
						return;
					}
					gsn = 1;
					bitvector = WEAPON_APATHY;
					act ("$n invokes an alignment nullifying spell upon $p!", ch, sword, NULL, TO_ROOM);
					act ("You successfully invoke an alignment nullifying spell upon $p!",ch,sword,NULL,TO_CHAR);
				}
				break;
			}


			af.type = gsn;
			af.bitvector = bitvector;
			affect_to_obj (sword, &af);
		}
		else
		{
			invoke_burst(ch, sword, bs);
			sword->bb_charges[bs]--;
			ch->sword->bb_charges[bs]--;
		}

		sprintf(buf, "%d", (burst) ? bs+100 : bs);
		trip_triggers_arg(ch, OBJ_TRIG_CHAR_INVOKES, NULL, ch, OT_SPEC_NONE, buf);

		check_improve (ch, gsn_invocation, TRUE, 4);
		return;
	}
	else
	{
		send_to_char("You fail to empower your blade into an elemental wrath.\n\r", ch);
		if (burst)
			ch->mana -= skill_table[gsn_invocation].min_mana / 2;
		else ch->mana -= 25;
		check_improve (ch, gsn_invocation, FALSE, 4);
		WAIT_STATE (ch, skill_table[gsn_invocation].beats);

		//5-11-03 Iblis - Added a check to see if the spell missed was a burst so the right charges
		//could be subtracted.  Previously, all missed burst spells were subtracting from the blade
		//charges array.
		if (!burst)
		{
			sword->bs_charges[bs]--;
			ch->sword->bs_charges[bs]--;
		}
		else
		{
			sword->bb_charges[bs]--;
			ch->sword->bb_charges[bs]--;
		}
		return;
	}
}


void invoke_burst (CHAR_DATA * ch, OBJ_DATA * sword, int type)
{
	switch (type)
	{
		case BURST_LIGHTNING:
			invoke_lightning_burst (ch, sword);
			break;
		case BURST_ICE:
			invoke_ice_burst (ch, sword);
			break;
		case BURST_FIRE:
			invoke_fire_burst (ch, sword);
			break;
		case BURST_UNHOLY:
			invoke_unholy_burst (ch, sword);
			break;
		case BURST_HELLSCAPE:
			invoke_hellscape_burst (ch, sword);
			break;
	}
	return;
}

void invoke_lightning_burst (CHAR_DATA * ch, OBJ_DATA * sword)
{
	CHAR_DATA *vch, *vch_next;
	int dam, gsn;

	act ("Bolts of lightning shoot forth from $p in an electric fury!.", ch, sword, NULL, TO_CHAR);
	act ("$n unleashes a furious electric storm from $p!", ch, sword, NULL, TO_ROOM);
	for (vch = ch->in_room->people; vch; vch = vch_next)
	{
		vch_next = vch->next_in_room;
		if (vch != ch)
		{
			if (IS_IMMORTAL (vch) || is_safe_spell (ch, vch, TRUE))
				continue;
			if (vch->alignment < 0)
			{
				act ("$N is unaffected by $n's burst of lightning.", ch, NULL, vch, TO_NOTVICT);
				act ("You are unaffected by $n's burst of lightning", ch, NULL, vch, TO_VICT);
				act ("$N is unaffected by your burst of lightning!", ch, NULL, vch, TO_CHAR);
				continue;
			}
			act ("$n unleashes a burst of lightning at $N.", ch, NULL, vch, TO_NOTVICT);
			act ("$n unleashes a burst of lightning at you!", ch, NULL, vch, TO_VICT);
			act ("You unleash a burst of lightning at $N.", ch, NULL, vch, TO_CHAR);
			//Iblis 5/13/03 - Scaled Lightning Burst to use alignment
			dam = (abs (ch->alignment - vch->alignment) / 20);
			//Iblis 5/13/03 - To get around the darn damage reducer in fight.c
			if (dam > 35)
				dam = dam * 2 - 35;
			if (dam > 80)
				dam = dam * 2 - 80;
			//Iblis 5/13/03 - Changed the save calculation to occur based on the character's level, not
			//the level of the chant
			if (saves_spell (ch->level, vch, DAM_LIGHTNING))
			{
				shock_effect (vch, ch->level / 2, dam / 4, TARGET_CHAR);
				damage_old (ch, vch, dam / 2, skill_lookup ("lightning breath"), DAM_LIGHTNING,	TRUE);
			}
			else
			{
				shock_effect (vch, ch->level, dam, TARGET_CHAR);
				damage_old (ch, vch, dam, skill_lookup ("lightning breath"), DAM_LIGHTNING, TRUE);
			}
		}
	}

	gsn = skill_lookup("lightning burst");
	ch->mana -= skill_table[gsn].min_mana / 10;

	return;

}

void invoke_ice_burst (CHAR_DATA * ch, OBJ_DATA * sword)
{
	CHAR_DATA *vch, *vch_next;
	int dam, gsn;

	act ("A furious blizzard spews forth from $p!.", ch, sword, NULL, TO_CHAR);
	act ("$n unleashes a icy blizzard from $p!", ch, sword, NULL, TO_ROOM);
	for (vch = ch->in_room->people; vch; vch = vch_next)
	{
		vch_next = vch->next_in_room;
		if (vch != ch)
		{
			if (IS_IMMORTAL (vch) || is_safe_spell (ch, vch, TRUE))
				continue;
			if (vch->alignment < 0)
			{
				act ("$N is unaffected by $n's burst of ice.", ch, NULL, vch, TO_NOTVICT);
				act ("You are unaffected by $n's burst of ice", ch, NULL, vch, TO_VICT);
				act ("$N is unaffected by your burst of ice!", ch, NULL, vch, TO_CHAR);
				continue;
			}
			act ("$n unleashes a burst of ice at $N.", ch, NULL, vch, TO_NOTVICT);
			act ("$n unleashes a burst of ice at you!", ch, NULL, vch, TO_VICT);
			act ("You unleash a burst of ice at $N.", ch, NULL, vch, TO_CHAR);

			//Iblis 5/13/03 - Scaled Frost Burst to use alignment
			dam = ((abs (ch->alignment - vch->alignment) / 20) * 2);
			//Iblis 5/13/03 - To get around the darn damage reducer in fight.c
			if (dam > 35)
				dam = dam * 2 - 35;
			if (dam > 80)
				dam = dam * 2 - 80;
			//Iblis 5/13/03 - Changed the save calculation to occur based on the character's level, not
			//the level of the chant
			if (saves_spell (ch->level, vch, DAM_COLD))
			{
				cold_effect (vch, ch->level / 2, dam / 4, TARGET_CHAR);
				damage_old (ch, vch, dam / 2, skill_lookup ("frost breath"), DAM_COLD, TRUE);
			}
			else
			{
				cold_effect (vch, ch->level, dam, TARGET_CHAR);
				damage_old (ch, vch, dam, skill_lookup ("frost breath"), DAM_COLD, TRUE);
			}
		}
	}

	gsn = skill_lookup("ice burst");
	ch->mana -= skill_table[gsn].min_mana / 10;

	return;

}

void invoke_fire_burst (CHAR_DATA * ch, OBJ_DATA * sword)
{
	CHAR_DATA *vch, *vch_next;
	int dam, gsn;

	act ("Searing flames shoot forth from $p creating a blazing inferno!.", ch, sword, NULL, TO_CHAR);
	act ("$n unleashes a blazing inferno from $p!", ch, sword, NULL, TO_ROOM);
	for (vch = ch->in_room->people; vch; vch = vch_next)
	{
		vch_next = vch->next_in_room;
		if (vch != ch)
		{
			if (IS_IMMORTAL (vch) || is_safe_spell (ch, vch, TRUE))
				continue;
			if (vch->alignment < 0)
			{
				act ("$N is unaffected by $n's burst of fire.", ch, NULL, vch, TO_NOTVICT);
				act ("You are unaffected by $n's burst of fire", ch, NULL, vch, TO_VICT);
				act ("$N is unaffected by your burst of fire!", ch, NULL, vch, TO_CHAR);
				continue;
			}
			act ("$n unleashes a burst of fire at $N.", ch, NULL, vch, TO_NOTVICT);
			act ("$n unleashes a burst of fire at you!", ch, NULL, vch, TO_VICT);
			act ("You unleash a burst of fire at $N.", ch, NULL, vch, TO_CHAR);

			//Iblis 5/13/03 - Scaled Fire Burst to use alignment
			dam = ((abs (ch->alignment - vch->alignment) / 20) * 3);
			//Iblis 5/13/03 - To get around the darn damage reducer in fight.c
			if (dam > 35)
				dam = (dam - 35) * 2 + 35;
			if (dam > 80)
				dam = (dam - 80) * 2 + 80;
			//Iblis 5/13/03 - Changed the save calculation to occur based on the character's level, not
			//the level of the chant
			if (saves_spell (ch->level, vch, DAM_FIRE))
			{
				fire_effect (vch, ch->level / 2, dam / 4, TARGET_CHAR);
				damage_old (ch, vch, dam / 2, skill_lookup ("fire breath"), DAM_LIGHTNING, TRUE);
			}
			else
			{
				fire_effect (vch, ch->level, dam, TARGET_CHAR);
				damage_old (ch, vch, dam, skill_lookup ("fire breath"), DAM_LIGHTNING, TRUE);
			}
		}
	}

	gsn = skill_lookup("fire burst");
	ch->mana -= skill_table[gsn].min_mana / 10;

	return;

}

void invoke_unholy_burst (CHAR_DATA * ch, OBJ_DATA * sword)
{
	CHAR_DATA *vch, *vch_next;
	int dam, sn;

	act ("Unholy wrath crackles within $p and is unleashed!.", ch, sword, NULL, TO_CHAR);
	act ("$n unleashes an unholy wrath from $p!", ch, sword, NULL, TO_ROOM);
	for (vch = ch->in_room->people; vch; vch = vch_next)
	{
		vch_next = vch->next_in_room;
		if (vch != ch)
		{
			if (IS_IMMORTAL (vch) || is_safe_spell (ch, vch, TRUE))
				continue;
			if (vch->alignment < 0)
			{
				act ("$N is unaffected by $n's unholy wrath.", ch, NULL, vch, TO_NOTVICT);
				act ("You are unaffected by $n's unholy wrath.", ch, NULL, vch, TO_VICT);
				act ("$N is unaffected by your unholy wrath!", ch, NULL, vch, TO_CHAR);
				continue;
			}
			act ("$n unleashes a burst of unholy wrath at $N.", ch, NULL, vch, TO_NOTVICT);
			act ("$n unleashes a burst of unholy wrath at you!", ch, NULL, vch, TO_VICT);
			act ("You unleash a burst of unholy wrath at $N.", ch, NULL, vch, TO_CHAR);

			sn = skill_lookup ("unholy burst");

			//Iblis 5/13/03 - Scaled Unholy Burst to use alignment
			dam = (abs (ch->alignment - vch->alignment) / 4);
			//Iblis 5/13/03 - To get around the darn damage reducer in fight.c
			if (dam > 35)
				dam = (dam - 35) * 2 + 35;
			if (dam > 80)
				dam = (dam - 80) * 2 + 80;

			//Iblis 5/13/03 - Changed the save calculation to occur based on the character's level, not
			//the level of the chant
			if (saves_spell (ch->level, vch, DAM_OTHER))
			{
				damage (ch, vch, dam / 2, sn, DAM_OTHER, TRUE);
			}
			else
			{
				damage (ch, vch, dam, sn, DAM_OTHER, TRUE);
			}
		}
	}

	ch->mana -= skill_table[sn].min_mana / 10;

	return;

}


void invoke_hellscape_burst (CHAR_DATA * ch, OBJ_DATA * sword)
{
	CHAR_DATA *vch, *vch_next;
	int dam, sn;

	act ("All hell breaks loose.\n\r", ch, sword, NULL, TO_CHAR);
	act ("Hell hath no fury like $n!\n\r", ch, sword, NULL, TO_ROOM);

	for (vch = ch->in_room->people; vch; vch = vch_next)
	{
		vch_next = vch->next_in_room;
		if (vch != ch)
		{

			dam = abs (ch->alignment - vch->alignment);
			dam = dam / 2;
			if (IS_IMMORTAL (vch) || is_safe_spell (ch, vch, TRUE))	// Don't hurt imms
				continue;
			if (vch->alignment < 0)	// Don't hurt evil folks
			{
				act ("$n's explosion of evil hellfire has no effect on $N.", ch, NULL, vch, TO_NOTVICT);
				act ("$n's explosion of evil hellfire has no effect on you.", ch, NULL, vch, TO_VICT);
				act ("Your explosion of evil hellfire has no effect on $N.", ch, NULL, vch, TO_CHAR);
				continue;
			}

			sn = skill_lookup ("hellscape");

			//Iblis 5/13/03 - Changed the save calculation to occur based on the character's level, not
			//the level of the chant
			if (saves_spell (ch->level, vch, DAM_FIRE))
			{
				damage (ch, vch, dam / 2, sn, DAM_FIRE, TRUE);
			}
			else
			{
				damage (ch, vch, dam, sn, DAM_FIRE, TRUE);
			}
		}
	}

	ch->mana -= (ch->mana / 2);
	return;
}







//Iblis - Minax suggestion for a new reaver skill
void do_repulse (CHAR_DATA * ch, char *argument)
{
	char arg[MAX_INPUT_LENGTH];
	CHAR_DATA *victim;
	int chance;

	//if (IS_NPC(ch))
	//              return;


	if (get_skill (ch, gsn_repulse) < 1)
	{
		send_to_char ("No one is repulsed by you.\r\n", ch);
		return;
	}
	one_argument (argument, arg);

	if (ch->position < POS_STANDING)
	{
		send_to_char ("You can't repulse anyone without standing.\r\n", ch);
		return;
	}

	if (ch->fighting != NULL)
	{
		send_to_char ("You're too busy to repulse.\r\n", ch);
		return;
	}

	if ((victim = get_char_room (ch, arg)) == NULL)
	{
		send_to_char ("They aren't here.\n\r", ch);
		return;
	}

	if (!IS_NPC (victim))
	{
		send_to_char("Players aren't repulsed by you.  They've seen much, much worse.\r\n",	ch);
		return;
	}

	if (check_shopkeeper_attack (ch, victim))
		return;


	if (victim->alignment < ch->alignment)
	{
		act ("$N is too evil to be repulsed by you.", ch, NULL, victim,	TO_CHAR);
		return;
	}

	if (victim->alignment > 0)
	{
		act ("$N is too good to be repulsed by you.", ch, NULL, victim,	TO_CHAR);
		return;
	}

	if (ch->alignment >= 0)
	{
		send_to_char ("You're not evil enough to repulse anyone.\r\n", ch);
		return;
	}
	chance = get_skill (ch, gsn_repulse) / 2.0;
	chance += get_curr_stat (ch, STAT_CHA) * 2;
	if (ch->level < victim->level)
		chance -= (victim->level - ch->level) * (victim->level - ch->level);
	if (chance < 0)
		chance = 0;
	if (get_skill (ch, gsn_repulse) >= 99)
		chance += get_curr_stat (ch, STAT_CHA) - 19;

	if (number_percent () < chance)
	{
		victim->alignment = -victim->alignment;
		act ("$n has repulsed $N so much $E has gone good.", ch, NULL, victim, TO_ROOM);
		act ("You repulse $N so much that $E turns good.", ch, NULL, victim, TO_CHAR);
		WAIT_STATE (ch, skill_table[gsn_repulse].beats);
		return;
	}
	else
	{
		act ("$n attempts to repulse $N, but only succeeds in angering $M.", ch, NULL, victim, TO_ROOM);
		act ("You attempt to repulse $N, but only succeed in angering $M.", ch, NULL, victim, TO_CHAR);
		damage (ch, victim, 0, gsn_repulse, 0, FALSE);
		WAIT_STATE (ch, skill_table[gsn_repulse].beats);
		return;
	}
}

//Iblis - Minax suggested new reaver skill
void do_tempt (CHAR_DATA * ch, char *argument)
{
	char arg[MAX_INPUT_LENGTH];
	CHAR_DATA *victim;
	int chance;

	//if (IS_NPC(ch))
	// return;
	if (get_skill (ch, gsn_tempt) < 1)
	{
		send_to_char("You can't even tempt a little girl to take a lollipop.\r\n", ch);
		return;
	}
	one_argument (argument, arg);

	if (ch->position < POS_STANDING)
	{
		send_to_char("You can't tempt anyone unless standing.\r\n", ch);
		return;
	}

	if (ch->fighting != NULL)
	{
		send_to_char("You're too busy to tempt.\r\n", ch);
		return;
	}

	if ((victim = get_char_room (ch, arg)) == NULL)
	{
		send_to_char("They aren't here.\n\r", ch);
		return;
	}

	if (IS_AFFECTED (ch, AFF_CHARM) && ch->master == victim)
	{
		act ("But $N is your friend!", ch, NULL, victim, TO_CHAR);
		return;
	}

	if (victim == ch)
	{
		send_to_char("You try to tempt yourself, but you're just not that tempting.\r\n", ch);
		return;
	}

	if (is_safe (ch, victim))
		return;

	if (IS_CLASS (victim, PC_CLASS_PALADIN) || victim->race == PC_RACE_NERIX)
	{
		send_to_char ("Paladins are beyond your tempting.\r\n", ch);
		return;
	}

	if (victim->alignment < ch->alignment)
	{
		act ("$N is too evil to be tempted by you.", ch, NULL, victim, TO_CHAR);
		return;
	}

	if (ch->alignment >= 0)
	{
		send_to_char ("You're not evil enough to tempt anyone.\r\n", ch);
		return;
	}
	chance = get_skill (ch, gsn_repulse) / 2.0;
	chance += get_curr_stat (ch, STAT_CHA) * 2;
	if (ch->level < victim->level)
		chance -= (victim->level - ch->level) * (victim->level - ch->level);
	if (chance < 0)
		chance = 0;
	if (get_skill (ch, gsn_repulse) >= 99)
		chance += get_curr_stat (ch, STAT_CHA) - 19;

	if (number_percent () < chance)
	{
		victim->alignment -= ch->level;
		if (victim->alignment < ch->alignment)
			victim->alignment = ch->alignment;
		act ("$n has tempted $N to grow more evil.", ch, NULL, victim, TO_ROOM);
		act ("You tempt $N to grow more evil.", ch, NULL, victim, TO_CHAR);
		WAIT_STATE (ch, skill_table[gsn_tempt].beats);
		return;
	}
	else
	{
		act ("$n attempts to tempt $N, but only succeeds in angering $M.", ch, NULL, victim, TO_ROOM);
		act ("You attempt to tempt $N, but only succeed in angering $M.", ch, NULL, victim, TO_CHAR);
		damage (ch, victim, 0, gsn_repulse, 0, FALSE);
		WAIT_STATE (ch, skill_table[gsn_tempt].beats);
		return;
	}
}

//Iblis - aunction to back calculate the total souls for reavers that began collecting them before
//showstats total souls was in.  This is run once per old reaver, then the total souls variable is
//correct and showstats works of that
void backcalc_totalsouls(CHAR_DATA *ch)
{
	unsigned long sls=0;
	int cost,mod,i;
	AFFECT_DATA *paf;
	sls = ch->pcdata->souls;
	if (ch->sword)
	{
		cost = 8;                 /*initial value */
		// sls += cost;
		for (i = 1; i < ch->sword->value[2]; i++)
		{
			sls += cost;
			cost *= 2;
		}
		cost = 16;
		for (i = 1; i < ch->sword->value[1]; i++)
		{
			sls += cost;
			cost *= 4;
		}
		paf = get_hit_affect (ch->sword);
		if (paf == NULL)
			mod = 0;
		else
			mod = paf->modifier;
		cost = 8;
		for (i = 0; i < mod; i++)
		{
			sls += cost;
			cost *= 2;
		}
		paf = get_dam_affect (ch->sword);
		if (paf == NULL)
			mod = 0;
		else
			mod = paf->modifier;
		cost = 9;
		for (i = 0; i < mod; i++)
		{
			sls += cost;
			cost *= 3;
		}
		//           case BLADE_SPELL_SHOCKING:
		cost = 100;
		for (i = 0; i < ch->sword->bs_capacity[BLADE_SPELL_SHOCKING]; i++)
		{
			sls += cost;
			cost += 200;
		}
		//            case BLADE_SPELL_FROST:
		cost = 200;
		for (i = 0; i < ch->sword->bs_capacity[BLADE_SPELL_FROST]; i++)
		{
			sls += cost;
			cost += 300;
		}
		//            case BLADE_SPELL_FLAMING:
		cost = 300;
		for (i = 0; i < ch->sword->bs_capacity[BLADE_SPELL_FLAMING]; i++)
		{
			sls += cost;
			cost += 400;
		}
		//            case BLADE_SPELL_CHAOTIC:
		cost = 600;
		for (i = 0; i < ch->sword->bs_capacity[BLADE_SPELL_CHAOTIC]; i++)
		{
			sls += cost;
			cost += 500;
		}
		//            case BLADE_SPELL_VENEMOUS:
		cost = 900;
		for (i = 0; i < ch->sword->bs_capacity[BLADE_SPELL_VENEMOUS]; i++)
		{
			sls += cost;
			cost += 600;
		}
		//            case BLADE_SPELL_VAMPIRIC:
		cost = 1000;
		for (i = 0; i < ch->sword->bs_capacity[BLADE_SPELL_VAMPIRIC]; i++)
		{
			cost += 1000;
			sls += cost;
		}
		//            case BLADE_SPELL_APATHY:
		cost = 1000;
		for (i=0; i < ch->sword->bs_capacity[BLADE_SPELL_APATHY]; i++)
		{
			cost += 6000;
			sls += cost;
		}
		//            case BURST_LIGHTNING:
		cost = 1000;
		for (i = 0; i < ch->sword->bb_capacity[BURST_LIGHTNING]; i++)
		{
			sls += cost;
			cost += 1000;
		}
		//case BURST_ICE:
		cost = 2000;
		for (i = 0; i < ch->sword->bb_capacity[BURST_ICE]; i++)
		{
			sls += cost;
			cost += 2000;
		}
		//case BURST_FIRE:
		cost = 3500;
		for (i = 0; i < ch->sword->bb_capacity[BURST_FIRE]; i++)
		{
			cost += 3500;
			sls += cost;
		}
		//case BURST_UNHOLY:
		cost = 10000;
		for (i = 0; i < ch->sword->bb_capacity[BURST_UNHOLY]; i++)
		{
			sls += cost;
			cost += 1500;
		}
		//case BURST_HELLSCAPE:
		cost = 20000;
		for (i = 0; i < ch->sword->bb_capacity[BURST_HELLSCAPE]; i++)
		{
			sls += cost;
			cost += 2500;
		}
		ch->pcdata->totalsouls = sls;
	}
}