shadow/
shadow/data/command/
shadow/data/help/
shadow/data/religion/
shadow/data/skill/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/

/***************************************************************************
*       ROM 2.4 is copyright 1993-1998 Russ Taylor                         *
*       ROM has been brought to you by the ROM consortium                  *
*           Russ Taylor (rtaylor@hypercube.org)                            *
*           Gabrielle Taylor (gtaylor@hypercube.org)                       *
*           Brian Moore (zump@rom.org)                                     *
*       By using this code, you have agreed to follow the terms of the     *
*       ROM license, in the file Rom24/doc/rom.license                     *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include "include.h"

/* For the OLC. Makes it so we can create an OLC Function!*/
#define RLGEDIT( fun )		bool fun (CHAR_DATA *ch, char *argument )

/*Local Prototypes */

RELIGION *new_religion	args( (void) );
int god_lookup			args( ( const char *name ) );
int relgrank_lookup		args( ( const char *name ) );
void free_religion		args( (RELIGION *pRlg) );
void join_religion		args( (CHAR_DATA *ch, RELIGION *pRlg ) );
void denounce_faith		args( (CHAR_DATA *ch, bool force ) );
bool same_main_relg		args( (CHAR_DATA *ch, CHAR_DATA *victim ) );

/* Local structures */
extern struct sex_type relgrank_table[];
extern struct sex_type god_table[];


/*Begining of OLC Functions */

RLGEDIT(rlgedit_show)
{	RELIGION *pRlg, *pFct;
	BUFFER *buffer;
	int faction, rank, iClass;
	char buf[MSL], arg[MSL], arg2[MSL], buf2[MSL];

	argument = one_argument(argument, arg);
	EDIT_RELIGION(ch, pRlg );

	if(arg[0] == '\0' )
	{	printf_to_char(ch, "{DReligion Editor for{r:{W %s\n\r\n\r", pRlg->name );
		printf_to_char(ch, "{DGod{r:           {W%10s{x\n\r", pRlg->god);
		printf_to_char(ch, "{DTemple{r:        {W%10s{x\n\r", pRlg->temple ? pRlg->temple->name : "Not Set"  );
		printf_to_char(ch, "{DDonation Vnum{r:   {W%10d{x\n\r",pRlg->donation_vnum );
		printf_to_char(ch, "\n\r{DExalt Message{r:{W %s{x\n\r", pRlg->pmt_msg );
		printf_to_char(ch, "\n\r{DRescind Message{r: {W%s{x\n\r", pRlg->dmt_msg );
		printf_to_char(ch, "\n\r{DSacrifice Message{r: {W%s{x\n\r", pRlg->sac_msg );
		printf_to_char(ch, "\n\r{DChannel Name{r: {W%s\n\r", pRlg->chan_name );

		send_to_char("{D---------------------------------------------------------\n\r",ch);
		send_to_char("{DFactions{r:{x\n\r",ch);
		faction = 0;
		if(!pRlg->faction[faction])
		{	send_to_char("{DThis religion has no Faction.\n\r",ch);
			send_to_char("{DType 'show ranks' to view the rank info.\n\r",ch);
			return FALSE;
		}
		printf_to_char(ch, "                      {W%-15s   %-15s\n\r", 
				"Faction 1", 
				pRlg->faction[FACTION_TWO] ?  "Faction 2" : "");

		printf_to_char(ch, "{DFaction Name{r:      [{W%-15s{r] [{W%-15s{r]\n\r", 
				pRlg->faction[FACTION_ONE]->name,
				pRlg->faction[FACTION_TWO] ? pRlg->faction[FACTION_TWO]->name : "" );

		printf_to_char(ch, "{DDeity{r:             [{W%-15s{r] [{W%-15s{r]\n\r", 
				pRlg->faction[FACTION_ONE]->deity,
				pRlg->faction[FACTION_TWO] ? pRlg->faction[FACTION_TWO]->deity : "");

		printf_to_char(ch, "{DTemple{r:            [{W%-15s{r] [{W%-15s{r]\n\r", 
				pRlg->faction[FACTION_ONE]->temple ? pRlg->faction[FACTION_ONE]->temple->name : "Not Set",
				pRlg->faction[FACTION_TWO] ? ( pRlg->faction[FACTION_TWO]->temple ? pRlg->faction[FACTION_TWO]->temple->name : "Not Set" ) : "");

		printf_to_char(ch, "{DDonation Vnum{r:     [{W%-15d{r] [{W%-15d{r]\n\r",
				pRlg->faction[FACTION_ONE]->donation_vnum,
				pRlg->faction[FACTION_TWO] ? pRlg->faction[FACTION_TWO]->donation_vnum : 0);
		

		send_to_char("{DType 'show <one|two> <rank|message>'\n\r",ch);
		send_to_char("{DType 'show ranks' to view the rank info.\n\r",ch);
		return TRUE;
	}
	if(!str_cmp(arg, "ranks" ) )
	{	
		printf_to_char(ch, "{DThese are the ranks and abilities for {W%s{D.{x\n\r\n\r", pRlg->name );
		printf_to_char(ch, "{D%-10s{r|{D%-10s{r|{D%20s{r|{D%20s{r|{x\n\r", "Rank Name", "Class Name", "Rank Title", "Rank Ability" );
		buffer = new_buf();
		for(rank = 0; rank < MAX_RELG_RANK ; rank++ )
			for(iClass = 0; iClass < MAX_CLASS ; iClass++ )
			{	sprintf(buf2, "\n\r%10s", relgrank_table[rank].name );
				sprintf(buf, "{D%-10s{r|{D%-10s{r|{W%20s{r|{W%20s{r|{x\n\r", iClass == 0 ? buf2 : "", class_table[iClass].name, pRlg->rank[iClass][rank], pRlg->skpell[iClass][rank] );
				add_buf(buffer, buf);
			}
		add_buf(buffer,"{D*************************************************************{x\n\r" );
		add_buf(buffer, "{DTo see Faction ranks, type {r'{Wshow <one|two> rank{r'{x.\n\r");
		page_to_char(buf_string(buffer), ch);
		free_buf(buffer);

		return TRUE;
	}
	if(!str_cmp(arg, "one" ) )
	{	if( ( pFct = pRlg->faction[FACTION_ONE] ) == NULL)
		{	send_to_char("This Religion does not have Factions to show!\n\r",ch);
			return FALSE;
		}
	}
	else if (!str_cmp(arg, "two" ) )
	{	if( ( pFct = pRlg->faction[FACTION_TWO] ) == NULL)
		{	send_to_char("This Religion does not have a second Factions to show!\n\r",ch);
			return FALSE;
		}
	}
	else
	{	send_to_char("Syntax:  show\n\r",ch);
		send_to_char("Syntax:  show ranks\n\r",ch);
		send_to_char("Syntax:  show <faction number (\"one\" or \"two\" )> <rank|message>.\n\r",ch);
		return FALSE;
	}

	argument = one_argument(argument, arg2 );
	if( arg2[0] == '\0' )
	{	send_to_char("Would you like to see ranks, or messages for the faction?\n\r",ch);
		return FALSE;
	}
	if(!str_cmp(arg2, "ranks" ) )
	{	printf_to_char(ch, "{DThese are the ranks and abilities for the faction {W%s{D.{x\n\r\n\r", pFct->name );
		printf_to_char(ch, "{D%-10s{r|{D%-10s{r|{D%20s{r|{D%20s{r|{x\n\r", "Rank Name", "Class Name", "Rank Title", "Rank Ability" );
		buffer = new_buf();
		for(rank = 0; rank < MAX_RELG_RANK ; rank++ )
			for(iClass = 0; iClass < MAX_CLASS ; iClass++ )
			{	sprintf(buf2, "\n\r%10s", relgrank_table[rank].name );
				sprintf(buf, "{D%-10s{r|{D%-10s{r|{W%20s{r|{W%20s{r|{x\n\r", iClass == 0 ? buf2 : "", class_table[iClass].name, pFct->rank[iClass][rank], pFct->skpell[iClass][rank] );
				add_buf(buffer, buf);
			}
		page_to_char(buf_string(buffer), ch);
		free_buf(buffer);
		return TRUE;
	}
	if(!str_cmp(arg2, "message" ) )
	{	printf_to_char(ch, "{DThese are messages for the faction {W%s{D.{x\n\r\n\r", pFct->name );
		printf_to_char(ch, "{DExalt Message{r:{W %s{x\n\r", pFct->pmt_msg );
		printf_to_char(ch, "\n\r{DRescind Message{r: {W%s{x\n\r", pFct->dmt_msg );
		printf_to_char(ch, "\n\r{DSacrifice Message{r: {W%s{x\n\r", pFct->sac_msg );
		printf_to_char(ch, "\n\r{DChannel Name{r: {W%s\n\r", pFct->chan_name );
		return TRUE;
	}

	send_to_char("Syntax:  show\n\r",ch);
	send_to_char("Syntax:  show ranks\n\r",ch);
	send_to_char("Syntax:  show <faction number (\"one\" or \"two\" )> <rank|message>.\n\r",ch);
	return FALSE;
}
		

