muddy/
muddy/CVS/
muddy/area/
muddy/area/CVS/
muddy/clans/CVS/
muddy/classes/CVS/
muddy/doc/
muddy/doc/CVS/
muddy/etc/CVS/
muddy/etc/i3/
muddy/etc/i3/CVS/
muddy/imc/CVS/
muddy/lang/CVS/
muddy/licenses/CVS/
muddy/msgdb/CVS/
muddy/new/CVS/
muddy/notes/
muddy/player/
muddy/races/CVS/
muddy/religions/CVS/
muddy/src/CVS/
muddy/src/comm/CVS/
muddy/src/db/CVS/
muddy/src/intermud/
muddy/src/intermud/CVS/
muddy/src/irc/CVS/
muddy/src/olc/CVS/
/* $Id: db_clan.c,v 1.666 2004/09/20 10:50:19 shrike Exp $ */

/************************************************************************************
 *    Copyright 2004 Astrum Metaphora consortium                                    *
 *                                                                                  *
 *    Licensed under the Apache License, Version 2.0 (the "License");               *
 *    you may not use this file except in compliance with the License.              *
 *    You may obtain a copy of the License at                                       *
 *                                                                                  *
 *    http://www.apache.org/licenses/LICENSE-2.0                                    *
 *                                                                                  *
 *    Unless required by applicable law or agreed to in writing, software           *
 *    distributed under the License is distributed on an "AS IS" BASIS,             *
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.      *
 *    See the License for the specific language governing permissions and           *
 *    limitations under the License.                                                *
 *                                                                                  *
 ************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#if defined (WIN32)
#   include <compat/compat.h>
#else
#   include <dirent.h>
#endif

#include "merc.h"
#include "db.h"
#include "clan.h"

DECLARE_DBLOAD_FUN(load_clan);

DBFUN db_load_clans[] =
{
    { "CLAN",   load_clan   },
    { NULL }
};

DBLOAD_FUN(load_clan)
{
    clan_t * clan;
    int     i;

    clan = clan_new();
    clan->file_name = get_filename(filename);

    for (;;) {
        char *word = feof(fp) ? "End" : fread_word(fp);
        bool fMatch = FALSE;

        switch (UPPER(word[0])) {
        case 'A':
            KEY("Altar", clan->altar_vnum, fread_number(fp));
            KEY("AltarTrophy", clan->altar_trophy_vnum,
                fread_number(fp));
            KEY("AreaGuardStandard", clan->standard_areaguard_vnum, fread_number(fp));
            KEY("AreaGuardVeteran", clan->veteran_areaguard_vnum, fread_number(fp));
            KEY("AreaGuardElite", clan->elite_areaguard_vnum, fread_number(fp));
            KEY("AllianceAllow", clan->allow_alliance, fread_fstring(aliance_allow_flag, fp));
            break;
        case 'B':
            KEY("BankGold", clan->bank_gold, fread_number(fp));
            KEY("BankQuestp", clan->bank_questp, fread_number(fp));
            KEY("BankBonus", clan->bank_bonus, fread_number(fp));
            KEY("BankGems", clan->bank_gems, fread_number(fp));
            KEY("BankRGems", clan->bank_rgems, fread_number(fp));
            KEY("BankBGems", clan->bank_bgems, fread_number(fp));
            KEY("BankGGems", clan->bank_ggems, fread_number(fp));
            KEY("BankMGems", clan->bank_mgems, fread_number(fp));
            KEY("BankWGems", clan->bank_wgems, fread_number(fp));
            KEY("BankYGems", clan->bank_ygems, fread_number(fp));
            break;
        case 'C':
            KEY("ClanMark", clan->mark_vnum, fread_number(fp));
            KEY("ClanAlign", clan->clan_align, fread_number(fp));
            break;
        case 'D':
            if (!str_cmp(word, "Diplomacy")) {
                for (i = 0; i < MAX_CLANS-1; i++)
                        clan->diplomacy[i] = fread_number(fp);
                    fMatch = TRUE;
                }
            break;
        case 'E':
            if (!str_cmp(word, "End")) {
                if (IS_NULLSTR(clan->name)) {
                    db_error("load_clan",
                         "clan name not defined");
                    clan_free(clan);
                    clans.nused--;
                }
                varr_qsort(&clan->skills, cmpint);
                return;
            }
            break;
        case 'F':
            KEY("Flags", clan->flags, fread_fstring(clan_flags, fp));
            break;
        case 'I':
            KEY("Item", clan->obj_vnum, fread_number(fp));
            break;
        case 'M':
            SKEY("MsgPrays", clan->msg_prays);
            SKEY("MsgVanishes", clan->msg_vanishes);
            KEY("MaxMembers", clan->max_clan_members, fread_number (fp));
            KEY("MinLevel", clan->min_clan_level, fread_number (fp));
            break;
        case 'N':
            SKEY("Name", clan->name);
            break;
        case 'R':
            KEY("Recall", clan->recall_vnum, fread_number(fp));
            break;
        case 'S':
            if (!str_cmp(word, "Skill")) {
                clan_skill_t *sk = varr_enew(&clan->skills);
                sk->sn = sn_lookup(fread_word(fp));
                sk->level = fread_number(fp);
                sk->percent = fread_number(fp);
                fMatch = TRUE;
            }
            break;
        case 'W':
            KEY("WhereItem", clan->item_at, fread_number(fp));
            break;
        }

        if (!fMatch)
            db_error("load_clan", "%s: Unknown keyword", word);
    }
}

void load_clan_members ()
{
    struct dirent      * dp    ;
    struct clan_member * clanm ;

    DIR  * dirp   ;
    FILE * pfile  ;
    char   letter ;
    char * word   ;
    int    cn = 0 ;

    if ((dirp = opendir (PLAYER_PATH)) == NULL)
    {
        bug ("Load_clan_members: unable to open player directory.", 0) ;
        exit(1) ;
    }

    // check each player
    for (dp = readdir (dirp) ; dp != NULL ; dp = readdir (dirp))
    {
        const char * clanname ;
        clan_t  * clan ;

        clanm = (struct clan_member *) calloc (1, sizeof (struct clan_member)) ;

        // only BSD implementation has d_type member of dirent structure
        #if defined (__FreeBSD__)
        if (dp->d_namlen < 3 || dp->d_type != DT_REG) continue ;
        #else
        if (strlen (dp->d_name) < 3) continue ;
        #endif

        // do not process HOLDER_LIST file in any
        if (!str_cmp (dp->d_name, HOLDER_LIST)) continue ;

        // open pfile
        if ((pfile = dfopen (PLAYER_PATH, dp->d_name, "r")) == NULL)
        {
            log_printf ("Load_clan_members: Can't open player file %s.",
                        dp->d_name) ;
            continue ;
        }

        // look through player data
        clanname = NULL ;
        cn       =    0 ;

        for (;;)
        {
            letter = fread_letter (pfile) ;

            if (letter == '*') { fread_to_eol (pfile) ; continue ; }

            if (letter != '#')
            {
                log_printf ("Load_clan_members: # not found in %s.",
                            dp->d_name) ;
                break ;
            }

            word = fread_word (pfile) ; // word - static buffer ptr

            // process player section
            if (!str_cmp (word, "PLAYER"))
            {
                for (;;)
                {
                    word = fread_word (pfile) ; // word - static buffer ptr

                    // until EOF or End
                    if (feof (pfile) || !word || !str_cmp (word, "End")) break;

                    // load player name
                    if (!str_cmp (word, "Name"))
                    {
                        clanm->name = fread_string (pfile) ; // allocate here
                    }
                    else
                    if (!str_cmp (word, "Clan"))
                    {
                        free_string (clanname) ;
                        clanname = fread_string (pfile) ; // allocate here
                    }
                    else
                    if (!str_cmp (word, "ClanStatus"))
                    {
                        clanm->rank = fread_number (pfile) ;
                    }
                    else
                    if (!str_cmp (word, "Alig"))
                    {
                        clanm->alignment = fread_number (pfile) ;
                    }
                    else
                    if (!str_cmp (word, "Ethos"))
                    {
                        clanm->ethos = fread_fword (ethos_table, pfile) ;
                    }
                    else
                    if (!str_cmp (word, "Login"))
                    {
                        clanm->last_login = fread_string (pfile) ;
                    }
                    else
                    if (!str_cmp (word, "Levl"))
                    {
                        clanm->level = fread_number (pfile) ;
                    }
                    else
                    if (!str_cmp (word, "Desc"))
                    {
                        // workaround to skip description
                        mlstring * desc = mlstr_fread (pfile) ;
                        mlstr_free (desc) ;
                    }
                    else fread_to_eol (pfile) ;
                }
            }
            else
            // process object section
            if (!str_cmp (word, "O") || !str_cmp (word, "OBJECT")) break ;
            else
            if (!str_cmp (word, "PET")) break ;
            /* golem and undead section */
            else
            if (!str_cmp (word, "GOLEM")) break ;
            else
            if (!str_cmp (word, "UNDEAD")) break ;
            /* end golem and undead section */
            else
            if (!str_cmp (word, "EXPLORED")) break ;
            else
            if (!str_cmp (word, "END")) break ;
            else
            {
                log_printf ("Load_clan_members: bad section in %s.",
                            dp->d_name) ;
                break ;
            }
        }

        // lookup clan data by name
        if (clanname && (cn = cln_lookup (clanname)) > 0 && clanm->level <= LEVEL_HERO)
        {
            clan = CLAN (cn) ;

            // add member to the beginning of the list
            clanm->next       = clan->member_list ;
            clan->member_list = clanm ;

            ++clan->cur_clan_members ;

            if (clan->cur_clan_members > clan->max_clan_members)
            {
                log_printf ("Load_clan_members: clan members limit exceeded in %s",
                            clan->name) ;
            }
        }
        else
        {
            free (clanm) ;

            if (clanm->level <= LEVEL_HERO && clanname != NULL)
                log_printf ("Load_clan_members: Unknown clan %s in player %s.",
                            clanname, dp->d_name) ;
        }

        free_string (clanname) ;
        fclose      (pfile)    ;
    }

    closedir (dirp) ;
}