/****************************************************************************
* [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 <stdio.h>
#include <string.h>
#include "h/mud.h"
#include "h/files.h"
#include "h/clans.h"
#include "h/key.h"
#include "h/languages.h"
#include <time.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;
bool valid_pfile(const char *filename);
void influence_areas(CLAN_DATA * clan);
/* local routines */
void fread_clan args((CLAN_DATA * clan, FILE * fp));
bool load_clan_file args((const char *clanfile));
void write_clan_list args((void));
void fread_council args((COUNCIL_DATA * council, FILE * fp));
bool load_council_file args((const char *councilfile));
void write_council_list args((void));
void check_clan_leaders(CLAN_DATA * clan, char *player);
/* Sorted by level and date updated */
void insert_roster(CLAN_DATA * clan, ROSTER_DATA * roster)
{
ROSTER_DATA *uroster;
int daydiff, odaydiff;
for(uroster = clan->first_member; uroster; uroster = uroster->next)
{
odaydiff = (current_time - uroster->lastupdated) / 86400;
daydiff = (current_time - roster->lastupdated) / 86400;
if(odaydiff < 3 && uroster->level > roster->level)
continue;
/*
* So if level is the same or they havent logged in for 3 days just insert here
*/
INSERT(roster, uroster, clan->first_member, next, prev);
return;
}
LINK(roster, clan->first_member, clan->last_member, next, prev);
}
void add_roster(CLAN_DATA * clan, char *name, char *race, int level, int pkills, int kills, int deaths, int tradeclass, int tradelevel)
{
ROSTER_DATA *roster;
CREATE(roster, ROSTER_DATA, 1);
roster->name = STRALLOC(name);
roster->race = STRALLOC(race);
roster->level = level;
roster->pkills = pkills;
roster->kills = kills;
roster->deaths = deaths;
roster->joined = current_time;
roster->lastupdated = current_time;
roster->tradeclass = tradeclass;
roster->tradelevel = tradelevel;
insert_roster(clan, roster);
}
void remove_roster(CLAN_DATA * clan, char *name)
{
ROSTER_DATA *roster;
for(roster = clan->first_member; roster; roster = roster->next)
{
if(!str_cmp(name, roster->name))
{
STRFREE(roster->name);
STRFREE(roster->race);
UNLINK(roster, clan->first_member, clan->last_member, next, prev);
DISPOSE(roster);
return;
}
}
}
/* Remove them from any roster they are on */
void remove_from_rosters(char *name)
{
CLAN_DATA *clan;
ROSTER_DATA *roster, *roster_next;
for(clan = first_clan; clan; clan = clan->next)
{
for(roster = clan->first_member; roster; roster = roster_next)
{
roster_next = roster->next;
if(!str_cmp(roster->name, name))
{
STRFREE(roster->name);
STRFREE(roster->race);
UNLINK(roster, clan->first_member, clan->last_member, next, prev);
DISPOSE(roster);
}
}
save_clan(clan);
}
}
/* When we update the roster move the roster to the first of the list */
void update_roster(CHAR_DATA *ch)
{
CLAN_DATA *clan;
ROSTER_DATA *roster;
if(!ch || !ch->pcdata || !(clan = ch->pcdata->clan))
return;
for(roster = clan->first_member; roster; roster = roster->next)
{
if(!str_cmp(ch->name, roster->name))
{
roster->race = STRALLOC(capitalize(race_table[ch->race]->race_name));
roster->level = ch->level;
roster->pkills = ch->pcdata->pkills;
roster->kills = ch->pcdata->mkills;
roster->deaths = ch->pcdata->mdeaths;
roster->lastupdated = current_time;
roster->tradelevel = ch->pcdata->tradelevel;
roster->tradeclass = ch->pcdata->tradeclass;
UNLINK(roster, clan->first_member, clan->last_member, next, prev);
insert_roster(clan, roster);
save_clan(ch->pcdata->clan);
return;
}
}
/*
* If we make it here, assume they haven't been added previously
*/
add_roster(clan, ch->name, capitalize(race_table[ch->race]->race_name), ch->level, ch->pcdata->pkills, ch->pcdata->mkills, ch->pcdata->mdeaths, ch->pcdata->tradeclass, ch->pcdata->tradelevel);
save_clan(clan);
}
/* For use during clan removal and memory cleanup */
void remove_all_rosters(CLAN_DATA * clan)
{
ROSTER_DATA *roster, *roster_next;
for(roster = clan->first_member; roster; roster = roster_next)
{
roster_next = roster->next;
STRFREE(roster->name);
STRFREE(roster->race);
UNLINK(roster, clan->first_member, clan->last_member, next, prev);
DISPOSE(roster);
}
}
void do_roster(CHAR_DATA *ch, char *argument)
{
CLAN_DATA *clan;
ROSTER_DATA *roster;
char arg[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
int total = 0;
if(IS_NPC(ch))
{
send_to_char("NPCs can't use this command.\r\n", ch);
return;
}
if(!argument || argument[0] == '\0')
{
send_to_char("Usage: roster <clanname>\r\n", ch);
if(IS_IMMORTAL(ch) || IS_CHIEFTAIN(ch) || IS_WARMASTER(ch))
send_to_char("Usage: roster <clanname> remove <name>\r\n", ch);
return;
}
argument = one_argument(argument, arg);
if(!(clan = get_clan(arg)))
{
ch_printf(ch, "No such guild or clan known as %s\r\n", arg);
return;
}
if(!argument || argument[0] == '\0')
{
ch_printf(ch, "&cMembership roster for the Clan %s\r\r\n\n", clan->name);
ch_printf(ch, "%-15.15s %15.15s %6.6s %10.10s %6.6s %6.6s %6.6s %6.6s\r\n", "Name", "Race", "Level", "TClass", "TLevel", "PKills", "Kills", "Deaths");
send_to_char("------------------------------------------------------------------------------&C\r\n", ch);
for(roster = clan->first_member; roster; roster = roster->next)
{
if(roster->level > 100)
continue;
ch_printf(ch, "%-15.15s %15.15s %6d %10s %6d %6d %6d %6d\r\n",
roster->name, roster->race, roster->level,
roster->tradeclass == 20 ? "Blacksmith" : roster->tradeclass ==
21 ? "Baker" : roster->tradeclass == 22 ? "Tanner" :
roster->tradeclass == 24 ? "Jeweler" :
roster->tradeclass == 25 ? "Carpenter" : roster->tradeclass == 26 ? "Dragonic" : "", roster->tradelevel >= 0 ? roster->tradelevel : 0, roster->pkills, roster->kills, roster->deaths);
total++;
}
ch_printf(ch, "\r\n&cThere are &C%d &cmember%s in &C%s\r\n", total, total == 1 ? "" : "s", clan->name);
return;
}
argument = one_argument(argument, arg2);
if(IS_IMMORTAL(ch) || (VLD_STR(clan->chieftain) && !str_cmp(ch->name, clan->chieftain)) || (VLD_STR(clan->warmaster) && !str_cmp(ch->name, clan->warmaster)))
{
if(!str_cmp(arg2, "remove"))
{
if(!argument || argument[0] == '\0')
{
send_to_char("Remove who from the roster?\r\n", ch);
return;
}
remove_roster(clan, argument);
save_clan(clan);
ch_printf(ch, "%s has been removed from the roster for %s\r\n", argument, clan->name);
return;
}
}
do_roster(ch, (char *)"");
}
void fwrite_memberlist(FILE * fp, CLAN_DATA * clan)
{
ROSTER_DATA *roster;
for(roster = clan->first_member; roster; roster = roster->next)
{
if(!valid_pfile(roster->name))
continue;
fprintf(fp, "%s", "#ROSTER\n");
fprintf(fp, "Name %s~\n", roster->name);
fprintf(fp, "Joined %ld\n", (time_t) roster->joined);
fprintf(fp, "Updated %ld\n", (time_t) roster->lastupdated);
fprintf(fp, "Race %s~\n", roster->race);
fprintf(fp, "Level %d\n", roster->level);
fprintf(fp, "PKills %d\n", roster->pkills);
fprintf(fp, "Kills %d\n", roster->kills);
fprintf(fp, "Deaths %d\n", roster->deaths);
fprintf(fp, "TradeClass %d\n", roster->tradeclass);
fprintf(fp, "TradeLevel %d\n", roster->tradelevel);
fprintf(fp, "%s", "End\n\n");
}
}
void fread_memberlist(CLAN_DATA * clan, FILE * fp)
{
ROSTER_DATA *roster;
const char *word;
bool fMatch;
CREATE(roster, ROSTER_DATA, 1);
roster->lastupdated = current_time;
roster->tradeclass = -1;
roster->tradelevel = -1;
for(;;)
{
word = feof(fp) ? "End" : fread_word(fp);
fMatch = FALSE;
switch (UPPER(word[0]))
{
case '*':
fMatch = TRUE;
fread_to_eol(fp);
break;
case 'D':
KEY("Deaths", roster->deaths, fread_number(fp));
break;
case 'E':
if(!str_cmp(word, "End"))
{
LINK(roster, clan->first_member, clan->last_member, next, prev);
return;
}
break;
case 'J':
KEY("Joined", roster->joined, fread_number(fp));
break;
case 'K':
KEY("Kills", roster->kills, fread_number(fp));
break;
case 'L':
KEY("Level", roster->level, fread_number(fp));
break;
case 'N':
KEY("Name", roster->name, fread_string(fp));
break;
case 'P':
KEY("PKills", roster->pkills, fread_number(fp));
break;
case 'R':
KEY("Race", roster->race, fread_string(fp));
break;
case 'T':
KEY("TradeClass", roster->tradeclass, fread_number(fp));
KEY("TradeLevel", roster->tradelevel, fread_number(fp));
break;
case 'U':
KEY("Updated", roster->lastupdated, fread_number(fp));
break;
}
if(!fMatch)
bug("%s: no match: %s", __FUNCTION__, word);
}
STRFREE( roster->name );
DISPOSE( roster );
}
void free_pkillarea(PKILLAREA_DATA * pkillarea)
{
STRFREE(pkillarea->name);
DISPOSE(pkillarea);
}
void free_one_clan(CLAN_DATA * clan)
{
PKILLAREA_DATA *pkillarea, *pkillarea_next;
AREA_DATA *tarea;
UNLINK(clan, first_clan, last_clan, next, prev);
STRFREE(clan->filename);
STRFREE(clan->name);
STRFREE(clan->motto);
STRFREE(clan->description);
STRFREE(clan->warmaster);
STRFREE(clan->chieftain);
STRFREE(clan->badge);
STRFREE(clan->intro);
remove_all_rosters(clan);
for(pkillarea = clan->first_pkillarea; pkillarea; pkillarea = pkillarea_next)
{
pkillarea_next = pkillarea->next;
UNLINK(pkillarea, clan->first_pkillarea, clan->last_pkillarea, next, prev);
free_pkillarea(pkillarea);
}
for(tarea = first_area; tarea; tarea = tarea->next)
{
if(tarea->influencer == clan)
tarea->influencer = NULL;
}
DISPOSE(clan);
}
void free_clans(void)
{
CLAN_DATA *clan, *clan_next;
for(clan = first_clan; clan; clan = clan_next)
{
clan_next = clan->next;
free_one_clan(clan);
}
}
void free_one_council(COUNCIL_DATA * council)
{
UNLINK(council, first_council, last_council, next, prev);
STRFREE(council->description);
STRFREE(council->filename);
STRFREE(council->head);
STRFREE(council->head2);
STRFREE(council->name);
STRFREE(council->powers);
DISPOSE(council);
}
void free_councils(void)
{
COUNCIL_DATA *council, *council_next;
for(council = first_council; council; council = council_next)
{
council_next = council->next;
free_one_council(council);
}
}
/*
* Get pointer to clan structure from clan name.
*/
CLAN_DATA *get_clan(const 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(const 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];
snprintf(filename, 256, "%s%s", CLAN_DIR, CLAN_LIST);
fpout = FileOpen(filename, "w");
if(!fpout)
{
bug("FATAL: cannot open %s for writing!\r\n", filename);
return;
}
for(tclan = first_clan; tclan; tclan = tclan->next)
fprintf(fpout, "%s\n", tclan->filename);
fprintf(fpout, "$\n");
FileClose(fpout);
}
void write_council_list()
{
COUNCIL_DATA *tcouncil;
FILE *fpout;
char filename[256];
snprintf(filename, 256, "%s%s", COUNCIL_DIR, COUNCIL_LIST);
fpout = FileOpen(filename, "w");
if(!fpout)
{
bug("FATAL: cannot open %s for writing!\r\n", filename);
return;
}
for(tcouncil = first_council; tcouncil; tcouncil = tcouncil->next)
fprintf(fpout, "%s\n", tcouncil->filename);
fprintf(fpout, "$\n");
FileClose(fpout);
}
/*
* Save a clan's data to its data file
*/
void save_clan(CLAN_DATA * clan)
{
FILE *fp;
char filename[256];
PKILLAREA_DATA *pkillarea = NULL;
if(!clan)
{
bug("%s", "save_clan: null clan pointer!");
return;
}
if(!clan->filename || clan->filename[0] == '\0')
{
bug("save_clan: %s has no filename", clan->name);
return;
}
snprintf(filename, 256, "%s%s", CLAN_DIR, clan->filename);
if((fp = FileOpen(filename, "w")) == NULL)
{
bug("save_clan: can't open %s", filename);
perror(filename);
}
else
{
fprintf(fp, "#CLAN\n");
fprintf(fp, "Name %s~\n", clan->name);
fprintf(fp, "Filename %s~\n", clan->filename);
fprintf(fp, "Intro %s~\n", clan->intro);
fprintf(fp, "Motto %s~\n", clan->motto);
fprintf(fp, "Description %s~\n", clan->description);
fprintf(fp, "Warmaster %s~\n", clan->warmaster);
fprintf(fp, "Chieftain %s~\n", clan->chieftain);
fprintf(fp, "Badge %s~\n", clan->badge);
fprintf(fp, "PKillRangeNew %d %d %d %d %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], clan->pkills[7], clan->pkills[8], clan->pkills[9], clan->pkills[10]);
fprintf(fp, "PDeathRangeNew %d %d %d %d %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], clan->pdeaths[7], clan->pdeaths[8], clan->pdeaths[9], clan->pdeaths[10]);
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, "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, "Clanstatus %d\n", clan->status);
fprintf(fp, "Recall %d\n", clan->recall);
fprintf(fp, "Totalpoints %d\n", clan->totalpoints);
fprintf(fp, "GuardOne %d\n", clan->guard1);
fprintf(fp, "GuardTwo %d\n", clan->guard2);
fprintf(fp, "ArenaVictory %d\n", clan->arena_victory);
fprintf(fp, "Chieflog %d\n", clan->chieflog);
fprintf(fp, "Warlog %d\n", clan->warlog);
for(pkillarea = clan->first_pkillarea; pkillarea; pkillarea = pkillarea->next)
{
fprintf(fp, "PKILLAREA %s~\n", pkillarea->name);
}
fprintf(fp, "End\n\n");
fwrite_memberlist(fp, clan);
fprintf(fp, "#END\n");
FileClose(fp);
fp = NULL;
}
return;
}
/*
* Save a council's data to its data file
*/
void save_council(COUNCIL_DATA * council)
{
FILE *fp;
char filename[256];
if(!council)
{
bug("%s", "save_council: null council pointer!");
return;
}
if(!council->filename || council->filename[0] == '\0')
{
bug("save_council: %s has no filename", council->name);
return;
}
snprintf(filename, 256, "%s%s", COUNCIL_DIR, council->filename);
if((fp = FileOpen(filename, "w")) == NULL)
{
bug("save_council: can't open %s", filename);
perror(filename);
}
else
{
fprintf(fp, "#COUNCIL\n");
if(council->name)
fprintf(fp, "Name %s~\n", council->name);
if(council->filename)
fprintf(fp, "Filename %s~\n", council->filename);
if(council->description)
fprintf(fp, "Description %s~\n", council->description);
if(council->head)
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);
if(council->powers)
fprintf(fp, "Powers %s~\n", council->powers);
fprintf(fp, "End\n\n");
fprintf(fp, "#END\n");
FileClose(fp);
fp = NULL;
}
}
/*
* Read in actual clan data.
*/
/*
* 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)
{
const 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));
KEY("ArenaVictory", clan->arena_victory, fread_number(fp));
break;
case 'B':
KEY("Badge", clan->badge, fread_string(fp));
KEY("Board", clan->board, fread_number(fp));
break;
case 'C':
KEY("Chieftain", clan->chieftain, fread_string(fp));
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));
KEY("Clanstatus", clan->status, fread_number(fp));
KEY("Chieflog", clan->chieflog, fread_number(fp));
break;
case 'D':
KEY("Description", clan->description, fread_string(fp));
break;
case 'E':
if(!str_cmp(word, "End"))
{
if(!clan->name)
clan->name = STRALLOC("");
if(!clan->description)
clan->description = STRALLOC("");
if(!clan->warmaster)
clan->warmaster = STRALLOC("");
if(!clan->chieftain)
clan->chieftain = STRALLOC("");
if(!clan->motto)
clan->motto = STRALLOC("");
if(!clan->badge)
clan->badge = STRALLOC("");
return;
}
break;
case 'F':
KEY("Filename", clan->filename, fread_string(fp));
case 'G':
KEY("GuardOne", clan->guard1, fread_number(fp));
KEY("GuardTwo", clan->guard2, fread_number(fp));
break;
case 'I':
KEY("Intro", clan->intro, fread_string(fp));
KEY("IllegalPK", clan->illegal_pk, fread_number(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));
break;
case 'O':
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);
clan->pdeaths[7] = fread_number(fp);
clan->pdeaths[8] = fread_number(fp);
clan->pdeaths[9] = fread_number(fp);
clan->pdeaths[10] = fread_number(fp);
}
if(!strcmp(word, "PKILLAREA"))
{
PKILLAREA_DATA *pkillarea;
CREATE(pkillarea, PKILLAREA_DATA, 1);
pkillarea->name = fread_string(fp);
LINK(pkillarea, clan->first_pkillarea, clan->last_pkillarea, next, prev);
fMatch = TRUE;
break;
}
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);
clan->pkills[7] = fread_number(fp);
clan->pkills[8] = fread_number(fp);
clan->pkills[9] = fread_number(fp);
clan->pkills[10] = 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));
break;
case 'T':
KEY("Totalpoints", clan->totalpoints, fread_number(fp));
KEY("Type", clan->clan_type, fread_number(fp));
break;
case 'W':
KEY("Warlog", clan->warlog, fread_number(fp));
KEY("Warmaster", clan->warmaster, fread_string(fp));
break;
}
if(!fMatch)
{
bug("Fread_clan: no match: %s", word);
fread_to_eol(fp);
}
}
}
/*
* Read in actual council data.
*/
void fread_council(COUNCIL_DATA * council, FILE * fp)
{
const 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(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)
{
bug("Fread_council: no match: %s", word);
fread_to_eol(fp);
}
}
}
/*
* Load a clan file
*/
bool load_clan_file(const 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->pkills[7] = 0;
clan->pkills[8] = 0;
clan->pkills[9] = 0;
clan->pkills[10] = 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;
clan->pdeaths[7] = 0;
clan->pdeaths[8] = 0;
clan->pdeaths[9] = 0;
clan->pdeaths[10] = 0;
clan->intro = NULL;
found = FALSE;
snprintf(filename, 256, "%s%s", CLAN_DIR, clanfile);
if((fp = FileOpen(filename, "r")) != NULL)
{
found = TRUE;
for(;;)
{
char letter;
char *word;
letter = fread_letter(fp);
if(letter == '*')
{
fread_to_eol(fp);
continue;
}
if(letter != '#')
{
bug("%s: # not found.", __FUNCTION__);
break;
}
word = fread_word(fp);
if(!str_cmp(word, "CLAN"))
fread_clan(clan, fp);
else if(!str_cmp(word, "ROSTER"))
fread_memberlist(clan, fp);
else if(!str_cmp(word, "END"))
break;
else
{
bug("%s: bad section: %s.", __FUNCTION__, word);
break;
}
}
FileClose(fp);
fp = NULL;
}
if(found)
LINK(clan, first_clan, last_clan, next, prev);
else
DISPOSE(clan);
if(clan)
influence_areas(clan);
return found;
}
bool load_council_file(const char *councilfile)
{
char filename[256];
COUNCIL_DATA *council;
FILE *fp;
bool found;
CREATE(council, COUNCIL_DATA, 1);
found = FALSE;
snprintf(filename, 256, "%s%s", COUNCIL_DIR, councilfile);
if((fp = FileOpen(filename, "r")) != NULL)
{
found = TRUE;
for(;;)
{
char letter;
char *word;
letter = fread_letter(fp);
if(letter == '*')
{
fread_to_eol(fp);
continue;
}
if(letter != '#')
{
bug("%s", "Load_council_file: # not found.");
break;
}
word = fread_word(fp);
if(!str_cmp(word, "COUNCIL"))
{
fread_council(council, fp);
break;
}
else if(!str_cmp(word, "END"))
break;
else
{
bug("%s", "Load_council_file: bad section.");
break;
}
}
FileClose(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;
const char *filename;
char clanlist[256];
PKILLAREA_DATA *first_pkillarea;
PKILLAREA_DATA *last_pkillarea;
first_clan = NULL;
last_clan = NULL;
first_pkillarea = NULL;
last_pkillarea = NULL;
log_string("Loading clans...");
snprintf(clanlist, 256, "%s%s", CLAN_DIR, CLAN_LIST);
if((fpList = FileOpen(clanlist, "r")) == NULL)
{
perror(clanlist);
exit(1);
}
for(;;)
{
filename = feof(fpList) ? "$" : fread_word(fpList);
log_printf("%s", filename);
if(filename[0] == '$')
break;
if(!load_clan_file(filename))
{
bug("Cannot load clan file: %s", filename);
}
}
FileClose(fpList);
log_string(" Done clans ");
return;
}
/*
* Load in all the council files.
*/
void load_councils()
{
FILE *fpList;
const char *filename;
char councillist[256];
first_council = NULL;
last_council = NULL;
log_string("Loading councils...");
snprintf(councillist, 256, "%s%s", COUNCIL_DIR, COUNCIL_LIST);
if((fpList = FileOpen(councillist, "r")) == NULL)
{
perror(councillist);
exit(1);
}
for(;;)
{
filename = feof(fpList) ? "$" : fread_word(fpList);
log_printf("%s", filename);
if(filename[0] == '$')
break;
if(!load_council_file(filename))
{
bug("Cannot load council file: %s", filename);
}
}
FileClose(fpList);
log_string(" Done councils ");
return;
}
void do_banish(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
char arg1[MIL];
CLAN_DATA *clan, *vclan;
char buf[MIL];
argument = one_argument(argument, arg1);
if(IS_NPC(ch) || !ch->pcdata->clan)
{
send_to_char("Huh?\r\n", ch);
return;
}
clan = ch->pcdata->clan;
if((VLD_STR(clan->chieftain) && !str_cmp(ch->name, clan->chieftain)) || (VLD_STR(clan->warmaster) && !str_cmp(ch->name, clan->warmaster)));
else
{
send_to_char("Huh?\r\n", ch);
return;
}
if(arg1[0] == '\0')
{
send_to_char("Syntax: Banish <player>\r\n", ch);
return;
}
if((victim = get_char_room(ch, arg1)) == NULL)
{
send_to_char("That player is not here.\r\n", ch);
return;
}
if(IS_NPC(victim))
{
send_to_char("Not on NPC's.\r\n", ch);
return;
}
if(!(vclan = victim->pcdata->clan) || vclan != clan)
{
send_to_char("They aren't in your clan.\r\n", ch);
return;
}
if(VLD_STR(clan->chieftain) && !str_cmp(ch->name, clan->chieftain))
{
if(victim->pcdata->banish == 1)
{
send_to_char("You have already done your part of the banishment.\r\n", ch);
return;
}
else if(victim->pcdata->banish == 0)
{
act(AT_GREEN, "You turn your back on $N for the first step in banishment from $t.", ch, clan->name, victim, TO_CHAR);
act(AT_GREEN, "$n turns $s back on $N for the first step in banishment from $t.", ch, clan->name, victim, TO_ROOM);
act(AT_GREEN, "$n turns $m back on you for the first step in banishment from $t.", ch, clan->name, victim, TO_VICT);
victim->pcdata->banish = 1;
return;
}
}
if(VLD_STR(clan->warmaster) && !str_cmp(ch->name, clan->warmaster))
{
if(victim->pcdata->banish == 0)
{
act(AT_GREEN, "You turn your back on $N for the first step in banishment from $t.", ch, clan->name, victim, TO_CHAR);
act(AT_GREEN, "$n turns $s back on $N for the first step in banishment from $t.", ch, clan->name, victim, TO_ROOM);
act(AT_GREEN, "$n turns $m back on you for the first step in banishment from $t.", ch, clan->name, victim, TO_VICT);
victim->pcdata->banish = 3;
return;
}
else if(victim->pcdata->banish == 3)
{
send_to_char("You have already done your part of the banishment.\r\n", ch);
return;
}
}
// outcast guts
victim->pcdata->clan_timer = current_time;
if(clan->members > 0)
--clan->members;
victim->pcdata->clan = NULL;
STRFREE(victim->pcdata->clan_name);
victim->pcdata->clan_name = STRALLOC("");
act(AT_MAGIC, "You banish $N from $t", ch, clan->name, victim, TO_CHAR);
act(AT_MAGIC, "$n banishes $N from $t", ch, clan->name, victim, TO_ROOM);
act(AT_MAGIC, "$n banishes you from $t", ch, clan->name, victim, TO_VICT);
snprintf(buf, sizeof(buf), "&RAnnouncement: &C%s has been banished from %s!", victim->name, clan->name);
echo_to_all(AT_MAGIC, buf, ECHOTAR_ALL);
victim->pcdata->banish = 0;
save_char_obj(victim);
save_clan(clan);
// end of outcast guts
check_clan_leaders(clan, victim->name);
send_to_char("Syntax: Banish <player>\r\n", ch);
}
void do_influence(CHAR_DATA *ch, char *argument)
{
CLAN_DATA *clan;
CHAR_DATA *mob = NULL;
MOB_INDEX_DATA *mobvnum = NULL;
int vnum = -1;
PKILLAREA_DATA *pkillarea = NULL;
if(IS_NPC(ch) || !ch->pcdata->clan)
{
send_to_char("Huh?\r\n", ch);
return;
}
clan = ch->pcdata->clan;
if(str_cmp(ch->name, clan->chieftain) && str_cmp(ch->name, clan->warmaster))
{
send_to_char("Huh?\r\n", ch);
return;
}
/*
* Lets see Affect price of items that are sold, and areas influenced should show up
* with clans command
*/
// Step 1 generate random clan guards
AREA_DATA *tarea;
bool found = FALSE;
ROOM_INDEX_DATA *location;
MOB_INDEX_DATA *imob = NULL;
CHAR_DATA *vch = NULL, *vch_next = NULL;
int incost;
if(!(tarea = ch->in_room->area))
{
send_to_char("Area not found, try getting in an area.\r\n", ch);
return;
}
incost = 200;
if(!tarea->influencer)
incost = 150;
/*
* We will use 15 as just normal range, above 15 decrease cost by how much above it is,
* below increase cost by how much below it is
*/
if(get_curr_cha(ch) > 15)
incost -= (get_curr_cha(ch) - 15);
else if(get_curr_cha(ch) < 15)
incost += (15 - get_curr_cha(ch));
if(clan->totalpoints < incost)
{
ch_printf(ch, "You need to untilize %d clan reputation status to influence this area.\r\n", incost);
return;
}
if(IS_SET(tarea->flags, AFLAG_NOINFLUENCE))
{
send_to_char("That area cannot be influenced.\r\n", ch);
return;
}
if(tarea->influencer && tarea->influencer == clan)
{
send_to_char("You already have that area influenced.\r\n", ch);
return;
}
if(tarea->influencer)
{
for(pkillarea = tarea->influencer->first_pkillarea; pkillarea; pkillarea = pkillarea->next)
{
if(str_cmp(pkillarea->name, tarea->name))
continue;
UNLINK(pkillarea, tarea->influencer->first_pkillarea, tarea->influencer->last_pkillarea, next, prev);
if(VLD_STR(pkillarea->name))
STRFREE(pkillarea->name);
save_clan(tarea->influencer);
break;
}
}
clan = ch->pcdata->clan;
tarea->influencer = clan;
for(vch = first_char; vch; vch = vch_next)
{
vch_next = vch->next;
if(vch->in_room->area == ch->in_room->area && IS_NPC(vch))
vch->influence = 20;
}
CREATE(pkillarea, PKILLAREA_DATA, 1);
LINK(pkillarea, clan->first_pkillarea, clan->last_pkillarea, next, prev);
pkillarea->name = STRALLOC(tarea->name);
// 41021 to 41025 for throng
// 41026 to 41029 for alliance
ch_printf(ch, "&cYou move throughout the area showing your clan insignia, and offering your clan's services.\r\n");
act(AT_CYAN, "&c$n begins moving thoughout the area showing $s clan insignia and offering the clan's services.", ch, NULL, NULL, TO_NOTVICT);
if(!str_cmp(ch->pcdata->clan_name, "throng"))
{
vnum = number_range(41021, 41025);
if(vnum == -1)
return;
imob = get_mob_index(vnum);
}
if(!str_cmp(ch->pcdata->clan_name, "alliance"))
{
vnum = number_range(41026, 41029);
if(vnum == -1)
return;
imob = get_mob_index(vnum);
}
short created;
short count;
count = number_chance(6, 12);
for(created = 0; created < count; created++)
{
if((location = get_room_index(number_range(tarea->low_r_vnum, tarea->hi_r_vnum))) == NULL)
{
--created;
continue;
}
if(IS_SET(location->room_flags, ROOM_SAFE))
{
--created;
continue;
}
if(!imob)
{
snprintf(log_buf, MAX_STRING_LENGTH, "influence: Missing mob for vnum %d", vnum);
log_string(log_buf);
return;
}
mob = create_mobile(imob);
mob->level = number_chance(10, 20);
STRFREE(mob->clan);
mob->clan = STRALLOC(clan->name);
mob->influence = 20;
char_to_room(mob, location);
}
clan->totalpoints -= incost;
save_clan(clan);
}
void do_declare(CHAR_DATA *ch, char *argument)
{
char buf[MIL];
char arg1[MIL];
char arg2[MIL];
CLAN_DATA *clan;
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if(IS_NPC(ch) || !ch->pcdata->clan)
{
send_to_char("Huh?\r\n", ch);
return;
}
/* Note to self for this business of clan->status and letting players know when
thier clan is at war or whatever.
1 = war 2 = truce 3 = peace */
clan = ch->pcdata->clan;
if(!str_cmp(ch->name, clan->chieftain) || !str_cmp(ch->name, clan->warmaster));
else
{
send_to_char("Huh?\r\n", ch);
return;
}
if(arg1[0] == '\0')
{
send_to_char("Syntax: Declare <status> <clan>\r\n", ch);
send_to_char("Status: war, truce, peace\r\n", ch);
return;
}
if(!str_cmp(ch->pcdata->clan_name, arg2))
{
send_to_char("You can't declare anything against your own clan.\r\n", ch);
return;
}
if(!str_cmp(arg1, "war"))
{
if(!str_cmp(arg2, "alliance") && !str_cmp(ch->pcdata->clan_name, "throng"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Throng has declared war with the Alliance!\r\n", ch->name);
else if(!str_cmp(arg2, "halcyon") && !str_cmp(ch->pcdata->clan_name, "throng"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Throng has declared war with the Halcyon!\r\n", ch->name);
else if(!str_cmp(arg2, "alliance") && !str_cmp(ch->pcdata->clan_name, "halcyon"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Halcyon has declared war with the Alliance!\r\n", ch->name);
else if(!str_cmp(arg2, "throng") && !str_cmp(ch->pcdata->clan_name, "halcyon"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Halcyon has declared war with the Throng!\r\n", ch->name);
else if(!str_cmp(arg2, "throng") && !str_cmp(ch->pcdata->clan_name, "alliance"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Alliance has declared war with the Throng!\r\n", ch->name);
else if(!str_cmp(arg2, "halcyon") && !str_cmp(ch->pcdata->clan_name, "alliance"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Alliance has declared war with the Halcyon!\r\n", ch->name);
echo_to_all(AT_RED, buf, ECHOTAR_ALL);
clan->status = 1;
save_clan(clan);
return;
}
if(!str_cmp(arg1, "peace"))
{
if(!str_cmp(arg2, "alliance") && !str_cmp(ch->pcdata->clan_name, "throng"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Throng has declared peace with the Alliance!\r\n", ch->name);
else if(!str_cmp(arg2, "halcyon") && !str_cmp(ch->pcdata->clan_name, "throng"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Throng has declared peace with the Halcyon!\r\n", ch->name);
else if(!str_cmp(arg2, "alliance") && !str_cmp(ch->pcdata->clan_name, "halcyon"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Halcyon has declared peace with the Alliance!\r\n", ch->name);
else if(!str_cmp(arg2, "throng") && !str_cmp(ch->pcdata->clan_name, "halcyon"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Halcyon has declared peace with the Throng!\r\n", ch->name);
else if(!str_cmp(arg2, "throng") && !str_cmp(ch->pcdata->clan_name, "alliance"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Alliance has declared peace with the Throng!\r\n", ch->name);
else if(!str_cmp(arg2, "halcyon") && !str_cmp(ch->pcdata->clan_name, "alliance"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Alliance has declared peace with the Halcyon!\r\n", ch->name);
echo_to_all(AT_RED, buf, ECHOTAR_ALL);
clan->status = 3;
save_clan(clan);
return;
}
if(!str_cmp(arg1, "truce"))
{
if(!str_cmp(arg2, "alliance") && !str_cmp(ch->pcdata->clan_name, "throng"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Throng has declared truce with the Alliance!\r\n", ch->name);
else if(!str_cmp(arg2, "halcyon") && !str_cmp(ch->pcdata->clan_name, "throng"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Throng has declared truce with the Halcyon!\r\n", ch->name);
else if(!str_cmp(arg2, "alliance") && !str_cmp(ch->pcdata->clan_name, "halcyon"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Halcyon has declared truce with the Alliance!\r\n", ch->name);
else if(!str_cmp(arg2, "throng") && !str_cmp(ch->pcdata->clan_name, "halcyon"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Halcyon has declared truce with the Throng!\r\n", ch->name);
else if(!str_cmp(arg2, "throng") && !str_cmp(ch->pcdata->clan_name, "alliance"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Alliance has declared truce with the Throng!\r\n", ch->name);
else if(!str_cmp(arg2, "halcyon") && !str_cmp(ch->pcdata->clan_name, "alliance"))
snprintf(buf, MIL, "&W[&RAnnouncement&W]&C %s representing the Alliance has declared truce with the Halcyon!\r\n", ch->name);
echo_to_all(AT_RED, buf, ECHOTAR_ALL);
clan->status = 2;
save_clan(clan);
return;
}
send_to_char("Syntax: Declare <status> <clan>\r\n", ch);
send_to_char("Status: war, truce, peace\r\n", ch);
return;
}
void do_intro(CHAR_DATA *ch, char *argument)
{
CLAN_DATA *clan;
if(IS_NPC(ch) || !ch->pcdata->clan)
{
send_to_char("Huh?\r\n", ch);
return;
}
clan = ch->pcdata->clan;
if((!VLD_STR(clan->chieftain) || str_cmp(ch->name, clan->chieftain)) && (!VLD_STR(clan->warmaster) || str_cmp(ch->name, clan->warmaster)))
{
send_to_char("Huh?\r\n", ch);
return;
}
if(!VLD_STR(argument))
{
send_to_char("&cSyntax: intro <&Cmessage&c>&D\r\n", ch);
return;
}
STRFREE(clan->intro);
if(str_cmp(argument, "clear")) /* Allow it so they can clear it * off */
clan->intro = STRALLOC(argument);
send_to_char("Your clan intro has been set.\r\n", ch);
save_clan(clan);
}
void do_call(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
CLAN_DATA *clan;
int level;
if(IS_NPC(ch) || !ch->pcdata->clan)
{
send_to_char("Huh?\r\n", ch);
return;
}
clan = ch->pcdata->clan;
if(!str_cmp(ch->name, clan->chieftain) || !str_cmp(ch->name, clan->warmaster));
else
{
send_to_char("Huh?\r\n", ch);
return;
}
argument = one_argument(argument, arg);
if(arg[0] == '\0')
{
send_to_char("Syntax: call <number>\r\n", ch);
send_to_char("Object numbers avail: first second third fourth fifth\r\n", ch);
return;
}
if(!str_cmp(arg, "first"))
{
pObjIndex = get_obj_index(clan->clanobj1);
level = 10;
}
if(!str_cmp(arg, "second"))
{
pObjIndex = get_obj_index(clan->clanobj2);
level = 20;
}
if(!str_cmp(arg, "third"))
{
pObjIndex = get_obj_index(clan->clanobj3);
level = 40;
}
if(!str_cmp(arg, "fourth"))
{
pObjIndex = get_obj_index(clan->clanobj4);
level = 80;
}
if(!str_cmp(arg, "fifth"))
{
pObjIndex = get_obj_index(clan->clanobj5);
level = 100;
}
else if(str_cmp(arg, "first") && str_cmp(arg, "second") && str_cmp(arg, "third") && str_cmp(arg, "fourth") && str_cmp(arg, "fifth"))
{
send_to_char("You don't know how to make that.\r\n", ch);
return;
}
obj = create_object(pObjIndex, level);
if(CAN_WEAR(obj, ITEM_TAKE))
obj = obj_to_char(obj, ch);
else
obj = obj_to_room(obj, ch->in_room);
act(AT_MAGIC, "$n calls forth $p from another dimension!", ch, obj, NULL, TO_ROOM);
act(AT_MAGIC, "You call forth $p from another dimension!", ch, obj, NULL, TO_CHAR);
return;
}
void do_induct(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
CLAN_DATA *clan;
if(IS_NPC(ch) || !ch->pcdata->clan)
{
send_to_char("Huh?\r\n", ch);
return;
}
clan = ch->pcdata->clan;
if((ch->pcdata && ch->pcdata->bestowments && is_name("induct", ch->pcdata->bestowments)));
else
{
send_to_char("Huh?\r\n", ch);
return;
}
argument = one_argument(argument, arg);
if(arg[0] == '\0')
{
send_to_char("Induct whom?\r\n", ch);
return;
}
if((victim = get_char_room(ch, arg)) == NULL)
{
send_to_char("That player is not here.\r\n", ch);
return;
}
if(IS_NPC(victim))
{
send_to_char("Not on NPC's.\r\n", ch);
return;
}
if(IS_IMMORTAL(victim))
{
send_to_char("You can't induct such a godly presence.\r\n", ch);
return;
}
if(victim->level < 10)
{
send_to_char("This player is not worthy of joining yet.\r\n", ch);
return;
}
if(victim->level > ch->level)
{
send_to_char("This player is too powerful for you to induct.\r\n", ch);
return;
}
if(victim->pcdata->clan)
{
if(victim->pcdata->clan == clan)
send_to_char("This player already belongs to your clan!\r\n", ch);
else
send_to_char("This player already belongs to a clan!\r\n", ch);
return;
}
if(clan->mem_limit && clan->members >= clan->mem_limit)
{
send_to_char("Your clan is too big to induct anymore players.\r\n", ch);
return;
}
clan->members++;
if(clan->clan_type != CLAN_NOKILL)
SET_BIT(victim->pcdata->flags, PCFLAG_DEADLY);
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);
save_clan(clan);
return;
}
void do_council_induct(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
COUNCIL_DATA *council;
if(IS_NPC(ch) || !ch->pcdata->council)
{
send_to_char("Huh?\r\n", 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?\r\n", ch);
return;
}
argument = one_argument(argument, arg);
if(arg[0] == '\0')
{
send_to_char("Induct whom into your council?\r\n", ch);
return;
}
if((victim = get_char_room(ch, arg)) == NULL)
{
send_to_char("That player is not here.\r\n", ch);
return;
}
if(IS_NPC(victim))
{
send_to_char("Not on NPC's.\r\n", ch);
return;
}
/* if( victim->level < LEVEL_IMMORTAL )
{
send_to_char( "This player is not worthy of joining any council yet.\r\n", ch );
return;
}
*/
if(victim->pcdata->council)
{
send_to_char("This player already belongs to a council!\r\n", 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;
}
/* Can the character outcast the victim? */
bool can_outcast(CLAN_DATA * clan, CHAR_DATA *ch, CHAR_DATA *victim)
{
return FALSE;
}
void do_outcast(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
CLAN_DATA *clan;
char buf[MAX_STRING_LENGTH];
if(IS_NPC(ch) || !ch->pcdata->clan)
{
send_to_char("Huh?\r\n", ch);
return;
}
clan = ch->pcdata->clan;
if((ch->pcdata && ch->pcdata->bestowments && is_name("outcast", ch->pcdata->bestowments)));
else
{
send_to_char("Huh?\r\n", ch);
return;
}
argument = one_argument(argument, arg);
if(arg[0] == '\0')
{
send_to_char("Outcast whom?\r\n", ch);
return;
}
if((victim = get_char_room(ch, arg)) == NULL)
{
send_to_char("That player is not here.\r\n", ch);
return;
}
if(IS_NPC(victim))
{
send_to_char("Not on NPC's.\r\n", ch);
return;
}
if(victim == ch)
{
send_to_char("Kick yourself out of your own clan?\r\n", ch);
return;
}
if(victim->pcdata->clan != ch->pcdata->clan)
{
send_to_char("This player does not belong to your clan!\r\n", ch);
return;
}
if(!can_outcast(clan, ch, victim))
{
send_to_char("You are not able to outcast them.\r\n", ch);
return;
}
--clan->members;
if(clan->members < 0)
clan->members = 0;
victim->pcdata->clan = NULL;
STRFREE(victim->pcdata->clan_name);
victim->pcdata->clan_name = STRALLOC("");
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);
snprintf(buf, MAX_STRING_LENGTH, "%s has been outcast from %s!", victim->name, clan->name);
echo_to_all(AT_MAGIC, buf, ECHOTAR_ALL);
save_char_obj(victim); /* clan gets saved when pfile is saved */
save_clan(clan);
check_clan_leaders(clan, victim->name);
return;
}
void do_council_outcast(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
COUNCIL_DATA *council;
if(IS_NPC(ch) || !ch->pcdata->council)
{
send_to_char("Huh?\r\n", 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?\r\n", ch);
return;
}
argument = one_argument(argument, arg);
if(arg[0] == '\0')
{
send_to_char("Outcast whom from your council?\r\n", ch);
return;
}
if(!(victim = get_char_room(ch, arg)))
{
send_to_char("That player is not here.\r\n", ch);
return;
}
if(IS_NPC(victim))
{
send_to_char("Not on NPC's.\r\n", ch);
return;
}
if(victim == ch)
{
send_to_char("Kick yourself out of your own council?\r\n", ch);
return;
}
if(victim->pcdata->council != ch->pcdata->council)
{
send_to_char("This player does not belong to your council!\r\n", ch);
return;
}
if(council->head2 && !str_cmp(victim->name, ch->pcdata->council->head2))
{
STRFREE(ch->pcdata->council->head2);
ch->pcdata->council->head2 = NULL;
}
--council->members;
if(council->members < 0)
council->members = 0;
victim->pcdata->council = NULL;
STRFREE(victim->pcdata->council_name);
victim->pcdata->council_name = STRALLOC("");
// check_switch( ch, FALSE );
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[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
CLAN_DATA *clan;
set_char_color(AT_PLAIN, ch);
if(IS_NPC(ch))
{
send_to_char("Huh?\r\n", ch);
return;
}
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if(arg1[0] == '\0')
{
send_to_char("Usage: setclan <clan> <field> <player>\r\n", ch);
send_to_char("\r\nField being one of:\r\n", ch);
send_to_char(" members board recall storage guard1 guard2\r\n", ch);
send_to_char(" align (not functional) memlimit chieftain warmaster\r\n", ch);
send_to_char(" obj1 obj2 obj3 obj4 obj5 clanpoints\r\n", ch);
if(get_trust(ch) >= LEVEL_AJ_LT)
{
send_to_char(" name filename motto desc\r\n", ch);
send_to_char(" strikes type class\r\n", ch);
}
if(get_trust(ch) >= LEVEL_AJ_LT)
send_to_char(" pkill1-7 pdeath1-7\r\n", ch);
return;
}
clan = get_clan(arg1);
if(!clan)
{
send_to_char("No such clan.\r\n", ch);
return;
}
if(!str_cmp(arg2, "badge"))
{
STRFREE(clan->badge);
clan->badge = STRALLOC(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "chieftain"))
{
STRFREE(clan->chieftain);
clan->chieftain = STRALLOC(argument);
send_to_char("Clan chieftain is now set.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "warmaster") || !str_cmp(arg2, "ambassador"))
{
STRFREE(clan->warmaster);
clan->warmaster = STRALLOC(argument);
ch_printf(ch, "Clan %s is now set.\r\n", arg2);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "board"))
{
clan->board = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "memlimit"))
{
clan->mem_limit = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "members"))
{
clan->members = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "recall"))
{
clan->recall = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "clanpoints"))
{
clan->totalpoints = atoi(argument);
send_to_char("Clan total points set.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "obj1"))
{
clan->clanobj1 = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "obj2"))
{
clan->clanobj2 = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "obj3"))
{
clan->clanobj3 = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "obj4"))
{
clan->clanobj4 = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "obj5"))
{
clan->clanobj5 = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "status"))
{
clan->status = atoi(argument);
send_to_char("Clan status is now set.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "guard1"))
{
clan->guard1 = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "guard2"))
{
clan->guard2 = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(get_trust(ch) < LEVEL_AJ_LT)
{
do_setclan(ch, (char *)"");
return;
}
if(!str_cmp(arg2, "align"))
{
clan->alignment = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "type"))
{
clan->clan_type = atoi(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "name"))
{
CLAN_DATA *uclan = NULL;
if(!argument || argument[0] == '\0')
{
send_to_char("You can't name a clan nothing.\r\n", ch);
return;
}
if((uclan = get_clan(argument)))
{
send_to_char("There is already another clan with that name.\r\n", ch);
return;
}
STRFREE(clan->name);
clan->name = STRALLOC(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "filename"))
{
char filename[256];
if(!is_valid_filename(ch, CLAN_DIR, argument))
return;
snprintf(filename, sizeof(filename), "%s%s", CLAN_DIR, clan->filename);
if(!remove(filename))
send_to_char("Old clan file deleted.\r\n", ch);
STRFREE(clan->filename);
clan->filename = STRALLOC(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
write_clan_list();
return;
}
if(!str_cmp(arg2, "intro"))
{
STRFREE(clan->intro);
clan->intro = STRALLOC(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "motto"))
{
STRFREE(clan->motto);
clan->motto = STRALLOC(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(!str_cmp(arg2, "desc"))
{
STRFREE(clan->description);
clan->description = STRALLOC(argument);
send_to_char("Done.\r\n", ch);
save_clan(clan);
return;
}
if(get_trust(ch) < LEVEL_AJ_LT)
{
do_setclan(ch, (char *)"");
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 if(!str_cmp(arg2, "pkill8"))
temp_value = 7;
else if(!str_cmp(arg2, "pkill9"))
temp_value = 8;
else if(!str_cmp(arg2, "pkill10"))
temp_value = 9;
else if(!str_cmp(arg2, "pkill11"))
temp_value = 10;
else if(!str_cmp(arg2, "pkill12"))
temp_value = 11;
else
{
do_setclan(ch, (char *)"");
return;
}
clan->pkills[temp_value] = atoi(argument);
send_to_char("Ok.\r\n", 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 if(!str_cmp(arg2, "pdeath8"))
temp_value = 7;
else if(!str_cmp(arg2, "pdeath9"))
temp_value = 8;
else if(!str_cmp(arg2, "pdeath10"))
temp_value = 9;
else if(!str_cmp(arg2, "pdeath11"))
temp_value = 10;
else if(!str_cmp(arg2, "pdeath12"))
temp_value = 11;
else
{
do_setclan(ch, (char *)"");
return;
}
clan->pdeaths[temp_value] = atoi(argument);
send_to_char("Ok.\r\n", ch);
return;
}
do_setclan(ch, (char *)"");
}
void do_setcouncil(CHAR_DATA *ch, char *argument)
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
COUNCIL_DATA *council;
set_char_color(AT_PLAIN, ch);
if(IS_NPC(ch))
{
send_to_char("Huh?\r\n", ch);
return;
}
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
if(arg1[0] == '\0')
{
send_to_char("Usage: setcouncil <council> <field> <value>\r\n", ch);
send_to_char("\r\nField being one of:\r\n", ch);
send_to_char(" head head2 members board meeting\r\n", ch);
if(get_trust(ch) >= LEVEL_AJ_LT)
send_to_char(" name filename desc\r\n", ch);
if(get_trust(ch) >= LEVEL_AJ_LT)
send_to_char(" powers\r\n", ch);
return;
}
council = get_council(arg1);
if(!council)
{
send_to_char("No such council.\r\n", ch);
return;
}
if(!str_cmp(arg2, "head"))
{
STRFREE(council->head);
council->head = STRALLOC(argument);
send_to_char("Done.\r\n", 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.\r\n", ch);
save_council(council);
return;
}
if(!str_cmp(arg2, "board"))
{
council->board = atoi(argument);
send_to_char("Done.\r\n", ch);
save_council(council);
return;
}
if(!str_cmp(arg2, "members"))
{
council->members = atoi(argument);
send_to_char("Done.\r\n", ch);
save_council(council);
return;
}
if(!str_cmp(arg2, "meeting"))
{
council->meeting = atoi(argument);
send_to_char("Done.\r\n", ch);
save_council(council);
return;
}
if(get_trust(ch) < LEVEL_AJ_LT)
{
do_setcouncil(ch, (char *)"");
return;
}
if(!str_cmp(arg2, "name"))
{
COUNCIL_DATA *ucouncil;
if(!argument || argument[0] == '\0')
{
send_to_char("Can't set a council name to nothing.\r\n", ch);
return;
}
if((ucouncil = get_council(argument)))
{
send_to_char("A council is already using that name.\r\n", ch);
return;
}
STRFREE(council->name);
council->name = STRALLOC(argument);
send_to_char("Done.\r\n", ch);
save_council(council);
return;
}
if(!str_cmp(arg2, "filename"))
{
char filename[256];
if(!is_valid_filename(ch, COUNCIL_DIR, argument))
return;
snprintf(filename, sizeof(filename), "%s%s", COUNCIL_DIR, council->filename);
if(!remove(filename))
send_to_char("Old council file deleted.\r\n", ch);
STRFREE(council->filename);
council->filename = STRALLOC(argument);
send_to_char("Done.\r\n", ch);
save_council(council);
write_council_list();
return;
}
if(!str_cmp(arg2, "desc"))
{
STRFREE(council->description);
council->description = STRALLOC(argument);
send_to_char("Done.\r\n", ch);
save_council(council);
return;
}
if(get_trust(ch) < LEVEL_AJ_LT)
{
do_setcouncil(ch, (char *)"");
return;
}
if(!str_cmp(arg2, "powers"))
{
STRFREE(council->powers);
council->powers = STRALLOC(argument);
send_to_char("Done.\r\n", ch);
save_council(council);
return;
}
do_setcouncil(ch, (char *)"");
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?\r\n", ch);
return;
}
if(argument[0] == '\0')
{
send_to_char("Usage: showclan <clan>\r\n", ch);
return;
}
clan = get_clan(argument);
if(!clan)
{
send_to_char("No such clan.\r\n", ch);
return;
}
ch_printf_color(ch, "\r\n&wClan : &W%s\r\n&wBadge: %s\r\n&wFilename : &W%s\r\n&wMotto : &W%s\r\n", clan->name, clan->badge ? clan->badge : "(not set)", clan->filename, clan->motto);
ch_printf_color(ch, "&wDesc : &W%s\r\n", clan->description);
ch_printf_color(ch, "&wChieftain: &W%s\r\n&wWar Master: &W%s\r\n", clan->chieftain, clan->warmaster);
ch_printf_color(ch,
"&wPKills : &w1-9:&W%-3d &w10-19:&W%-3d &w20-29:&W%-3d &w30-39:&W%-3d &w40-49:&W%-3d &w50-59:&W%-3d &w60-69:&W%-3d\r\n",
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, " &w70-79:&W%-3d &w80-89:&W%-3d &w90-99:&W%-3d &w100:&W%-3d\r\n", clan->pkills[7], clan->pkills[8], clan->pkills[9], clan->pkills[10]);
ch_printf_color(ch,
"&wPDeaths : &w1-9:&W%-3d &w10-19:&W%-3d &w20-29:&W%-3d &w30-39:&W%-3d &w40-49:&W%-3d &w50-59:&W%-3d &w60-69:&W%-3d\r\n",
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, " &w70-79:&W%-3d &w80-89:&W%-3d &w90-99:&W%-3d &w100:&W%-3d\r\n", clan->pdeaths[7], clan->pdeaths[8], clan->pdeaths[9], clan->pdeaths[10]);
ch_printf_color(ch, "&wIllegalPK: &W%-6d\r\n", clan->illegal_pk);
ch_printf_color(ch, "&wMKills : &W%-6d &wMDeaths: &W%-6d &wScore : &W%-6d\r\n", clan->mkills, clan->mdeaths, clan->score);
ch_printf_color(ch, "&wMembers : &W%-6d &wMemLimit: &W%-6d &wAlign : &W%-6d", clan->members, clan->mem_limit, clan->alignment);
ch_printf_color(ch, "&wBoard : &W%-5d \r\n&wRecall : &W%-5d &wClan Reputation: &W%-5d\r\n", clan->board, clan->recall, clan->totalpoints);
ch_printf_color(ch, "&wGuard1 : &W%-5d &wGuard2 : &W%-5d\r\n", 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)\r\n", 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?\r\n", ch);
return;
}
if(argument[0] == '\0')
{
send_to_char("Usage: showcouncil <council>\r\n", ch);
return;
}
council = get_council(argument);
if(!council)
{
send_to_char("No such council.\r\n", ch);
return;
}
ch_printf_color(ch, "\r\n&wCouncil : &W%s\r\n&wFilename: &W%s\r\n", council->name, council->filename);
ch_printf_color(ch, "&wHead: &W%s\r\n", council->head);
ch_printf_color(ch, "&wHead2: &W%s\r\n", council->head2);
ch_printf_color(ch, "&wMembers: &W%-d\r\n", council->members);
ch_printf_color(ch, "&wBoard: &W%-5d\r\n&wMeeting: &W%-5d\r\n&wPowers: &W%s\r\n", council->board, council->meeting, council->powers);
ch_printf_color(ch, "&wDescription:\r\n&W%s\r\n", council->description);
return;
}
void do_makeclan(CHAR_DATA *ch, char *argument)
{
CLAN_DATA *clan;
set_char_color(AT_IMMORT, ch);
if(!argument || argument[0] == '\0')
{
send_to_char("Usage: makeclan <clan name>\r\n", ch);
return;
}
set_char_color(AT_PLAIN, ch);
clan = get_clan(argument);
if(clan)
{
send_to_char("There is already a clan with that name.\r\n", ch);
return;
}
CREATE(clan, CLAN_DATA, 1);
LINK(clan, first_clan, last_clan, next, prev);
clan->name = STRALLOC(argument);
/*
* Let's refix this, STRALLOC shouldn't be used for the 'filename'
* member without changing load_clan() and do_setclan() to employ hashstrings too...
*/
clan->filename = STRALLOC("");
clan->motto = STRALLOC("");
clan->description = STRALLOC("");
clan->warmaster = STRALLOC("");
clan->chieftain = 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>\r\n", ch);
return;
}
found = FALSE;
snprintf(filename, 256, "%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)
{
PKILLAREA_DATA *pkillarea;
CLAN_DATA *clan;
int count = 0;
bool firstdis;
if(argument[0] == '\0')
{
set_char_color(AT_BLOOD, ch);
send_to_char("\r\n Clan Chieftain Ambassador/Warmaster Pkills: Avatar\r\n", ch);
send_to_char("_________________________________________________________________________\r\r\n\n", ch);
for(clan = first_clan; clan; clan = clan->next)
{
set_char_color(AT_GREY, ch);
ch_printf(ch, "%13s %13s %24s", clan->name, clan->chieftain, clan->warmaster);
set_char_color(AT_BLOOD, ch);
ch_printf(ch, " %5d\r\n", clan->pkills[10]);
count++;
}
set_char_color(AT_BLOOD, ch);
if(!count)
send_to_char("There are no Clans currently formed.\r\n", ch);
else
send_to_char("_________________________________________________________________________\r\r\n\nUse 'clans <clan>' for detailed information and a breakdown of victories.\r\n", ch);
return;
}
clan = get_clan(argument);
if(!clan)
{
set_char_color(AT_BLOOD, ch);
send_to_char("No such clan.\r\n", ch);
return;
}
set_char_color(AT_BLOOD, ch);
ch_printf(ch, "\r\n%s, '%s'\r\r\n\n", clan->name, clan->motto);
if(VLD_STR(clan->intro))
ch_printf(ch, "Intro: '%s'\r\r\n\n", clan->intro);
set_char_color(AT_GREY, ch);
send_to_char_color("Victories:&w\r\n", ch);
ch_printf_color(ch, " &w 1- 9: &r%-4d &w10-19: &r%-4d &w20-29: &r%-4d &w30-39: &r%-4d &w40-49: &r%-4d\r\n", clan->pkills[0], clan->pkills[1], clan->pkills[2], clan->pkills[3], clan->pkills[4]);
ch_printf_color(ch, " &w50-59: &r%-4d &w60-69: &r%-4d &w70-79: &r%-4d &w80-89: &r%-4d &w90-99: &r%-4d\r\n", clan->pkills[5], clan->pkills[6], clan->pkills[7], clan->pkills[8], clan->pkills[9]);
ch_printf_color(ch, " &w 100: &r%-4d\r\n", clan->pkills[10]);
ch_printf_color(ch, "&wArena Victories: &r%d&d\r\n", clan->arena_victory);
set_char_color(AT_GREY, ch);
ch_printf(ch, "Clan Chieftain: %s\r\n", clan->chieftain);
if(!str_cmp(clan->name, "Halcyon"))
send_to_char("Ambassador: ", ch);
else
send_to_char("War Master: ", ch);
ch_printf(ch, "%s\r\n", clan->warmaster);
ch_printf(ch, "Members: %d\r\n", clan->members);
ch_printf(ch, "Clan Reputation: %d\r\n\r\n", clan->totalpoints);
set_char_color(AT_BLOOD, ch);
ch_printf(ch, "Description: %s\r\n", clan->description);
firstdis = TRUE;
int acount = 0;
for(pkillarea = clan->first_pkillarea; pkillarea; pkillarea = pkillarea->next)
{
if(!VLD_STR(pkillarea->name))
continue;
if(firstdis)
ch_printf(ch, "&wAreas under &r%s &wInfluence:\r\n", clan->name);
firstdis = FALSE;
pager_printf(ch, "&G%-25s", capitalize(pkillarea->name));
acount++;
if(acount == 3)
{
send_to_char("\r\n", ch);
acount = 0;
}
}
}
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.\r\n", ch);
return;
}
if(argument[0] == '\0')
{
send_to_char_color("\r\n&cTitle Head\r\n", ch);
for(council = first_council; council; council = council->next)
{
if(council->head2 != NULL)
ch_printf_color(ch, "&w%-24s %s and %s\r\n", council->name, council->head, council->head2);
else
ch_printf_color(ch, "&w%-24s %-14s\r\n", council->name, council->head);
}
send_to_char_color("&cUse 'councils <name of council>' for more detailed information.\r\n", ch);
return;
}
council = get_council(argument);
if(!council)
{
send_to_char_color("&cNo such council exists...\r\n", ch);
return;
}
ch_printf_color(ch, "&c\r\n%s\r\n", council->name);
if(council->head2 == NULL)
ch_printf_color(ch, "&cHead: &w%s\r\n&cMembers: &w%d\r\n", council->head, council->members);
else
ch_printf_color(ch, "&cCo-Heads: &w%s &cand &w%s\r\n&cMembers: &w%d\r\n", council->head, council->head2, council->members);
ch_printf_color(ch, "&cDescription:\r\n&w%s\r\n", council->description);
return;
}
void do_victories(CHAR_DATA *ch, char *argument)
{
char filename[256];
if(IS_NPC(ch) || !ch->pcdata->clan)
{
send_to_char("Huh?\r\n", ch);
return;
}
snprintf(filename, 256, "%s%s.record", CLAN_DIR, ch->pcdata->clan->name);
set_pager_color(AT_PURPLE, ch);
if(IS_IMMORTAL(ch) && !str_cmp(argument, "clean"))
{
FILE *fp = FileOpen(filename, "w");
if(fp)
FileClose(fp);
send_to_pager("\r\nVictories ledger has been cleared.\r\n", ch);
return;
}
else
{
send_to_pager("\r\nLVL Character LVL Character\r\n", ch);
show_file(ch, filename);
return;
}
return;
}
void do_shove(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
int exit_dir;
EXIT_DATA *pexit;
CHAR_DATA *victim;
bool nogo;
ROOM_INDEX_DATA *to_room;
int schance = 0;
int race_bonus = 0;
argument = one_argument(argument, arg);
argument = one_argument(argument, arg2);
if(IS_NPC(ch) || !IS_SET(ch->pcdata->flags, PCFLAG_DEADLY))
{
send_to_char("Only deadly characters can shove.\r\n", ch);
return;
}
if(get_timer(ch, TIMER_PKILLED) > 0)
{
send_to_char("You can't shove a player right now.\r\n", ch);
return;
}
if(arg[0] == '\0')
{
send_to_char("Shove whom?\r\n", ch);
return;
}
if((victim = get_char_room(ch, arg)) == NULL)
{
send_to_char("They aren't here.\r\n", ch);
return;
}
if(victim == ch)
{
send_to_char("You shove yourself around, to no avail.\r\n", ch);
return;
}
// Only a Dragon is big enough to shove another Dragon. -Taon
if(victim->race == RACE_DRAGON && ch->race != RACE_DRAGON)
{
send_to_char("Just how are you going to shove a Dragon?\r\n", ch);
return;
}
if(IS_NPC(victim) || !IS_SET(victim->pcdata->flags, PCFLAG_DEADLY))
{
send_to_char("You can only shove deadly characters.\r\n", ch);
return;
}
if(ch->level - victim->level > 10 || victim->level - ch->level > 10)
{
send_to_char("There is too great an experience difference for you to even bother.\r\n", ch);
return;
}
if(get_timer(victim, TIMER_PKILLED) > 0)
{
send_to_char("You can't shove that player right now.\r\n", ch);
return;
}
if((victim->position) != POS_STANDING)
{
act(AT_PLAIN, "$N isn't standing up.", ch, NULL, victim, TO_CHAR);
return;
}
if(arg2[0] == '\0')
{
send_to_char("Shove them in which direction?\r\n", ch);
return;
}
exit_dir = get_dir(arg2);
if(IS_SET(victim->in_room->room_flags, ROOM_SAFE) && get_timer(victim, TIMER_SHOVEDRAG) <= 0)
{
send_to_char("That character cannot be shoved right now.\r\n", ch);
return;
}
set_position(victim, 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.\r\n", ch);
set_position(victim, POS_STANDING);
return;
}
to_room = pexit->to_room;
if(IS_SET(to_room->room_flags, ROOM_DEATH))
{
send_to_char("You cannot shove someone into a death trap.\r\n", ch);
set_position(victim, POS_STANDING);
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.\r\n", ch);
set_position(victim, POS_STANDING);
return;
}
/* Check for class, assign percentage based on that. */
schance = 35;
/* Add 3 points to chance for every str point above 15, subtract for below 15 */
schance += ((get_curr_str(ch) - 15) * 3);
schance += (ch->level - victim->level);
/* Check for race, adjust percentage based on that. */
if(ch->race == RACE_ELF)
race_bonus = -3;
if(ch->race == RACE_DWARF)
race_bonus = 3;
if(ch->race == RACE_HALFLING)
race_bonus = -5;
if(ch->race == RACE_PIXIE)
race_bonus = -7;
if(ch->race == RACE_OGRE)
race_bonus = 5;
if(ch->race == RACE_ORC)
race_bonus = 7;
if(ch->race == RACE_TROLL)
race_bonus = 10;
if(ch->race == RACE_DROW)
race_bonus = 1;
if(ch->race == RACE_GNOME)
race_bonus = -2;
schance += race_bonus;
if(schance < number_percent())
{
send_to_char("You failed.\r\n", ch);
set_position(victim, POS_STANDING);
return;
}
act(AT_ACTION, "You shove $M.", ch, NULL, victim, TO_CHAR);
act(AT_ACTION, "$n shoves you.", ch, NULL, victim, TO_VICT);
move_char(victim, get_exit(ch->in_room, exit_dir), 0, FALSE);
if(!char_died(victim))
set_position(victim, POS_STANDING);
WAIT_STATE(ch, 12);
/*
* Remove protection from shove/drag if char shoves -- Blodkai
*/
if(IS_SET(ch->in_room->room_flags, ROOM_SAFE) && get_timer(ch, TIMER_SHOVEDRAG) <= 0)
add_timer(ch, TIMER_SHOVEDRAG, 10, NULL, 0);
}
void do_drag(CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
int exit_dir;
CHAR_DATA *victim;
EXIT_DATA *pexit;
ROOM_INDEX_DATA *to_room;
bool nogo;
int schance = 0;
int race_bonus = 0;
argument = one_argument(argument, arg);
argument = one_argument(argument, arg2);
if(IS_NPC(ch))
{
send_to_char("Only characters can drag.\r\n", ch);
return;
}
if(get_timer(ch, TIMER_PKILLED) > 0)
{
send_to_char("You can't drag a player right now.\r\n", ch);
return;
}
if(arg[0] == '\0')
{
send_to_char("Drag whom?\r\n", ch);
return;
}
if((victim = get_char_room(ch, arg)) == NULL)
{
send_to_char("They aren't here.\r\n", ch);
return;
}
if(victim == ch)
{
send_to_char("You take yourself by the scruff of your neck, but go nowhere.\r\n", ch);
return;
}
if(IS_NPC(victim))
{
send_to_char("You can only drag characters.\r\n", ch);
return;
}
if(!xIS_SET(victim->act, PLR_SHOVEDRAG) && !IS_SET(victim->pcdata->flags, PCFLAG_DEADLY))
{
send_to_char("That character doesn't seem to appreciate your attentions.\r\n", ch);
return;
}
if(get_timer(victim, TIMER_PKILLED) > 0)
{
send_to_char("You can't drag that player right now.\r\n", ch);
return;
}
if(victim->fighting)
{
send_to_char("You try, but can't get close enough.\r\n", ch);
return;
}
if(!IS_SET(ch->pcdata->flags, PCFLAG_DEADLY) && IS_SET(victim->pcdata->flags, PCFLAG_DEADLY))
{
send_to_char("You cannot drag a deadly character.\r\n", ch);
return;
}
if(!IS_SET(victim->pcdata->flags, PCFLAG_DEADLY) && victim->position > 3)
{
send_to_char("They don't seem to need your assistance.\r\n", ch);
return;
}
if(arg2[0] == '\0')
{
send_to_char("Drag them in which direction?\r\n", ch);
return;
}
if(ch->level - victim->level > 10 || victim->level - ch->level > 10)
{
if(IS_SET(victim->pcdata->flags, PCFLAG_DEADLY) && IS_SET(ch->pcdata->flags, PCFLAG_DEADLY))
{
send_to_char("There is too great an experience difference for you to even bother.\r\n", ch);
return;
}
}
exit_dir = get_dir(arg2);
if(IS_SET(victim->in_room->room_flags, ROOM_SAFE) && get_timer(victim, TIMER_SHOVEDRAG) <= 0)
{
send_to_char("That character cannot be dragged right now.\r\n", 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.\r\n", ch);
return;
}
to_room = pexit->to_room;
if(IS_SET(to_room->room_flags, ROOM_DEATH))
{
send_to_char("You cannot drag someone into a death trap.\r\n", 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.\r\n", ch);
set_position(victim, POS_STANDING);
return;
}
/*
* Check for class, assign percentage based on that.
*/
schance = 35;
/*
* Add 3 points to chance for every str point above 15, subtract for below 15
*/
schance += ((get_curr_str(ch) - 15) * 3);
schance += (ch->level - victim->level);
if(ch->race == 1)
race_bonus = -3;
if(ch->race == 2)
race_bonus = 3;
if(ch->race == 3)
race_bonus = -5;
if(ch->race == 4)
race_bonus = -7;
if(ch->race == 6)
race_bonus = 5;
if(ch->race == 7)
race_bonus = 7;
if(ch->race == 8)
race_bonus = 10;
if(ch->race == 9)
race_bonus = -2;
schance += race_bonus;
if(schance < number_percent())
{
send_to_char("You failed.\r\n", ch);
set_position(victim, POS_STANDING);
return;
}
if(victim->position < POS_STANDING)
{
short temp;
temp = victim->position;
set_position(victim, 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, FALSE);
if(!char_died(victim))
set_position(victim, temp);
/*
* Move ch to the room too.. they are doing dragging - Scryn
*/
move_char(ch, get_exit(ch->in_room, exit_dir), 0, FALSE);
WAIT_STATE(ch, 12);
return;
}
send_to_char("You cannot do that to someone who is standing.\r\n", ch);
}
bool is_head_architect(CHAR_DATA *ch)
{
if(!ch || !ch->pcdata || !ch->pcdata->council || ch->pcdata->council != get_council("Area Building Machine"))
return FALSE;
if(ch->pcdata->council->head && !str_cmp(ch->pcdata->council->head, ch->name))
return TRUE;
if(ch->pcdata->council->head2 && !str_cmp(ch->pcdata->council->head2, ch->name))
return TRUE;
return FALSE;
}
/* Set all areas the clan is influencing */
void influence_areas(CLAN_DATA * clan)
{
PKILLAREA_DATA *pkillarea, *pkillarea_next;
AREA_DATA *pkarea;
bool pkremove; /* Should we Remove the area or set it as influenced
* by the clan. */
for(pkillarea = clan->first_pkillarea; pkillarea; pkillarea = pkillarea_next)
{
pkillarea_next = pkillarea->next;
pkremove = TRUE; /* Assume we will remove it */
for(pkarea = first_area; pkarea; pkarea = pkarea->next)
{
if(!str_cmp(pkillarea->name, pkarea->name))
{
if(!IS_SET(pkarea->flags, AFLAG_NOINFLUENCE))
{
pkarea->influencer = clan;
pkremove = FALSE; /* So should be set and not removed */
}
break;
}
}
if(pkremove)
{
UNLINK(pkillarea, clan->first_pkillarea, clan->last_pkillarea, next, prev);
free_pkillarea(pkillarea);
}
}
}
/* Used to assign the first person in line for the position */
void assign_clan_leaders(CLAN_DATA * clan)
{
ROSTER_DATA *rost;
char buf[MSL];
bool changed = FALSE;
if(!clan || (clan->chieftain && clan->warmaster) || !clan->first_member)
return;
for(rost = clan->first_member; rost; rost = rost->next)
{
if(clan->chieftain && !str_cmp(clan->chieftain, rost->name))
continue;
if(clan->warmaster && !str_cmp(clan->warmaster, rost->name))
continue;
if(!clan->chieftain)
{
changed = TRUE;
clan->chieftain = STRALLOC(rost->name);
snprintf(buf, MSL, "&W[&RAnnouncement&W]&C %s has been appointed clan chieftain for the %s!\r\n", clan->chieftain, clan->name);
echo_to_all(AT_RED, buf, ECHOTAR_ALL);
continue;
}
if(!clan->warmaster)
{
changed = TRUE;
clan->warmaster = STRALLOC(rost->name);
snprintf(buf, MSL, "&W[&RAnnouncement&W]&C %s has been appointed clan warmaster for the %s!\r\n", clan->warmaster, clan->name);
echo_to_all(AT_RED, buf, ECHOTAR_ALL);
continue;
}
}
if(changed)
save_clan(clan);
}
/* Used if a player is outcast etc... to check and remove them from leader spots */
void check_clan_leaders(CLAN_DATA * clan, char *player)
{
char buf[MSL];
if(!clan || !player)
return;
if(clan->chieftain && !str_cmp(clan->chieftain, player))
{
snprintf(buf, MSL, "&W[&RAnnouncement&W]&C %s has been removed from clan chieftain for the %s!\r\n", clan->chieftain, clan->name);
echo_to_all(AT_RED, buf, ECHOTAR_ALL);
STRFREE(clan->chieftain);
clan->chieftain = NULL;
save_clan(clan);
}
if(clan->warmaster && !str_cmp(clan->warmaster, player))
{
snprintf(buf, MSL, "&W[&RAnnouncement&W]&C %s has been removed from clan warmaster for the %s!\r\n", clan->warmaster, clan->name);
echo_to_all(AT_RED, buf, ECHOTAR_ALL);
STRFREE(clan->warmaster);
clan->warmaster = NULL;
save_clan(clan);
}
assign_clan_leaders(clan);
}
void increase_clan_pkills(CLAN_DATA * clan, int level)
{
if(!clan)
return;
if(level < 10)
clan->pkills[0]++;
else if(level < 20)
clan->pkills[1]++;
else if(level < 30)
clan->pkills[2]++;
else if(level < 40)
clan->pkills[3]++;
else if(level < 50)
clan->pkills[4]++;
else if(level < 60)
clan->pkills[5]++;
else if(level < 70)
clan->pkills[6]++;
else if(level < 80)
clan->pkills[7]++;
else if(level < 90)
clan->pkills[8]++;
else if(level < 100)
clan->pkills[9]++;
else if(level == 100)
clan->pkills[10]++;
}
void increase_clan_pdeaths(CLAN_DATA * clan, int level)
{
if(!clan)
return;
if(level < 10)
clan->pdeaths[0]++;
else if(level < 20)
clan->pdeaths[1]++;
else if(level < 30)
clan->pdeaths[2]++;
else if(level < 40)
clan->pdeaths[3]++;
else if(level < 50)
clan->pdeaths[4]++;
else if(level < 60)
clan->pdeaths[5]++;
else if(level < 70)
clan->pdeaths[6]++;
else if(level < 80)
clan->pdeaths[7]++;
else if(level < 90)
clan->pdeaths[8]++;
else if(level < 100)
clan->pdeaths[9]++;
else if(level == 100)
clan->pdeaths[10]++;
}