RLGEDIT( rlgedit_new )
{	RELIGION *pRlg;
	
	if( argument[0] == '\0' )
	{	send_to_char("Syntax: Rlgedit new <name>\n\r",ch);
		return FALSE;
	}
	
	if( (pRlg = religion_lookup(argument) ) != NULL )
	{	send_to_char("That religion already exists. Try another name.\n\r",ch);
		return FALSE;
	}

	pRlg = new_religion();
	free_string(pRlg->name);
	pRlg->name = str_dup(capitalize(argument));
	pRlg->next = religion_list;
	religion_list = pRlg;
	printf_to_char(ch, "The order of %s, has now been created.\n\r",pRlg->name );
	ch->desc->editor = ED_RELIGION;
	ch->desc->pEdit = (void *) pRlg;
	return TRUE;
}


RLGEDIT( rlgedit_name )
{	RELIGION * pRlg;
	
	EDIT_RELIGION( ch, pRlg );

	if( argument[0] == '\0' )
	{	send_to_char("Syntax: name <name>\n\r",ch);
		return FALSE;
	}

	if( religion_lookup(argument) != NULL )
	{	send_to_char("That religion already exists. Please use another name.\n\r",ch);
		return FALSE;
	}
	printf_to_char(ch, "The order of %s has been renamed to the order of %s\n\r",pRlg->name, capitalize(argument) );
	free_string(pRlg->name);
	pRlg->name = str_dup(capitalize(argument ) );
	return TRUE;
}

RLGEDIT( rlgedit_god )
{	RELIGION * pRlg;
	int god;

	EDIT_RELIGION(ch, pRlg);

	if(argument[0] == '\0' )
	{	send_to_char("Syntax: god <god name>\n\r", ch );
		return FALSE;
	}

	if( ( god = god_lookup(argument )  ) == -1 )
	{	send_to_char("That isn't a valid god.\n\r",ch);
		return FALSE;
	}

	free_string(pRlg->god);
	pRlg->god = str_dup(capitalize(argument ) );
	printf_to_char(ch, "The god for the order of %s has been set too %s.\n\r",pRlg->name, pRlg->god );
	return TRUE;
}

RLGEDIT( rlgedit_temple )
{	RELIGION *pRlg;
	AREA_DATA *pArea;
	int value;

	EDIT_RELIGION(ch, pRlg);

	if(argument[0] == '\0' )
	{	send_to_char("Syntax: temple <area vnum>\n\r",ch);
		return FALSE;
	}
	if(is_number(argument ) )
	{	value = atoi( argument );
		if ( !( pArea = get_area_data( value ) ) )
		{	send_to_char( "That area vnum does not exist.\n\r", ch );
		    return FALSE;
		}

		printf_to_char(ch, "Temple for the order of %s is set to %s.\n\r",pRlg->name, pArea->name );
		pRlg->temple = pArea;
		return TRUE;
	}
	else
	{	send_to_char("Syntax: temple <area vnum>\n\r",ch);
		return FALSE;
	}
	return TRUE;
}

RLGEDIT( rlgedit_donation)
{	RELIGION * pRlg;
	int vnum;

	EDIT_RELIGION(ch, pRlg );
	
	if(argument[0] == '\0' )
	{	send_to_char("Syntax: Donation <vnum>\n\r",ch);
		return FALSE;
	}

	if(!is_number(argument ) )
	{	send_to_char("A vnum is a form of number.\n\r",ch);
		return FALSE;
	}

	vnum = atoi(argument );
	if( get_room_index(vnum) == NULL )
	{	send_to_char("That isn't a valid Vnum.\n\r",ch);
		return FALSE;
	}

	pRlg->donation_vnum = vnum;
	printf_to_char(ch, "Donation Room Vnum set to %d.\n\r", pRlg->donation_vnum );
	return TRUE;
}

RLGEDIT( rlgedit_rank )
{	RELIGION *pRlg;
	char arg[MSL], arg2[MSL];
	int rank, iClass;

	EDIT_RELIGION( ch, pRlg );

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

	if(arg[0] == '\0' || argument[0] == '\0')
	{	send_to_char("Syntax: rank <rank name> <class name> <title>\n\r",ch);
		return FALSE;
	}

	if( ( rank = relgrank_lookup(arg) ) == -1 )
	{	send_to_char("That isn't a valid rank.\n\r",ch);
		return FALSE;
	}
	if( ( iClass = class_lookup(arg2 ) ) == -1 )
	{	send_to_char("That isn't a valid class.\n\r",ch);
		return FALSE;
	}
	
	free_string(pRlg->rank[iClass][rank]);
	pRlg->rank[iClass][rank] = str_dup(capitalize(argument) );
	printf_to_char(ch, "%s, %s's %s rank was changed too %s.\n\r", pRlg->name, class_table[iClass].name, relgrank_table[rank].name, argument);
	return TRUE;
}

RLGEDIT( rlgedit_skill )
{	RELIGION *pRlg;
	char arg[MSL], arg2[MSL], arg3[MSL];
	int rank, sn, iClass;

	EDIT_RELIGION(ch, pRlg );

	argument = one_argument(argument, arg );
	argument = one_argument(argument, arg2);
	argument = one_argument(argument, arg3);

	if(arg[0] == '\0' || arg2[0] == '\0' )
	{	send_to_char("Syntax: skill <rank name> <class name> <skill/spell name>\n\r",ch);
		return FALSE;
	}

	if( ( rank = relgrank_lookup(arg) ) == -1 )
	{	send_to_char("That isn't a valid Religious Rank.\n\r",ch);
		return FALSE;
	}

	if( ( sn = skill_lookup(arg2) ) == -1 )
	{	send_to_char("Thats not a valid spell, or skill!\n\r",ch);
		return FALSE;
	}
	if( ( iClass = class_lookup(arg3 ) ) == -1 )
	{	send_to_char("That isn't a valid class.\n\r",ch);
		return FALSE;
	}

	printf_to_char(ch, "%s's %s rank for %s class's ability was changed too %s.\n\r", pRlg->name, relgrank_table[rank].name, class_table[iClass].name, skill_table[sn].name );
	free_string(pRlg->skpell[iClass][rank]);
	pRlg->skpell[iClass][rank] = str_dup(skill_table[sn].name );
	return TRUE;
}

RLGEDIT( rlgedit_faction )
{	RELIGION * pRlg;
	char arg[MSL], arg2[MSL], arg3[MSL], arg4[MSL], arg5[MSL];
	int faction;
	RELIGION *pFct;
	argument = one_argument(argument, arg);

	EDIT_RELIGION(ch, pRlg);
	if(arg[0] == '\0' )
	{	send_to_char("Syntax: faction create <name>\n\r",ch);
		send_to_char("        faction <one|two> <command> <value>\n\r",ch);
		send_to_char("Commands: Name, Donation, Skill, Rank, Temple, Deity, message.\n\r",ch);
		return FALSE;
	}

	if(!str_cmp(arg, "create" ) )
	{	if(argument[0] == '\0' )
		{	rlgedit_faction(ch, argument );
			return FALSE;
		}
		if(pRlg->faction[FACTION_ONE] && pRlg->faction[FACTION_TWO] )
		{	send_to_char("This religions already got enough factions!\n\r",ch);
			return FALSE;
		}
		if(pRlg->faction[FACTION_ONE])
			faction = FACTION_TWO;
		else 
			faction = FACTION_ONE;
		
		pRlg->faction[faction] = new_religion();
		pRlg->faction[faction]->isfaction = TRUE;
		pRlg->faction[faction]->name = str_dup(capitalize(argument));
		pRlg->faction[faction]->main = pRlg;
		printf_to_char(ch, "The Faction of %s has been added to the order of %s.\n\r", pRlg->faction[faction]->name, pRlg->name );
		return TRUE;
	}

	argument = one_argument(argument, arg2);
	if(!str_cmp(arg, "one" ) )
	{	if( (pFct = pRlg->faction[FACTION_ONE] ) == NULL )
		{	send_to_char("That faction has yet to be created.\n\r",ch);
			return FALSE;
		}
	}
	else if( !str_cmp(arg, "two" ) )
	{	if( (pFct = pRlg->faction[FACTION_TWO] ) == NULL )
		{	send_to_char("That faction has yet to be created.\n\r",ch);
			return FALSE;
		}
	}
	else
	{	send_to_char("Syntax: faction create <name>\n\r",ch);
		send_to_char("        faction <one|two> <command> <value>\n\r",ch);
		send_to_char("Commands: Name, Donation, Skill, Rank, Temple, deity, message.\n\r",ch);
		return FALSE;
	}		
	if(arg2[0] == '\0' )
	{	send_to_char("Syntax: faction create <name>\n\r",ch);
		send_to_char("        faction <one|two> <command> <value>\n\r",ch);
		send_to_char("Commands: Name, Donation, Skill, Rank, Temple, deity, message.\n\r",ch);
		return FALSE;
	}
	if(!str_cmp(arg2, "name" ) )
	{	if(argument[0] == '\0' ) 
		{	send_to_char("What would you like to change the name too?\n\r",ch);
			return FALSE;
		}
		printf_to_char(ch, "The Faction, %s, has been changed to %s.\n\r",pFct->name, capitalize(argument) );
		free_string(pFct->name);
		pFct->name = str_dup(capitalize(argument) );
		return TRUE;
	}

	if(!str_cmp(arg2, "Donation" ) )
	{	int vnum;
		argument = one_argument(argument, arg3 );
		if(arg3[0] == '\0' )
		{	send_to_char("Where would you like to set the donation room?\n\r",ch);
			return FALSE;
		}

		if(!is_number(arg3) )
		{	send_to_char("It must be a valid vnum.\n\r", ch );
			return FALSE;
		}
		vnum = atoi(arg3);
		if( get_room_index(vnum) == NULL )
		{	send_to_char("That isn't a valid room.\n\r",ch);
			return FALSE;
		}

		printf_to_char(ch, "The Faction, %s's donation room changed to %d.\n\r", pFct->name, vnum );
		pFct->donation_vnum = vnum;
		return TRUE;
	}

	if(!str_cmp(arg2, "temple" ) )
	{	int value;
		AREA_DATA *pArea;
		argument = one_argument(argument, arg3);
		if(arg3[0] == '\0' )
		{	send_to_char("Syntax: temple <area vnum>\n\r",ch);
			return FALSE;
		}
		if(is_number(arg3 ) )
		{	value = atoi( arg3 );
			if ( !( pArea = get_area_data( value ) ) )
			{	send_to_char( "That area vnum does not exist.\n\r", ch );
			    return FALSE;
			}	

			printf_to_char(ch, "Temple for the faction, %s is set to %s.\n\r",pRlg->name, pArea->name );
			pFct->temple = pArea;
			return TRUE;
		}
		else
		{	send_to_char("Syntax: temple <area vnum>\n\r",ch);
			return FALSE;
		}
		return TRUE;
	}

	if(!str_cmp(arg2, "deity" ) )
	{	int god;
		argument = one_argument(argument, arg3);
		if(arg3[0] == '\0' )
		{	send_to_char("What would you like to set the factions Deity too?\n\r",ch);
			return FALSE;
		}
		if( ( god = god_lookup(arg3) ) == -1 )
		{	send_to_char("That isn't a valid god.\n\r",ch);
			return FALSE;
		}
		printf_to_char(ch, "The Faction, %s's deity set too %s.\n\r",pFct->name, god_table[god].name );
		free_string(pFct->deity);
		pFct->deity = str_dup(god_table[god].name );
		return TRUE;
	}

	if(!str_cmp(arg2, "Rank" ) )
	{	int rank, iClass;
		argument = one_argument(argument, arg3);
		argument = one_argument(argument, arg4);
		argument = one_argument(argument, arg5);
		if(arg3[0] == '\0' || arg4[0] == '\0' )
		{	send_to_char("Syntax: faction <number> <rank> <class> <title>\n\r",ch);
			return FALSE;
		}

		if( ( rank = relgrank_lookup(arg4) ) == -1 )
		{	send_to_char("That isn't a valid Religious Rank.\n\r",ch);
			return FALSE;
		}

		if( ( iClass = class_lookup(arg5 ) ) == -1 )
		{	send_to_char("That isn't a valid class.\n\r",ch);
			return FALSE;
		}
		
		free_string(pFct->rank[iClass][rank]);
		pFct->rank[iClass][rank] = str_dup(argument);
		printf_to_char(ch, "The faction, %s,  %s's %s rank was changed too %s.\n\r", pFct->name, class_table[iClass].name, relgrank_table[rank].name, argument);
		return TRUE;
	}

	if(!str_cmp(arg2, "Skill" ) )
	{	int sn, rank, iClass;
		argument = one_argument(argument, arg3 );
		argument = one_argument(argument, arg4 );
		argument = one_argument(argument, arg5 );
		if(arg3[0] == '\0' || arg4[0] == '\0' )
		{	send_to_char("Syntax: Faction skill <rank name> <class name> <skill/spell name>\n\r",ch );
			return FALSE;
		}
		if( ( rank = relgrank_lookup(arg3) ) == -1 )
		{	send_to_char("That isn't a valid Religious Rank.\n\r",ch);
			return FALSE;
		}
		if( ( sn = skill_lookup(arg4) ) == -1 )
		{	send_to_char("That isn't a valid spell or skill!\n\r",ch);
			return FALSE;
		}
		if( ( iClass = class_lookup(arg5 ) ) == -1 )
		{	send_to_char("That isn't a valid class.\n\r",ch);
			return FALSE;
		}

		printf_to_char(ch, "The faction, %s's %s rank for %s class's ability was changed too %s.\n\r", pFct->name, relgrank_table[rank].name, class_table[iClass].name, skill_table[sn].name );
		free_string(pFct->skpell[iClass][rank]);
		pFct->skpell[iClass][rank] = str_dup(skill_table[sn].name );
		return TRUE;
	}
	/* To lazy to write this properly, lets hope it works :) */
	if(!str_cmp(arg2, "message" ) )
	{	ch->desc->pEdit = (void *) pFct;
		rlgedit_message(ch, argument );
		ch->desc->pEdit = (void *) pRlg;
		return TRUE;
	}
	rlgedit_faction(ch, NULL);
	return FALSE;
}

