/****************************************************************************
* [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 | *
* ------------------------------------------------------------------------ *
* Special clan module *
****************************************************************************/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
/* #include <stdlib.h> */
#include <time.h>
#include "mud.h"
#define MAX_NEST 100
static OBJ_DATA *rgObjNest[MAX_NEST];
CLAN_DATA *first_clan;
CLAN_DATA *last_clan;
COUNCIL_DATA *first_council;
COUNCIL_DATA *last_council;
/* local routines */
void fread_clan args((CLAN_DATA * clan, FILE * fp));
bool load_clan_file args((char *clanfile));
void write_clan_list args((void));
void fread_council args((COUNCIL_DATA * council, FILE * fp));
bool load_council_file args((char *councilfile));
void write_council_list args((void));
/*
* Get pointer to clan structure from clan name.
*/
CLAN_DATA *get_clan(char *name)
{
CLAN_DATA *clan;
for (clan = first_clan; clan; clan = clan->next)
if (!str_cmp(name, clan->name))
return clan;
return NULL;
}
COUNCIL_DATA *get_council(char *name)
{
COUNCIL_DATA *council;
for (council = first_council; council; council = council->next)
if (!str_cmp(name, council->name))
return council;
return NULL;
}
void write_clan_list()
{
CLAN_DATA *tclan;
FILE *fpout;
char filename[256];
sprintf(filename, "%s%s", CLAN_DIR, CLAN_LIST);
fpout = fopen(filename, "w");
if (!fpout)
{
bug("FATAL: cannot open clan.lst for writing!\n\r", 0);
return;
}
for (tclan = first_clan; tclan; tclan = tclan->next)
fprintf(fpout, "%s\n", tclan->filename);
fprintf(fpout, "$\n");
fclose(fpout);
}
void write_council_list()
{
COUNCIL_DATA *tcouncil;
FILE *fpout;
char filename[256];
sprintf(filename, "%s%s", COUNCIL_DIR, COUNCIL_LIST);
fpout = fopen(filename, "w");
if (!fpout)
{
bug("FATAL: cannot open council.lst for writing!\n\r", 0);
return;
}
for (tcouncil = first_council; tcouncil; tcouncil = tcouncil->next)
fprintf(fpout, "%s\n", tcouncil->filename);
fprintf(fpout, "$\n");
fclose(fpout);
}
/*
* Save a clan's data to its data file
*/
void save_clan(CLAN_DATA * clan)
{
FILE *fp;
char filename[256];
char buf[MSL];
if (!clan)
{
bug("save_clan: null clan pointer!", 0);
return;
}
if (!clan->filename || clan->filename[0] == '\0')
{
sprintf(buf, "save_clan: %s has no filename", clan->name);
bug(buf, 0);
return;
}
sprintf(filename, "%s%s", CLAN_DIR, clan->filename);
fclose(fpReserve);
if ((fp = fopen(filename, "w")) == NULL)
{
bug("save_clan: fopen", 0);
perror(filename);
}
else
{
fprintf(fp, "#CLAN\n");
fprintf(fp, "Name %s~\n", clan->name);
fprintf(fp, "Filename %s~\n", clan->filename);
fprintf(fp, "Motto %s~\n", clan->motto);
fprintf(fp, "Description %s~\n", clan->description);
fprintf(fp, "Deity %s~\n", clan->deity);
fprintf(fp, "Leader %s~\n", clan->leader);
fprintf(fp, "NumberOne %s~\n", clan->number1);
fprintf(fp, "NumberTwo %s~\n", clan->number2);
fprintf(fp, "Badge %s~\n", clan->badge);
fprintf(fp, "PKillRangeNew %d %d %d %d %d %d %d\n",
clan->pkills[0], clan->pkills[1], clan->pkills[2], clan->pkills[3], clan->pkills[4], clan->pkills[5], clan->pkills[6]);
fprintf(fp, "PDeathRangeNew %d %d %d %d %d %d %d\n",
clan->pdeaths[0], clan->pdeaths[1], clan->pdeaths[2], clan->pdeaths[3], clan->pdeaths[4], clan->pdeaths[5], clan->pdeaths[6]);
fprintf(fp, "MKills %d\n", clan->mkills);
fprintf(fp, "MDeaths %d\n", clan->mdeaths);
fprintf(fp, "IllegalPK %d\n", clan->illegal_pk);
fprintf(fp, "Score %d\n", clan->score);
fprintf(fp, "Type %d\n", clan->clan_type);
fprintf(fp, "Favour %d\n", clan->favour);
fprintf(fp, "Strikes %d\n", clan->strikes);
fprintf(fp, "Members %d\n", clan->members);
fprintf(fp, "MemLimit %d\n", clan->mem_limit);
fprintf(fp, "Alignment %d\n", clan->alignment);
fprintf(fp, "Board %d\n", clan->board);
fprintf(fp, "ClanObjOne %d\n", clan->clanobj1);
fprintf(fp, "ClanObjTwo %d\n", clan->clanobj2);
fprintf(fp, "ClanObjThree %d\n", clan->clanobj3);
fprintf(fp, "ClanObjFour %d\n", clan->clanobj4);
fprintf(fp, "ClanObjFive %d\n", clan->clanobj5);
fprintf(fp, "Recall %d\n", clan->recall);
fprintf(fp, "Storeroom %d\n", clan->storeroom);
fprintf(fp, "GuardOne %d\n", clan->guard1);
fprintf(fp, "GuardTwo %d\n", clan->guard2);
fprintf(fp, "End\n\n");
fprintf(fp, "#END\n");
}
fclose(fp);
fpReserve = fopen(NULL_FILE, "r");
return;
}
/*
* Save a council's data to its data file
*/
void save_council(COUNCIL_DATA * council)
{
FILE *fp;
char filename[256];
char buf[MSL];
if (!council)
{
bug("save_council: null council pointer!", 0);
return;
}
if (!council->filename || council->filename[0] == '\0')
{
sprintf(buf, "save_council: %s has no filename", council->name);
bug(buf, 0);
return;
}
sprintf(filename, "%s%s", COUNCIL_DIR, council->filename);
fclose(fpReserve);
if ((fp = fopen(filename, "w")) == NULL)
{
bug("save_council: fopen", 0);
perror(filename);
}
else
{
fprintf(fp, "#COUNCIL\n");
fprintf(fp, "Name %s~\n", council->name);
fprintf(fp, "Filename %s~\n", council->filename);
fprintf(fp, "Description %s~\n", council->description);
fprintf(fp, "Head %s~\n", council->head);
if (council->head2 != NULL)
fprintf(fp, "Head2 %s~\n", council->head2);
fprintf(fp, "Members %d\n", council->members);
fprintf(fp, "Board %d\n", council->board);
fprintf(fp, "Meeting %d\n", council->meeting);
fprintf(fp, "Powers %s~\n", council->powers);
fprintf(fp, "End\n\n");
fprintf(fp, "#END\n");
}
fclose(fp);
fpReserve = fopen(NULL_FILE, "r");
return;
}
/*
* Read in actual clan data.
*/
#if defined(KEY)
#undef KEY
#endif
#define KEY( literal, field, value ) \
if ( !str_cmp( word, literal ) ) \
{ \
field = value; \
fMatch = TRUE; \
break; \
}
/*
* Reads in PKill and PDeath still for backward compatibility but now it
* should be written to PKillRange and PDeathRange for multiple level pkill
* tracking support. --Shaddai
* Added a hardcoded limit memlimit to the amount of members a clan can
* have set using setclan. --Shaddai
*/
void fread_clan(CLAN_DATA * clan, FILE * fp)
{
char buf[MSL];
char *word;
bool fMatch;
clan->mem_limit = 0; /* Set up defaults */
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("Alignment", clan->alignment, fread_number(fp));
break;
case 'B':
KEY("Badge", clan->badge, fread_string(fp));
KEY("Board", clan->board, fread_number(fp));
break;
case 'C':
KEY("ClanObjOne", clan->clanobj1, fread_number(fp));
KEY("ClanObjTwo", clan->clanobj2, fread_number(fp));
KEY("ClanObjThree", clan->clanobj3, fread_number(fp));
KEY("ClanObjFour", clan->clanobj4, fread_number(fp));
KEY("ClanObjFive", clan->clanobj5, fread_number(fp));
break;
case 'D':
KEY("Deity", clan->deity, fread_string(fp));
KEY("Description", clan->description, fread_string(fp));
break;
case 'E':
if (!str_cmp(word, "End"))
{
if (!clan->name)
clan->name = STRALLOC("");
if (!clan->leader)
clan->leader = STRALLOC("");
if (!clan->description)
clan->description = STRALLOC("");
if (!clan->motto)
clan->motto = STRALLOC("");
if (!clan->number1)
clan->number1 = STRALLOC("");
if (!clan->number2)
clan->number2 = STRALLOC("");
if (!clan->deity)
clan->deity = STRALLOC("");
if (!clan->badge)
clan->badge = STRALLOC("");
return;
}
break;
case 'F':
KEY("Favour", clan->favour, fread_number(fp));
KEY("Filename", clan->filename, fread_string_nohash(fp));
case 'G':
KEY("GuardOne", clan->guard1, fread_number(fp));
KEY("GuardTwo", clan->guard2, fread_number(fp));
break;
case 'I':
KEY("IllegalPK", clan->illegal_pk, fread_number(fp));
break;
case 'L':
KEY("Leader", clan->leader, fread_string(fp));
break;
case 'M':
KEY("MDeaths", clan->mdeaths, fread_number(fp));
KEY("Members", clan->members, fread_number(fp));
KEY("MemLimit", clan->mem_limit, fread_number(fp));
KEY("MKills", clan->mkills, fread_number(fp));
KEY("Motto", clan->motto, fread_string(fp));
break;
case 'N':
KEY("Name", clan->name, fread_string(fp));
KEY("NumberOne", clan->number1, fread_string(fp));
KEY("NumberTwo", clan->number2, fread_string(fp));
break;
case 'P':
KEY("PDeaths", clan->pdeaths[6], fread_number(fp));
KEY("PKills", clan->pkills[6], fread_number(fp));
/* Addition of New Ranges */
if (!str_cmp(word, "PDeathRange"))
{
fMatch = TRUE;
fread_number(fp);
fread_number(fp);
fread_number(fp);
fread_number(fp);
fread_number(fp);
fread_number(fp);
fread_number(fp);
}
if (!str_cmp(word, "PDeathRangeNew"))
{
fMatch = TRUE;
clan->pdeaths[0] = fread_number(fp);
clan->pdeaths[1] = fread_number(fp);
clan->pdeaths[2] = fread_number(fp);
clan->pdeaths[3] = fread_number(fp);
clan->pdeaths[4] = fread_number(fp);
clan->pdeaths[5] = fread_number(fp);
clan->pdeaths[6] = fread_number(fp);
}
if (!str_cmp(word, "PKillRangeNew"))
{
fMatch = TRUE;
clan->pkills[0] = fread_number(fp);
clan->pkills[1] = fread_number(fp);
clan->pkills[2] = fread_number(fp);
clan->pkills[3] = fread_number(fp);
clan->pkills[4] = fread_number(fp);
clan->pkills[5] = fread_number(fp);
clan->pkills[6] = fread_number(fp);
}
if (!str_cmp(word, "PKillRange"))
{
fMatch = TRUE;
fread_number(fp);
fread_number(fp);
fread_number(fp);
fread_number(fp);
fread_number(fp);
fread_number(fp);
fread_number(fp);
}
break;
case 'R':
KEY("Recall", clan->recall, fread_number(fp));
break;
case 'S':
KEY("Score", clan->score, fread_number(fp));
KEY("Strikes", clan->strikes, fread_number(fp));
KEY("Storeroom", clan->storeroom, fread_number(fp));
break;
case 'T':
KEY("Type", clan->clan_type, fread_number(fp));
break;
}
if (!fMatch)
{
sprintf(buf, "Fread_clan: no match: %s", word);
bug(buf, 0);
}
}
}
/*
* Read in actual council data.
*/
#if defined(KEY)
#undef KEY
#endif
#define KEY( literal, field, value ) \
if ( !str_cmp( word, literal ) ) \
{ \
field = value; \
fMatch = TRUE; \
break; \
}
void fread_council(COUNCIL_DATA * council, 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 'B':
KEY("Board", council->board, fread_number(fp));
break;
case 'D':
KEY("Description", council->description, fread_string(fp));
break;
case 'E':
if (!str_cmp(word, "End"))
{
if (!council->name)
council->name = STRALLOC("");
if (!council->description)
council->description = STRALLOC("");
if (!council->powers)
council->powers = STRALLOC("");
return;
}
break;
case 'F':
KEY("Filename", council->filename, fread_string_nohash(fp));
break;
case 'H':
KEY("Head", council->head, fread_string(fp));
KEY("Head2", council->head2, fread_string(fp));
break;
case 'M':
KEY("Members", council->members, fread_number(fp));
KEY("Meeting", council->meeting, fread_number(fp));
break;
case 'N':
KEY("Name", council->name, fread_string(fp));
break;
case 'P':
KEY("Powers", council->powers, fread_string(fp));
break;
}
if (!fMatch)
{
sprintf(buf, "Fread_council: no match: %s", word);
bug(buf, 0);
}
}
}
#if defined(KEY)
#undef KEY
#endif
#define KEY( literal, field, value ) \
if ( !strcmp( word, literal ) ) \
{ \
field = value; \
fMatch = TRUE; \
break; \
}
void get_version(FILE * fp)
{
char *word;
bool fMatch;
char buf[MSL];
for (;;)
{
word = feof(fp) ? "End" : fread_word(fp);
fMatch = FALSE;
switch (UPPER(word[0]))
{
case '*':
fMatch = TRUE;
fread_to_eol(fp);
break;
case 'V':
KEY("Version", file_ver, fread_number(fp));
break;
case 'E':
if (!str_cmp(word, "End"))
return;
}
if (!fMatch)
{
sprintf(buf, "get_version: no match: %s", word);
bug(buf, 0);
}
}
}
/*
* Load a clan file
*/
bool load_clan_file(char *clanfile)
{
char filename[256];
CLAN_DATA *clan;
FILE *fp;
bool found;
CREATE(clan, CLAN_DATA, 1);
/* Make sure we default these to 0 --Shaddai */
clan->pkills[0] = 0;
clan->pkills[1] = 0;
clan->pkills[2] = 0;
clan->pkills[3] = 0;
clan->pkills[4] = 0;
clan->pkills[5] = 0;
clan->pkills[6] = 0;
clan->pdeaths[0] = 0;
clan->pdeaths[1] = 0;
clan->pdeaths[2] = 0;
clan->pdeaths[3] = 0;
clan->pdeaths[4] = 0;
clan->pdeaths[5] = 0;
clan->pdeaths[6] = 0;
found = FALSE;
sprintf(filename, "%s%s", CLAN_DIR, clanfile);
if ((fp = fopen(filename, "r")) != NULL)
{
found = TRUE;
for (;;)
{
char letter;
char *word;
letter = fread_letter(fp);
if (letter == '*')
{
fread_to_eol(fp);
continue;
}
if (letter != '#')
{
bug("Load_clan_file: # not found.", 0);
break;
}
word = fread_word(fp);
if (!str_cmp(word, "CLAN"))
{
fread_clan(clan, fp);
break;
}
else if (!str_cmp(word, "END"))
break;
else
{
char buf[MSL];
sprintf(buf, "Load_clan_file: bad section: %s.", word);
bug(buf, 0);
break;
}
}
fclose(fp);
}
if (found)
{
ROOM_INDEX_DATA *storeroom;
LINK(clan, first_clan, last_clan, next, prev);
if (clan->storeroom == 0 || (storeroom = get_room_index(clan->storeroom)) == NULL)
{
log_string("Storeroom not found");
return found;
}
sprintf(filename, "%s%s.vault", CLAN_DIR, clan->filename);
if ((fp = fopen(filename, "r")) != NULL)
{
int iNest;
bool found;
OBJ_DATA *tobj, *tobj_next;
log_string("Loading clan storage room");
rset_supermob(storeroom);
for (iNest = 0; iNest < MAX_NEST; iNest++)
rgObjNest[iNest] = NULL;
found = TRUE;
for (;;)
{
char letter;
char *word;
letter = fread_letter(fp);
if (letter == '*')
{
fread_to_eol(fp);
continue;
}
if (letter != '#')
{
bug("Load_clan_vault: # not found.", 0);
bug(clan->name, 0);
break;
}
word = fread_word(fp);
if (!str_cmp(word, "OBJECT")) /* Objects */
fread_obj(supermob, fp, OS_CARRY);
else if (!str_cmp(word, "VERSION")) // Version
get_version(fp);
else if (!str_cmp(word, "END")) /* Done */
break;
else
{
bug("Load_clan_vault: bad section.", 0);
bug(clan->name, 0);
break;
}
}
file_ver = 0;
fclose(fp);
for (tobj = supermob->first_carrying; tobj; tobj = tobj_next)
{
tobj_next = tobj->next_content;
obj_from_char(tobj);
obj_to_room(tobj, storeroom, supermob);
}
release_supermob();
}
else
log_string("Cannot open clan vault");
}
else
DISPOSE(clan);
return found;
}
/*
* Load a council file
*/
bool load_council_file(char *councilfile)
{
char filename[256];
COUNCIL_DATA *council;
FILE *fp;
bool found;
CREATE(council, COUNCIL_DATA, 1);
found = FALSE;
sprintf(filename, "%s%s", COUNCIL_DIR, councilfile);
if ((fp = fopen(filename, "r")) != NULL)
{
found = TRUE;
for (;;)
{
char letter;
char *word;
letter = fread_letter(fp);
if (letter == '*')
{
fread_to_eol(fp);
continue;
}
if (letter != '#')
{
bug("Load_council_file: # not found.", 0);
break;
}
word = fread_word(fp);
if (!str_cmp(word, "COUNCIL"))
{
fread_council(council, fp);
break;
}
else if (!str_cmp(word, "END"))
break;
else
{
bug("Load_council_file: bad section.", 0);
break;
}
}
fclose(fp);
}
if (found)
LINK(council, first_council, last_council, next, prev);
else
DISPOSE(council);
return found;
}
/*
* Load in all the clan files.
*/
void load_clans()
{
FILE *fpList;
char *filename;
char clanlist[256];
char buf[MSL];
first_clan = NULL;
last_clan = NULL;
log_string("Loading clans...");
sprintf(clanlist, "%s%s", CLAN_DIR, CLAN_LIST);
fclose(fpReserve);
if ((fpList = fopen(clanlist, "r")) == NULL)
{
perror(clanlist);
exit(1);
}
for (;;)
{
filename = feof(fpList) ? "$" : fread_word(fpList);
log_string(filename);
if (filename[0] == '$')
break;
if (!load_clan_file(filename))
{
sprintf(buf, "Cannot load clan file: %s", filename);
bug(buf, 0);
}
}
fclose(fpList);
log_string(" Done clans ");
fpReserve = fopen(NULL_FILE, "r");
return;
}
/*
* Load in all the council files.
*/
void load_councils()
{
FILE *fpList;
char *filename;
char councillist[256];
char buf[MSL];
first_council = NULL;
last_council = NULL;
log_string("Loading councils...");
sprintf(councillist, "%s%s", COUNCIL_DIR, COUNCIL_LIST);
fclose(fpReserve);
if ((fpList = fopen(councillist, "r")) == NULL)
{
perror(councillist);
exit(1);
}
for (;;)
{
filename = feof(fpList) ? "$" : fread_word(fpList);
log_string(filename);
if (filename[0] == '$')
break;
if (!load_council_file(filename))
{
sprintf(buf, "Cannot load council file: %s", filename);
bug(buf, 0);
}
}
fclose(fpList);
log_string(" Done councils ");
fpReserve = fopen(NULL_FILE, "r");
return;
}
void do_make(CHAR_DATA * ch, char *argument)
{
send_to_char("Not used anymore.\n\r", ch);
return;
}
void do_induct(CHAR_DATA * ch, char *argument)
{
char arg[MIL];
CHAR_DATA *victim;
CLAN_DATA *clan;
if (IS_NPC(ch) || !ch->pcdata->clan)
{
send_to_char("Huh?\n\r", ch);
return;
}
clan = ch->pcdata->clan;
if ((ch->pcdata && ch->pcdata->bestowments
&& is_name("induct", ch->pcdata->bestowments))
|| !str_cmp(ch->name, clan->deity)
|| !str_cmp(ch->name, clan->leader) || !str_cmp(ch->name, clan->number1) || !str_cmp(ch->name, clan->number2))
;
else
{
send_to_char("Huh?\n\r", ch);
return;
}
argument = one_argument(argument, arg);
if (arg[0] == '\0')
{
send_to_char("Induct whom?\n\r", ch);
return;
}
if ((victim = get_char_room_new(ch, arg, 1)) == NULL)
{
send_to_char("That player is not here.\n\r", ch);
return;
}
if (IS_NPC(victim))
{
send_to_char("Not on NPC's.\n\r", ch);
return;
}
if (IS_IMMORTAL(victim))
{
send_to_char("You can't induct such a godly presence.\n\r", ch);
return;
}
if (victim->pcdata->clan)
{
if (victim->pcdata->clan->clan_type == CLAN_ORDER)
{
if (victim->pcdata->clan == clan)
send_to_char("This player already belongs to your order!\n\r", ch);
else
send_to_char("This player already belongs to an order!\n\r", ch);
return;
}
else if (victim->pcdata->clan->clan_type == CLAN_GUILD)
{
if (victim->pcdata->clan == clan)
send_to_char("This player already belongs to your guild!\n\r", ch);
else
send_to_char("This player already belongs to an guild!\n\r", ch);
return;
}
else
{
if (victim->pcdata->clan == clan)
send_to_char("This player already belongs to your clan!\n\r", ch);
else
send_to_char("This player already belongs to a clan!\n\r", ch);
return;
}
}
if (clan->mem_limit && clan->members >= clan->mem_limit)
{
send_to_char("Your clan is too big to induct anymore players.\n\r", ch);
return;
}
clan->members++;
if (clan->clan_type != CLAN_ORDER && clan->clan_type != CLAN_GUILD)
SET_BIT(victim->speaks, LANG_CLAN);
victim->pcdata->clan = clan;
STRFREE(victim->pcdata->clan_name);
victim->pcdata->clan_name = QUICKLINK(clan->name);
act(AT_MAGIC, "You induct $N into $t", ch, clan->name, victim, TO_CHAR);
act(AT_MAGIC, "$n inducts $N into $t", ch, clan->name, victim, TO_NOTVICT);
act(AT_MAGIC, "$n inducts you into $t", ch, clan->name, victim, TO_VICT);
save_char_obj(victim);
add_player_list(victim, 1);
save_clan(clan);
return;
}
void do_council_induct(CHAR_DATA * ch, char *argument)
{
char arg[MIL];
CHAR_DATA *victim;
COUNCIL_DATA *council;
if (IS_NPC(ch) || !ch->pcdata->council)
{
send_to_char("Huh?\n\r", ch);
return;
}
council = ch->pcdata->council;
if ((council->head == NULL || str_cmp(ch->name, council->head))
&& (council->head2 == NULL || str_cmp(ch->name, council->head2)) && str_cmp(council->name, "mortal council"))
{
send_to_char("Huh?\n\r", ch);
return;
}
argument = one_argument(argument, arg);
if (arg[0] == '\0')
{
send_to_char("Induct whom into your council?\n\r", ch);
return;
}
if ((victim = get_char_room_new(ch, arg, 1)) == NULL)
{
send_to_char("That player is not here.\n\r", ch);
return;
}
if (IS_NPC(victim))
{
send_to_char("Not on NPC's.\n\r", ch);
return;
}
if (victim->pcdata->council)
{
send_to_char("This player already belongs to a council!\n\r", ch);
return;
}
council->members++;
victim->pcdata->council = council;
STRFREE(victim->pcdata->council_name);
victim->pcdata->council_name = QUICKLINK(council->name);
act(AT_MAGIC, "You induct $N into $t", ch, council->name, victim, TO_CHAR);
act(AT_MAGIC, "$n inducts $N into $t", ch, council->name, victim, TO_ROOM);
act(AT_MAGIC, "$n inducts you into $t", ch, council->name, victim, TO_VICT);
save_char_obj(victim);
save_council(council);
return;
}
void do_outcast(CHAR_DATA * ch, char *argument)
{
char arg[MIL];
CHAR_DATA *victim;
CLAN_DATA *clan;
if (IS_NPC(ch) || !ch->pcdata->clan)
{
send_to_char("Huh?\n\r", ch);
return;
}
clan = ch->pcdata->clan;
if ((ch->pcdata && ch->pcdata->bestowments
&& is_name("outcast", ch->pcdata->bestowments))
|| !str_cmp(ch->name, clan->deity)
|| !str_cmp(ch->name, clan->leader) || !str_cmp(ch->name, clan->number1) || !str_cmp(ch->name, clan->number2))
;
else
{
send_to_char("Huh?\n\r", ch);
return;
}
argument = one_argument(argument, arg);
if (arg[0] == '\0')
{
send_to_char("Outcast whom?\n\r", ch);
return;
}
if ((victim = get_char_room_new(ch, arg, 1)) == NULL)
{
send_to_char("That player is not here.\n\r", ch);
return;
}
if (IS_NPC(victim))
{
send_to_char("Not on NPC's.\n\r", ch);
return;
}
if (victim == ch)
{
if (ch->pcdata->clan->clan_type == CLAN_ORDER)
{
send_to_char("Kick yourself out of your own order?\n\r", ch);
return;
}
else if (ch->pcdata->clan->clan_type == CLAN_GUILD)
{
send_to_char("Kick yourself out of your own guild?\n\r", ch);
return;
}
else
{
send_to_char("Kick yourself out of your own clan?\n\r", ch);
return;
}
}
if (victim->level > ch->level)
{
send_to_char("This player is too powerful for you to outcast.\n\r", ch);
return;
}
if (victim->pcdata->clan != ch->pcdata->clan)
{
if (ch->pcdata->clan->clan_type == CLAN_ORDER)
{
send_to_char("This player does not belong to your order!\n\r", ch);
return;
}
else if (ch->pcdata->clan->clan_type == CLAN_GUILD)
{
send_to_char("This player does not belong to your guild!\n\r", ch);
return;
}
else
{
send_to_char("This player does not belong to your clan!\n\r", ch);
return;
}
}
if (victim->speaking & LANG_CLAN)
victim->speaking = LANG_COMMON;
REMOVE_BIT(victim->speaks, LANG_CLAN);
--clan->members;
if (!str_cmp(victim->name, ch->pcdata->clan->number1))
{
STRFREE(ch->pcdata->clan->number1);
ch->pcdata->clan->number1 = STRALLOC("");
}
if (!str_cmp(victim->name, ch->pcdata->clan->number2))
{
STRFREE(ch->pcdata->clan->number2);
ch->pcdata->clan->number2 = STRALLOC("");
}
victim->pcdata->clan = NULL;
STRFREE(victim->pcdata->clan_name);
victim->pcdata->clan_name = STRALLOC("");
remove_player_list(victim, 1);
act(AT_MAGIC, "You outcast $N from $t", ch, clan->name, victim, TO_CHAR);
act(AT_MAGIC, "$n outcasts $N from $t", ch, clan->name, victim, TO_ROOM);
act(AT_MAGIC, "$n outcasts you from $t", ch, clan->name, victim, TO_VICT);
/* Outcast flag setting removed by Narn. It's useless now that deadlies
remain deadly even on being cast out of a clan.
*/
/* if ( clan->clan_type != CLAN_GUILD )
xSET_BIT(victim->act, PLR_OUTCAST);
*/
save_char_obj(victim); /* clan gets saved when pfile is saved */
save_clan(clan);
return;
}
void do_council_outcast(CHAR_DATA * ch, char *argument)
{
char arg[MIL];
CHAR_DATA *victim;
COUNCIL_DATA *council;
if (IS_NPC(ch) || !ch->pcdata->council)
{
send_to_char("Huh?\n\r", ch);
return;
}
council = ch->pcdata->council;
if ((council->head == NULL || str_cmp(ch->name, council->head))
&& (council->head2 == NULL || str_cmp(ch->name, council->head2)) && str_cmp(council->name, "mortal council"))
{
send_to_char("Huh?\n\r", ch);
return;
}
argument = one_argument(argument, arg);
if (arg[0] == '\0')
{
send_to_char("Outcast whom from your council?\n\r", ch);
return;
}
if ((victim = get_char_room_new(ch, arg, 1)) == NULL)
{
send_to_char("That player is not here.\n\r", ch);
return;
}
if (IS_NPC(victim))
{
send_to_char("Not on NPC's.\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char("Kick yourself out of your own council?\n\r", ch);
return;
}
if (victim->pcdata->council != ch->pcdata->council)
{
send_to_char("This player does not belong to your council!\n\r", ch);
return;
}
--council->members;
victim->pcdata->council = NULL;
STRFREE(victim->pcdata->council_name);
victim->pcdata->council_name = STRALLOC("");
act(AT_MAGIC, "You outcast $N from $t", ch, council->name, victim, TO_CHAR);
act(AT_MAGIC, "$n outcasts $N from $t", ch, council->name, victim, TO_ROOM);
act(AT_MAGIC, "$n outcasts you from $t", ch, council->name, victim, TO_VICT);
save_char_obj(victim);
save_council(council);
return;
}
void do_setclan(CHAR_DATA * ch, char *argument)
{
char arg1[MIL];
char arg2[MIL];
CLAN_DATA *clan;
set_char_color(AT_PLAIN, ch);
if (IS_NPC(ch))
{
send_to_char("Huh?\n\r", ch);
return;
}
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if (arg1[0] == '\0')
{
send_to_char("Usage: setclan <clan> <field> <deity|leader|number1|number2> <player>\n\r", ch);
send_to_char("\n\rField being one of:\n\r", ch);
send_to_char(" deity leader number1 number2\n\r", ch);
send_to_char(" members board recall storage guard1 guard2\n\r", ch);
send_to_char(" align (not functional) memlimit", ch);
send_to_char(" obj1 obj2 obj3 obj4 obj5\n\r", ch);
if (get_trust(ch) >= LEVEL_STAFF) /* Tracker1 */
{
send_to_char(" name filename motto desc\n\r", ch);
send_to_char(" favour strikes type\n\r", ch);
}
if (get_trust(ch) >= LEVEL_HI_STAFF) /* Tracker1 */
send_to_char(" pkill1-7 pdeath1-7\n\r", ch);
return;
}
clan = get_clan(arg1);
if (!clan)
{
send_to_char("No such clan.\n\r", ch);
return;
}
if (!str_cmp(arg2, "deity"))
{
STRFREE(clan->deity);
clan->deity = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "leader"))
{
STRFREE(clan->leader);
clan->leader = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "number1"))
{
STRFREE(clan->number1);
clan->number1 = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "number2"))
{
STRFREE(clan->number2);
clan->number2 = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "badge"))
{
STRFREE(clan->badge);
clan->badge = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "board"))
{
clan->board = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "memlimit"))
{
clan->mem_limit = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "members"))
{
clan->members = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "recall"))
{
clan->recall = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "storage"))
{
clan->storeroom = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "obj1"))
{
clan->clanobj1 = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "obj2"))
{
clan->clanobj2 = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "obj3"))
{
clan->clanobj3 = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "obj4"))
{
clan->clanobj4 = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "obj5"))
{
clan->clanobj5 = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "guard1"))
{
clan->guard1 = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "guard2"))
{
clan->guard2 = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (get_trust(ch) < LEVEL_STAFF) /* Tracker1 */
{
do_setclan(ch, "");
return;
}
if (!str_cmp(arg2, "align"))
{
clan->alignment = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "type"))
{
if (!str_cmp(argument, "order"))
clan->clan_type = CLAN_ORDER;
else if (!str_cmp(argument, "guild"))
clan->clan_type = CLAN_GUILD;
else
clan->clan_type = atoi(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "name"))
{
STRFREE(clan->name);
clan->name = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "filename"))
{
DISPOSE(clan->filename);
clan->filename = str_dup(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
write_clan_list();
return;
}
if (!str_cmp(arg2, "motto"))
{
STRFREE(clan->motto);
clan->motto = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (!str_cmp(arg2, "desc"))
{
STRFREE(clan->description);
clan->description = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_clan(clan);
return;
}
if (get_trust(ch) < LEVEL_HI_STAFF) /* Tracker1 */
{
do_setclan(ch, "");
return;
}
if (!str_prefix("pkill", arg2))
{
int temp_value;
if (!str_cmp(arg2, "pkill1"))
temp_value = 0;
else if (!str_cmp(arg2, "pkill2"))
temp_value = 1;
else if (!str_cmp(arg2, "pkill3"))
temp_value = 2;
else if (!str_cmp(arg2, "pkill4"))
temp_value = 3;
else if (!str_cmp(arg2, "pkill5"))
temp_value = 4;
else if (!str_cmp(arg2, "pkill6"))
temp_value = 5;
else if (!str_cmp(arg2, "pkill7"))
temp_value = 6;
else
{
do_setclan(ch, "");
return;
}
clan->pkills[temp_value] = atoi(argument);
send_to_char("Ok.\n\r", ch);
return;
}
if (!str_prefix("pdeath", arg2))
{
int temp_value;
if (!str_cmp(arg2, "pdeath1"))
temp_value = 0;
else if (!str_cmp(arg2, "pdeath2"))
temp_value = 1;
else if (!str_cmp(arg2, "pdeath3"))
temp_value = 2;
else if (!str_cmp(arg2, "pdeath4"))
temp_value = 3;
else if (!str_cmp(arg2, "pdeath5"))
temp_value = 4;
else if (!str_cmp(arg2, "pdeath6"))
temp_value = 5;
else if (!str_cmp(arg2, "pdeath7"))
temp_value = 6;
else
{
do_setclan(ch, "");
return;
}
clan->pdeaths[temp_value] = atoi(argument);
send_to_char("Ok.\n\r", ch);
return;
}
do_setclan(ch, "");
return;
}
void do_setcouncil(CHAR_DATA * ch, char *argument)
{
char arg1[MIL];
char arg2[MIL];
COUNCIL_DATA *council;
set_char_color(AT_PLAIN, ch);
if (IS_NPC(ch))
{
send_to_char("Huh?\n\r", ch);
return;
}
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if (arg1[0] == '\0')
{
send_to_char("Usage: setcouncil <council> <field> <deity|leader|number1|number2> <player>\n\r", ch);
send_to_char("\n\rField being one of:\n\r", ch);
send_to_char(" head head2 members board meeting\n\r", ch);
if (get_trust(ch) >= LEVEL_STAFF) /* Tracker1 */
send_to_char(" name filename desc\n\r", ch);
if (get_trust(ch) >= LEVEL_HI_STAFF) /* Tracker1 */
send_to_char(" powers\n\r", ch);
return;
}
council = get_council(arg1);
if (!council)
{
send_to_char("No such council.\n\r", ch);
return;
}
if (!str_cmp(arg2, "head"))
{
STRFREE(council->head);
council->head = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_council(council);
return;
}
if (!str_cmp(arg2, "head2"))
{
if (council->head2 != NULL)
STRFREE(council->head2);
if (!str_cmp(argument, "none") || !str_cmp(argument, "clear"))
council->head2 = NULL;
else
council->head2 = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_council(council);
return;
}
if (!str_cmp(arg2, "board"))
{
council->board = atoi(argument);
send_to_char("Done.\n\r", ch);
save_council(council);
return;
}
if (!str_cmp(arg2, "members"))
{
council->members = atoi(argument);
send_to_char("Done.\n\r", ch);
save_council(council);
return;
}
if (!str_cmp(arg2, "meeting"))
{
council->meeting = atoi(argument);
send_to_char("Done.\n\r", ch);
save_council(council);
return;
}
if (get_trust(ch) < LEVEL_STAFF) /* Tracker1 */
{
do_setcouncil(ch, "");
return;
}
if (!str_cmp(arg2, "name"))
{
STRFREE(council->name);
council->name = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_council(council);
return;
}
if (!str_cmp(arg2, "filename"))
{
DISPOSE(council->filename);
council->filename = str_dup(argument);
send_to_char("Done.\n\r", ch);
save_council(council);
write_council_list();
return;
}
if (!str_cmp(arg2, "desc"))
{
STRFREE(council->description);
council->description = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_council(council);
return;
}
if (get_trust(ch) < LEVEL_HI_STAFF) /* Tracker1 */
{
do_setcouncil(ch, "");
return;
}
if (!str_cmp(arg2, "powers"))
{
STRFREE(council->powers);
council->powers = STRALLOC(argument);
send_to_char("Done.\n\r", ch);
save_council(council);
return;
}
do_setcouncil(ch, "");
return;
}
/*
* Added multiple levels on pkills and pdeaths. -- Shaddai
*/
void do_showclan(CHAR_DATA * ch, char *argument)
{
CLAN_DATA *clan;
set_char_color(AT_PLAIN, ch);
if (IS_NPC(ch))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (argument[0] == '\0')
{
send_to_char("Usage: showclan <clan>\n\r", ch);
return;
}
clan = get_clan(argument);
if (!clan)
{
send_to_char("No such clan, guild or order.\n\r", ch);
return;
}
ch_printf_color(ch, "\n\r&w%s : &W%s\t\tBadge: %s\n\r&wFilename : &W%s\n\r&wMotto : &W%s\n\r",
clan->clan_type == CLAN_ORDER ? "Order" :
(clan->clan_type == CLAN_GUILD ? "Guild" : "Clan"), clan->name, clan->badge ? clan->badge : "(not set)", clan->filename, clan->motto);
ch_printf_color(ch, "&wDesc : &W%s\n\r&wDeity : &W%s\n\r&wLeader : &W%s\n\r", clan->description, clan->deity, clan->leader);
ch_printf_color(ch, "&wNumber1 : &W%s\n\r&wNumber2 : &W%s\n\r", clan->number1, clan->number2);
ch_printf_color(ch, "&wPKills : &w1-9:&W%-3d &w10-14:&W%-3d &w15-19:&W%-3d &w20-29:&W%-3d &w30-39:&W%-3d &w40-49:&W%-3d &w50:&W%-3d\n\r",
clan->pkills[0], clan->pkills[1], clan->pkills[2], clan->pkills[3], clan->pkills[4], clan->pkills[5], clan->pkills[6]);
ch_printf_color(ch, "&wPDeaths : &w1-9:&W%-3d &w10-14:&W%-3d &w15-19:&W%-3d &w20-29:&W%-3d &w30-39:&W%-3d &w40-49:&W%-3d &w50:&W%-3d\n\r",
clan->pdeaths[0], clan->pdeaths[1], clan->pdeaths[2], clan->pdeaths[3], clan->pdeaths[4], clan->pdeaths[5], clan->pdeaths[6]);
ch_printf_color(ch, "&wIllegalPK: &W%-6d\n\r", clan->illegal_pk);
ch_printf_color(ch, "&wMKills : &W%-6d &wMDeaths: &W%-6d\n\r", clan->mkills, clan->mdeaths);
ch_printf_color(ch, "&wScore : &W%-6d &wFavor : &W%-6d &wStrikes: &W%d\n\r", clan->score, clan->favour, clan->strikes);
ch_printf_color(ch, "&wMembers : &W%-6d &wMemLimit : &W%-6d &wAlign : &W%-6d", clan->members, clan->mem_limit, clan->alignment);
send_to_char("\n\r", ch);
ch_printf_color(ch, "&wBoard : &W%-5d &wRecall : &W%-5d &wStorage: &W%-5d\n\r", clan->board, clan->recall, clan->storeroom);
ch_printf_color(ch, "&wGuard1 : &W%-5d &wGuard2 : &W%-5d\n\r", clan->guard1, clan->guard2);
ch_printf_color(ch, "&wObj1( &W%d &w) Obj2( &W%d &w) Obj3( &W%d &w) Obj4( &W%d &w) Obj5( &W%d &w)\n\r",
clan->clanobj1, clan->clanobj2, clan->clanobj3, clan->clanobj4, clan->clanobj5);
return;
}
void do_showcouncil(CHAR_DATA * ch, char *argument)
{
COUNCIL_DATA *council;
set_char_color(AT_PLAIN, ch);
if (IS_NPC(ch))
{
send_to_char("Huh?\n\r", ch);
return;
}
if (argument[0] == '\0')
{
send_to_char("Usage: showcouncil <council>\n\r", ch);
return;
}
council = get_council(argument);
if (!council)
{
send_to_char("No such council.\n\r", ch);
return;
}
ch_printf_color(ch, "\n\r&wCouncil : &W%s\n\r&wFilename: &W%s\n\r", council->name, council->filename);
ch_printf_color(ch, "&wHead: &W%s\n\r", council->head);
ch_printf_color(ch, "&wHead2: &W%s\n\r", council->head2);
ch_printf_color(ch, "&wMembers: &W%-d\n\r", council->members);
ch_printf_color(ch, "&wBoard: &W%-5d\n\r&wMeeting: &W%-5d\n\r&wPowers: &W%s\n\r", council->board, council->meeting, council->powers);
ch_printf_color(ch, "&wDescription:\n\r&W%s\n\r", council->description);
return;
}
void do_makeclan(CHAR_DATA * ch, char *argument)
{
char filename[256];
CLAN_DATA *clan;
bool found;
set_char_color(AT_IMMORT, ch);
if (!argument || argument[0] == '\0')
{
send_to_char("Usage: makeclan <clan name>\n\r", ch);
return;
}
found = FALSE;
sprintf(filename, "%s%s", CLAN_DIR, strlower(argument));
CREATE(clan, CLAN_DATA, 1);
LINK(clan, first_clan, last_clan, next, prev);
clan->name = STRALLOC(argument);
clan->motto = STRALLOC("");
clan->description = STRALLOC("");
clan->deity = STRALLOC("");
clan->leader = STRALLOC("");
clan->number1 = STRALLOC("");
clan->number2 = STRALLOC("");
clan->badge = STRALLOC("");
}
void do_makecouncil(CHAR_DATA * ch, char *argument)
{
char filename[256];
COUNCIL_DATA *council;
bool found;
set_char_color(AT_IMMORT, ch);
if (!argument || argument[0] == '\0')
{
send_to_char("Usage: makecouncil <council name>\n\r", ch);
return;
}
found = FALSE;
sprintf(filename, "%s%s", COUNCIL_DIR, strlower(argument));
CREATE(council, COUNCIL_DATA, 1);
LINK(council, first_council, last_council, next, prev);
council->name = STRALLOC(argument);
council->head = STRALLOC("");
council->head2 = NULL;
council->powers = STRALLOC("");
}
/*
* Added multiple level pkill and pdeath support. --Shaddai
*/
void do_clans(CHAR_DATA * ch, char *argument)
{
CLAN_DATA *clan;
int count = 0;
if (argument[0] == '\0')
{
set_char_color(AT_BLOOD, ch);
send_to_char
("\n\rClan Deity Leader Pkills: Avatar Other\n\r_________________________________________________________________________\n\r\n\r",
ch);
for (clan = first_clan; clan; clan = clan->next)
{
if (clan->clan_type == CLAN_ORDER || clan->clan_type == CLAN_GUILD)
continue;
set_char_color(AT_GREY, ch);
ch_printf(ch, "%-13s %-13s %-13s", clan->name, clan->deity, clan->leader);
set_char_color(AT_BLOOD, ch);
ch_printf(ch, " %5d %5d\n\r", clan->pkills[6], (clan->pkills[2] + clan->pkills[3] + clan->pkills[4] + clan->pkills[5]));
count++;
}
set_char_color(AT_BLOOD, ch);
if (!count)
send_to_char("There are no Clans currently formed.\n\r", ch);
else
send_to_char
("_________________________________________________________________________\n\r\n\rUse 'clans <clan>' for detailed information and a breakdown of victories.\n\r",
ch);
return;
}
clan = get_clan(argument);
if (!clan || clan->clan_type == CLAN_GUILD || clan->clan_type == CLAN_ORDER)
{
set_char_color(AT_BLOOD, ch);
send_to_char("No such clan.\n\r", ch);
return;
}
set_char_color(AT_BLOOD, ch);
ch_printf(ch, "\n\r%s, '%s'\n\r\n\r", clan->name, clan->motto);
set_char_color(AT_GREY, ch);
send_to_char_color("Victories:&w\n\r", ch);
ch_printf_color(ch, " &w15-19... &r%-4d\n\r &w20-29... &r%-4d\n\r &w30-39... &r%-4d\n\r &w40-49... &r%-4d\n\r",
clan->pkills[2], clan->pkills[3], clan->pkills[4], clan->pkills[5]);
ch_printf_color(ch, " &wAvatar... &r%-4d\n\r", clan->pkills[6]);
set_char_color(AT_GREY, ch);
ch_printf(ch, "Clan Leader: %s\n\rNumber One : %s\n\rNumber Two : %s\n\rClan Deity : %s\n\r",
clan->leader, clan->number1, clan->number2, clan->deity);
if (!str_cmp(ch->name, clan->deity) || !str_cmp(ch->name, clan->leader) || !str_cmp(ch->name, clan->number1) || !str_cmp(ch->name, clan->number2))
ch_printf(ch, "Members : %d\n\r", clan->members);
set_char_color(AT_BLOOD, ch);
ch_printf(ch, "\n\rDescription: %s\n\r", clan->description);
return;
}
void do_orders(CHAR_DATA * ch, char *argument)
{
CLAN_DATA *order;
int count = 0;
if (argument[0] == '\0')
{
set_char_color(AT_DGREEN, ch);
send_to_char
("\n\rOrder Deity Leader Mkills Mdeaths\n\r____________________________________________________________________\n\r\n\r",
ch);
set_char_color(AT_GREEN, ch);
for (order = first_clan; order; order = order->next)
if (order->clan_type == CLAN_ORDER)
{
ch_printf(ch, "%-16s %-14s %-14s %-7d %5d\n\r", order->name, order->deity, order->leader, order->mkills, order->mdeaths);
count++;
}
set_char_color(AT_DGREEN, ch);
if (!count)
send_to_char("There are no Orders currently formed.\n\r", ch);
else
send_to_char
("____________________________________________________________________\n\r\n\rUse 'orders <order>' for more detailed information.\n\r",
ch);
return;
}
order = get_clan(argument);
if (!order || order->clan_type != CLAN_ORDER)
{
set_char_color(AT_DGREEN, ch);
send_to_char("No such Order.\n\r", ch);
return;
}
set_char_color(AT_DGREEN, ch);
ch_printf(ch, "\n\rOrder of %s\n\r'%s'\n\r\n\r", order->name, order->motto);
set_char_color(AT_GREEN, ch);
ch_printf(ch, "Deity : %s\n\rLeader : %s\n\rNumber One : %s\n\rNumber Two : %s\n\r",
order->deity, order->leader, order->number1, order->number2);
if (!str_cmp(ch->name, order->deity)
|| !str_cmp(ch->name, order->leader) || !str_cmp(ch->name, order->number1) || !str_cmp(ch->name, order->number2))
ch_printf(ch, "Members : %d\n\r", order->members);
set_char_color(AT_DGREEN, ch);
ch_printf(ch, "\n\rDescription:\n\r%s\n\r", order->description);
return;
}
void do_councils(CHAR_DATA * ch, char *argument)
{
COUNCIL_DATA *council;
set_char_color(AT_CYAN, ch);
if (!first_council)
{
send_to_char("There are no councils currently formed.\n\r", ch);
return;
}
if (argument[0] == '\0')
{
send_to_char_color("\n\r&cTitle Head\n\r", ch);
for (council = first_council; council; council = council->next)
{
if (council->head2 != NULL)
ch_printf_color(ch, "&w%-24s %s and %s\n\r", council->name, council->head, council->head2);
else
ch_printf_color(ch, "&w%-24s %-14s\n\r", council->name, council->head);
}
send_to_char_color("&cUse 'councils <name of council>' for more detailed information.\n\r", ch);
return;
}
council = get_council(argument);
if (!council)
{
send_to_char_color("&cNo such council exists...\n\r", ch);
return;
}
ch_printf_color(ch, "&c\n\r%s\n\r", council->name);
if (council->head2 == NULL)
ch_printf_color(ch, "&cHead: &w%s\n\r&cMembers: &w%d\n\r", council->head, council->members);
else
ch_printf_color(ch, "&cCo-Heads: &w%s &cand &w%s\n\r&cMembers: &w%d\n\r", council->head, council->head2, council->members);
ch_printf_color(ch, "&cDescription:\n\r&w%s\n\r", council->description);
return;
}
void do_guilds(CHAR_DATA * ch, char *argument)
{
CLAN_DATA *guild;
int count = 0;
if (argument[0] == '\0')
{
set_char_color(AT_HUNGRY, ch);
send_to_char
("\n\rGuild Leader Mkills Mdeaths\n\r_____________________________________________________________\n\r\n\r",
ch);
set_char_color(AT_YELLOW, ch);
for (guild = first_clan; guild; guild = guild->next)
if (guild->clan_type == CLAN_GUILD)
{
++count;
ch_printf(ch, "%-20s %-14s %-6d %6d\n\r", guild->name, guild->leader, guild->mkills, guild->mdeaths);
}
set_char_color(AT_HUNGRY, ch);
if (!count)
send_to_char("There are no Guilds currently formed.\n\r", ch);
else
send_to_char("_____________________________________________________________\n\r\n\rUse 'guilds <guild>' for more detailed information.\n\r",
ch);
return;
}
guild = get_clan(argument);
if (!guild || guild->clan_type != CLAN_GUILD)
{
set_char_color(AT_HUNGRY, ch);
send_to_char("No such Guild.\n\r", ch);
return;
}
set_char_color(AT_HUNGRY, ch);
ch_printf(ch, "\n\r%s\n\r", guild->name);
set_char_color(AT_YELLOW, ch);
ch_printf(ch, "Leader: %s\n\rNumber 1: %s\n\rNumber 2: %s\n\rMotto: %s\n\r", guild->leader, guild->number1, guild->number2, guild->motto);
if (!str_cmp(ch->name, guild->deity)
|| !str_cmp(ch->name, guild->leader) || !str_cmp(ch->name, guild->number1) || !str_cmp(ch->name, guild->number2))
ch_printf(ch, "Members: %d\n\r", guild->members);
set_char_color(AT_HUNGRY, ch);
ch_printf(ch, "Guild Description:\n\r%s\n\r", guild->description);
return;
}
void do_victories(CHAR_DATA * ch, char *argument)
{
char filename[256];
if (IS_NPC(ch) || !ch->pcdata->clan)
{
send_to_char("Huh?\n\r", ch);
return;
}
if (ch->pcdata->clan->clan_type != CLAN_ORDER && ch->pcdata->clan->clan_type != CLAN_GUILD)
{
sprintf(filename, "%s%s.record", CLAN_DIR, ch->pcdata->clan->name);
set_pager_color(AT_PURPLE, ch);
if (!str_cmp(ch->name, ch->pcdata->clan->leader) && !str_cmp(argument, "clean"))
{
FILE *fp = fopen(filename, "w");
if (fp)
fclose(fp);
send_to_pager("\n\rVictories ledger has been cleared.\n\r", ch);
return;
}
else
{
send_to_pager("\n\rLVL Character LVL Character\n\r", ch);
show_file(ch, filename);
return;
}
}
else
{
send_to_char("Huh?\n\r", ch);
return;
}
}
void do_shove(CHAR_DATA * ch, char *argument)
{
char arg[MIL];
char arg2[MIL];
int exit_dir;
EXIT_DATA *pexit;
CHAR_DATA *victim;
int curpos;
bool nogo;
ROOM_INDEX_DATA *to_room;
int chance = 0;
argument = one_argument(argument, arg);
argument = one_argument(argument, arg2);
if (IS_NPC(ch))
{
send_to_char("Only PCs can shove.\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char("Shove whom?\n\r", ch);
return;
}
if ((victim = get_char_room_new(ch, arg, 1)) == NULL)
{
send_to_char("They aren't here.\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char("You shove yourself around, to no avail.\n\r", ch);
return;
}
if (IS_NPC(victim))
{
send_to_char("You can only shove PCs.\n\r", ch);
return;
}
if (victim->position != POS_STANDING && victim->position != POS_MOUNTED)
{
act(AT_PLAIN, "$N isn't standing or mounted.", ch, NULL, victim, TO_CHAR);
return;
}
curpos = victim->position;
if (arg2[0] == '\0')
{
send_to_char("Shove them in which direction?\n\r", ch);
return;
}
exit_dir = get_dir(arg2);
if ((check_room_pk(ch) == 1) && get_timer(victim, TIMER_SHOVEDRAG) <= 0)
{
send_to_char("That character cannot be shoved right now.\n\r", ch);
return;
}
victim->position = POS_SHOVE;
nogo = FALSE;
if ((pexit = get_exit(ch->in_room, exit_dir)) == NULL)
nogo = TRUE;
else if (IS_SET(pexit->exit_info, EX_CLOSED) && (!IS_AFFECTED(victim, AFF_PASS_DOOR) || IS_SET(pexit->exit_info, EX_NOPASSDOOR)))
nogo = TRUE;
if (nogo)
{
send_to_char("There's no exit in that direction.\n\r", ch);
victim->position = curpos;
return;
}
to_room = pexit->to_room;
if (xIS_SET(to_room->room_flags, ROOM_DEATH))
{
send_to_char("You cannot shove someone into a death trap.\n\r", ch);
victim->position = curpos;
return;
}
if (ch->in_room->area != to_room->area && !in_hard_range(victim, to_room->area))
{
send_to_char("That character cannot enter that area.\n\r", ch);
victim->position = curpos;
return;
}
chance = number_range(35, 50);
chance += ((get_curr_str(ch) - get_curr_str(victim)) * 10);
//Make it much harder to push a mounted individual, almost impossible for magic users
if (curpos == POS_MOUNTED)
chance -= 30;
/* Debugging purposes - show percentage for testing */
/* sprintf(buf, "Shove percentage of %s = %d", ch->name, chance);
act( AT_ACTION, buf, ch, NULL, NULL, TO_ROOM );
*/
if (chance < number_percent())
{
send_to_char("You failed.\n\r", ch);
remove_timer(victim, TIMER_SHOVEDRAG); //cannot force after this
victim->position = curpos;
act(AT_ACTION, "$n tries to shove you but fails.", ch, NULL, victim, TO_VICT);
return;
}
act(AT_ACTION, "You shove $M.", ch, NULL, victim, TO_CHAR);
if (curpos == POS_MOUNTED)
{
act(AT_ACTION, "$n shoves you off of your mount and into the next room.", ch, NULL, victim, TO_VICT);
if (victim->mount)
{
xREMOVE_BIT(victim->mount->act, ACT_MOUNTED);
victim->mount = NULL;
ch->position = POS_STANDING;
}
}
else
{
act(AT_ACTION, "$n shoves you.", ch, NULL, victim, TO_VICT);
}
move_char(victim, get_exit(ch->in_room, exit_dir), 0);
if (!char_died(victim))
victim->position = POS_STANDING;
if (curpos == POS_MOUNTED)
damage(victim, victim, number_range(10, 25), TYPE_UNDEFINED, 0, -1);
else
damage(victim, victim, number_range(1, 5), TYPE_UNDEFINED, 0, -1);
WAIT_STATE(ch, 12);
/* Remove protection from shove/drag if char shoves -- Blodkai */
}
void do_consent(CHAR_DATA * ch, char *argument)
{
DESCRIPTOR_DATA *d;
if (check_npc(ch))
return;
if (argument[0] == '\0')
{
send_to_char("Syntax: consent <player>\n\r", ch);
send_to_char("Syntax: consent none\n\r", ch);
return;
}
if (!str_cmp(argument, "none"))
{
ch->pcdata->consent = 0;
return;
}
for (d = first_descriptor; d; d = d->next)
{
if (d->character && d->character->name && d->character->short_descr && d->character->pcdata)
{
if (!str_prefix(argument, PERS_MAP(d->character, ch)))
break;
}
}
if (d)
{
ch->pcdata->consent = d->character->pcdata->pid;
ch_printf(ch, "You offer %s consent to drag your corpse.\n\r", PERS_MAP(d->character, ch));
ch_printf(d->character, "%s gives you consent to drag his/her corpse.\n\r", PERS_MAP(ch, d->character));
return;
}
else
{
ch_printf(ch, "No %s could be found to offer consent.\n\r", argument);
return;
}
}
void write_corpses args((CHAR_DATA * ch, char *name, OBJ_DATA * objrem));
void update_player_container args((CHAR_DATA * ch, OBJ_DATA *iobj));
void do_drag(CHAR_DATA * ch, char *argument)
{
char arg[MIL];
char arg2[MIL];
int exit_dir;
CHAR_DATA *victim;
EXIT_DATA *pexit;
ROOM_INDEX_DATA *to_room;
int curpos;
bool nogo;
int chance = 0;
if (IS_NPC(ch))
/* || !IS_SET( ch->pcdata->flags, PCFLAG_DEADLY ) ) */
{
send_to_char("Only characters can drag.\n\r", ch);
return;
}
if (argument[0] == '\0')
{
send_to_char("Syntax: drag <victim> <dir>\n\r", ch);
send_to_char("Syntax: drag corpse <corpse> <dir>\n\r", ch);
return;
}
argument = one_argument(argument, arg);
argument = one_argument(argument, arg2);
if (!str_cmp(arg, "corpse"))
{
OBJ_DATA *obj;
char *pd;
char name[MIL];
int consent = 0;
DESCRIPTOR_DATA *d;
ROOM_INDEX_DATA *in_room;
ROOM_INDEX_DATA *to_room;
int x, nx;
int y, ny;
int map, nmap;
if ((obj = get_obj_list_rev(ch, arg2, ch->in_room->last_content)) == NULL)
{
send_to_char("That corpse is not here.\n\r", ch);
return;
}
if (obj->item_type != ITEM_CORPSE_PC)
{
send_to_char("You can only drag a PC corpse.\n\r", ch);
return;
}
if (ch->position != POS_STANDING)
{
send_to_char("You can only do this if you are standing.\n\r", ch);
return;
}
pd = obj->short_descr;
pd = one_argument(pd, name);
pd = one_argument(pd, name);
pd = one_argument(pd, name);
pd = one_argument(pd, name);
if (!str_cmp(name, ch->name))
consent = 1;
for (d = first_descriptor; d; d = d->next)
{
if (d->character && d->character->name && !str_cmp(d->character->name, name))
{
if (d->character->master && is_same_group(ch, d->character))
consent = 1;
if (d->character->pcdata && d->character->pcdata->consent == ch->pcdata->pid)
consent = 1;
}
}
if (consent == 0)
{
send_to_char("You do not have consent to drag that corpse.\n\r", ch);
return;
}
in_room = ch->in_room;
x = ch->coord->x;
y = ch->coord->y;
map = ch->map;
exit_dir = get_dir(argument);
if (exit_dir == 0)
do_north(ch, "");
if (exit_dir == 1)
do_east(ch, "");
if (exit_dir == 2)
do_south(ch, "");
if (exit_dir == 3)
do_west(ch, "");
if (exit_dir == 4)
do_up(ch, "");
if (exit_dir == 5)
do_down(ch, "");
if (exit_dir == 6)
do_northeast(ch, "");
if (exit_dir == 7)
do_northwest(ch, "");
if (exit_dir == 8)
do_southeast(ch, "");
if (exit_dir == 9)
do_southwest(ch, "");
to_room = ch->in_room;
nx = ch->coord->x;
ny = ch->coord->y;
nmap = ch->map;
if (in_room == to_room && x == nx && y == ny && map == nmap)
{
send_to_char("You cannot go that direction so you cannot drag a corpse that direction.\n\r", ch);
return;
}
char_from_room(ch);
char_to_room(ch, in_room);
ch->coord->x = x;
ch->coord->y = y;
ch->map = map;
act(AT_WHITE, "$n departs with a corpse in haul.", ch, NULL, NULL, TO_ROOM);
char_from_room(ch);
char_to_room(ch, to_room);
ch->coord->x = nx;
ch->coord->y = ny;
ch->map = nmap;
act(AT_WHITE, "$n hauls in a corpse.", ch, NULL, NULL, TO_ROOM);
act(AT_WHITE, "You drag in the corpse", ch, NULL, NULL, TO_CHAR);
obj_from_room(obj);
obj_to_room(obj, to_room, ch);
update_player_container(ch, obj);
write_corpses(NULL, obj->short_descr + 14, NULL);
return;
}
if ((victim = get_char_room_new(ch, arg, 1)) == NULL)
{
send_to_char("They aren't here.\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char("You take yourself by the scruff of your neck, but go nowhere.\n\r", ch);
return;
}
if (IS_NPC(victim))
/* || !IS_SET( victim->pcdata->flags, PCFLAG_DEADLY ) ) */
{
send_to_char("You can only drag characters.\n\r", ch);
return;
}
if (victim->fighting)
{
send_to_char("You try, but can't get close enough.\n\r", ch);
return;
}
if (victim->position <= 4 || victim->position == POS_RESTING || victim->position == POS_SITTING)
{
;
}
else
{
send_to_char("They don't seem to need your assistance.\n\r", ch);
return;
}
curpos = victim->position;
if (arg2[0] == '\0')
{
send_to_char("Drag them in which direction?\n\r", ch);
return;
}
exit_dir = get_dir(arg2);
if ((check_room_pk(ch) == 1) && get_timer(victim, TIMER_SHOVEDRAG) <= 0)
{
send_to_char("That character cannot be dragged right now.\n\r", ch);
return;
}
nogo = FALSE;
if ((pexit = get_exit(ch->in_room, exit_dir)) == NULL)
nogo = TRUE;
else if (IS_SET(pexit->exit_info, EX_CLOSED) && (!IS_AFFECTED(victim, AFF_PASS_DOOR) || IS_SET(pexit->exit_info, EX_NOPASSDOOR)))
nogo = TRUE;
if (nogo)
{
send_to_char("There's no exit in that direction.\n\r", ch);
return;
}
to_room = pexit->to_room;
if (xIS_SET(to_room->room_flags, ROOM_DEATH))
{
send_to_char("You cannot drag someone into a death trap.\n\r", ch);
return;
}
if (ch->in_room->area != to_room->area && !in_hard_range(victim, to_room->area))
{
send_to_char("That character cannot enter that area.\n\r", ch);
return;
}
chance = number_range(30, 45);
chance += ((get_curr_str(ch) - get_curr_str(victim)) * 10);
if (curpos == POS_DEAD || curpos == POS_MORTAL || curpos == POS_INCAP)
chance += 40;
if (curpos == POS_STUNNED)
chance += 35;
if (curpos == POS_SLEEPING)
chance += 25;
if (curpos == POS_RESTING)
chance += 20;
if (curpos == POS_SITTING)
chance += 10;
/* Debugging purposes - show percentage for testing */
/* sprintf(buf, "Shove percentage of %s = %d", ch->name, chance);
act( AT_ACTION, buf, ch, NULL, NULL, TO_ROOM );
*/
if (chance < number_percent())
{
send_to_char("You failed.\n\r", ch);
remove_timer(victim, TIMER_SHOVEDRAG); //cannot force after this
victim->position = POS_STANDING;
return;
}
if (victim->position < POS_STANDING)
{
sh_int temp;
temp = victim->position;
victim->position = POS_DRAG;
act(AT_ACTION, "You drag $M into the next room.", ch, NULL, victim, TO_CHAR);
act(AT_ACTION, "$n grabs your hair and drags you.", ch, NULL, victim, TO_VICT);
move_char(victim, get_exit(ch->in_room, exit_dir), 0);
if (!char_died(victim))
victim->position = temp;
/* Move ch to the room too.. they are doing dragging - Scryn */
move_char(ch, get_exit(ch->in_room, exit_dir), 0);
WAIT_STATE(ch, 12);
return;
}
send_to_char("You cannot do that to someone who is standing.\n\r", ch);
return;
}