SmaugWizard/Backup/
SmaugWizard/Backup/L/
SmaugWizard/Boards/
SmaugWizard/Building/
SmaugWizard/Corpses/
SmaugWizard/Councils/
SmaugWizard/Deity/
SmaugWizard/Gods/
SmaugWizard/MudProgs/
SmaugWizard/Player/L/
SmaugWizard/Src/
SmaugWizard/Src/res/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |				*
 * -----------------------------------------------------------|   \\._.//	*
 * SmaugWiz (C) 1998 by Russ Pillsbury (Windows NT version)   |   (0...0)	*
 * -----------------------------------------------------------|    ).:.(	*
 * SMAUG (C) 1994, 1995, 1996 by Derek Snider                 |    {o o}	*
 * -----------------------------------------------------------|   / ' ' \	*
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |~'~.VxvxV.~'~*
 * Scryn, Swordbearer, Rennard, Tricops, and Gorog.           |				*
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik Staerfeldt, Tom Madsen, and Katja Nyboe.    *
 ***************************************************************************/
// Language.cpp

#include	"stdafx.h"
#include	"smaug.h"
#include	"Smaugx.h"
#include	"bitvector.h"
#include	"SmaugFiles.h"
#include	"language.h"


// for now, just load from the standard language list.  Later we can
// load from a file or files.  Set common and clan to the first valid
// language (language 0 is reserved for 'all').  Later we will change
// them to values saved in sysdata.
void CLanguageTable::Load ()
{
	FILE	*fp;
	char	*pLine, *word;

	m_Common = m_Clan = 1;
	LanguageTable.Add (new CLanguage (0, "all"));

	CString Fname = FileTable.MakeName (SD_SYSTEM_DIR, "Languages.dat");
	if ((fp = fopen (Fname, "r")) == NULL) {
		bug ("Cannot open language file %s. Using default Languages.",
			NCCP Fname);
		// Load Default Language list
		for (int i=1; i < MAX_LANGUAGE; ++i) {
			LanguageTable.Add (new CLanguage (i, LanguageNames [i]));
			if (! stricmp (LanguageNames [i], "clan"))
				m_Clan = i;
		}
		return;
	}

	// Load languages from file
	extern int	gAcount;
	gAcount = 0;
	pLine = fread_line (fp);
	word = ParseWord (pLine);

	if (stricmp (word, "#VERSION")) {
		bug ("%s: No Version Found.", NCCP Fname);
		fclose (fp);
		ThrowSmaugException (SE_LANGUAGE);
	}
	int Version = ParseNumber (pLine);

	if (Version != LanguageTable.GetCurrentVersion ()) {
		bug ("%s: Cannot load Version %d Languages.", NCCP Fname, Version);
		fclose (fp);
		ThrowSmaugException (SE_LANGUAGE);
	}

	int		nLanguage = 1;
	for (;;) {
		BOOL	fMatch = FALSE;
		if (! feof (fp)) {
			pLine = fread_line (fp);
			word = ParseWord (pLine);
		}
		else word = "End";

		switch  (UPPER (word [0])) {
		  case '*':
			fMatch = TRUE;
			break;

		  case 'E':
			if (! stricmp (word, "End")) {
				fclose (fp);
				return;
			}
			break;

		  case 'L':
		    if (! stricmp (word, "Language")) {
				word = ParseWord (pLine);
				BOOL	bLearn = ParseNumber (pLine) != 0;
				LanguageTable.Add (new CLanguage (nLanguage, word, bLearn));
				if (! stricmp (word, "clan"))
					m_Clan = nLanguage;
				++nLanguage;
				fMatch = TRUE;
			}
			break;
		}
		if (! fMatch)
			bug ("CLanguageTable::Load: %s, no match: %s", NCCP Fname, word);
	}
}


CLanguage *CLanguageTable::Find (const char* prefix)
{
	// First try for an exact match
	POSITION	pos = GetHeadPosition ();
	while (pos) {
		CLanguage	*la = GetNext (pos);
		if (la->m_Name == prefix)
			return la;
	}
	// Then try for a prefix match
	pos = GetHeadPosition ();
	while (pos) {
		CLanguage	*la = GetNext (pos);
		if (toupper (prefix [0]) == toupper (la->m_Name [0])
		  && ! str_prefix (prefix, la->m_Name))
				return la;
	}
	return NULL;
}


void CLanguageTable::LoadFromString (CBitVector& Bv, char* s)
{
	char		*word;
	CLanguage	*pLang;

	while (word = ParseWord (s)) {
		if (! word [0]) then break;
		if (pLang = Find (word))
			Bv.SetBit (pLang->GetLanguage ());
	}
}


int CLanguageTable::GetLanguage (const char* name)
{
	CLanguage	&La = *Find (name);
	return &La ? La.GetLanguage () : m_Common;
}


CString CLanguageTable::PrintAssigned (const CBitVector& Bv)
{
	CString	s;

	BOOL	bFirst = TRUE;
	for (int i=0; i < GetCount (); ++i)
		if (Bv.IsSet (i)) {
			if (! bFirst)
				s += ' ';
			s += GetName (i);
			bFirst = FALSE;
		}

	return s;
}


void CLanguageTable::SetFromString (char*& pLine, CBitVector& Bv)
{
	char	*word;

	while (*pLine) {
		word = ParseWord (pLine);
		int	len = strlen (word);
		if (word [len-1] == '~')
			word [len-1] = 0;

		for (int i=0; i < GetCount (); ++i)
			if (! stricmp (GetName (i), word)) {
				Bv.SetBit (i);
				break;
			}
	}
}


void CLanguageTable::RemoveAll ()
{
	while (! IsEmpty ())
		delete RemoveTail ();

	CPtrList::RemoveAll ();
}