RLGEDIT( rlgedit_list )
{	RELIGION *pRlg;
	
	for(pRlg = religion_list ; pRlg ; pRlg = pRlg->next )
		printf_to_char(ch, "{D%-15s {r-{D %s\n\r",pRlg->name, pRlg->god );
	return TRUE;
}

RLGEDIT( rlgedit_delete )
{	RELIGION *pRlg, *temp;

	if(argument[0] == '\0' )
	{	send_to_char("Syntax: Delete <religion>\n\r",ch);
		return FALSE;
	}

	if( ( pRlg = religion_lookup(argument) ) == NULL )
	{	send_to_char("There is no such religion.\n\r",ch);
		return FALSE;
	}

	for(temp = religion_list ; temp ; temp = temp->next )
		if(temp->next == pRlg )
			temp->next = pRlg->next;
	if(religion_list == pRlg )
		religion_list = pRlg->next;
	free_religion(pRlg);
	send_to_char("Religion Deleted!\n\r",ch);
	return TRUE;
}

RLGEDIT( rlgedit_message )
{	RELIGION *pRlg;
	char arg[MSL];

	argument = one_argument(argument, arg );
	EDIT_RELIGION(ch, pRlg);

	if( arg[0] == '\0' )
	{	send_to_char("Syntax:  message <sac|exalt|rescind|channame> <string>\n\r",ch);
		return FALSE;
	}

	if(!str_cmp(arg, "sac" ) )
	{	if(argument[0] == '\0' )
		{	send_to_char("What would you like your sacrifice message to be?\n\r",ch );
			return FALSE;
		}
		free_string(pRlg->sac_msg );
		pRlg->sac_msg = str_dup(argument);
		send_to_char("Sacrifice message set!\n\r", ch);
	}
	if(!str_cmp(arg, "exalt" ) )
	{	if(argument[0] == '\0' )
		{	send_to_char("What would you like your exalt message to be?\n\r",ch );
			return FALSE;
		}
		free_string(pRlg->pmt_msg );
		pRlg->pmt_msg = str_dup(argument);
		send_to_char("Exalt message set!\n\r", ch);
	}
	if(!str_cmp(arg, "rescind" ) )
	{	if(argument[0] == '\0' )
		{	send_to_char("What would you like your rescind message to be?\n\r",ch );
			return FALSE;
		}
		free_string(pRlg->dmt_msg );
		pRlg->dmt_msg = str_dup(argument);
		send_to_char("Rescind message set!\n\r", ch);
	}
	if(!str_cmp(arg, "channame" ) )
	{	if(argument[0] == '\0' )
		{	send_to_char("What would you like your channel name to be?\n\r",ch );
			return FALSE;
		}
		free_string(pRlg->chan_name );
		pRlg->chan_name = str_dup(argument);
		send_to_char("Channel name set!\n\r", ch);
	}
	return FALSE;
}

/*End of OLC Functions */

