Commit 899d91c3 authored by nanahira's avatar nanahira

Merge branch 'master' into another

parents 217ce585 62dd6c6e
No preview for this file type
...@@ -7,23 +7,37 @@ namespace ygo { ...@@ -7,23 +7,37 @@ namespace ygo {
const wchar_t* DataManager::unknown_string = L"???"; const wchar_t* DataManager::unknown_string = L"???";
wchar_t DataManager::strBuffer[4096]; wchar_t DataManager::strBuffer[4096];
byte DataManager::scriptBuffer[0x20000]; byte DataManager::scriptBuffer[0x20000];
IFileSystem* DataManager::FileSystem;
DataManager dataManager; DataManager dataManager;
bool DataManager::LoadDB(const char* file) { bool DataManager::LoadDB(const wchar_t* wfile) {
sqlite3* pDB; IReadFile* reader = FileSystem->createAndOpenFile(wfile);
if(sqlite3_open_v2(file, &pDB, SQLITE_OPEN_READONLY, 0) != SQLITE_OK) if(reader == NULL)
return Error(pDB); return false;
spmemvfs_db_t db;
spmembuffer_t* mem = (spmembuffer_t*)calloc(sizeof(spmembuffer_t), 1);
spmemvfs_env_init();
mem->total = mem->used = reader->getSize();
mem->data = (char*)malloc(mem->total + 1);
reader->read(mem->data, mem->total);
reader->drop();
(mem->data)[mem->total] = '\0';
char file[256];
BufferIO::EncodeUTF8(wfile, file);
if(spmemvfs_open_db(&db, file, mem) != SQLITE_OK)
return Error(&db);
sqlite3* pDB = db.handle;
sqlite3_stmt* pStmt; sqlite3_stmt* pStmt;
const char* sql = "select * from datas,texts where datas.id=texts.id"; const char* sql = "select * from datas,texts where datas.id=texts.id";
if(sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK) if(sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK)
return Error(pDB); return Error(&db);
CardDataC cd; CardDataC cd;
CardString cs; CardString cs;
int step = 0; int step = 0;
do { do {
step = sqlite3_step(pStmt); step = sqlite3_step(pStmt);
if(step == SQLITE_BUSY || step == SQLITE_ERROR || step == SQLITE_MISUSE) if(step == SQLITE_BUSY || step == SQLITE_ERROR || step == SQLITE_MISUSE)
return Error(pDB, pStmt); return Error(&db, pStmt);
else if(step == SQLITE_ROW) { else if(step == SQLITE_ROW) {
cd.code = sqlite3_column_int(pStmt, 0); cd.code = sqlite3_column_int(pStmt, 0);
cd.ot = sqlite3_column_int(pStmt, 1); cd.ot = sqlite3_column_int(pStmt, 1);
...@@ -63,54 +77,68 @@ bool DataManager::LoadDB(const char* file) { ...@@ -63,54 +77,68 @@ bool DataManager::LoadDB(const char* file) {
} }
} while(step != SQLITE_DONE); } while(step != SQLITE_DONE);
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
sqlite3_close(pDB); spmemvfs_close_db(&db);
spmemvfs_env_fini();
return true; return true;
} }
bool DataManager::LoadStrings(const char* file) { bool DataManager::LoadStrings(const char* file) {
#ifdef _WIN32
wchar_t fname[1024];
BufferIO::DecodeUTF8(file, fname);
FILE* fp = _wfopen(fname, L"r");
#else
FILE* fp = fopen(file, "r"); FILE* fp = fopen(file, "r");
#endif // _WIN32
if(!fp) if(!fp)
return false; return false;
char linebuf[256]; char linebuf[256];
char strbuf[256];
int value;
while(fgets(linebuf, 256, fp)) { while(fgets(linebuf, 256, fp)) {
if(linebuf[0] != '!') ReadStringConfLine(linebuf);
continue;
sscanf(linebuf, "!%s", strbuf);
if(!strcmp(strbuf, "system")) {
sscanf(&linebuf[7], "%d %240[^\n]", &value, strbuf);
BufferIO::DecodeUTF8(strbuf, strBuffer);
_sysStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "victory")) {
sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf);
BufferIO::DecodeUTF8(strbuf, strBuffer);
_victoryStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "counter")) {
sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf);
BufferIO::DecodeUTF8(strbuf, strBuffer);
_counterStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "setname")) {
sscanf(&linebuf[8], "%x %240[^\t\n]", &value, strbuf);//using tab for comment
BufferIO::DecodeUTF8(strbuf, strBuffer);
_setnameStrings[value] = strBuffer;
}
} }
fclose(fp); fclose(fp);
for(int i = 0; i < 255; ++i) for(int i = 0; i < 255; ++i)
myswprintf(numStrings[i], L"%d", i); myswprintf(numStrings[i], L"%d", i);
return true; return true;
} }
bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) { bool DataManager::LoadStrings(IReadFile* reader) {
BufferIO::DecodeUTF8(sqlite3_errmsg(pDB), strBuffer); char ch[2] = " ";
char linebuf[256] = "";
while(reader->read(&ch[0], 1)) {
if(ch[0] == '\0')
break;
strcat(linebuf, ch);
if(ch[0] == '\n') {
ReadStringConfLine(linebuf);
linebuf[0] = '\0';
}
}
reader->drop();
return true;
}
void DataManager::ReadStringConfLine(const char* linebuf) {
if(linebuf[0] != '!')
return;
char strbuf[256];
int value;
sscanf(linebuf, "!%s", strbuf);
if(!strcmp(strbuf, "system")) {
sscanf(&linebuf[7], "%d %240[^\n]", &value, strbuf);
BufferIO::DecodeUTF8(strbuf, strBuffer);
_sysStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "victory")) {
sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf);
BufferIO::DecodeUTF8(strbuf, strBuffer);
_victoryStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "counter")) {
sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf);
BufferIO::DecodeUTF8(strbuf, strBuffer);
_counterStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "setname")) {
sscanf(&linebuf[8], "%x %240[^\t\n]", &value, strbuf);//using tab for comment
BufferIO::DecodeUTF8(strbuf, strBuffer);
_setnameStrings[value] = strBuffer;
}
}
bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) {
BufferIO::DecodeUTF8(sqlite3_errmsg(pDB->handle), strBuffer);
if(pStmt) if(pStmt)
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
sqlite3_close(pDB); spmemvfs_close_db(pDB);
spmemvfs_env_fini();
return false; return false;
} }
bool DataManager::GetData(int code, CardData* pData) { bool DataManager::GetData(int code, CardData* pData) {
...@@ -320,54 +348,40 @@ int DataManager::CardReader(int code, void* pData) { ...@@ -320,54 +348,40 @@ int DataManager::CardReader(int code, void* pData) {
byte* DataManager::ScriptReaderEx(const char* script_name, int* slen) { byte* DataManager::ScriptReaderEx(const char* script_name, int* slen) {
byte* buffer; byte* buffer;
if(!mainGame->gameConf.prefer_expansion_script) { if(!mainGame->gameConf.prefer_expansion_script) {
buffer = ScriptReaderExDirectry(".", script_name, slen); buffer = ScriptReaderExSingle(".", script_name, slen);
if(buffer) if(buffer)
return buffer; return buffer;
} }
buffer = ScriptReaderExDirectry("./specials", script_name, slen, 8); buffer = ScriptReaderExSingle("./specials", script_name, slen, 8);
if(buffer) if(buffer)
return buffer; return buffer;
buffer = ScriptReaderExDirectry("./expansions", script_name, slen); buffer = ScriptReaderExSingle("./expansions", script_name, slen);
if(buffer) if(buffer)
return buffer; return buffer;
buffer = ScriptReaderExDirectry("./beta", script_name, slen); buffer = ScriptReaderExSingle("./beta", script_name, slen);
if(buffer) if(buffer)
return buffer; return buffer;
bool find = false;
FileSystem::TraversalDir("./expansions", [script_name, slen, &buffer, &find](const char* name, bool isdir) {
if(!find && isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char subdir[1024];
sprintf(subdir, "./expansions/%s", name);
buffer = ScriptReaderExDirectry(subdir, script_name, slen);
if(buffer)
find = true;
}
});
if(find)
return buffer;
return ScriptReader(script_name, slen); return ScriptReader(script_name, slen);
} }
byte* DataManager::ScriptReaderExDirectry(const char* path, const char* script_name, int* slen, int pre_len) { byte* DataManager::ScriptReaderExSingle(const char* path, const char* script_name, int* slen, int pre_len) {
char sname[256]; char sname[256];
sprintf(sname, "%s%s", path, script_name + pre_len); //default script name: ./script/c%d.lua sprintf(sname, "%s%s", path, script_name + pre_len); //default script name: ./script/c%d.lua
return ScriptReader(sname, slen); return ScriptReader(sname, slen);
} }
byte* DataManager::ScriptReader(const char* script_name, int* slen) { byte* DataManager::ScriptReader(const char* script_name, int* slen) {
FILE *fp;
#ifdef _WIN32
wchar_t fname[256]; wchar_t fname[256];
BufferIO::DecodeUTF8(script_name, fname); BufferIO::DecodeUTF8(script_name, fname);
fp = _wfopen(fname, L"rb"); IReadFile* reader = FileSystem->createAndOpenFile(fname);
#else if(reader == NULL)
fp = fopen(script_name, "rb");
#endif
if(!fp)
return 0; return 0;
int len = fread(scriptBuffer, 1, sizeof(scriptBuffer), fp); size_t size = reader->getSize();
fclose(fp); if(size > sizeof(scriptBuffer)) {
if(len >= sizeof(scriptBuffer)) reader->drop();
return 0; return 0;
*slen = len; }
reader->read(scriptBuffer, size);
reader->drop();
*slen = size;
return scriptBuffer; return scriptBuffer;
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include "config.h" #include "config.h"
#include "sqlite3.h" #include "sqlite3.h"
#include "spmemvfs.h"
#include "client_card.h" #include "client_card.h"
#include <unordered_map> #include <unordered_map>
...@@ -11,9 +12,11 @@ namespace ygo { ...@@ -11,9 +12,11 @@ namespace ygo {
class DataManager { class DataManager {
public: public:
DataManager(): _datas(8192), _strings(8192) {} DataManager(): _datas(8192), _strings(8192) {}
bool LoadDB(const char* file); bool LoadDB(const wchar_t* wfile);
bool LoadStrings(const char* file); bool LoadStrings(const char* file);
bool Error(sqlite3* pDB, sqlite3_stmt* pStmt = 0); bool LoadStrings(IReadFile* reader);
void ReadStringConfLine(const char* linebuf);
bool Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt = 0);
bool GetData(int code, CardData* pData); bool GetData(int code, CardData* pData);
code_pointer GetCodePointer(int code); code_pointer GetCodePointer(int code);
bool GetString(int code, CardString* pStr); bool GetString(int code, CardString* pStr);
...@@ -53,9 +56,9 @@ public: ...@@ -53,9 +56,9 @@ public:
static const wchar_t* unknown_string; static const wchar_t* unknown_string;
static int CardReader(int, void*); static int CardReader(int, void*);
static byte* ScriptReaderEx(const char* script_name, int* slen); static byte* ScriptReaderEx(const char* script_name, int* slen);
static byte* ScriptReaderExDirectry(const char* path, const char* script_name, int* slen, int pre_len = 1); static byte* ScriptReaderExSingle(const char* path, const char* script_name, int* slen, int pre_len = 1);
static byte* ScriptReader(const char* script_name, int* slen); static byte* ScriptReader(const char* script_name, int* slen);
static IFileSystem* FileSystem;
}; };
extern DataManager dataManager; extern DataManager dataManager;
......
...@@ -10,13 +10,7 @@ DeckManager deckManager; ...@@ -10,13 +10,7 @@ DeckManager deckManager;
void DeckManager::LoadLFListSingle(const char* path) { void DeckManager::LoadLFListSingle(const char* path) {
LFList* cur = NULL; LFList* cur = NULL;
#ifdef _WIN32
wchar_t fname[1024];
BufferIO::DecodeUTF8(path, fname);
FILE* fp = _wfopen(fname, L"r");
#else
FILE* fp = fopen(path, "r"); FILE* fp = fopen(path, "r");
#endif // _WIN32
char linebuf[256]; char linebuf[256];
wchar_t strBuffer[256]; wchar_t strBuffer[256];
if(fp) { if(fp) {
...@@ -57,13 +51,6 @@ void DeckManager::LoadLFListSingle(const char* path) { ...@@ -57,13 +51,6 @@ void DeckManager::LoadLFListSingle(const char* path) {
} }
void DeckManager::LoadLFList() { void DeckManager::LoadLFList() {
LoadLFListSingle("expansions/lflist.conf"); LoadLFListSingle("expansions/lflist.conf");
FileSystem::TraversalDir("./expansions", [this](const char* name, bool isdir) {
if(isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char fpath[1024];
sprintf(fpath, "./expansions/%s/lflist.conf", name);
LoadLFListSingle(fpath);
}
});
LoadLFListSingle("lflist.conf"); LoadLFListSingle("lflist.conf");
LFList nolimit; LFList nolimit;
myswprintf(nolimit.listName, L"N/A"); myswprintf(nolimit.listName, L"N/A");
......
...@@ -78,9 +78,10 @@ bool Game::Initialize() { ...@@ -78,9 +78,10 @@ bool Game::Initialize() {
ErrorLog("Failed to load textures!"); ErrorLog("Failed to load textures!");
return false; return false;
} }
LoadExpansionDB(); dataManager.FileSystem = device->getFileSystem();
if(dataManager.LoadDB(GetLocaleDir("cards.cdb"))) {} else LoadExpansions();
if(!dataManager.LoadDB("cards.cdb")) { if(dataManager.LoadDB(GetLocaleDirWide("cards.cdb"))) {} else
if(!dataManager.LoadDB(L"cards.cdb")) {
ErrorLog("Failed to load card database (cards.cdb)!"); ErrorLog("Failed to load card database (cards.cdb)!");
return false; return false;
} }
...@@ -89,7 +90,7 @@ bool Game::Initialize() { ...@@ -89,7 +90,7 @@ bool Game::Initialize() {
ErrorLog("Failed to load strings!"); ErrorLog("Failed to load strings!");
return false; return false;
} }
LoadExpansionStrings(); dataManager.LoadStrings("./expansions/strings.conf");
env = device->getGUIEnvironment(); env = device->getGUIEnvironment();
numFont = irr::gui::CGUITTFont::createTTFont(env, gameConf.numfont, 16); numFont = irr::gui::CGUITTFont::createTTFont(env, gameConf.numfont, 16);
adFont = irr::gui::CGUITTFont::createTTFont(env, gameConf.numfont, 12); adFont = irr::gui::CGUITTFont::createTTFont(env, gameConf.numfont, 12);
...@@ -981,34 +982,37 @@ void Game::SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gu ...@@ -981,34 +982,37 @@ void Game::SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gu
dataManager.strBuffer[pbuffer] = 0; dataManager.strBuffer[pbuffer] = 0;
pControl->setText(dataManager.strBuffer); pControl->setText(dataManager.strBuffer);
} }
void Game::LoadExpansionDB() { void Game::LoadExpansions() {
LoadExpansionDBDirectry("./expansions"); FileSystem::TraversalDir(L"./expansions", [](const wchar_t* name, bool isdir) {
FileSystem::TraversalDir("./expansions", [this](const char* name, bool isdir) { if(!isdir && wcsrchr(name, '.') && !mywcsncasecmp(wcsrchr(name, '.'), L".cdb", 4)) {
if(isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) { wchar_t fpath[1024];
char subdir[1024]; myswprintf(fpath, L"./expansions/%ls", name);
sprintf(subdir, "./expansions/%s", name);
LoadExpansionDBDirectry(subdir);
}
});
}
void Game::LoadExpansionDBDirectry(const char* path) {
FileSystem::TraversalDir(path, [path](const char* name, bool isdir) {
if(!isdir && strrchr(name, '.') && !mystrncasecmp(strrchr(name, '.'), ".cdb", 4)) {
char fpath[1024];
sprintf(fpath, "%s/%s", path, name);
dataManager.LoadDB(fpath); dataManager.LoadDB(fpath);
} }
}); if(!isdir && wcsrchr(name, '.') && !mywcsncasecmp(wcsrchr(name, '.'), L".zip", 4)) {
} wchar_t fpath[1024];
void Game::LoadExpansionStrings() { myswprintf(fpath, L"./expansions/%ls", name);
dataManager.LoadStrings("./expansions/strings.conf"); dataManager.FileSystem->addFileArchive(fpath, true, false);
FileSystem::TraversalDir("./expansions", [](const char* name, bool isdir) {
if(isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char fpath[1024];
sprintf(fpath, "./expansions/%s/strings.conf", name);
dataManager.LoadStrings(fpath);
} }
}); });
for(u32 i = 0; i < DataManager::FileSystem->getFileArchiveCount(); ++i) {
const IFileList* archive = DataManager::FileSystem->getFileArchive(i)->getFileList();
for(u32 j = 0; j < archive->getFileCount(); ++j) {
#ifdef _WIN32
const wchar_t* fname = archive->getFullFileName(j).c_str();
#else
wchar_t fname[1024];
const char* uname = archive->getFullFileName(j).c_str();
BufferIO::DecodeUTF8(uname, fname);
#endif
if(wcsrchr(fname, '.') && !mywcsncasecmp(wcsrchr(fname, '.'), L".cdb", 4))
dataManager.LoadDB(fname);
if(wcsrchr(fname, '.') && !mywcsncasecmp(wcsrchr(fname, '.'), L".conf", 5)) {
IReadFile* reader = DataManager::FileSystem->createAndOpenFile(fname);
dataManager.LoadStrings(reader);
}
}
}
} }
void Game::RefreshDeck(irr::gui::IGUIComboBox* cbDeck) { void Game::RefreshDeck(irr::gui::IGUIComboBox* cbDeck) {
cbDeck->clear(); cbDeck->clear();
...@@ -2151,13 +2155,18 @@ bool Game::CheckRegEx(const std::wstring& text, const std::wstring& exp, bool ex ...@@ -2151,13 +2155,18 @@ bool Game::CheckRegEx(const std::wstring& text, const std::wstring& exp, bool ex
const char* Game::GetLocaleDir(const char* dir) { const char* Game::GetLocaleDir(const char* dir) {
if(!gameConf.locale || !wcscmp(gameConf.locale, L"default")) if(!gameConf.locale || !wcscmp(gameConf.locale, L"default"))
return dir; return dir;
wchar_t locale_buf[256];
wchar_t orig_dir[64];
BufferIO::DecodeUTF8(dir, orig_dir); BufferIO::DecodeUTF8(dir, orig_dir);
myswprintf(locale_buf, L"locales/%ls/%ls", gameConf.locale, orig_dir); myswprintf(locale_buf, L"locales/%ls/%ls", gameConf.locale, orig_dir);
BufferIO::EncodeUTF8(locale_buf, locale_buf_utf8); BufferIO::EncodeUTF8(locale_buf, locale_buf_utf8);
return locale_buf_utf8; return locale_buf_utf8;
} }
const wchar_t* Game::GetLocaleDirWide(const char* dir) {
BufferIO::DecodeUTF8(dir, orig_dir);
if(!gameConf.locale || !wcscmp(gameConf.locale, L"default"))
return orig_dir;
myswprintf(locale_buf, L"locales/%ls/%ls", gameConf.locale, orig_dir);
return locale_buf;
}
void Game::SetCursor(ECURSOR_ICON icon) { void Game::SetCursor(ECURSOR_ICON icon) {
ICursorControl* cursor = mainGame->device->getCursorControl(); ICursorControl* cursor = mainGame->device->getCursorControl();
if(cursor->getActiveIcon() != icon) { if(cursor->getActiveIcon() != icon) {
......
...@@ -130,9 +130,7 @@ public: ...@@ -130,9 +130,7 @@ public:
void BuildProjectionMatrix(irr::core::matrix4& mProjection, f32 left, f32 right, f32 bottom, f32 top, f32 znear, f32 zfar); void BuildProjectionMatrix(irr::core::matrix4& mProjection, f32 left, f32 right, f32 bottom, f32 top, f32 znear, f32 zfar);
void InitStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, u32 cHeight, irr::gui::CGUITTFont* font, const wchar_t* text); void InitStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, u32 cHeight, irr::gui::CGUITTFont* font, const wchar_t* text);
void SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gui::CGUITTFont* font, const wchar_t* text, u32 pos = 0); void SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gui::CGUITTFont* font, const wchar_t* text, u32 pos = 0);
void LoadExpansionDB(); void LoadExpansions();
void LoadExpansionDBDirectry(const char* path);
void LoadExpansionStrings();
void RefreshDeck(irr::gui::IGUIComboBox* cbDeck); void RefreshDeck(irr::gui::IGUIComboBox* cbDeck);
void RefreshReplay(); void RefreshReplay();
void RefreshSingleplay(); void RefreshSingleplay();
...@@ -173,6 +171,7 @@ public: ...@@ -173,6 +171,7 @@ public:
int LocalPlayer(int player); int LocalPlayer(int player);
const wchar_t* LocalName(int local_player); const wchar_t* LocalName(int local_player);
const char* GetLocaleDir(const char* dir); const char* GetLocaleDir(const char* dir);
const wchar_t* GetLocaleDirWide(const char* dir);
bool CheckRegEx(const std::wstring& text, const std::wstring& exp, bool exact = false); bool CheckRegEx(const std::wstring& text, const std::wstring& exp, bool exact = false);
bool HasFocus(EGUI_ELEMENT_TYPE type) const { bool HasFocus(EGUI_ELEMENT_TYPE type) const {
...@@ -258,6 +257,8 @@ public: ...@@ -258,6 +257,8 @@ public:
float yScale; float yScale;
CGUISkinSystem *skinSystem; CGUISkinSystem *skinSystem;
wchar_t locale_buf[256];
wchar_t orig_dir[64];
char locale_buf_utf8[256]; char locale_buf_utf8[256];
ClientField dField; ClientField dField;
......
...@@ -78,17 +78,13 @@ int main(int argc, char* argv[]) { ...@@ -78,17 +78,13 @@ int main(int argc, char* argv[]) {
bool keep_on_return = false; bool keep_on_return = false;
for(int i = 1; i < wargc; ++i) { for(int i = 1; i < wargc; ++i) {
if(wargv[i][0] == L'-' && wargv[i][1] == L'e' && wargv[i][2] != L'\0') { if(wargv[i][0] == L'-' && wargv[i][1] == L'e' && wargv[i][2] != L'\0') {
char param[128]; ygo::dataManager.LoadDB(&wargv[i][2]);
BufferIO::EncodeUTF8(&wargv[i][2], param);
ygo::dataManager.LoadDB(param);
continue; continue;
} }
if(!wcscmp(wargv[i], L"-e")) { // extra database if(!wcscmp(wargv[i], L"-e")) { // extra database
++i; ++i;
if(i < wargc) { if(i < wargc) {
char param[128]; ygo::dataManager.LoadDB(wargv[i]);
BufferIO::EncodeUTF8(wargv[i], param);
ygo::dataManager.LoadDB(param);
} }
continue; continue;
} else if(!wcscmp(wargv[i], L"-n")) { // nickName } else if(!wcscmp(wargv[i], L"-n")) { // nickName
......
...@@ -274,55 +274,25 @@ void imageScaleNNAA(irr::video::IImage *src, irr::video::IImage *dest) { ...@@ -274,55 +274,25 @@ void imageScaleNNAA(irr::video::IImage *src, irr::video::IImage *dest) {
} }
} }
irr::video::ITexture* ImageManager::GetTextureFromFile(char* file, s32 width, s32 height) { irr::video::ITexture* ImageManager::GetTextureFromFile(char* file, s32 width, s32 height) {
#ifdef _WIN32
wchar_t name[1024];
BufferIO::DecodeUTF8(file, name);
#else
char* name = file;
#endif // _WIN32
if(mainGame->gameConf.use_image_scale) { if(mainGame->gameConf.use_image_scale) {
irr::video::ITexture* texture; irr::video::ITexture* texture;
irr::video::IImage* srcimg = driver->createImageFromFile(name); irr::video::IImage* srcimg = driver->createImageFromFile(file);
if(srcimg == NULL) if(srcimg == NULL)
return NULL; return NULL;
if(srcimg->getDimension() == irr::core::dimension2d<u32>(width, height)) { if(srcimg->getDimension() == irr::core::dimension2d<u32>(width, height)) {
texture = driver->addTexture(name, srcimg); texture = driver->addTexture(file, srcimg);
} else { } else {
video::IImage *destimg = driver->createImage(srcimg->getColorFormat(), irr::core::dimension2d<u32>(width, height)); video::IImage *destimg = driver->createImage(srcimg->getColorFormat(), irr::core::dimension2d<u32>(width, height));
imageScaleNNAA(srcimg, destimg); imageScaleNNAA(srcimg, destimg);
texture = driver->addTexture(name, destimg); texture = driver->addTexture(file, destimg);
destimg->drop(); destimg->drop();
} }
srcimg->drop(); srcimg->drop();
return texture; return texture;
} else { } else {
return driver->getTexture(name); return driver->getTexture(file);
} }
} }
irr::video::ITexture* ImageManager::GetTextureExpansions(char* file, s32 width, s32 height) {
irr::video::ITexture* img = GetTextureExpansionsDirectry("./expansions", file, width, height);
if(img != NULL)
return img;
bool find = false;
FileSystem::TraversalDir("./expansions", [this, file, width, height, &img, &find](const char* name, bool isdir) {
if(!find && isdir && strcmp(name, ".") && strcmp(name, "..") && strcmp(name, "pics") && strcmp(name, "script")) {
char subdir[1024];
sprintf(subdir, "./expansions/%s", name);
img = GetTextureExpansionsDirectry(subdir, file, width, height);
if(img)
find = true;
}
});
if(find)
return img;
return img;
}
irr::video::ITexture* ImageManager::GetTextureExpansionsDirectry(const char* path, char* file, s32 width, s32 height) {
char fpath[1000];
sprintf(fpath, "%s/%s", path, file);
return GetTextureFromFile(fpath, width, height);
}
irr::video::ITexture* ImageManager::GetTexture(int code, bool fit) { irr::video::ITexture* ImageManager::GetTexture(int code, bool fit) {
if(code == 0) if(code == 0)
return fit ? tUnknownFit : tUnknown; return fit ? tUnknownFit : tUnknown;
...@@ -338,11 +308,11 @@ irr::video::ITexture* ImageManager::GetTexture(int code, bool fit) { ...@@ -338,11 +308,11 @@ irr::video::ITexture* ImageManager::GetTexture(int code, bool fit) {
auto tit = tMap[fit ? 1 : 0].find(code); auto tit = tMap[fit ? 1 : 0].find(code);
if(tit == tMap[fit ? 1 : 0].end()) { if(tit == tMap[fit ? 1 : 0].end()) {
char file[256]; char file[256];
sprintf(file, "pics/%d.png", code); sprintf(file, "expansions/pics/%d.png", code);
irr::video::ITexture* img = GetTextureExpansions(file, width, height); irr::video::ITexture* img = GetTextureFromFile(file, width, height);
if(img == NULL) { if(img == NULL) {
sprintf(file, "pics/%d.jpg", code); sprintf(file, "expansions/pics/%d.jpg", code);
img = GetTextureExpansions(file, width, height); img = GetTextureFromFile(file, width, height);
} }
if(img == NULL) { if(img == NULL) {
sprintf(file, mainGame->GetLocaleDir("pics/%d.png"), code); sprintf(file, mainGame->GetLocaleDir("pics/%d.png"), code);
...@@ -380,11 +350,11 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) { ...@@ -380,11 +350,11 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
int height = CARD_THUMB_HEIGHT * mainGame->yScale; int height = CARD_THUMB_HEIGHT * mainGame->yScale;
if(tit == tThumb.end()) { if(tit == tThumb.end()) {
char file[256]; char file[256];
sprintf(file, "pics/thumbnail/%d.png", code); sprintf(file, "expansions/pics/thumbnail/%d.png", code);
irr::video::ITexture* img = GetTextureExpansions(file, width, height); irr::video::ITexture* img = GetTextureFromFile(file, width, height);
if(img == NULL) { if(img == NULL) {
sprintf(file, "pics/thumbnail/%d.jpg", code); sprintf(file, "expansions/pics/thumbnail/%d.jpg", code);
img = GetTextureExpansions(file, width, height); img = GetTextureFromFile(file, width, height);
} }
if(img == NULL) { if(img == NULL) {
sprintf(file, mainGame->GetLocaleDir("pics/thumbnail/%d.png"), code); sprintf(file, mainGame->GetLocaleDir("pics/thumbnail/%d.png"), code);
...@@ -403,11 +373,11 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) { ...@@ -403,11 +373,11 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
img = GetTextureFromFile(file, width, height); img = GetTextureFromFile(file, width, height);
} }
if(img == NULL && mainGame->gameConf.use_image_scale) { if(img == NULL && mainGame->gameConf.use_image_scale) {
sprintf(file, "pics/%d.png", code); sprintf(file, "expansions/pics/%d.png", code);
img = GetTextureExpansions(file, width, height); img = GetTextureFromFile(file, width, height);
if(img == NULL) { if(img == NULL) {
sprintf(file, "pics/%d.jpg", code); sprintf(file, "expansions/pics/%d.jpg", code);
img = GetTextureExpansions(file, width, height); img = GetTextureFromFile(file, width, height);
} }
if(img == NULL) { if(img == NULL) {
sprintf(file, mainGame->GetLocaleDir("pics/%d.png"), code); sprintf(file, mainGame->GetLocaleDir("pics/%d.png"), code);
...@@ -437,11 +407,11 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) { ...@@ -437,11 +407,11 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
auto tit = tFields.find(code); auto tit = tFields.find(code);
if(tit == tFields.end()) { if(tit == tFields.end()) {
char file[256]; char file[256];
sprintf(file, "pics/field/%d.png", code); sprintf(file, "expansions/pics/field/%d.png", code);
irr::video::ITexture* img = GetTextureExpansions(file, 512 * mainGame->xScale, 512 * mainGame->yScale); irr::video::ITexture* img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale);
if(img == NULL) { if(img == NULL) {
sprintf(file, "pics/field/%d.jpg", code); sprintf(file, "expansions/pics/field/%d.jpg", code);
img = GetTextureExpansions(file, 512 * mainGame->xScale, 512 * mainGame->yScale); img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale);
} }
if(img == NULL) { if(img == NULL) {
sprintf(file, mainGame->GetLocaleDir("pics/field/%d.png"), code); sprintf(file, mainGame->GetLocaleDir("pics/field/%d.png"), code);
...@@ -481,11 +451,11 @@ irr::video::ITexture* ImageManager::GetTextureField(int code) { ...@@ -481,11 +451,11 @@ irr::video::ITexture* ImageManager::GetTextureField(int code) {
auto tit = tFields.find(code); auto tit = tFields.find(code);
if(tit == tFields.end()) { if(tit == tFields.end()) {
char file[256]; char file[256];
sprintf(file, "pics/field/%d.png", code); sprintf(file, "expansions/pics/field/%d.png", code);
irr::video::ITexture* img = GetTextureExpansions(file, 512 * mainGame->xScale, 512 * mainGame->yScale); irr::video::ITexture* img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale);
if(img == NULL) { if(img == NULL) {
sprintf(file, "pics/field/%d.jpg", code); sprintf(file, "expansions/pics/field/%d.jpg", code);
img = GetTextureExpansions(file, 512 * mainGame->xScale, 512 * mainGame->yScale); img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale);
} }
if(img == NULL) { if(img == NULL) {
sprintf(file, mainGame->GetLocaleDir("pics/field/%d.png"), code); sprintf(file, mainGame->GetLocaleDir("pics/field/%d.png"), code);
......
...@@ -22,8 +22,6 @@ public: ...@@ -22,8 +22,6 @@ public:
void RemoveTexture(int code); void RemoveTexture(int code);
void ResizeTexture(); void ResizeTexture();
irr::video::ITexture* GetTextureFromFile(char* file, s32 width, s32 height); irr::video::ITexture* GetTextureFromFile(char* file, s32 width, s32 height);
irr::video::ITexture* GetTextureExpansions(char* file, s32 width, s32 height);
irr::video::ITexture* GetTextureExpansionsDirectry(const char* path, char* file, s32 width, s32 height);
irr::video::ITexture* GetTexture(int code, bool fit = false); irr::video::ITexture* GetTexture(int code, bool fit = false);
irr::video::ITexture* GetTextureThumb(int code); irr::video::ITexture* GetTextureThumb(int code);
irr::video::ITexture* GetTextureField(int code); irr::video::ITexture* GetTextureField(int code);
......
...@@ -25,7 +25,7 @@ private: ...@@ -25,7 +25,7 @@ private:
public: public:
static Replay cur_replay; static Replay cur_replay;
public: public:
static bool StartReplay(int skipturn); static bool StartReplay(int skipturn);
static void StopReplay(bool is_exiting = false); static void StopReplay(bool is_exiting = false);
...@@ -38,7 +38,7 @@ public: ...@@ -38,7 +38,7 @@ public:
static void Restart(bool refresh); static void Restart(bool refresh);
static void Undo(); static void Undo();
static bool ReplayAnalyze(char* msg, unsigned int len); static bool ReplayAnalyze(char* msg, unsigned int len);
static void ReplayRefresh(int flag = 0xf81fff); static void ReplayRefresh(int flag = 0xf81fff);
static void ReplayRefreshHand(int player, int flag = 0x781fff); static void ReplayRefreshHand(int player, int flag = 0x781fff);
static void ReplayRefreshGrave(int player, int flag = 0x181fff); static void ReplayRefreshGrave(int player, int flag = 0x181fff);
......
...@@ -28,7 +28,7 @@ public: ...@@ -28,7 +28,7 @@ public:
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len); virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len);
virtual void TimeConfirm(DuelPlayer* dp); virtual void TimeConfirm(DuelPlayer* dp);
virtual void EndDuel(); virtual void EndDuel();
void DuelEndProc(); void DuelEndProc();
void WaitforResponse(int playerid); void WaitforResponse(int playerid);
void RefreshMzone(int player, int flag = 0x881fff, int use_cache = 1); void RefreshMzone(int player, int flag = 0x881fff, int use_cache = 1);
...@@ -40,7 +40,7 @@ public: ...@@ -40,7 +40,7 @@ public:
static int MessageHandler(long fduel, int type); static int MessageHandler(long fduel, int type);
static void SingleTimer(evutil_socket_t fd, short events, void* arg); static void SingleTimer(evutil_socket_t fd, short events, void* arg);
protected: protected:
DuelPlayer* players[2]; DuelPlayer* players[2];
DuelPlayer* pplayer[2]; DuelPlayer* pplayer[2];
......
...@@ -17,7 +17,7 @@ public: ...@@ -17,7 +17,7 @@ public:
static void SetResponse(unsigned char* resp, unsigned int len); static void SetResponse(unsigned char* resp, unsigned int len);
static int SinglePlayThread(void* param); static int SinglePlayThread(void* param);
static bool SinglePlayAnalyze(char* msg, unsigned int len); static bool SinglePlayAnalyze(char* msg, unsigned int len);
static void SinglePlayRefresh(int flag = 0xf81fff); static void SinglePlayRefresh(int flag = 0xf81fff);
static void SinglePlayRefreshHand(int player, int flag = 0x781fff); static void SinglePlayRefreshHand(int player, int flag = 0x781fff);
static void SinglePlayRefreshGrave(int player, int flag = 0x181fff); static void SinglePlayRefreshGrave(int player, int flag = 0x181fff);
......
This diff is collapsed.
/*
* BSD 2-Clause License
*
* Copyright 2009 Stephen Liu
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __spmemvfs_h__
#define __spmemvfs_h__
#ifdef __cplusplus
extern "C" {
#endif
#include "sqlite3.h"
#define SPMEMVFS_NAME "spmemvfs"
typedef struct spmembuffer_t {
char * data;
int used;
int total;
} spmembuffer_t;
typedef struct spmemvfs_db_t {
sqlite3 * handle;
spmembuffer_t * mem;
} spmemvfs_db_t;
int spmemvfs_env_init();
void spmemvfs_env_fini();
int spmemvfs_open_db( spmemvfs_db_t * db, const char * path, spmembuffer_t * mem );
int spmemvfs_close_db( spmemvfs_db_t * db );
#ifdef __cplusplus
}
#endif
#endif
...@@ -28,7 +28,7 @@ public: ...@@ -28,7 +28,7 @@ public:
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len); virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len);
virtual void TimeConfirm(DuelPlayer* dp); virtual void TimeConfirm(DuelPlayer* dp);
virtual void EndDuel(); virtual void EndDuel();
void DuelEndProc(); void DuelEndProc();
void WaitforResponse(int playerid); void WaitforResponse(int playerid);
void RefreshMzone(int player, int flag = 0x881fff, int use_cache = 1); void RefreshMzone(int player, int flag = 0x881fff, int use_cache = 1);
...@@ -40,7 +40,7 @@ public: ...@@ -40,7 +40,7 @@ public:
static int MessageHandler(long fduel, int type); static int MessageHandler(long fduel, int type);
static void TagTimer(evutil_socket_t fd, short events, void* arg); static void TagTimer(evutil_socket_t fd, short events, void* arg);
protected: protected:
DuelPlayer* players[4]; DuelPlayer* players[4];
DuelPlayer* pplayer[4]; DuelPlayer* pplayer[4];
......
Subproject commit 97be8132cdfe41b3597e96fa0d317351e3c32eef Subproject commit 848005898ba085a1dfa172085c495418d8afcb16
Subproject commit f3c20205858de66cd956871c3e1db1a5a62b6638 Subproject commit 17096c4264ac893d691a08732d2a929db995baed
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment