rm4/
rm4/boards/
rm4/clans/
rm4/councils/
rm4/deity/
rm4/gods/
rm4/guilds/
rm4/player/a/
rm4/src/utils/
rm4/watch/
rm4/web/public_html/
/****************************************************************************
 * ResortMUD 4.0 Beta by Ntanel, Garinan, Badastaz, Josh, Digifuzz, Senir,  *
 * Kratas, Scion, Shogar and Tagith.  Special thanks to Thoric, Nivek,      *
 * Altrag, Arlorn, Justice, Samson, Dace, HyperEye and Yakkov.              *
 ****************************************************************************
 * Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld              *
 * of Lorain, Ohio - ALL RIGHTS RESERVED                                    *
 * The text and pictures of this publication, or any part thereof, may not  *
 * be reproduced or transmitted in any form or by any means, electronic or  *
 * mechanical, includes photocopying, recording, storage in a information   *
 * retrieval system, or otherwise, without the prior written or e-mail      *
 * consent from the publisher.                                              *
 ****************************************************************************
 * GREETING must mention ResortMUD programmers and the help file named      *
 * CREDITS must remain completely intact as listed in the SMAUG license.    *
 ****************************************************************************/

/****************************************************************************
 * [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 );
   fpout = fopen( filename, "w" );
   if( !fpout )
      bug( "FATAL: cannot open deity.lst for writing!\r\n", 0 );
   else
   {
      for( tdeity = first_deity; tdeity; tdeity = tdeity->next )
         fprintf( fpout, "%s\n", tdeity->filename );
      fprintf( fpout, "$\n" );
      fclose( fpout );
      fpout = NULL;
   }
}

/* Save a deity's data to its data file */
void save_deity( DEITY_DATA * deity )
{
   FILE *fp;
   char filename[256];
   char buf[MAX_STRING_LENGTH];

   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 );

   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, "Suplift		%d\n", deity->suplift );
      fprintf( fp, "Race		%d\n", deity->race );
      fprintf( fp, "Class		%d\n", deity->class );
      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 );
      fp = NULL;
   }
   return;
}

/* Read in actual deity data */
void fread_deity( DEITY_DATA * deity, FILE * fp )
{
   char buf[MAX_STRING_LENGTH];
   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 'C':
            KEY( "Class", deity->class, 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( "Suplift", deity->suplift, 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[MAX_STRING_LENGTH];
            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[MAX_STRING_LENGTH];

   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[MAX_INPUT_LENGTH];
   char arg2[MAX_INPUT_LENGTH];
   char arg3[MAX_INPUT_LENGTH];
   DEITY_DATA *deity;
   int value;

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

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

      case SUB_RESTRICTED:
         send_to_char( "You cannot do this while in another command.\r\n", 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;
   }

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

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

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

   if( !str_cmp( arg2, "name" ) )
   {
      DEITY_DATA *udeity;

      if( !argument || argument[0] == '\0' )
      {
         send_to_char( "You can't set a deity's name to nothing.\r\n", ch );
         return;
      }
      if( ( udeity = get_deity( argument ) ) )
      {
         send_to_char( "There is already another deity with that name.\r\n", ch );
         return;
      }
      STRFREE( deity->name );
      deity->name = STRALLOC( argument );
      send_to_char( "Done.\r\n", ch );
      save_deity( deity );
      return;
   }

   if( !str_cmp( arg2, "filename" ) )
   {
      char filename[256];

      if( !argument || argument[0] == '\0' )
      {
         send_to_char( "You can't set a deity's filename to nothing.\r\n", ch );
         return;
      }
      snprintf( filename, 256, "%s%s", DEITY_DIR, deity->filename );
      if( !remove( filename ) )
         send_to_char( "Old deity file deleted.\r\n", ch );
      DISPOSE( deity->filename );
      deity->filename = str_dup( argument );
      send_to_char( "Done.\r\n", 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 );
      return;
   }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

   if( !str_cmp( arg2, "worshippers" ) )
   {
      deity->worshippers = atoi( argument );
      send_to_char( "Done.\r\n", 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.\r\n", ch );
         return;
      }
      deity->race = value;
      send_to_char( "Done.\r\n", 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.\r\n", ch );
         return;
      }
      deity->race2 = value;
      send_to_char( "Done.\r\n", 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.\r\n", ch );
         return;
      }
      deity->npcrace = value;
      send_to_char( "Done.\r\n", 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.\r\n", ch );
         return;
      }
      deity->npcfoe = value;
      send_to_char( "Done.\r\n", ch );
      save_deity( deity );
      return;
   }

   if( !str_cmp( arg2, "class" ) )
   {
      deity->class = atoi( argument );
      if( ( deity->class < 0 ) || ( deity->class >= MAX_CLASS ) )
         deity->class = -1;
      send_to_char( "Done.\r\n", ch );
      save_deity( deity );
      return;
   }

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

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

   if( !str_cmp( arg2, "affectednum" ) )
   {
      deity->affectednum = atoi( argument );
      send_to_char( "Done.\r\n", 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\r\n", arg3 );
            else
            {
               TOGGLE_BIT( deity->suscept, 1 << value );
               fMatch = TRUE;
            }
         }
      }

      if( fMatch )
         ch_printf( ch, "Done.\r\n" );
      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\r\n", arg3 );
            else
            {
               TOGGLE_BIT( deity->element, 1 << value );
               fMatch = TRUE;
            }
         }
      }

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

   if( !str_cmp( arg2, "sex" ) )
   {
      deity->sex = atoi( argument );
      send_to_char( "Done.\r\n", 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\r\n", arg3 );
            else
            {
               xTOGGLE_BIT( deity->affected, value );
               fMatch = TRUE;
            }
         }
      }

      if( fMatch )
         ch_printf( ch, "Done.\r\n" );
      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?\r\n", ch );
      return;
   }

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

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

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

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

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

   smash_tilde( argument );

   if( ( deity = get_deity( argument ) ) )
   {
      send_to_char( "A deity with that name already holds weight on this world.\r\n", ch );
      return;
   }

   CREATE( deity, DEITY_DATA, 1 );
   LINK( deity, first_deity, last_deity, next, prev );
   deity->name = STRALLOC( argument );
   deity->filename = str_dup( strlower( argument ) );
   write_deity_list( );
   save_deity( deity );
   ch_printf( ch, "%s deity has been created\r\n", argument );
   return;
}

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

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