/*Begining of File I/O*/
void save_religion()
{	FILE *rList, *fp;
	RELIGION *pRlg;
	char buf[MSL];
	int rank, iClass;

	rList = file_open(RELG_LIST, "w");
	for(pRlg = religion_list ; pRlg ; pRlg = pRlg->next )
	{	fprintf(rList, "%s\n", pRlg->name );
		sprintf(buf, "%s%s",RELG_DIR, pRlg->name);
		fp = file_open(buf, "w");
		fprintf(fp, "Name %s~\n", pRlg->name );
		fprintf(fp, "God %s~\n", pRlg->god );
		fprintf(fp, "Temple %s~\n", pRlg->temple ? pRlg->temple->name : "None" );
		fprintf(fp, "Donation %d\n", pRlg->donation_vnum );
		fprintf(fp, "Ranks\n" );
		for( rank = 0; rank < MAX_RELG_RANK ; rank++ )
		{	for(iClass = 0; iClass < MAX_CLASS ; iClass++ )
			{	fprintf(fp, "%s~\n", pRlg->rank[iClass][rank] );
				fprintf(fp, "%s~\n", pRlg->skpell[iClass][rank] );
			}
		}
		fprintf(fp, "Faction %s~\n", pRlg->faction[FACTION_ONE] ? ( pRlg->faction[FACTION_TWO] ? "two" : "one" ) : "none" );
		if(pRlg->faction[FACTION_ONE] )
		{	RELIGION *faction = pRlg->faction[FACTION_ONE];
			fprintf(fp, "%s~\n", faction->name );
			fprintf(fp, "%s~\n", faction->deity );
			fprintf(fp, "%s~\n", faction->temple ? faction->temple->name : "None" );
			fprintf(fp, "%d\n", faction->donation_vnum );
			
			for(rank = 0; rank < MAX_RELG_RANK ; rank++ )
			{	for(iClass = 0; iClass < MAX_CLASS ; iClass++ )
				{	fprintf(fp, "%s~\n", faction->rank[iClass][rank] );
					fprintf(fp, "%s~\n",faction->skpell[iClass][rank]);
				}
			}
			if(pRlg->faction[FACTION_TWO] )
			{	faction = pRlg->faction[FACTION_TWO];
				fprintf(fp, "%s~\n", faction->name );
				fprintf(fp, "%s~\n", faction->deity );
				fprintf(fp, "%s~\n", faction->temple ? faction->temple->name : "None" );
				fprintf(fp, "%d\n", faction->donation_vnum );
				for(rank = 0; rank < MAX_RELG_RANK ; rank++ )
				{	for(iClass = 0; iClass < MAX_CLASS ; iClass++ )
					{	fprintf(fp, "%s~\n", faction->rank[iClass][rank] );
						fprintf(fp, "%s~\n",faction->skpell[iClass][rank]);
					}
				}
			}
		}
		fprintf(fp, "$\n");
		file_close(fp);
	}
	fprintf(rList, "$\n");
	file_close(rList);
}
#define KEYS( field, value )					\
				    free_string(field);			\
				    field  = value;			\

				
void load_religion()
{	RELIGION *pRlg;
	FILE *fp, *rList;
	char *word, *string;
	char buf[MSL];
	AREA_DATA *pArea;
	int rank, iClass;

	if( !file_exists(RELG_LIST ) )
	{	logf2("Relg_list not there. No religions!");
		return;
	}

	rList = file_open(RELG_LIST, "r" );
	
	for( word = fread_word(rList); str_cmp(word, "$" ); word = fread_word(rList) )
	{	sprintf(buf, "%s%s", RELG_DIR, word);
		if(!file_exists(buf ) )
		{	logf2("%s religious file missing.",word);
			continue;
		}
		rank = 0; iClass = rank;
		fp = file_open(buf, "r" );
		for(string = fread_word(fp); str_cmp(word, "$" ); word = fread_word(fp) )
		{
			if(!str_cmp(string, "Name" ) )
			{	pRlg = new_religion();
				KEYS(pRlg->name, fread_string(fp) );
				pRlg->next = religion_list;
				religion_list = pRlg;
				continue;
			}
			if(!str_cmp(string, "God" ) )
			{	KEYS(pRlg->god, fread_string(fp) );
				continue;
			}
			if(!str_cmp(string, "Temple" ) )
			{	if( ( pArea = area_lookup(fread_string(fp) ) ) == NULL )
				{	logf2("%s temple not defined.",pRlg->name );
					continue;
				}
				pRlg->temple = pArea;
				continue;
			}
			if(!str_cmp(string, "Donation" ) )
			{	pRlg->donation_vnum = fread_number(fp);
				continue;
			}
			if(!str_cmp(string, "Ranks" ) )
			{	for(rank = 0; rank < MAX_RELG_RANK ; rank++ )
				{	for(iClass = 0; iClass < MAX_CLASS ; iClass++ )
					{	KEYS(pRlg->rank[iClass][rank], fread_string(fp) );
						KEYS(pRlg->skpell[iClass][rank], fread_string(fp) );
					}
				}
				continue;
			}
			if(!str_cmp(string, "Faction" ) )
			{	KEYS(string, fread_string(fp) );
				if(!str_cmp(string,"none" ) )
					continue;
				else if(!str_cmp(string, "one") || !str_cmp(string, "two" ) )
				{	RELIGION *faction;
					faction = new_religion();
					KEYS(faction->name, fread_string(fp));
					KEYS(faction->deity, fread_string(fp));
					if( ( pArea = area_lookup(fread_string(fp) ) ) == NULL )
						logf2("Faction %s lacks temple.", faction->name );
					else
						faction->temple = pArea;
					faction->donation_vnum = fread_number(fp);
					for (rank = 0; rank < MAX_RELG_RANK ; rank++)
					{	for(iClass = 0; iClass < MAX_CLASS ; iClass++ )
						{	KEYS(faction->rank[iClass][rank], fread_string(fp) );
							KEYS(faction->skpell[iClass][rank], fread_string(fp) );
						}
					}
					faction->isfaction = TRUE;
					faction->main = pRlg;
					pRlg->faction[FACTION_ONE] = faction;
					
				}
				if(!str_cmp(string, "two" ) )
				{	RELIGION *faction;
					faction = new_religion();
					KEYS(faction->name, fread_string(fp));
					KEYS(faction->deity, fread_string(fp));
					if( ( pArea = area_lookup(fread_string(fp) ) ) == NULL )
						logf2("Faction %s lacks temple.", faction->name );
					else
						faction->temple = pArea;
					faction->donation_vnum = fread_number(fp);
					for (rank = 0; rank < MAX_RELG_RANK ; rank++)
					{	for(iClass = 0; iClass < MAX_CLASS ; iClass++ )
						{	KEYS(faction->rank[iClass][rank], fread_string(fp) );
							KEYS(faction->skpell[iClass][rank], fread_string(fp) );
						}
					}
					faction->isfaction = TRUE;
					faction->main = pRlg;
					pRlg->faction[FACTION_TWO] = faction;
				}
				continue;
			}
			logf2("Invalid string in Religion. %s", word );
		}
	}
}
		
/*End of File I/O */

/*Begining of do_functions*/

