tfe-1.0/area/
tfe-1.0/files/
tfe-1.0/logs/
tfe-1.0/logs/immortal/
tfe-1.0/logs/mob/
tfe-1.0/logs/object/
tfe-1.0/logs/player/
tfe-1.0/logs/room/
tfe-1.0/notes/clans/
tfe-1.0/player/
tfe-1.0/prev/
tfe-1.0/prev/area/
tfe-1.0/prev/player/
tfe-1.0/prev/rooms/
tfe-1.0/rooms/
tfe-1.0/src-gc/
tfe-1.0/src-msvc/
tfe-1.0/src-unix/
tfe-1.0/www/
tfe-1.0/www/html/
/*
 *   ALIGNMENT
 */


#define ALGN_LAWFUL_GOOD            0
#define ALGN_LAWFUL_NEUTRAL         1
#define ALGN_LAWFUL_EVIL            2
#define ALGN_NEUTRAL_GOOD           3
#define ALGN_PURE_NEUTRAL           4
#define ALGN_NEUTRAL_EVIL           5
#define ALGN_CHAOTIC_GOOD           6
#define ALGN_CHAOTIC_NEUTRAL        7
#define ALGN_CHAOTIC_EVIL           8
#define MAX_ALIGNMENT               9


extern flag_data         align_flags;
extern flag_data     abv_align_flags;


#define ib      inline bool
#define align   ch->shdata->alignment%3

ib is_good    ( char_data* ch ) { return( align == 0 ); }
ib is_neutral ( char_data* ch ) { return( align == 1 ); }
ib is_evil    ( char_data* ch ) { return( align == 2 ); }

#undef ib
#undef align


/*
 *   TITLES
 */


#define TITLE_SET_FLAGS       0
#define TITLE_EDIT_CHARTER    1
#define TITLE_RECRUIT         2
#define TITLE_REMOVE_NOTES    3
#define MAX_TITLE             4


class Title_Data
{
 public:
  char*          name;
  int           flags  [ 2 ];
  pfile_data*   pfile;

  Title_Data( char* s1, pfile_data* p1 ) {
    name     = alloc_string( s1, MEM_CLAN );
    flags[0] = 0;
    flags[1] = 0;
    pfile    = p1;
    }

  Title_Data( ) {
    name     = empty_string;
    flags[0] = 0;
    flags[1] = 0;
    pfile    = NULL;
    }

  ~Title_Data( ) {
    free_string( name, MEM_CLAN );
    }
};


title_data*    get_title         ( pfile_data* );


class Title_Array
{
 public:
  int           size;
  title_data**  list;

  Title_Array( ) {
    size = 0;
    list = NULL;
    }

  ~Title_Array( ) {
    if( size > 0 ) 
      delete [] list;
    }
};


/*
 *   CLAN CLASS
 */


#define CLAN_APPROVED         0
#define CLAN_KNOWN            1
#define CLAN_PUBLIC           2
#define MAX_CLAN_FLAGS        3


extern clan_data**    clan_list;
extern int             max_clan; 


class Clan_Data
{
 public:
  char*              name;
  char*            abbrev;
  char*           charter;
  int               flags  [ 2 ];
  int           min_level;
  int             classes;
  int               races;
  int          alignments;
  int               sexes;
  int                date;
  bool           modified;
  title_array      titles;
  pfile_array     members;
  note_data**   note_list;
  int            max_note;

  Clan_Data( char* s1 ) {
    record_new( sizeof( clan_data ), MEM_CLAN );
    abbrev      = alloc_string( s1, MEM_CLAN );
    name        = empty_string;
    charter     = empty_string;
    flags[0]    = 0;
    flags[1]    = 0;
    min_level   = 5;
    classes     = 0;
    races       = 0;
    alignments  = 0;
    sexes       = 0;
    max_note    = 0;
    modified    = FALSE;
    note_list   = NULL;
    date        = current_time;
    insert( clan_list, max_clan, this, max_clan );
    }

  ~Clan_Data( ) {
    record_delete( sizeof( clan_data ), MEM_CLAN );
    free_string( name, MEM_CLAN );
    free_string( abbrev, MEM_CLAN );
    free_string( charter, MEM_CLAN );
    }

  friend const char* name( clan_data* clan ) {
    return( clan->name == empty_string ? clan->abbrev
      : clan->name );
    }
};


inline bool same_clan( char_data* c1, char_data* c2 )
{
  return( c1->pcdata->pfile->clan != NULL
    && c1->pcdata->pfile->clan == c2->pcdata->pfile->clan );
}


inline bool knows_members( char_data* ch, clan_data* clan )
{
  return( ch->pcdata->pfile->clan == clan
    || ( is_set( clan->flags, CLAN_APPROVED )
    && is_set( clan->flags, CLAN_PUBLIC ) ) 
    || has_permission( ch, PERM_CLANS ) );
}  


void        add_member      ( clan_data*, pfile_data* );
void        remove_member   ( pfile_data* );
void        remove_member   ( player_data* );
void        save_clans      ( clan_data* = NULL );
void        load_clans      ( void );
clan_data*  find_clan       ( char_data*, char* );