/*    if ( ch->level < 5 )
    {
	send_to_char( "You are not yet prepared for such devotion.\r\n", ch );
	return;
    }
*/
   argument = one_argument( argument, arg );

   if( arg[0] == '\0' )
   {
      send_to_char( "Devote yourself to which deity?\r\n", 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.\r\n", ch );
         return;
      }
      --ch->pcdata->deity->worshippers;
      if( ch->pcdata->deity->worshippers < 0 )
         ch->pcdata->deity->worshippers = 0;
      ch->pcdata->favor = -2500;
      ch->mental_state = -80;
      send_to_char( "A terrible curse afflicts you as you forsake a deity!\r\n", 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.\r\n", ch );
      ch->pcdata->deity = NULL;
      STRFREE( ch->pcdata->deity_name );
      ch->pcdata->deity_name = STRALLOC( "" );
      save_char_obj( ch );
      return;
   }

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

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

   if( ( deity->class != -1 ) && ( deity->class != ch->class ) )
   {
      send_to_char( "That deity will not accept your worship due to your class.\r\n", ch );
      return;
   }

   if( ( deity->sex != -1 ) && ( deity->sex != ch->sex ) )
   {
      send_to_char( "That deity will not accept worshippers of your sex.\r\n", 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.\r\n", 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!\r\n", 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'\r\n", ch );
      send_to_pager_color( "Deity			Worshippers\r\n", ch );
      for( deity = first_deity; deity; deity = deity->next )
      {
         pager_printf_color( ch, "&G%-14s	&g%19d\r\n", deity->name, deity->worshippers );
         count++;
      }
      if( !count )
      {
         send_to_pager_color( "&gThere are no deities on this world.\r\n", ch );
         return;
      }
      return;
   }

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

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

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

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

   oldfavor = ch->pcdata->favor;

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

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

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

      if( IS_SET( ch->in_room->room_flags, ROOM_CLANSTOREROOM ) )
      {
         send_to_char( "You cannot supplicate in a storage room.\r\n", 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( IS_SET( obj->in_room->room_flags, ROOM_NOSUPPLICATE ) || ( obj->timer > 35 ) )
            {
               act( AT_MAGIC, "The image of your corpse appears, but suddenly wavers away.", ch, NULL, NULL, TO_CHAR );
               return;
            }
            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 );
         }
      }

      if( !found )
      {
         send_to_char( "No corpse of yours litters the world...\r\n", 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, "avatar" ) )
   {
      MOB_INDEX_DATA *pMobIndex;
      CHAR_DATA *victim;

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

      pMobIndex = get_mob_index( MOB_VNUM_DEITY );
      victim = create_mobile( pMobIndex );
      char_to_room( victim, ch->in_room );

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

      sprintf( buf, victim->long_descr, ch->pcdata->deity->name );
      STRFREE( victim->long_descr );
      victim->long_descr = STRALLOC( buf );

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


      act( AT_MAGIC, "$n summons a powerful avatar!", ch, NULL, NULL, TO_ROOM );
      act( AT_MAGIC, "You summon a powerful avatar!", ch, NULL, NULL, TO_CHAR );
      add_follower( victim, ch );
      xSET_BIT( victim->affected_by, AFF_CHARM );
      victim->level = 10;
      victim->hit = ch->hit * 6 + ch->pcdata->favor;
      victim->alignment = ch->pcdata->deity->alignment;
      victim->max_hit = ch->hit * 6 + ch->pcdata->favor;

      ch->pcdata->favor -= ch->pcdata->deity->savatar;

      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.\r\n", 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 );

      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, "uplift" ) )
   {
      if( ch->pcdata->favor < ch->pcdata->deity->suplift )
      {
         send_to_char( "Your favor is inadequate for such a supplication.\r\n", ch );
         return;
      }
      if( IS_SET( ch->in_room->room_flags, ROOM_NOSUPPLICATE ) )
      {
         send_to_char( "You have been forsaken!\r\n", ch );
         return;
      }
      if( ( ch->hit ) > ( ch->max_hit / 10 ) )
      {
         send_to_char( "You must become downtrodden before being eligible for uplifting.\r\n", ch );
         return;
      }
      ch->hit += 10;

/* Zebeid */
      ch->pcdata->favor -= ch->pcdata->deity->suplift;

      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 );
      }

      act( AT_MAGIC, "$n is engulfed in holy light, and is partially healed!", ch, NULL, NULL, TO_ROOM );
      send_to_char( "You are momentarily engulfed in holy light.\r\nYou have been healed by your God!\r\n", ch );
      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.\r\n", ch );
         return;
      }

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

      if( get_timer( ch, TIMER_RECENTFIGHT ) > 0 && !IS_IMMORTAL( ch ) )
      {
         send_to_char( "You cannot supplicate recall under adrenaline!\r\n", ch );
         return;
      }

      if( ch->position == POS_FIGHTING )
      {
         send_to_char( "You cannot concentrate enough to supplicate!\r\n", 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.\r\n", 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 );
      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.\r\n", 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;
}