Something went wrong. Try again.
the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
Something went wrong. Try again.
3.5 kB · 189 lines
C++
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190#include "StdAfx.h"#include "StringTable.h"
StringTable::StringTable(void){
}
// Load string table from a binary blob, filling out with the current localisation data onlyStringTable::StringTable(PBYTE pbData, DWORD dwSize){ src = byteArray(pbData, dwSize);
ProcessStringTableData();}
void StringTable::ReloadStringTable(){ m_stringsMap.clear(); m_stringsVec.clear();
ProcessStringTableData();}
void StringTable::ProcessStringTableData(void){ ByteArrayInputStream bais(src); DataInputStream dis(&bais);
int versionNumber = dis.readInt(); int languagesCount = dis.readInt();
vector< pair<wstring, int> > langSizeMap; for(int i = 0; i < languagesCount; ++i) { wstring langId = dis.readUTF(); int langSize = dis.readInt();
langSizeMap.push_back( vector< pair<wstring, int> >::value_type(langId, langSize)); }
vector<wstring> locales; app.getLocale(locales);
bool foundLang = false; __int64 bytesToSkip = 0; int dataSize = 0;
// for( AUTO_VAR(it_locales, locales.begin()); it_locales!=locales.end() && (!foundLang); it_locales++ ) { bytesToSkip = 0;
for(AUTO_VAR(it, langSizeMap.begin()); it != langSizeMap.end(); ++it) { if(it->first.compare(*it_locales) == 0) { app.DebugPrintf("StringTable:: Found language '%ls'.\n", it_locales->c_str()); dataSize = it->second; foundLang = true; break; }
bytesToSkip += it->second; }
if (!foundLang) app.DebugPrintf("StringTable:: Can't find language '%ls'.\n", it_locales->c_str()); }
if(foundLang) { dis.skip(bytesToSkip);
byteArray langData(dataSize); dis.read(langData);
dis.close();
ByteArrayInputStream bais2(langData); DataInputStream dis2(&bais2);
// Read the language file for the selected language int langVersion = dis2.readInt();
isStatic = false; // 4J-JEV: Versions 1 and up could use if (langVersion > 0) // integers rather than wstrings as keys. isStatic = dis2.readBoolean();
wstring langId = dis2.readUTF(); int totalStrings = dis2.readInt();
app.DebugPrintf("IsStatic=%d totalStrings = %d\n",isStatic?1:0,totalStrings);
if (!isStatic) { for(int i = 0; i < totalStrings; ++i) { wstring stringId = dis2.readUTF(); wstring stringValue = dis2.readUTF();
m_stringsMap.insert( unordered_map<wstring, wstring>::value_type(stringId, stringValue) ); } } else { for(int i = 0; i < totalStrings; ++i) m_stringsVec.push_back( dis2.readUTF() ); } dis2.close();
// We can't delete this data in the dtor, so clear the reference bais2.reset(); } else { app.DebugPrintf("Failed to get language\n");#ifdef _DEBUG __debugbreak();#endif
isStatic = false; }
// We can't delete this data in the dtor, so clear the reference bais.reset();}
StringTable::~StringTable(void){ // delete src.data; TODO 4J-JEV: ?}
void StringTable::getData(PBYTE *ppData, UINT *pSize){ *ppData = src.data; *pSize = src.length;}
LPCWSTR StringTable::getString(const wstring &id){#ifndef _CONTENT_PACKAGE if (isStatic) { __debugbreak(); return L""; }#endif
AUTO_VAR(it, m_stringsMap.find(id) );
if(it != m_stringsMap.end()) { return it->second.c_str(); } else { return L""; }}
LPCWSTR StringTable::getString(int id){#ifndef _CONTENT_PACKAGE if (!isStatic) { __debugbreak(); return L""; }#endif
if (id < m_stringsVec.size()) { LPCWSTR pwchString=m_stringsVec.at(id).c_str(); return pwchString; } else return L"";}