toc/
toc/account/a/
toc/area/backup/
toc/area/imc/
toc/caste/
toc/caste/backup/
toc/clans/
toc/classes/
toc/crash/
toc/gods/
toc/guilds/
toc/lname/s/
toc/maps/backup/
toc/player/a/
toc/src/
toc/system/backup/
toc/tableprog/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |   \\._.//   *
 * -----------------------------------------------------------|   (0...0)   *
 * SMAUG 1.4 (C) 1994, 1995, 1996, 1998  by Derek Snider      |    ).:.(    *
 * -----------------------------------------------------------|    {o o}    *
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |   / ' ' \   *
 * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek,      |~'~.VxvxV.~'~*
 * Tricops and Fireblade                                      |             *
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.     *
 * ------------------------------------------------------------------------ *
 *                           Deity handling module                          *
 ****************************************************************************/

/*Put together by Rennard for Realms of Despair.  Brap on...*/

#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"


DEITY_DATA *first_deity;
DEITY_DATA *last_deity;

/* local routines */

void fread_deity args((DEITY_DATA * deity, FILE * fp));
bool load_deity_file args((char *deityfile));
void write_deity_list args((void));
int get_risflag args((char *flag));
int get_npc_race args((char *type));

/* Get pointer to deity structure from deity name */

DEITY_DATA *get_deity(char *name)
{
   DEITY_DATA *deity;

   for (deity = first_deity; deity; deity = deity->next)
      if (!str_cmp(name, deity->name))
         return deity;
   return NULL;
}

void write_deity_list()
{
   DEITY_DATA *tdeity;
   FILE *fpout;
   char filename[256];

   sprintf(filename, "%s%s", DEITY_DIR, DEITY_LIST);
   fclose(fpReserve);
   fpout = fopen(filename, "w");
   if (!fpout)
      bug("FATAL: cannot open deity.lst for writing!\n\r", 0);
   else
   {
      for (tdeity = first_deity; tdeity; tdeity = tdeity->next)
         fprintf(fpout, "%s\n", tdeity->filename);
      fprintf(fpout, "$\n");
      fclose(fpout);
   }
   fpReserve = fopen(NULL_FILE, "r");
}

/* Save a deity's data to its data file */

void save_deity(DEITY_DATA * deity)
{
   FILE *fp;
   char filename[256];
   char buf[MSL];

   if (!deity)
   {
      bug("save_deity: null deity pointer!", 0);
      return;
   }

   if (!deity->filename || deity->filename[0] == '\0')
   {
      sprintf(buf, "save_deity: %s has no filename", deity->name);
      bug(buf, 0);
      return;
   }

   sprintf(filename, "%s%s", DEITY_DIR, deity->filename);

   fclose(fpReserve);
   if ((fp = fopen(filename, "w")) == NULL)
   {
      bug("save_deity: fopen", 0);
      perror(filename);
   }
   else
   {
      fprintf(fp, "#DEITY\n");
      fprintf(fp, "Filename		%s~\n", deity->filename);
      fprintf(fp, "Name		%s~\n", deity->name);
      fprintf(fp, "Description	%s~\n", deity->description);
      fprintf(fp, "Alignment		%d\n", deity->alignment);
      fprintf(fp, "Worshippers	%d\n", deity->worshippers);
      fprintf(fp, "Flee		%d\n", deity->flee);
      fprintf(fp, "Flee_npcrace	%d\n", deity->flee_npcrace);
      fprintf(fp, "Flee_npcfoe	%d\n", deity->flee_npcfoe);
      fprintf(fp, "Kill		%d\n", deity->kill);
      fprintf(fp, "Kill_npcrace	%d\n", deity->kill_npcrace);
      fprintf(fp, "Kill_npcfoe	%d\n", deity->kill_npcfoe);
      fprintf(fp, "Kill_magic	%d\n", deity->kill_magic);
      fprintf(fp, "Sac		%d\n", deity->sac);
      fprintf(fp, "Bury_corpse	%d\n", deity->bury_corpse);
      fprintf(fp, "Aid_spell		%d\n", deity->aid_spell);
      fprintf(fp, "Aid		%d\n", deity->aid);
      fprintf(fp, "Steal		%d\n", deity->steal);
      fprintf(fp, "Backstab		%d\n", deity->backstab);
      fprintf(fp, "Die		%d\n", deity->die);
      fprintf(fp, "Die_npcrace	%d\n", deity->die_npcrace);
      fprintf(fp, "Die_npcfoe	%d\n", deity->die_npcfoe);
      fprintf(fp, "Spell_aid		%d\n", deity->spell_aid);
      fprintf(fp, "Dig_corpse	%d\n", deity->dig_corpse);
      fprintf(fp, "Scorpse		%d\n", deity->scorpse);
      fprintf(fp, "Savatar		%d\n", deity->savatar);
      fprintf(fp, "Sdeityobj		%d\n", deity->sdeityobj);
      fprintf(fp, "Srecall		%d\n", deity->srecall);
      fprintf(fp, "Race		%d\n", deity->race);
      fprintf(fp, "Element		%d\n", deity->element);
      fprintf(fp, "Sex		%d\n", deity->sex);
      fprintf(fp, "Affected		%s\n", print_bitvector(&deity->affected));
      fprintf(fp, "Npcrace		%d\n", deity->npcrace);
      fprintf(fp, "Npcfoe		%d\n", deity->npcfoe);
      fprintf(fp, "Suscept		%d\n", deity->suscept);
      fprintf(fp, "Race2		%d\n", deity->race2);
      fprintf(fp, "Susceptnum	%d\n", deity->susceptnum);
      fprintf(fp, "Elementnum	%d\n", deity->elementnum);
      fprintf(fp, "Affectednum	%d\n", deity->affectednum);
      fprintf(fp, "Objstat		%d\n", deity->objstat);
      fprintf(fp, "End\n\n");
      fprintf(fp, "#END\n");
      fclose(fp);
   }
   fpReserve = fopen(NULL_FILE, "r");
   return;
}

/* Read in actual deity data */

#if defined(KEY)
#undef KEY
#endif

#define KEY( literal, field, value )					\
				if ( !str_cmp( word, literal ) )	\
				{					\
				      field = value;			\
				      fMatch = TRUE;			\
				      break;				\
				}

void fread_deity(DEITY_DATA * deity, FILE * fp)
{
   char buf[MSL];
   char *word;
   bool fMatch;

   for (;;)
   {
      word = feof(fp) ? "End" : fread_word(fp);
      fMatch = FALSE;

      switch (UPPER(word[0]))
      {
         case '*':
            fMatch = TRUE;
            fread_to_eol(fp);
            break;

         case 'A':
            KEY("Affected", deity->affected, fread_bitvector(fp));
            KEY("Affectednum", deity->affectednum, fread_number(fp));
            KEY("Aid", deity->aid, fread_number(fp));
            KEY("Aid_spell", deity->aid_spell, fread_number(fp));
            KEY("Alignment", deity->alignment, fread_number(fp));
            break;

         case 'B':
            KEY("Backstab", deity->backstab, fread_number(fp));
            KEY("Bury_corpse", deity->bury_corpse, fread_number(fp));
            break;

         case 'D':
            KEY("Description", deity->description, fread_string(fp));
            KEY("Die", deity->die, fread_number(fp));
            KEY("Die_npcrace", deity->die_npcrace, fread_number(fp));
            KEY("Die_npcfoe", deity->die_npcfoe, fread_number(fp));
            KEY("Dig_corpse", deity->dig_corpse, fread_number(fp));
            break;

         case 'E':
            if (!str_cmp(word, "End"))
            {
               if (!deity->name)
                  deity->name = STRALLOC("");
               if (!deity->description)
                  deity->description = STRALLOC("");
               return;
            }
            KEY("Element", deity->element, fread_number(fp));
            KEY("Elementnum", deity->elementnum, fread_number(fp));
            break;

         case 'F':
            KEY("Filename", deity->filename, fread_string_nohash(fp));
            KEY("Flee", deity->flee, fread_number(fp));
            KEY("Flee_npcrace", deity->flee_npcrace, fread_number(fp));
            KEY("Flee_npcfoe", deity->flee_npcfoe, fread_number(fp));
            break;

         case 'K':
            KEY("Kill", deity->kill, fread_number(fp));
            KEY("Kill_npcrace", deity->kill_npcrace, fread_number(fp));
            KEY("Kill_npcfoe", deity->kill_npcfoe, fread_number(fp));
            KEY("Kill_magic", deity->kill_magic, fread_number(fp));
            break;

         case 'N':
            KEY("Name", deity->name, fread_string(fp));
            KEY("Npcfoe", deity->npcfoe, fread_number(fp));
            KEY("Npcrace", deity->npcrace, fread_number(fp));
            break;

         case 'O':
            KEY("Objstat", deity->objstat, fread_number(fp));

         case 'R':
            KEY("Race", deity->race, fread_number(fp));
            KEY("Race2", deity->race2, fread_number(fp));
            break;

         case 'S':
            KEY("Sac", deity->sac, fread_number(fp));
            KEY("Savatar", deity->savatar, fread_number(fp));
            KEY("Scorpse", deity->scorpse, fread_number(fp));
            KEY("Sdeityobj", deity->sdeityobj, fread_number(fp));
            KEY("Srecall", deity->srecall, fread_number(fp));
            KEY("Sex", deity->sex, fread_number(fp));
            KEY("Spell_aid", deity->spell_aid, fread_number(fp));
            KEY("Steal", deity->steal, fread_number(fp));
            KEY("Suscept", deity->suscept, fread_number(fp));
            KEY("Susceptnum", deity->susceptnum, fread_number(fp));
            break;

         case 'W':
            KEY("Worshippers", deity->worshippers, fread_number(fp));
            break;
      }

      if (!fMatch)
      {
         sprintf(buf, "Fread_deity: no match: %s", word);
         bug(buf, 0);
      }
   }
}

/* Load a deity file */

bool load_deity_file(char *deityfile)
{
   char filename[256];
   DEITY_DATA *deity;
   FILE *fp;
   bool found;

   found = FALSE;
   sprintf(filename, "%s%s", DEITY_DIR, deityfile);

   if ((fp = fopen(filename, "r")) != NULL)
   {
      for (;;)
      {
         char letter;
         char *word;

         letter = fread_letter(fp);
         if (letter == '*')
         {
            fread_to_eol(fp);
            continue;
         }

         if (letter != '#')
         {
            bug("Load_deity_file: # not found.", 0);
            break;
         }

         word = fread_word(fp);
         if (!str_cmp(word, "DEITY"))
         {
            CREATE(deity, DEITY_DATA, 1);
            fread_deity(deity, fp);
            LINK(deity, first_deity, last_deity, next, prev);
            found = TRUE;
            break;
         }
         else
         {
            char buf[MSL];

            sprintf(buf, "Load_deity_file: bad section: %s.", word);
            bug(buf, 0);
            break;
         }
      }
      fclose(fp);
   }

   return found;
}

/* Load in all the deity files */

void load_deity()
{
   FILE *fpList;
   char *filename;
   char deitylist[256];
   char buf[MSL];

   first_deity = NULL;
   last_deity = NULL;

   log_string("Loading deities...");

   sprintf(deitylist, "%s%s", DEITY_DIR, DEITY_LIST);
   if ((fpList = fopen(deitylist, "r")) == NULL)
   {
      perror(deitylist);
      exit(1);
   }

   for (;;)
   {
      filename = feof(fpList) ? "$" : fread_word(fpList);
      log_string(filename);
      if (filename[0] == '$')
         break;
      if (!load_deity_file(filename))
      {
         sprintf(buf, "Cannot load deity file: %s", filename);
         bug(buf, 0);
      }
   }
   fclose(fpList);
   log_string(" Done deities ");
   return;
}

void do_setdeity(CHAR_DATA * ch, char *argument)
{
   char arg1[MIL];
   char arg2[MIL];
   char arg3[MIL];
   DEITY_DATA *deity;
   int value;

   if (IS_NPC(ch))
   {
      send_to_char("Huh?\n\r", ch);
      return;
   }

   switch (ch->substate)
   {
      default:
         break;

      case SUB_RESTRICTED:
         send_to_char("You cannot do this while in another command.\n\r", ch);
         return;

      case SUB_DEITYDESC:
         deity = ch->dest_buf;
         STRFREE(deity->description);
         deity->description = copy_buffer(ch);
         stop_editing(ch);
         save_deity(deity);
         ch->substate = ch->tempnum;
         return;
   }

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

   if (arg1[0] == '\0')
   {
      send_to_char("Usage: setdeity <deity> <field> <toggle>\n\r", ch);
      send_to_char("\n\rField being one of:\n\r", ch);
      send_to_char("filename name description type alignment worshippers npcfoe susceptnum\n\r", ch);
      send_to_char("race race2 npcrace element sex affected suscept elementnum affectednum\n\r", ch);
      send_to_char("\n\rFavor adjustments:\n\r", ch);
      send_to_char("flee flee_npcrace kill kill_npcrace kill_magic\n\r", ch);
      send_to_char("die die_npcrace dig_corpse bury_corpse spell_aid\n\r", ch);
      send_to_char("steal backstab aid aid_spell sac kill_npcfoe\n\r", ch);
      send_to_char("die_npcfoe flee_npcfoe\n\r", ch);
      send_to_char("\n\rFavor requirements for supplicate:\n\r", ch);
      send_to_char("scorpse savatar sdeityobj srecall\n\r\n\r", ch);
      send_to_char("Objstat - being one of:\n\r", ch);
      send_to_char("str int wis con dex cha lck\n\r", ch);
      send_to_char(" 0 - 1 - 2 - 3 - 4 - 5 - 6\n\r", ch);
      return;
   }

   deity = get_deity(arg1);
   if (!deity)
   {
      send_to_char("No such deity.\n\r", ch);
      return;
   }

   if (!str_cmp(arg2, "name"))
   {
      STRFREE(deity->name);
      deity->name = STRALLOC(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "filename"))
   {
      DISPOSE(deity->filename);
      deity->filename = str_dup(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      write_deity_list();
      return;
   }

   if (!str_cmp(arg2, "description"))
   {
      if (ch->substate == SUB_REPEATCMD)
         ch->tempnum = SUB_REPEATCMD;
      else
         ch->tempnum = SUB_NONE;
      ch->substate = SUB_DEITYDESC;
      ch->dest_buf = deity;
      start_editing(ch, deity->description);
      editor_desc_printf(ch, "Deity description of deity '%s'.", deity->name);
      return;
   }

   if (!str_cmp(arg2, "alignment"))
   {
      deity->alignment = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "flee"))
   {
      deity->flee = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "flee_npcrace"))
   {
      deity->flee_npcrace = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "flee_npcfoe"))
   {
      deity->flee_npcfoe = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "kill"))
   {
      deity->kill = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "kill_npcrace"))
   {
      deity->kill_npcrace = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "kill_npcfoe"))
   {
      deity->kill_npcfoe = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "kill_magic"))
   {
      deity->kill_magic = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "sac"))
   {
      deity->sac = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "bury_corpse"))
   {
      deity->bury_corpse = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "aid_spell"))
   {
      deity->aid_spell = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "aid"))
   {
      deity->aid = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "steal"))
   {
      deity->steal = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "backstab"))
   {
      deity->backstab = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "die"))
   {
      deity->die = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "die_npcrace"))
   {
      deity->die_npcrace = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "die_npcfoe"))
   {
      deity->die_npcfoe = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "spell_aid"))
   {
      deity->spell_aid = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "dig_corpse"))
   {
      deity->dig_corpse = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "scorpse"))
   {
      deity->scorpse = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "savatar"))
   {
      deity->savatar = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "sdeityobj"))
   {
      deity->sdeityobj = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "objstat"))
   {
      deity->objstat = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "srecall"))
   {
      deity->srecall = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "worshippers"))
   {
      deity->worshippers = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "race"))
   {
      value = get_npc_race(argument);
      if (value < 0)
         value = atoi(argument);
      if ((value < 0) || (value >= MAX_RACE))
      {
         deity->race = -1;
         send_to_char("No race set.\n\r", ch);
         return;
      }
      deity->race = value;
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "race2"))
   {
      value = get_npc_race(argument);
      if (value < 0)
         value = atoi(argument);
      if ((value < 0) || (value >= MAX_RACE))
      {
         deity->race2 = -1;
         send_to_char("No race set.\n\r", ch);
         return;
      }
      deity->race2 = value;
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }


   if (!str_cmp(arg2, "npcrace"))
   {
      value = get_npc_race(argument);
      if (value < 0)
         value = atoi(argument);
      if ((value < 0) || (value >= max_npc_race))
      {
         send_to_char("Invalid npc race.\n\r", ch);
         return;
      }
      deity->npcrace = value;
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "npcfoe"))
   {
      value = get_npc_race(argument);
      if (value < 0)
         value = atoi(argument);
      if ((value < 0) || (value >= max_npc_race))
      {
         send_to_char("Invalid npc race.\n\r", ch);
         return;
      }
      deity->npcfoe = value;
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "susceptnum"))
   {
      deity->susceptnum = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "elementnum"))
   {
      deity->elementnum = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "affectednum"))
   {
      deity->affectednum = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "suscept"))
   {
      bool fMatch = FALSE;

      while (argument[0] != '\0')
      {
         argument = one_argument(argument, arg3);
         if (!str_cmp(arg3, "none"))
         {
            fMatch = TRUE;
            deity->suscept = 0;
         }
         else
         {
            value = get_risflag(arg3);
            if (value < 0 || value > 31)
               ch_printf(ch, "Unknown flag: %s\n\r", arg3);
            else
            {
               TOGGLE_BIT(deity->suscept, 1 << value);
               fMatch = TRUE;
            }
         }
      }

      if (fMatch)
         ch_printf(ch, "Done.\n\r");
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "element"))
   {
      bool fMatch = FALSE;

      while (argument[0] != '\0')
      {
         argument = one_argument(argument, arg3);
         if (!str_cmp(arg3, "none"))
         {
            fMatch = TRUE;
            deity->element = 0;
         }
         else
         {
            value = get_risflag(arg3);
            if (value < 0 || value > 31)
               ch_printf(ch, "Unknown flag: %s\n\r", arg3);
            else
            {
               TOGGLE_BIT(deity->element, 1 << value);
               fMatch = TRUE;
            }
         }
      }

      if (fMatch)
         ch_printf(ch, "Done.\n\r");
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "sex"))
   {
      deity->sex = atoi(argument);
      send_to_char("Done.\n\r", ch);
      save_deity(deity);
      return;
   }

   if (!str_cmp(arg2, "affected"))
   {
      bool fMatch = FALSE;

      while (argument[0] != '\0')
      {
         argument = one_argument(argument, arg3);
         if (!str_cmp(arg3, "none"))
         {
            fMatch = TRUE;
            xCLEAR_BITS(deity->affected);
         }
         else
         {
            value = get_aflag(arg3);
            if (value < 0 || value > MAX_BITS)
               ch_printf(ch, "Unknown flag: %s\n\r", arg3);
            else
            {
               xTOGGLE_BIT(deity->affected, value);
               fMatch = TRUE;
            }
         }
      }

      if (fMatch)
         ch_printf(ch, "Done.\n\r");
      save_deity(deity);
      return;
   }

   do_setdeity(ch, "");
   return;
}