void do_exalt(CHAR_DATA *ch, char *argument )
{	CHAR_DATA *victim;
	char arg[MSL];

	if(IS_NPC(ch) )
		return;

	if(!HAS_RELIGION(ch) )
	{	send_to_char("You don't have a religion.\n\r",ch);
		return;
	}
	if( ch->pcdata->rank < RANK_PRIEST )
	{	send_to_char("You cannot exalt people!\n\r",ch );
		return;
	}
	one_argument(argument, arg );

	if(arg[0] == '\0' )
	{	send_to_char("Syntax: Exalt <person>\n\r",ch);
		return;
	}
	if(!IS_IMMORTAL(ch) )
	{	if( ( victim = get_char_room(ch, NULL, arg) )  == NULL )
		{	send_to_char("They arn't here.\n\r",ch);
			return;
		}
	}
	else
	{	if( ( victim = get_char_world(ch, arg) ) == NULL )
		{	send_to_char("They arn't here.\n\r",ch);
			return;
		}
	}
	if(IS_NPC(victim) )
	{	send_to_char("Not on NPC's.\n\r",ch);
		return;
	}
	if(!HAS_RELIGION(victim) )
	{	send_to_char("They don't have a religion.\n\r",ch);
		return;
	}

	if( ch->pcdata->rank == RANK_GOD && (IN_FACTION(ch) || IN_FACTION(victim) ) )
	{ if(!same_main_relg(ch,victim) )
	  {   send_to_char("They arn't in your religion!\n\r",ch);
	      return;
	  }
    }
	else if(!IS_SAME_RELIGION(ch, victim) && ch->pcdata->rank != RANK_GOD  )
	{	send_to_char("They arn't in your religion!\n\r",ch); 
		return; 
	}

	if( ch->pcdata->rank <= victim->pcdata->rank )
	{	send_to_char("You cannot exalt them.\n\r", ch );
		return;
	}

	if(!IS_IMMORTAL(ch) && ch->pcdata->rank <= RANK_PRIEST && victim->pcdata->rank >= RANK_BISHOP )
	{	send_to_char("You cannot exalt them.\n\r",ch);
		return;
	}

	if(victim->pcdata->rank == RANK_DEITY && ch->pcdata->rank != RANK_GOD )
	{	send_to_char("You cannot exalt to God Rank.\n\r",ch);
		return;
	}
	if(victim->pcdata->rank == RANK_GOD )
	{	send_to_char("They cannot get any higher!\n\r",ch);
		return;
	}
	if(IN_FACTION(victim) && victim->pcdata->rank == RANK_DEITY )
	{	send_to_char("You can't promote them any higher in a Faction.\n\r",ch);
		return;
	}
	if(!IN_FACTION(victim) && victim->pcdata->rank == RANK_PRIEST)
	{	send_to_char("You cannot exalt them anymore, if you wish to make them a god, use the makegod command.\n\r",ch);
		return;
	}

	victim->pcdata->rank++;
	victim->pcdata->learned[skill_lookup(victim->pcdata->religion->skpell[prime_class(victim)][victim->pcdata->rank] ) ] = 1;
	printf_to_char(ch, "%s has been exalted to %s.\n\r", victim->name, relgrank_table[victim->pcdata->rank].name );
	act_new(victim->pcdata->religion->pmt_msg, victim, NULL, NULL, TO_CHAR, POS_SLEEPING);
	return;
}

void do_rescind(CHAR_DATA *ch, char *argument )
{	CHAR_DATA *victim;

	char arg[MSL];

	if(IS_NPC(ch) )
		return;
	if(!HAS_RELIGION(ch) )
	{	send_to_char("You don't have a religion.\n\r",ch);
		return;
	}
	if( ch->pcdata->rank < RANK_PRIEST )
	{	send_to_char("You cannot rescind peoples ranks!\n\r",ch );
		return;
	}
	one_argument(argument, arg );

	if(arg[0] == '\0' )
	{	send_to_char("Syntax: rescind <person>\n\r",ch);
		return;
	}
	if(!IS_IMMORTAL(ch) )
	{	if( ( victim = get_char_room(ch, NULL, arg) )  == NULL )
		{	send_to_char("They arn't here.\n\r",ch);
			return;
		}
	}
	else
	{	if( ( victim = get_char_world(ch, arg) ) == NULL )
		{	send_to_char("They arn't here.\n\r",ch);
			return;
		}
		
	}
	if(IS_NPC(victim) )
	{	send_to_char("Not on NPC's.\n\r",ch);
		return;
	}
	if(!HAS_RELIGION(victim) )
	{	send_to_char("They don't have a religion.\n\r",ch);
		return;
	}
	if( ch->pcdata->rank == RANK_GOD && (IN_FACTION(ch) || IN_FACTION(victim) ) )
	{ if(!same_main_relg(ch,victim) )
	  {   send_to_char("They arn't in your religion!\n\r",ch);
	      return;
	  }
    }
	else if(!IS_SAME_RELIGION(ch, victim) && ch->pcdata->rank != RANK_GOD  )
	{	send_to_char("They arn't in your religion!\n\r",ch); 
		return; 
	}

	if( ch->pcdata->rank <= victim->pcdata->rank )
	{	send_to_char("You cannot rescind their rank!\n\r", ch );
		return;
	}

	if(!IS_IMMORTAL(ch) && ch->pcdata->rank <= RANK_PRIEST && victim->pcdata->rank >= RANK_BISHOP )
	{	send_to_char("You cannot rescind their rank.\n\r",ch);
		return;
	}

	if(victim->pcdata->rank == RANK_INITIATE )
	{	send_to_char("They cannot get any lower!\n\r",ch);
		return;
	}
	victim->pcdata->learned[skill_lookup(victim->pcdata->religion->skpell[prime_class(victim)][victim->pcdata->rank] ) ] = 0;
	--victim->pcdata->rank;
	act_new(victim->pcdata->religion->dmt_msg,ch, NULL, victim, TO_VICT, POS_SLEEPING );
	printf_to_char(ch, "You have lowered thier rank to %s.\n\r", relgrank_table[victim->pcdata->rank].name );
	return;
}

void do_denounce(CHAR_DATA *ch, char * argument )
{	char arg[MSL], arg2[MSL];
	CHAR_DATA *victim;
	if(IS_NPC(ch ) )
		return;

	if(!str_cmp(argument, "faith" ) )
	{	denounce_faith(ch, FALSE);
		return;
	}
	argument = one_argument(argument, arg );
	argument = one_argument(argument, arg2 );
	
	if(!str_cmp(arg, "follower" ) )
	{	if(ch->pcdata->rank <= RANK_PRIEST )
		{	do_function(ch, &do_denounce, NULL );
			return;
		}

		if(!IS_IMMORTAL(ch) )
		{	if( ( victim = get_char_room(ch, NULL, arg2 ) ) == NULL )
			{	send_to_char("They arn't here.\n\r",ch);
				return;
			}
		}
		else
		{	if( ( victim = get_char_world(ch, arg2 ) ) == NULL )
			{	send_to_char("They arn't here.\n\r", ch);
				return;
			}
		}
		if(IS_NPC(victim) )
		{	send_to_char("Not on NPC's.\n\r",ch);
			return;
		}
		if( ch->pcdata->rank == RANK_GOD && (IN_FACTION(ch) || IN_FACTION(victim) ) )
		{ if(!same_main_relg(ch,victim) )
		  {   send_to_char("They arn't in your religion!\n\r",ch);
			  return;
		  }
		}
		else if(!IS_SAME_RELIGION(ch, victim) && ch->pcdata->rank != RANK_GOD  )
		{	send_to_char("They arn't in your religion!\n\r",ch); 
			return; 
		}


		if(ch->pcdata->rank <= victim->pcdata->rank )
		{	send_to_char("You cannot denounce their faith.\n\r",ch);
			return;
		}

		send_to_char("You denounce thier faith!\n\r",ch);
		denounce_faith(victim, TRUE);
		return;
	}

	if(ch->pcdata->rank <= RANK_PRIEST )
		send_to_char("To denounce a followers faith, use the syntax: 'denounce follower <name>'\n\r",ch);
	send_to_char("To denounce your faith, please type use the syntax: 'denounce faith'\n\r", ch);
	return;
}

void do_initiate(CHAR_DATA *ch, char *argument )
{	char arg[MSL], arg2[MSL], arg3[MSL];
	CHAR_DATA *victim;

	if(IS_NPC(ch ) )
		return;

	argument = one_argument(argument, arg  );
	argument = one_argument(argument, arg2 );
	argument = one_argument(argument, arg3 );
	if(!HAS_RELIGION(ch) )
	{	send_to_char("How do you expect to initiate someone into a religion, when you, yourself do not have one?\n\r",ch);
		return;
	}
	if(ch->pcdata->rank < RANK_PRIEST )
	{	send_to_char("You can't initiate people!\n\r",ch);
		return;
	}

	if(arg[0] == '\0' )
	{	send_to_char("Syntax: Initiate <person>\n\r",ch);
		if(ch->pcdata->rank > RANK_PRIEST )
			send_to_char("Syntax:  Initiate <person> faction\n\r",ch);
		return;
	}

	if(ch->pcdata->rank < RANK_PRIEST )
	{	send_to_char("You can't initiate people!\n\r",ch);
		return;
	}

	if(!IS_IMMORTAL(ch) )
	{	if( ( victim = get_char_room(ch, NULL, arg ) ) == NULL )
		{	send_to_char("They arn't here.\n\r",ch);
			return;
		}
	}
	else
	{	if( ( victim = get_char_world(ch, arg ) ) == NULL )
		{	send_to_char("They arn't here.\n\r", ch);
			return;
		}
	}
	if(IS_NPC(victim) )
	{	send_to_char("Not on NPC's.\n\r",ch);
		return;
	}
	if(arg2[0] == '\0' )
	{	if( HAS_RELIGION(victim) )
		{	send_to_char("They are already in a religion!\n\r",ch);
			return;
		}
		printf_to_char(ch, "They have been initiated.\n\r" );
		join_religion(victim, ch->pcdata->religion );
	}
	if(!str_cmp(arg2, "faction" ) )
	{	if( ch->pcdata->rank < RANK_DEITY 
		|| (!IN_FACTION(ch) && ch->pcdata->rank < RANK_GOD ) )
		{	send_to_char("You cannot initiate someone into a faction!\n\r",ch);
			return;
		}
		if(!ch->pcdata->religion->faction[FACTION_ONE] )
		{	send_to_char("You don't have any factions.\n\r",ch);
			return;
		}

		if(!str_cmp(arg3, "one" ) )
		{	if(ch->pcdata->rank != RANK_GOD )
			{	send_to_char("Only Gods can toy with peoples faith.\n\r",ch);
				return;
			}
			send_to_char("They have been swiched to the first Faction of your Religion.\n\r",ch);
			denounce_faith(victim, TRUE );
			join_religion(victim, ch->pcdata->religion->faction[FACTION_ONE] );
			return;
		}
		if(!str_cmp(arg3, "two" ) )
		{	if(ch->pcdata->rank != RANK_GOD )
			{	send_to_char("Only Gods can toy with peoples faith.\n\r",ch);
				return;
			}
			if(!ch->pcdata->religion->faction[FACTION_TWO] )
			{	send_to_char("You don't have a second faction.\n\r",ch);
				return;
			}
			send_to_char("They have been swiched to the second Faction of your Religion.\n\r",ch);
			denounce_faith(victim, TRUE );
			join_religion(victim, ch->pcdata->religion->faction[FACTION_TWO] );
			return;
		}
		if(!same_main_relg(ch, victim) )
		{	send_to_char("You atleast have to have the same main religion!\n\r",ch);
			return;
		}
		send_to_char("They have joined your Faction.\n\r",ch);
		denounce_faith(victim, TRUE );
		join_religion(victim, ch->pcdata->religion );
	}
	return;
}

/*This is made so the first time you create a 
  religion you can make yourself a god! Make sure 
  only responsable people have this. */

void do_makegod(CHAR_DATA *ch, char *argument ) 
{	char arg[MSL];
	RELIGION *pRlg;

	argument = one_argument(argument, arg);

	if(arg[0] == '\0' )
	{	send_to_char("Syntax: makegod <religion>\n\r",ch);
		return;
	}

	if( ( pRlg = religion_lookup(arg) ) == NULL )
	{	if( (pRlg = faction_lookup(arg) ) == NULL )
		{	send_to_char("That isn't a valid religion, or faction.\n\r",ch);
			return;
		}
	}

	ch->pcdata->religion = pRlg;
	ch->pcdata->rank = RANK_GOD;
	return;
}
/*End of do_functions*/

/*Stuff for joining/leaving a religion or Faction */

void join_religion(CHAR_DATA *ch, RELIGION *pRlg )
{	if(IS_NPC(ch) )
		return;
	if(ch->pcdata->religion )
	{	printf_to_char(ch, "You must denounce your faith to %s first.\n\r",ch->pcdata->religion->name );
		return;
	}
	
	ch->pcdata->religion = pRlg;
	printf_to_char(ch, "You now find solace in %s.\n\r", pRlg->name );
	ch->pcdata->bless = 0;
	ch->pcdata->rank = 0;
}

