6D/
6D/area/
6D/boards/
6D/city/
6D/color/
6D/corpses/
6D/councils/
6D/htowns/
6D/news/
6D/specials/
6D/src/specials/
6D/src/trades/
 /****************************************************************************
 * [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]++;
}