void do_showdeity(CHAR_DATA * ch, char *argument)
{
   DEITY_DATA *deity;

   if (IS_NPC(ch))
   {
      send_to_char("Huh?\n\r", ch);
      return;
   }

   if (argument[0] == '\0')
   {
      send_to_char("Usage: showdeity <deity>\n\r", ch);
      return;
   }

   deity = get_deity(argument);
   if (!deity)
   {
      send_to_char("No such deity.\n\r", ch);
      return;
   }

   ch_printf(ch, "Deity: %s\n\rFilename: %s\n\rDescription:\n\r%s\n\r", deity->name, deity->filename, deity->description);
   ch_printf(ch, "Alignment: %-7dNpcrace: %-9sNpcfoe: %s\n\r",
      deity->alignment,
      (deity->npcrace < 0 || deity->npcrace > max_npc_race) ? "none" : print_npc_race(deity->npcrace),
      (deity->npcfoe < 0 || deity->npcfoe > max_npc_race) ? "none" : print_npc_race(deity->npcfoe));
   ch_printf(ch, "Race: %-12sSex: %-13sRace2: %s\n\r",
      (deity->race < 0 || deity->race > MAX_RACE) ? "none" : print_npc_race(deity->race),
      deity->sex == -1 ? "none" :
      deity->sex == SEX_MALE ? "male" :
      deity->sex == SEX_FEMALE ? "female" : "neutral", (deity->race2 < 0 || deity->race2 > MAX_RACE) ? "none" : print_npc_race(deity->race2));
   ch_printf(ch, "Objstat: %-9dWorshippers: %d\n\r", deity->objstat, deity->worshippers);
   ch_printf(ch, "Affectednum: %-5dElementnum: %-6dSusceptnum: %d\n\r", deity->affectednum, deity->elementnum, deity->susceptnum);
   ch_printf(ch, "\n\rAffected: %s\n\r", affect_bit_name(&deity->affected));
   ch_printf(ch, "Suscept: %s\n\r", flag_string(deity->suscept, ris_flags));
   ch_printf(ch, "Element: %s\n\r", flag_string(deity->element, ris_flags));
   ch_printf(ch, "\n\rFlee: %-12dFlee_npcrace: %-4dKill_npcrace: "
      "%-4dKill: %d\n\r", deity->flee, deity->flee_npcrace, deity->kill_npcrace, deity->kill);
   ch_printf(ch, "Kill_magic: %-6dSac: %-13dBury_corpse: %-5dAid_spell: "
      "%d\n\r", deity->kill_magic, deity->sac, deity->bury_corpse, deity->aid_spell);
   ch_printf(ch, "Aid: %-13dSteal: %-11dBackstab: %-8dDie: %d\n\r", deity->aid, deity->steal, deity->backstab, deity->die);
   ch_printf(ch, "Die_npcrace: %-5dDig_corpse: %-6dSpell_aid: %-7dKill_npcfoe: %d\n\r",
      deity->die_npcrace, deity->dig_corpse, deity->spell_aid, deity->kill_npcfoe);
   ch_printf(ch, "Die_npcfoe: %-6dFlee_npcfoe: %d\n\r", deity->die_npcfoe, deity->flee_npcfoe);
   ch_printf(ch, "\n\rScorpse: %-9dSavatar: %-9dSdeityobj: %-7d" "Srecall: %d\n\r", deity->scorpse, deity->savatar, deity->sdeityobj, deity->srecall);
   return;
}