void denounce_faith(CHAR_DATA *ch, bool force )
{	int rank, sn;
	if(IS_NPC(ch) )
		return;

	if(!ch->pcdata->religion )
	{	send_to_char("You cannot denounce your faith when you do not have a faith!\n\r",ch);
		return;
	}

	if(!force)
		printf_to_char(ch, "You denounce %s as your faith, and choose the path of a heathen.\n\r", ch->pcdata->religion->name );
	else
		printf_to_char(ch, "You have been excommunicated from your faith!  You are now of the heathen.\n\r" );
	ch->pcdata->bless = 0;
	for( rank = ch->pcdata->rank; rank >= 0; rank-- )
	{	sn = skill_lookup(ch->pcdata->religion->skpell[prime_class(ch)][rank]);
		if( ch->pcdata->learned[sn] >= 1 )
		{	printf_to_char(ch, "You loose your %s ability.\n\r", skill_table[sn].name );
			ch->pcdata->learned[sn] = 0;
		}
	}
	ch->pcdata->religion = NULL;
	ch->pcdata->rank = 0;
	return;
}

/*Sacrifice and bless points stuff */
void religious_sacrifice(CHAR_DATA *ch, OBJ_DATA *obj )
{	act_new(ch->pcdata->religion->sac_msg, ch, obj, NULL, TO_CHAR, POS_RESTING );
	ch->pcdata->bless += ch->pcdata->rank;
	extract_obj(obj);
}
/*Begining of Recycling functions*/
RELIGION *relg_free;
#define STRING_NEW(string)           \
				free_string(string);  \
				string = str_dup("Not Set"); \

RELIGION *new_religion(void)
{
    static RELIGION relg_zero;
    RELIGION *pRlg;
	int rank, faction, iClass;

    if (relg_free == NULL)
        pRlg = (RELIGION *)alloc_perm(sizeof(*pRlg));
    else
    {
        pRlg = relg_free;
        relg_free = relg_free->next;
    }
	*pRlg = relg_zero;
	

	
	pRlg->isfaction = FALSE;

	STRING_NEW(pRlg->pmt_msg);
	STRING_NEW(pRlg->dmt_msg);
	STRING_NEW(pRlg->chan_name);
	STRING_NEW(pRlg->sac_msg );
	STRING_NEW(pRlg->god);
	STRING_NEW(pRlg->deity);
	STRING_NEW(pRlg->name );

	for(rank = 0; rank < MAX_RELG_RANK ; rank++ )
	{	for(iClass = 0; iClass < MAX_CLASS ; iClass++ )
		{	free_string(pRlg->skpell[iClass][rank]);
			pRlg->skpell[iClass][rank] = str_dup("reserved");
			free_string(pRlg->rank[iClass][rank]);
			pRlg->rank[iClass][rank] = str_dup(relgrank_table[rank].name );
		}
	}
	for(faction = 0; faction < MAX_FACTION ; faction++ )
		pRlg->faction[faction] = NULL;


    VALIDATE(pRlg);
    return pRlg;
}


void free_religion(RELIGION *pRlg)
{	int faction, rank, iClass;

	if (!IS_VALID(pRlg))
        return;

	free_string(pRlg->name);
	
	pRlg->isfaction = FALSE;
	free_string(pRlg->deity);
	free_string(pRlg->god);
	
	for(rank = 0; rank < MAX_RELG_RANK ; rank++ )
		for(iClass = 0; iClass < MAX_CLASS ; iClass++ )
		{	free_string(pRlg->skpell[iClass][rank]);
			free_string(pRlg->rank[iClass][rank]);
		}

	for(faction = 0; faction < MAX_FACTION ; faction++ )
		pRlg->faction[faction] = NULL;

	pRlg->temple = NULL;
	pRlg->donation_vnum = 1;
    INVALIDATE(pRlg);
    pRlg->next = relg_free;
    relg_free = pRlg;
}
/*End of Recycling functions*/
/*Begining of lookup functions*/
int god_lookup ( const char *name )
{
    int god;

    for ( god = 0 ; god_table[god].name != NULL ; god++ )
    {
        if (LOWER(name[0]) == LOWER(god_table[god].name[0])
        &&  !str_prefix(name,god_table[god].name))
            return god;
    }
    return -1;
}

int relgrank_lookup ( const char *name )
{
    int relgrank;

    for ( relgrank = 0 ; relgrank_table[relgrank].name != NULL ; relgrank++ )
    {
        if (LOWER(name[0]) == LOWER(relgrank_table[relgrank].name[0])
        &&  !str_prefix(name,relgrank_table[relgrank].name))
            return relgrank;
    }
    return -1;
}

RELIGION *religion_lookup ( const char *name )
{
    RELIGION * pRlg;

    for ( pRlg = religion_list ; pRlg ; pRlg = pRlg->next )
    {
        if (LOWER(name[0]) == LOWER(pRlg->name[0])
        &&  !str_prefix(name,pRlg->name))
            return pRlg;
    }
    return NULL;
}

RELIGION *faction_lookup ( const char *name )
{
    RELIGION * pRlg;
	int i;

    for ( pRlg = religion_list ; pRlg ; pRlg = pRlg->next )
    {	for(i = 0; i < MAX_FACTION; i++ )
		{	if(!pRlg->faction[i] )
				continue;

			if (LOWER(name[0]) == LOWER(pRlg->faction[i]->name[0])
			&&  !str_prefix(name,pRlg->faction[i]->name))
				return pRlg->faction[i];
		}
    }
    return NULL;
}
/*End of Lookup Functions */
/*Begining of Structures */
struct sex_type relgrank_table[] =
{
	{  "Initiate" },
	{  "Acolyte"  },
	{  "Disciple" },
	{  "Bishop"	  },
	{  "Priest"   },
	{  "Deity"    },
	{  "God"	  }
};

struct sex_type god_table[] = 
{
	{ "Davion" },
	{ "Synon"  },
	{ "Sola"   },
	{ NULL	   },
};

/*End of Structures */


char *god_name(CHAR_DATA *ch )
{	if( religion_lookup(ch->pcdata->religion->name ) != NULL )
		return ch->pcdata->religion->god;
	if( faction_lookup(ch->pcdata->religion->name ) != NULL )
		return ch->pcdata->religion->deity;
	return "ShadowStorm";
}
/*This function was written to be able to tell if someone is in the same Religion
  But a different Faction of it */
bool same_main_relg(CHAR_DATA *ch, CHAR_DATA *victim )
{	if(IN_FACTION(ch) && IN_FACTION(victim))
		if(ch->pcdata->religion->main == victim->pcdata->religion->main )
			return TRUE;
	if(IN_FACTION(ch) && !IN_FACTION(victim) )
		if(ch->pcdata->religion->main == victim->pcdata->religion )
			return TRUE;
	if(!IN_FACTION(ch) && IN_FACTION(victim) )
		if(ch->pcdata->religion == victim->pcdata->religion->main )
			return TRUE;

	return FALSE;
}