Commit f707e95b authored by nanahira's avatar nanahira

Merge branch 'server' of github.com:moecube/ygopro into server

parents 490c6942 82160119
...@@ -7,10 +7,19 @@ namespace ygo { ...@@ -7,10 +7,19 @@ 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];
#ifndef YGOPRO_SERVER_MODE
IFileSystem* DataManager::FileSystem; IFileSystem* DataManager::FileSystem;
#endif
DataManager dataManager; DataManager dataManager;
bool DataManager::LoadDB(const wchar_t* wfile) { bool DataManager::LoadDB(const wchar_t* wfile) {
#ifdef YGOPRO_SERVER_MODE
char file[256];
BufferIO::EncodeUTF8(wfile, file);
sqlite3* pDB;
if(sqlite3_open_v2(file, &pDB, SQLITE_OPEN_READONLY, 0) != SQLITE_OK)
return Error(pDB);
#else
IReadFile* reader = FileSystem->createAndOpenFile(wfile); IReadFile* reader = FileSystem->createAndOpenFile(wfile);
if(reader == NULL) if(reader == NULL)
return false; return false;
...@@ -27,6 +36,7 @@ bool DataManager::LoadDB(const wchar_t* wfile) { ...@@ -27,6 +36,7 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
if(spmemvfs_open_db(&db, file, mem) != SQLITE_OK) if(spmemvfs_open_db(&db, file, mem) != SQLITE_OK)
return Error(&db); return Error(&db);
sqlite3* pDB = db.handle; sqlite3* pDB = db.handle;
#endif //YGOPRO_SERVER_MODE
sqlite3_stmt* pStmt; sqlite3_stmt* pStmt;
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
const char* sql = "select * from datas"; const char* sql = "select * from datas";
...@@ -34,14 +44,22 @@ bool DataManager::LoadDB(const wchar_t* wfile) { ...@@ -34,14 +44,22 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
const char* sql = "select * from datas,texts where datas.id=texts.id"; const char* sql = "select * from datas,texts where datas.id=texts.id";
#endif #endif
if(sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK) if(sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK)
#ifdef YGOPRO_SERVER_MODE
return Error(pDB);
#else
return Error(&db); return Error(&db);
#endif
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)
#ifdef YGOPRO_SERVER_MODE
return Error(pDB, pStmt);
#else
return Error(&db, pStmt); return Error(&db, pStmt);
#endif
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);
...@@ -83,8 +101,12 @@ bool DataManager::LoadDB(const wchar_t* wfile) { ...@@ -83,8 +101,12 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
} }
} while(step != SQLITE_DONE); } while(step != SQLITE_DONE);
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
#ifdef YGOPRO_SERVER_MODE
sqlite3_close(pDB);
#else
spmemvfs_close_db(&db); spmemvfs_close_db(&db);
spmemvfs_env_fini(); spmemvfs_env_fini();
#endif
return true; return true;
} }
bool DataManager::LoadStrings(const char* file) { bool DataManager::LoadStrings(const char* file) {
...@@ -100,6 +122,7 @@ bool DataManager::LoadStrings(const char* file) { ...@@ -100,6 +122,7 @@ bool DataManager::LoadStrings(const char* file) {
myswprintf(numStrings[i], L"%d", i); myswprintf(numStrings[i], L"%d", i);
return true; return true;
} }
#ifndef YGOPRO_SERVER_MODE
bool DataManager::LoadStrings(IReadFile* reader) { bool DataManager::LoadStrings(IReadFile* reader) {
char ch[2] = " "; char ch[2] = " ";
char linebuf[256] = ""; char linebuf[256] = "";
...@@ -115,6 +138,7 @@ bool DataManager::LoadStrings(IReadFile* reader) { ...@@ -115,6 +138,7 @@ bool DataManager::LoadStrings(IReadFile* reader) {
reader->drop(); reader->drop();
return true; return true;
} }
#endif //YGOPRO_SERVER_MODE
void DataManager::ReadStringConfLine(const char* linebuf) { void DataManager::ReadStringConfLine(const char* linebuf) {
if(linebuf[0] != '!') if(linebuf[0] != '!')
return; return;
...@@ -139,6 +163,15 @@ void DataManager::ReadStringConfLine(const char* linebuf) { ...@@ -139,6 +163,15 @@ void DataManager::ReadStringConfLine(const char* linebuf) {
_setnameStrings[value] = strBuffer; _setnameStrings[value] = strBuffer;
} }
} }
#ifdef YGOPRO_SERVER_MODE
bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) {
BufferIO::DecodeUTF8(sqlite3_errmsg(pDB), strBuffer);
if(pStmt)
sqlite3_finalize(pStmt);
sqlite3_close(pDB);
return false;
}
#else
bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) { bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) {
BufferIO::DecodeUTF8(sqlite3_errmsg(pDB->handle), strBuffer); BufferIO::DecodeUTF8(sqlite3_errmsg(pDB->handle), strBuffer);
if(pStmt) if(pStmt)
...@@ -147,6 +180,7 @@ bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) { ...@@ -147,6 +180,7 @@ bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) {
spmemvfs_env_fini(); spmemvfs_env_fini();
return false; return false;
} }
#endif
bool DataManager::GetData(int code, CardData* pData) { bool DataManager::GetData(int code, CardData* pData) {
auto cdit = _datas.find(code); auto cdit = _datas.find(code);
if(cdit == _datas.end()) if(cdit == _datas.end())
...@@ -381,6 +415,17 @@ byte* DataManager::ScriptReaderExSingle(const char* path, const char* script_nam ...@@ -381,6 +415,17 @@ byte* DataManager::ScriptReaderExSingle(const char* path, const char* script_nam
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 YGOPRO_SERVER_MODE
fp = fopen(script_name, "rb");
if(!fp)
return 0;
int len = fread(scriptBuffer, 1, sizeof(scriptBuffer), fp);
fclose(fp);
if(len >= sizeof(scriptBuffer))
return 0;
*slen = len;
#else
wchar_t fname[256]; wchar_t fname[256];
BufferIO::DecodeUTF8(script_name, fname); BufferIO::DecodeUTF8(script_name, fname);
IReadFile* reader = FileSystem->createAndOpenFile(fname); IReadFile* reader = FileSystem->createAndOpenFile(fname);
...@@ -394,6 +439,7 @@ byte* DataManager::ScriptReader(const char* script_name, int* slen) { ...@@ -394,6 +439,7 @@ byte* DataManager::ScriptReader(const char* script_name, int* slen) {
reader->read(scriptBuffer, size); reader->read(scriptBuffer, size);
reader->drop(); reader->drop();
*slen = size; *slen = size;
#endif //YGOPRO_SERVER_MODE
return scriptBuffer; return scriptBuffer;
} }
......
...@@ -3,7 +3,9 @@ ...@@ -3,7 +3,9 @@
#include "config.h" #include "config.h"
#include "sqlite3.h" #include "sqlite3.h"
#ifndef YGOPRO_SERVER_MODE
#include "spmemvfs.h" #include "spmemvfs.h"
#endif
#include "client_card.h" #include "client_card.h"
#include <unordered_map> #include <unordered_map>
...@@ -14,9 +16,14 @@ public: ...@@ -14,9 +16,14 @@ public:
DataManager(): _datas(8192), _strings(8192) {} DataManager(): _datas(8192), _strings(8192) {}
bool LoadDB(const wchar_t* wfile); bool LoadDB(const wchar_t* wfile);
bool LoadStrings(const char* file); bool LoadStrings(const char* file);
#ifndef YGOPRO_SERVER_MODE
bool LoadStrings(IReadFile* reader); bool LoadStrings(IReadFile* reader);
void ReadStringConfLine(const char* linebuf); void ReadStringConfLine(const char* linebuf);
bool Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt = 0); bool Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt = 0);
#else
void ReadStringConfLine(const char* linebuf);
bool Error(sqlite3* pDB, sqlite3_stmt* pStmt = 0);
#endif
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);
...@@ -58,7 +65,9 @@ public: ...@@ -58,7 +65,9 @@ public:
static byte* ScriptReaderEx(const char* script_name, int* slen); static byte* ScriptReaderEx(const char* script_name, int* slen);
static byte* ScriptReaderExSingle(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);
#ifndef YGOPRO_SERVER_MODE
static IFileSystem* FileSystem; static IFileSystem* FileSystem;
#endif
}; };
extern DataManager dataManager; extern DataManager dataManager;
......
...@@ -32,10 +32,9 @@ HostInfo game_info; ...@@ -32,10 +32,9 @@ HostInfo game_info;
void Game::MainServerLoop() { void Game::MainServerLoop() {
initUtils(); initUtils();
deckManager.LoadLFList(); deckManager.LoadLFList();
LoadBetaDB(); LoadExpansions();
LoadExpansionDB(); dataManager.LoadDB(L"cards.cdb");
dataManager.LoadDB("cards.cdb");
aServerPort = NetServer::StartServer(aServerPort); aServerPort = NetServer::StartServer(aServerPort);
NetServer::InitDuel(); NetServer::InitDuel();
printf("%u\n", aServerPort); printf("%u\n", aServerPort);
...@@ -50,44 +49,11 @@ void Game::MainServerLoop() { ...@@ -50,44 +49,11 @@ void Game::MainServerLoop() {
} }
} }
void Game::MainTestLoop(int code) { void Game::MainTestLoop(int code) {
LoadBetaDB(); LoadExpansions();
LoadExpansionDB(); dataManager.LoadDB(L"cards.cdb");
dataManager.LoadDB("cards.cdb");
fflush(stdout); fflush(stdout);
NetServer::InitTestCard(code); NetServer::InitTestCard(code);
} }
void Game::LoadBetaDB() {
LoadExpansionDBDirectry("./beta");
#ifdef _WIN32
char fpath[1000];
WIN32_FIND_DATAW fdataw;
HANDLE fh = FindFirstFileW(L"./beta/*", &fdataw);
if(fh != INVALID_HANDLE_VALUE) {
do {
if(wcscmp(L".",fdataw.cFileName) != 0 && wcscmp(L"..",fdataw.cFileName) != 0 && fdataw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
char fname[780];
BufferIO::EncodeUTF8(fdataw.cFileName, fname);
sprintf(fpath, "./beta/%s", fname);
LoadExpansionDBDirectry(fpath);
}
} while(FindNextFileW(fh, &fdataw));
FindClose(fh);
}
#else
DIR * dir;
struct dirent * dirp;
if((dir = opendir("./beta/")) != NULL) {
while((dirp = readdir(dir)) != NULL) {
if (strcmp(".", dirp->d_name) == 0 || strcmp("..", dirp->d_name) == 0 || dirp->d_type != DT_DIR)
continue;
char filepath[1000];
sprintf(filepath, "./beta/%s/", dirp->d_name);
LoadExpansionDBDirectry(filepath);
}
closedir(dir);
}
#endif
}
#else //YGOPRO_SERVER_MODE #else //YGOPRO_SERVER_MODE
bool Game::Initialize() { bool Game::Initialize() {
srand(time(0)); srand(time(0));
...@@ -1061,6 +1027,9 @@ void Game::LoadExpansions() { ...@@ -1061,6 +1027,9 @@ void Game::LoadExpansions() {
myswprintf(fpath, L"./expansions/%ls", name); myswprintf(fpath, L"./expansions/%ls", name);
dataManager.LoadDB(fpath); dataManager.LoadDB(fpath);
} }
#ifdef YGOPRO_SERVER_MODE
});
#else
if(!isdir && wcsrchr(name, '.') && !mywcsncasecmp(wcsrchr(name, '.'), L".zip", 4)) { if(!isdir && wcsrchr(name, '.') && !mywcsncasecmp(wcsrchr(name, '.'), L".zip", 4)) {
wchar_t fpath[1024]; wchar_t fpath[1024];
myswprintf(fpath, L"./expansions/%ls", name); myswprintf(fpath, L"./expansions/%ls", name);
...@@ -1085,6 +1054,7 @@ void Game::LoadExpansions() { ...@@ -1085,6 +1054,7 @@ void Game::LoadExpansions() {
} }
} }
} }
#endif //YGOPRO_SERVER_MODE
} }
#ifndef YGOPRO_SERVER_MODE #ifndef YGOPRO_SERVER_MODE
void Game::RefreshDeck(irr::gui::IGUIComboBox* cbDeck) { void Game::RefreshDeck(irr::gui::IGUIComboBox* cbDeck) {
......
...@@ -132,9 +132,7 @@ public: ...@@ -132,9 +132,7 @@ public:
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
void MainServerLoop(); void MainServerLoop();
void MainTestLoop(int code); void MainTestLoop(int code);
void LoadExpansionDB(); void LoadExpansions();
void LoadExpansionDBDirectry(const char* path);
void LoadBetaDB();
void AddDebugMsg(const char* msgbuf); void AddDebugMsg(const char* msgbuf);
void initUtils(); void initUtils();
#else #else
......
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