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