/****************************************************************************
* [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 ();
}