/***************************************************************************
* 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. *
* *
* Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David *
* Love, Guilherme 'Willie' Arnold, and Mitchell Tse. *
* *
* In order to use any part of this Envy Diku Mud, you must comply with *
* the original Diku license in 'license.doc', the Merc license in *
* 'license.txt', as well as the Envy license in 'license.nvy'. *
* 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. *
***************************************************************************/
/*$Id: religion.c,v 1.12 2005/02/22 23:55:19 ahsile Exp $*/
#if defined( macintosh )
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#define REL_QUEST_MIN 50
extern bool rel_quest_gen (CHAR_DATA* ch, int align, int levels);
extern void rel_quest_goals(CHAR_DATA* ch, int levels, int align);
void rquest_update args(( void ));
void do_religions( CHAR_DATA *ch, char *argument )
{
RELIGION_DATA *pReligion;
char buf[MAX_STRING_LENGTH];
char result [ MAX_STRING_LENGTH*2 ]; /* May need tweaking. */
int chance;
if ( religion_first == NULL )
return;
sprintf( result, "[%3s] [%4s] [%12s] [%7s] [%7s] [%7s] [%6s]\n\r",
"Num", "Name", "Deity", "Followers", "Pkills", "Pkilled", "% Wins");
for ( pReligion = religion_first->next; pReligion; pReligion = pReligion->next )
{
chance = 0;
if(pReligion->pkills != 0 || pReligion->pdeaths != 0)
chance = (int)( ((float)pReligion->pkills / (float)(pReligion->pkills + pReligion->pdeaths) ) * 100 );
sprintf( buf, "[%3d] [%4s] [%12s] [%9d] [%7d] [%7d] [%6d]\n\r",
pReligion->vnum,
pReligion->name,
pReligion->deity,
pReligion->members,
pReligion->pkills,
pReligion->pdeaths,
chance );
strcat( result, buf );
}
send_to_char(AT_WHITE, result, ch );
return;
}
void do_religioninfo( CHAR_DATA *ch, char *argument )
{
RELIGION_DATA *pReligion;
char buf[MAX_STRING_LENGTH];
int num;
char arg1[MAX_INPUT_LENGTH];
argument = one_argument(argument, arg1);
if (!(is_number(arg1)))
{
send_to_char(AT_WHITE, "Syntax: religioninfo <religion number>\n\r", ch );
send_to_char(AT_WHITE, "Use the command religions to find a religion number.\n\r", ch );
return;
}
num = atoi(arg1);
if (!(pReligion = get_religion_index(num)))
{
send_to_char( AT_WHITE, "Illegal religion number, please try again.\n\r", ch );
return;
}
sprintf( buf, "------------------Information on <%s>-----------------\n\r\n\r", pReligion->name );
send_to_char(AT_WHITE, buf, ch );
sprintf( buf, "Name: %s\n\r", pReligion->shortdesc );
send_to_char(AT_LBLUE, buf, ch );
sprintf( buf, "Deity [%12s]\n\r", pReligion->deity );
send_to_char(AT_CYAN, buf, ch );
sprintf( buf, "Followers [%12d]\n\r", pReligion->members );
send_to_char(AT_BLUE, buf, ch );
sprintf( buf, "Pkills: [%12d]\n\r", pReligion->pkills );
send_to_char(AT_DBLUE, buf, ch );
sprintf( buf, "Pkilled: [%12d]\n\r", pReligion->pdeaths );
send_to_char(AT_BLUE, buf, ch );
sprintf( buf, "Mkills: [%12d]\n\r", pReligion->mkills );
send_to_char(AT_CYAN, buf, ch );
sprintf( buf, "Mkilled: [%12d]\n\r", pReligion->mdeaths );
send_to_char(AT_LBLUE, buf, ch );
sprintf( buf, "Description:\n\r%s", pReligion->description );
send_to_char( AT_WHITE, buf, ch );
return;
}
void do_relquest(CHAR_DATA* ch, char *argument)
{
do_crusade(ch, argument);
}
void do_crusade(CHAR_DATA *ch, char *argument)
{
DESCRIPTOR_DATA* d;
CHAR_DATA *questman;
CHAR_DATA *boss;
char buf [MAX_STRING_LENGTH];
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if (arg1[0] == '\0')
{
send_to_char(AT_WHITE, "CRUSADE commands: POINTS INFO TIME REQUEST COMPLETE LIST BUY ADVANCE.\n\r",ch);
send_to_char(AT_WHITE, "For more information, type 'HELP CRUSADE'.\n\r",ch);
return;
}
if (!str_cmp(arg1, "time"))
{
if (IS_SET(ch->act2, PLR_RELQUEST))
{
sprintf(buf, "You have %d minutes left on your crusade!\n\r", ch->rcountdown);
} else
{
if (ch->rnextquest > 0)
{
sprintf(buf, "You have %d minutes left before your next crusade!\n\r", ch->rnextquest);
} else
{
strcpy(buf, "You are free to do a crusade right now!\n\r");
}
}
send_to_char(AT_WHITE, buf, ch);
return;
} else if (!str_cmp(arg1, "points"))
{
sprintf(buf, "You have %d relgion points.\n\r", ch->rquestpoints);
send_to_char(AT_WHITE, buf, ch);
return;
} else if (!str_cmp(arg1, "info"))
{
OBJ_INDEX_DATA* oinfo;
MOB_INDEX_DATA* minfo;
if (!IS_SET(ch->act2, PLR_RELQUEST))
{
send_to_char(AT_WHITE, "You are not on a crusade!\n\r", ch);
return;
}
if (ch->rquestobj[ch->relquest_level]==0 && ch->rquestmob[ch->relquest_level]==0)
{
if (ch->in_room->vnum <= REL_VNUM_UPPER && ch->in_room->vnum >= REL_VNUM_LOWER)
{
send_to_char(AT_WHITE, "You are almost finished your crusade.\n\rFind the portal to the next level!\n\r", ch);
return;
} else
{
send_to_char(AT_WHITE, "You are almost finished your crusade!\n\rFind your DEITY and COMPLETE you quest!\n\r",ch);
return;
}
}
if (ch->rquestmob[ch->relquest_level])
{
if (ch->rquestmob[ch->relquest_level] == -1)
{
send_to_char(AT_WHITE, "You are almost done your crusade!\n\rFind the boss and ADVANCE!\n\r", ch);
return;
} else
{
minfo = get_mob_index( ch->rquestmob[ch->relquest_level] );
sprintf(buf, "You are on a crusade to slay the dreaded %s!\n\r", minfo->short_descr);
}
} else
{
oinfo = get_obj_index( ch->rquestobj[ch->relquest_level] );
sprintf(buf, "You are on a crusade to retrieve the fabled %s!\n\r", oinfo->short_descr);
}
send_to_char(AT_WHITE, buf, ch);
return;
}
for ( questman = ch->in_room->people; questman != NULL; questman = questman->next_in_room)
{
if (!IS_NPC(questman)) continue;
if (IS_SET(questman->act, ACT_IS_DEITY)) break;
}
for (boss = ch->in_room->people; boss; boss = boss->next_in_room)
{
if (!IS_NPC(boss)) continue;
if (IS_SET(boss->act, ACT_RELBOSS)) break;
}
if (!str_cmp(arg1, "request"))
{
int member_count = 0;
CHAR_DATA* group[MAX_GROUP];
if (questman==NULL)
{
send_to_char(AT_WHITE, "Your deity is not here!\n\r", ch);
return;
}
if (IS_SET(ch->act2, PLR_RELQUEST))
{
send_to_char(AT_WHITE, "You are already ON a crusade!\n\r",ch);
return;
}
if (relquest)
{
send_to_char(AT_WHITE, "The gods have already set a crusade to be finished!\n\r",ch);
return;
}
if (ch->master)
{
send_to_char(AT_WHITE, "Only your group leader can ask for a crusade!\n\r", ch);
return;
}
if (ch->alignment > -500 && ch->alignment < 500) /* || (ch->religion == TIME_AND_FATE */
{
send_to_char(AT_WHITE, "You are neutral. You cannot go upon a crusade!\n\r",ch);
return;
}
if (ch->leader)
{
send_to_char(AT_WHITE, "Only the leader of your group can request a crusade!\n\r", ch);
return;
}
for ( d = descriptor_list; d; d = d->next )
{
RELIGION_DATA* rd = NULL;
CHAR_DATA* gch = NULL;
if ( d->connected != CON_PLAYING )
continue;
gch = d->character;
if ( !is_same_group(gch , ch ) )
continue;
if ( gch->in_room != ch->in_room )
{
send_to_char(AT_WHITE, "Your must gather your party before venturing forth!\n\r", ch);
return;
}
if ( gch->rnextquest > 0 )
{
sprintf(buf, "%s must wait before doing another crusade!\n\r", gch->name);
send_to_char(AT_WHITE, "You must wait before your next Crusade!\n\r", gch);
send_to_char(AT_WHITE, buf, ch);
return;
}
if ( gch->level < REL_QUEST_MIN )
{
sprintf(buf, "%s is not high enough level to do a Crusade!\n\r", gch->name);
send_to_char(AT_WHITE, "You are not high enough level to complete a Crusade!\n\r", gch);
send_to_char(AT_WHITE, buf, ch);
return;
}
rd = get_religion_index( ch->religion );
/*
Quest Restriction to Deities
Out for debug
if (!strstr(questman->short_descr, rd->deity ) )
{
sprintf(buf, "%s would not appreciate you devoting your crusades to %s!\n\rFind your own Deity!\n\r", rd->deity, questman->short_descr);
send_to_char(AT_WHITE, buf, ch);
return;
}
*/
group[member_count] = gch;
member_count++;
if (ch->alignment >= 500)
{
if (gch->alignment <= -500) /* || gch->religion == EVIL */
{
sprintf(buf, "Your deity will not accept %s upon your crusade!\n\r", gch->name);
send_to_char(AT_WHITE, buf, ch);
return;
}
} else if (ch->alignment <= -500)
{
if (gch->alignment >= 500) /* || gch->religion == GOOD */
{
sprintf(buf, "Your deity will not accept %s upon your crusade!\n\r", gch->name);
send_to_char(AT_WHITE, buf, ch);
return;
}
}
}
if (member_count < 2)
{
send_to_char(AT_WHITE, "You need 2 or more heroes for a crusade!\n\r", ch);
return;
}
if (ch->alignment >= 500)
{
int levels = (((((ch->level > LEVEL_DEMIGOD) ? LEVEL_DEMIGOD : ch->level )) - REL_QUEST_MIN)/(14))+1;
if(rel_quest_gen(ch, ALIGN_GOOD, levels))
{
int qtime = number_range(15, 45);
int curmemb;
relquest=TRUE;
/* Made it... let's go! */
rel_quest_goals(ch, levels, ALIGN_GOOD);
for ( curmemb = 0; curmemb < member_count; curmemb++)
{
int i;
for (i = 0; i < levels; i++)
{
group[curmemb]->rquestobj[i] = ch->rquestobj[i];
group[curmemb]->rquestmob[i] = ch->rquestmob[i];
}
group[curmemb]->relquest_level = 0;
group[curmemb]->rcountdown = qtime;
SET_BIT(group[curmemb]->act2, PLR_RELQUEST);
char_from_room(group[curmemb]);
char_to_room (group[curmemb], get_room_index( REL_VNUM_UPPER ) );
send_to_char( AT_WHITE, "The smell of honey and sweet perfume fills your nose!\n\r", group[curmemb]);
interpret( group[curmemb], "look" );
interpret( group[curmemb], "crusade info" );
}
return;
} else
{
bug("rel_quest_gen: Failed to create quest!",0);
}
} else if (ch->alignment <= -500)
{
int levels = (((((ch->level > LEVEL_DEMIGOD) ? LEVEL_DEMIGOD : ch->level )) - REL_QUEST_MIN)/( 14 ))+1;
if(rel_quest_gen(ch, ALIGN_EVIL, levels))
{
int qtime = number_range(15, 45);
int curmemb;
relquest=TRUE;
/* Made it... let's go! */
rel_quest_goals(ch, levels, ALIGN_EVIL);
for ( curmemb=0; curmemb < member_count; curmemb++)
{
int i;
for (i = 0; i < levels; i++)
{
group[curmemb]->rquestobj[i] = ch->rquestobj[i];
group[curmemb]->rquestmob[i] = ch->rquestmob[i];
}
group[curmemb]->relquest_level = 0;
group[curmemb]->rcountdown = qtime;
SET_BIT(group[curmemb]->act2, PLR_RELQUEST);
char_from_room(group[curmemb]);
char_to_room (group[curmemb], get_room_index( REL_VNUM_LOWER ) );
send_to_char( AT_RED, "The flames of hell singe your armor!\n\r", group[curmemb]);
interpret( group[curmemb], "look" );
interpret( group[curmemb], "crusade info" );
}
return;
} else
{
bug("rel_quest_gen: Failed to create quest!",0);
}
}
} else if (!str_cmp(arg1,"complete"))
{
if (questman==NULL)
{
send_to_char(AT_WHITE, "Your deity is not here!\n\r", ch);
return;
}
if (IS_SET(ch->act2, PLR_RELQUEST) && ch->rcountdown > 0)
{
CHAR_DATA* gch = NULL;
int qp;
qp = number_range( ch->level/4, ch->level/2);
if (ch->leader || ch->master)
{
send_to_char(AT_WHITE, "Only the group leader can complete a crusade!\n\r", ch);
return;
}
for (d=descriptor_list; d; d = d->next)
{
if ( d->connected != CON_PLAYING )
continue;
if (is_same_group(d->character, ch))
{
if (d->character->in_room != ch->in_room)
{
send_to_char(AT_WHITE, "You must gather your party before completing a crusade!\n\r", ch);
return;
}
}
}
// the whole party is in the room
for (gch=ch->in_room->people; gch; gch=gch->next_in_room)
{
if (is_same_group(ch, gch))
{
int gqp = number_fuzzy(qp);
sprintf(buf, "You have gained %d religion points for your service!\n\r", gqp);
send_to_char(AT_WHITE, "YAY! You completed your crusade!\n\r",gch);
gch->rquestpoints += gqp;
gch->rnextquest = number_range(10, 30);
gch->rcountdown = 0;
send_to_char(AT_WHITE, buf, gch);
REMOVE_BIT(gch->act2, PLR_RELQUEST);
}
}
relquest=FALSE;
return;
} else
{
send_to_char(AT_WHITE, "You are not on a religious crusade!\n\r",ch);
return;
}
} else if(!str_cmp(arg1, "list"))
{
if (questman==NULL)
{
send_to_char(AT_WHITE, "Your deity is not here!\n\r", ch);
return;
}
send_to_char(AT_WHITE, "Nothing to list yet.\n\r", ch);
return;
} else if(!str_cmp(arg1, "buy"))
{
if (questman==NULL)
{
send_to_char(AT_WHITE, "Your deity is not here!\n\r", ch);
return;
}
send_to_char(AT_WHITE, "Nothing to buy quite yet.\n\r", ch);
return;
} else if(!str_cmp(arg1, "advance"))
{
DESCRIPTOR_DATA* d;
if(!IS_SET(ch->act2, PLR_RELQUEST))
{
send_to_char(AT_WHITE, "You cannot advance a crusade if you are not on one!\n\r", ch);
return;
}
if(ch->leader || ch->master)
{
send_to_char(AT_WHITE, "Only the group leader can advance a crusade!\n\r", ch);
return;
}
if (!boss)
{
send_to_char(AT_WHITE, "You need to find the boss of this level before you can advance!\n\r", ch);
return;
}
if (ch->rquestmob[ch->relquest_level] > 0 && ch->rcountdown > 0)
{
send_to_char(AT_WHITE, "You have not completed this section of your crusade!\n\r", ch);
return;
} else if (ch->rquestobj[ch->relquest_level] > 0 && ch->rcountdown > 0)
{
bool found = FALSE;
OBJ_DATA* obj;
for (obj = ch->carrying; obj; obj = obj->next)
{
if (obj->pIndexData->vnum == ch->rquestobj[ch->relquest_level])
{
found = TRUE;
extract_obj(obj);
}
}
if (!found)
{
send_to_char(AT_WHITE, "You have not completed this section of your crusade!\n\r", ch);
return;
}
}
ch->rquestobj[ch->relquest_level]=0;
ch->rquestmob[ch->relquest_level]=0;
for (d=descriptor_list; d; d = d->next)
{
if ( d->connected != CON_PLAYING )
continue;
if (is_same_group(d->character, ch))
{
d->character->rquestmob[ch->relquest_level] = 0;
d->character->rquestobj[ch->relquest_level] = 0;
send_to_char(AT_WHITE, "You feel free to pursue the next part of your crusade!\n\r", d->character);
}
}
} else
{
send_to_char(AT_WHITE, "CRUSADE commands: POINTS INFO TIME REQUEST COMPLETE LIST BUY ADVANCE.\n\r",ch);
send_to_char(AT_WHITE, "For more information, type 'HELP CRUSADE'.\n\r",ch);
return;
}
}
void rquest_update(void)
{
DESCRIPTOR_DATA *d;
CHAR_DATA *ch;
int qcount = 0;
for ( d = descriptor_list; d != NULL; d = d->next )
{
if (d->character != NULL && d->connected == CON_PLAYING)
{
ch = d->character;
if (ch->rnextquest > 0)
{
ch->rnextquest--;
if (ch->rnextquest == 0)
{
send_to_char(AT_WHITE, "The gods allow you to crusade again.\n\r",ch);
}
}
else if (IS_SET(ch->act2,PLR_RELQUEST))
{
qcount++;
if (--ch->rcountdown <= 0)
{
char buf [MAX_STRING_LENGTH];
int vnum;
ch->rnextquest = number_range(10, 30);
sprintf(buf, "You have run out of time for your crusade!\n\rYou may crusade again in %d minutes.\n\r",ch->rnextquest);
send_to_char(AT_WHITE, buf, ch);
REMOVE_BIT(ch->act2, PLR_RELQUEST);
ch->rcountdown = 0;
vnum = ch->in_room->vnum;
if (vnum >= REL_VNUM_LOWER && vnum <= REL_VNUM_UPPER)
{
send_to_char(AT_YELLOW, "Your vision becomes fuzzy and you wake up in Methidoral!\n\r", ch);
char_from_room( ch );
char_to_room( ch, get_room_index( ROOM_VNUM_ALTAR ) );
interpret( ch, "look" );
}
}
if (ch->rcountdown > 0 && ch->rcountdown < 6)
{
send_to_char(AT_WHITE, "Better hurry, you're almost out of time for your crusade!\n\r",ch);
}
}
}
}
if (!qcount)
{
relquest = FALSE;
}
return;
}
void do_map(CHAR_DATA *ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
FILE* fp;
if (!IS_SET(ch->act2, PLR_RELQUEST))
{
send_to_char(AT_WHITE, "You can only see maps while on crusades!\n\r", ch);
return;
}
sprintf(buf, "Crusade Map for Level %d\n\r\n\r", ch->relquest_level+1);
send_to_char(AT_WHITE, buf, ch);
sprintf(buf, "level%d.map", ch->relquest_level);
fp = fopen(buf, "r");
buf[1]='\0';
while (!feof(fp))
{
fread(buf, sizeof(char), 1, fp);
if (strcmp(buf, "\n")==0)
send_to_char(AT_WHITE, "\n\r", ch);
else
send_to_char(AT_WHITE, buf, ch);
};
send_to_char(AT_WHITE, "\n\rX: Room\n\rO: Start\n\r#: Exit\n\r", ch);
return;
}