void do_makedeity(CHAR_DATA * ch, char *argument)
{
   char filename[256];
   DEITY_DATA *deity;
   bool found;

   if (!argument || argument[0] == '\0')
   {
      send_to_char("Usage: makedeity <deity name>\n\r", ch);
      return;
   }

   found = FALSE;
   sprintf(filename, "%s%s", DEITY_DIR, strlower(argument));
   CREATE(deity, DEITY_DATA, 1);
   LINK(deity, first_deity, last_deity, next, prev);
   deity->name = STRALLOC(argument);
   deity->description = STRALLOC("");
   deity->filename = str_dup(filename);
   write_deity_list();
   save_deity(deity);

}

void do_devote(CHAR_DATA * ch, char *argument)
{
   char arg[MIL];
   DEITY_DATA *deity;

   if (IS_NPC(ch))
   {
      send_to_char("Huh?\n\r", ch);
      return;
   }

   argument = one_argument(argument, arg);

   if (arg[0] == '\0')
   {
      send_to_char("Devote yourself to which deity?\n\r", ch);
      return;
   }

   if (!str_cmp(arg, "none"))
   {
      AFFECT_DATA af;

      if (!ch->pcdata->deity)
      {
         send_to_char("You have already chosen to worship no deities.\n\r", ch);
         return;
      }
      --ch->pcdata->deity->worshippers;
      ch->pcdata->favor = -2500;
      ch->mental_state = -80;
      send_to_char("A terrible curse afflicts you as you forsake a deity!\n\r", ch);
      xREMOVE_BITS(ch->affected_by, ch->pcdata->deity->affected);
      REMOVE_BIT(ch->resistant, ch->pcdata->deity->element);
      REMOVE_BIT(ch->susceptible, ch->pcdata->deity->suscept);
      affect_strip(ch, gsn_blindness);
      af.type = gsn_blindness;
      af.location = APPLY_HITROLL;
      af.modifier = -4;
      af.duration = 50 * DUR_CONV;
      af.bitvector = meb(AFF_BLIND);
      affect_to_char(ch, &af);
      save_deity(ch->pcdata->deity);
      send_to_char("You cease to worship any deity.\n\r", ch);
      ch->pcdata->deity = NULL;
      STRFREE(ch->pcdata->deity_name);
      ch->pcdata->deity_name = STRALLOC("");
      save_char_obj(ch);
      return;
   }

   deity = get_deity(arg);
   if (!deity)
   {
      send_to_char("No such deity holds weight on this world.\n\r", ch);
      return;
   }

   if (ch->pcdata->deity)
   {
      send_to_char("You are already devoted to a deity.\n\r", ch);
      return;
   }

   if ((deity->sex != -1) && (deity->sex != ch->sex))
   {
      send_to_char("That deity will not accept worshippers of your sex.\n\r", ch);
      return;
   }

   if ((deity->race == -1) && (deity->race2 == -1)) ;
   else
   {
      if ((deity->race != ch->race) && (deity->race2 != ch->race))
      {
         send_to_char("That deity will not accept worshippers of your race.\n\r", ch);
         return;
      }
   }
/*
    if ( ch->pcdata->deity )
    {
	AFFECT_DATA af;
	--ch->pcdata->deity->worshippers;
	ch->pcdata->favor = -2500;
	send_to_char( "A terrible curse afflicts you as you forsake a deity!\n\r", ch );
	xREMOVE_BITs( ch->affected_by, ch->pcdata->deity->affected );
	REMOVE_BIT( ch->resistant, ch->pcdata->deity->element );

	affect_strip( ch, gsn_blindness );
	af.type		= gsn_blindness;
	af.location	= APPLY_HITROLL;
	af.modifier	= -4;
	af.duration	= 50 * DUR_CONV;
	af.bitvector	= AFF_BLIND;
	affect_to_char( ch, &af );
	save_deity(ch->pcdata->deity);
    }	
*/

   STRFREE(ch->pcdata->deity_name);
   ch->pcdata->deity_name = QUICKLINK(deity->name);
   ch->pcdata->deity = deity;
   if (ch->pcdata->favor > deity->affectednum)
   {
      xSET_BITS(ch->affected_by, ch->pcdata->deity->affected);
   }
   if (ch->pcdata->favor > deity->elementnum)
   {
      SET_BIT(ch->resistant, ch->pcdata->deity->element);
   }
   if (ch->pcdata->favor < deity->susceptnum)
   {
      SET_BIT(ch->susceptible, ch->pcdata->deity->suscept);
   }
   act(AT_MAGIC, "Body and soul, you devote yourself to $t!", ch, ch->pcdata->deity_name, NULL, TO_CHAR);
   ++ch->pcdata->deity->worshippers;
   save_deity(ch->pcdata->deity);
   save_char_obj(ch);
   return;
}


void do_deities(CHAR_DATA * ch, char *argument)
{
   DEITY_DATA *deity;
   int count = 0;

   if (argument[0] == '\0')
   {
      send_to_pager_color("&gFor detailed information on a deity, try 'deities <deity>' or 'help deities'\n\r", ch);
      send_to_pager_color("Deity			Worshippers\n\r", ch);
      for (deity = first_deity; deity; deity = deity->next)
      {
         pager_printf_color(ch, "&G%-14s	&g%19d\n\r", deity->name, deity->worshippers);
         count++;
      }
      if (!count)
      {
         send_to_pager_color("&gThere are no deities on this world.\n\r", ch);
         return;
      }
      return;
   }

   deity = get_deity(argument);
   if (!deity)
   {
      send_to_pager_color("&gThat deity does not exist.\n\r", ch);
      return;
   }

   pager_printf_color(ch, "&gDeity:        &G%s\n\r", deity->name);
   pager_printf_color(ch, "&gDescription:\n\r&G%s", deity->description);
   return;
}

void do_supplicate(CHAR_DATA * ch, char *argument)
{
   char arg[MIL];
   char buf[MSL];
   int oldfavor;

   one_argument(argument, arg);
   if (IS_NPC(ch) || !ch->pcdata->deity)
   {
      send_to_char("You have no deity to supplicate to.\n\r", ch);
      return;
   }

   oldfavor = ch->pcdata->favor;

   if (arg[0] == '\0')
   {
      send_to_char("Supplicate for what?\n\r", ch);
      return;
   }

   if (!str_cmp(arg, "corpse"))
   {
      char buf2[MSL];
      char buf3[MSL];
      OBJ_DATA *obj;
      ROOM_INDEX_DATA *sRoom;
      bool found;

      if (ch->pcdata->favor < ch->pcdata->deity->scorpse)
      {
         send_to_char("You are not favored enough for a corpse retrieval.\n\r", ch);
         return;
      }

      if (xIS_SET(ch->in_room->room_flags, ROOM_CLANSTOREROOM))
      {
         send_to_char("You cannot supplicate in a storage room.\n\r", ch);
         return;
      }
      if (ch->coord->x > -1 || ch->coord->y > -1 || ch->map > -1)
      {
         send_to_char("You cannot supplicate while on the Wilderness map.\n\r", ch);
         return;
      }

      found = FALSE;
      sprintf(buf3, " ");
      sprintf(buf2, "the corpse of %s", ch->name);
      for (obj = first_object; obj; obj = obj->next)
      {
         if (obj->in_room && !str_cmp(buf2, obj->short_descr) && (obj->pIndexData->vnum == 11))
         {
            found = TRUE;
            if (xIS_SET(obj->in_room->room_flags, ROOM_NOSUPPLICATE))
            {
               act(AT_MAGIC, "The image of your corpse appears, but suddenly wavers away.", ch, NULL, NULL, TO_CHAR);
               return;
            }
            sRoom = ch->in_room;

            char_from_room(ch);
            char_to_room(ch, obj->in_room);
            if (check_room_pk(ch) >= 3)
            {
               act(AT_MAGIC, "Your supplicate for your corpse, but it is protected in a PK zone.", ch, NULL, NULL, TO_CHAR);
               char_from_room(ch);
               char_to_room(ch, sRoom);
            }
            char_from_room(ch);
            char_to_room(ch, sRoom);
            act(AT_MAGIC, "Your corpse appears suddenly, surrounded by a divine presence...", ch, NULL, NULL, TO_CHAR);
            act(AT_MAGIC, "$n's corpse appears suddenly, surrounded by a divine force...", ch, NULL, NULL, TO_ROOM);
            obj_from_room(obj);
            obj = obj_to_room(obj, ch->in_room, ch);
            update_container(obj, ch->coord->x, ch->coord->y, ch->map, 0, 0, 0);
         }
      }

      if (!found)
      {
         send_to_char("No corpse of yours litters the world...\n\r", ch);
         return;
      }
      ch->pcdata->favor -= ch->pcdata->deity->scorpse;

      if (ch->pcdata->favor < ch->pcdata->deity->susceptnum)
         SET_BIT(ch->susceptible, ch->pcdata->deity->suscept);

      if ((oldfavor > ch->pcdata->deity->affectednum &&
            ch->pcdata->favor <= ch->pcdata->deity->affectednum) ||
         (oldfavor > ch->pcdata->deity->elementnum &&
ch->pcdata->favor <= ch->pcdata->deity->elementnum) || (oldfavor < ch->pcdata->deity->susceptnum && ch->pcdata->favor >= ch->pcdata->deity->susceptnum))
      {
         update_aris(ch);
      }

      return;
   }

   if (!str_cmp(arg, "object"))
   {
      OBJ_DATA *obj;
      OBJ_INDEX_DATA *pObjIndex;
      AFFECT_DATA *paf;

      if (ch->pcdata->favor < ch->pcdata->deity->sdeityobj)
      {
         send_to_char("You are not favored enough for that.\n\r", ch);
         return;
      }

      pObjIndex = get_obj_index(OBJ_VNUM_DEITY);

      obj = create_object(pObjIndex, ch->level);
      if (CAN_WEAR(obj, ITEM_TAKE))
         obj = obj_to_char(obj, ch);
      else
         obj = obj_to_room(obj, ch->in_room, ch);

      sprintf(buf, "sigil %s", ch->pcdata->deity->name);
      STRFREE(obj->name);
      obj->name = STRALLOC(buf);

      sprintf(buf, obj->short_descr, ch->pcdata->deity->name);
      STRFREE(obj->short_descr);
      obj->short_descr = STRALLOC(buf);

      sprintf(buf, obj->description, ch->pcdata->deity->name);
      STRFREE(obj->description);
      obj->description = STRALLOC(buf);

      act(AT_MAGIC, "$n weaves $p from divine matter!", ch, obj, NULL, TO_ROOM);
      act(AT_MAGIC, "You weave $p from divine matter!", ch, obj, NULL, TO_CHAR);
      ch->pcdata->favor -= ch->pcdata->deity->sdeityobj;

      if (ch->pcdata->favor < ch->pcdata->deity->susceptnum)
         SET_BIT(ch->susceptible, ch->pcdata->deity->suscept);

      if ((oldfavor > ch->pcdata->deity->affectednum &&
            ch->pcdata->favor <= ch->pcdata->deity->affectednum) ||
         (oldfavor > ch->pcdata->deity->elementnum &&
ch->pcdata->favor <= ch->pcdata->deity->elementnum) || (oldfavor < ch->pcdata->deity->susceptnum && ch->pcdata->favor >= ch->pcdata->deity->susceptnum))
      {
         update_aris(ch);
      }

      CREATE(paf, AFFECT_DATA, 1);
      paf->type = -1;
      paf->duration = -1;
      switch (ch->pcdata->deity->objstat)
      {
         case 0:
            paf->location = APPLY_STR;
            break;
         case 1:
            paf->location = APPLY_INT;
            break;
         case 2:
            paf->location = APPLY_WIS;
            break;
         case 3:
            paf->location = APPLY_CON;
            break;
         case 4:
            paf->location = APPLY_DEX;
            break;
         case 5:
            paf->location = APPLY_CHA;
            break;
         case 6:
            paf->location = APPLY_LCK;
            break;
      }
      paf->modifier = 1;
      xCLEAR_BITS(paf->bitvector);
      LINK(paf, obj->first_affect, obj->last_affect, next, prev);

      return;
   }

   if (!str_cmp(arg, "recall"))
   {
      ROOM_INDEX_DATA *location;

      if (ch->pcdata->favor < ch->pcdata->deity->srecall)
      {
         send_to_char("Your favor is inadequate for such a supplication.\n\r", ch);
         return;
      }

      if (xIS_SET(ch->in_room->room_flags, ROOM_NOSUPPLICATE))
      {
         send_to_char("You have been forsaken!\n\r", ch);
         return;
      }

      if (check_room_pk(ch) >= 3)
      {
         send_to_char("Your deity shuns cowards you KNOW!\n\r", ch);
         return;
      }

      if (in_hellmaze(ch))
      {
         send_to_char("Even your deity cannot hear you in this forsaken place.\n\r", ch);
         return;
      }

      location = NULL;

      if (!IS_NPC(ch) && ch->pcdata->clan)
         location = get_room_index(ch->pcdata->clan->recall);

      if (!location)
         location = get_room_index(ROOM_VNUM_TEMPLE);

      if (!location)
      {
         send_to_char("You are completely lost.\n\r", ch);
         return;
      }

      act(AT_MAGIC, "$n disappears in a column of divine power.", ch, NULL, NULL, TO_ROOM);
      char_from_room(ch);
      char_to_room(ch, location);
      update_objects(ch, ch->map, ch->coord->x, ch->coord->y);
      if (ch->mount)
      {
         char_from_room(ch->mount);
         char_to_room(ch->mount, location);
      }
      act(AT_MAGIC, "$n appears in the room from a column of divine mist.", ch, NULL, NULL, TO_ROOM);
      do_look(ch, "auto");
      ch->pcdata->favor -= ch->pcdata->deity->srecall;

      if (ch->pcdata->favor < ch->pcdata->deity->susceptnum)
         SET_BIT(ch->susceptible, ch->pcdata->deity->suscept);

      if ((oldfavor > ch->pcdata->deity->affectednum &&
            ch->pcdata->favor <= ch->pcdata->deity->affectednum) ||
         (oldfavor > ch->pcdata->deity->elementnum &&
ch->pcdata->favor <= ch->pcdata->deity->elementnum) || (oldfavor < ch->pcdata->deity->susceptnum && ch->pcdata->favor >= ch->pcdata->deity->susceptnum))
      {
         update_aris(ch);
      }

      return;
   }

   send_to_char("You cannot supplicate for that.\n\r", ch);
   return;
}

/*
Internal function to adjust favor.
Fields are:
0 = flee		5 = sac			10 = backstab	
1 = flee_npcrace	6 = bury_corpse		11 = die
2 = kill		7 = aid_spell		12 = die_npcrace
3 = kill_npcrace	8 = aid			13 = spell_aid
4 = kill_magic		9 = steal		14 = dig_corpse
15 = die_npcfoe	       16 = flee_npcfoe         17 = kill_npcfoe
*/
void adjust_favor(CHAR_DATA * ch, int field, int mod)
{
   int oldfavor;

   if (IS_NPC(ch) || !ch->pcdata->deity)
      return;

   oldfavor = ch->pcdata->favor;

   if ((ch->alignment - ch->pcdata->deity->alignment > 650
         || ch->alignment - ch->pcdata->deity->alignment < -650) && ch->pcdata->deity->alignment != 0)
   {
      ch->pcdata->favor -= 2;
      ch->pcdata->favor = URANGE(-2500, ch->pcdata->favor, 2500);

      if (ch->pcdata->favor > ch->pcdata->deity->affectednum)
         xSET_BITS(ch->affected_by, ch->pcdata->deity->affected);
      if (ch->pcdata->favor > ch->pcdata->deity->elementnum)
         SET_BIT(ch->resistant, ch->pcdata->deity->element);
      if (ch->pcdata->favor < ch->pcdata->deity->susceptnum)
         SET_BIT(ch->susceptible, ch->pcdata->deity->suscept);

      /* If favor crosses over the line then strip the affect */
      if ((oldfavor > ch->pcdata->deity->affectednum &&
            ch->pcdata->favor <= ch->pcdata->deity->affectednum) ||
         (oldfavor > ch->pcdata->deity->elementnum &&
ch->pcdata->favor <= ch->pcdata->deity->elementnum) || (oldfavor < ch->pcdata->deity->susceptnum && ch->pcdata->favor >= ch->pcdata->deity->susceptnum))
      {
         update_aris(ch);
      }

      return;
   }

   if (mod < 1)
      mod = 1;
   switch (field)
   {
      case 0:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->flee / mod);
         break;
      case 1:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->flee_npcrace / mod);
         break;
      case 2:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->kill / mod);
         break;
      case 3:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->kill_npcrace / mod);
         break;
      case 4:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->kill_magic / mod);
         break;
      case 5:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->sac / mod);
         break;
      case 6:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->bury_corpse / mod);
         break;
      case 7:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->aid_spell / mod);
         break;
      case 8:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->aid / mod);
         break;
      case 9:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->steal / mod);
         break;
      case 10:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->backstab / mod);
         break;
      case 11:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->die / mod);
         break;
      case 12:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->die_npcrace / mod);
         break;
      case 13:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->spell_aid / mod);
         break;
      case 14:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->dig_corpse / mod);
         break;
      case 15:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->die_npcfoe / mod);
         break;
      case 16:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->flee_npcfoe / mod);
         break;
      case 17:
         ch->pcdata->favor += number_fuzzy(ch->pcdata->deity->kill_npcfoe / mod);
         break;
   }
   ch->pcdata->favor = URANGE(-2500, ch->pcdata->favor, 2500);

   if (ch->pcdata->favor > ch->pcdata->deity->affectednum)
      xSET_BITS(ch->affected_by, ch->pcdata->deity->affected);
   if (ch->pcdata->favor > ch->pcdata->deity->elementnum)
      SET_BIT(ch->resistant, ch->pcdata->deity->element);
   if (ch->pcdata->favor < ch->pcdata->deity->susceptnum)
      SET_BIT(ch->susceptible, ch->pcdata->deity->suscept);

   /* If favor crosses over line then strip the affect */
   if ((oldfavor > ch->pcdata->deity->affectednum &&
         ch->pcdata->favor <= ch->pcdata->deity->affectednum) ||
      (oldfavor > ch->pcdata->deity->elementnum &&
ch->pcdata->favor <= ch->pcdata->deity->elementnum) || (oldfavor < ch->pcdata->deity->susceptnum && ch->pcdata->favor >= ch->pcdata->deity->susceptnum))
   {
      update_aris(ch);
   }

   return;
}