Commit c8e0b04e authored by nanahira's avatar nanahira

Merge branch 'develop' into server-develop

parents a2614631 bd56c1a2
......@@ -116,5 +116,7 @@ extern bool auto_watch_mode;
extern bool open_file;
extern wchar_t open_file_name[256];
extern bool bot_mode;
extern bool expansions_specified;
extern std::vector<std::wstring> expansions_list;
#endif
......@@ -434,19 +434,14 @@ unsigned char* DataManager::ScriptReaderEx(const char* script_name, int* slen) {
buffer = ScriptReaderExSingle("specials/", script_name, slen, 9);
if(buffer)
return buffer;
buffer = ScriptReaderExSingle("expansions/", script_name, slen);
for(auto ex : mainGame->GetExpansionsListU("/")) {
buffer = ScriptReaderExSingle(ex.c_str(), script_name, slen);
if(buffer)
return buffer;
#if defined(SERVER_PRO3_SUPPORT) && !defined(_WIN32)
buffer = ScriptReaderExSingle("Expansions/", script_name, slen);
if(buffer)
return buffer;
#endif
#if !defined(YGOPRO_SERVER_MODE) || defined(SERVER_ZIP_SUPPORT)
}
buffer = ScriptReaderExSingle("", script_name, slen, 2, TRUE);
if(buffer)
return buffer;
#endif
return ScriptReaderExSingle("", script_name, slen);
}
unsigned char* DataManager::ScriptReaderExSingle(const char* path, const char* script_name, int* slen, int pre_len, unsigned int use_irr) {
......
......@@ -97,7 +97,7 @@ void Game::MainServerLoop() {
initUtils();
deckManager.LoadLFList();
dataManager.LoadDB(L"cards.cdb");
LoadExpansions();
LoadExpansionsAll();
#ifdef SERVER_PRO2_SUPPORT
DataManager::FileSystem->addFileArchive("data/script.zip", true, false, irr::io::EFAT_ZIP);
#endif
......@@ -115,7 +115,7 @@ void Game::MainServerLoop() {
}
}
void Game::MainTestLoop(int code) {
LoadExpansions();
LoadExpansionsAll();
dataManager.LoadDB(L"cards.cdb");
fflush(stdout);
NetServer::InitTestCard(code);
......@@ -179,7 +179,6 @@ bool Game::Initialize() {
ErrorLog("Failed to load strings!");
return false;
}
LoadExpansions();
dataManager.LoadDB(L"specials/special.cdb");
env = device->getGUIEnvironment();
numFont = irr::gui::CGUITTFont::createTTFont(env, gameConf.numfont, 16);
......@@ -1100,6 +1099,7 @@ bool Game::Initialize() {
return true;
}
void Game::MainLoop() {
LoadExpansionsAll();
wchar_t cap[256];
camera = smgr->addCameraSceneNode(0);
irr::core::matrix4 mProjection;
......@@ -1286,41 +1286,12 @@ std::wstring Game::SetStaticText(irr::gui::IGUIStaticText* pControl, irr::u32 cW
return ret;
}
#endif //YGOPRO_SERVER_MODE
void Game::LoadExpansions() {
#ifdef SERVER_PRO2_SUPPORT
FileSystem::TraversalDir(L"./cdb", [](const wchar_t* name, bool isdir) {
if (isdir)
return;
wchar_t fpath[1024];
myswprintf(fpath, L"./cdb/%ls", name);
if(IsExtension(name, L".cdb")) {
dataManager.LoadDB(fpath);
}
});
#endif // SERVER_PRO2_SUPPORT
#ifdef SERVER_PRO3_SUPPORT
FileSystem::TraversalDir(L"./Data/locales/zh-CN", [](const wchar_t* name, bool isdir) {
wchar_t fpath[1024];
myswprintf(fpath, L"./Data/locales/zh-CN/%ls", name);
if(!isdir && IsExtension(name, L".cdb")) {
dataManager.LoadDB(fpath);
}
});
#ifndef _WIN32
FileSystem::TraversalDir(L"./Expansions", [](const wchar_t* name, bool isdir) {
wchar_t fpath[1024];
myswprintf(fpath, L"./Expansions/%ls", name);
if(!isdir && IsExtension(name, L".cdb")) {
dataManager.LoadDB(fpath);
}
});
#endif
#endif // SERVER_PRO3_SUPPORT
FileSystem::TraversalDir(L"./expansions", [](const wchar_t* name, bool isdir) {
void Game::LoadExpansions(const wchar_t* expansions_path) {
FileSystem::TraversalDir(expansions_path, [&](const wchar_t* name, bool isdir) {
if (isdir)
return;
wchar_t fpath[1024];
myswprintf(fpath, L"./expansions/%ls", name);
myswprintf(fpath, L"%ls/%ls", expansions_path, name);
if (IsExtension(name, L".cdb")) {
dataManager.LoadDB(fpath);
return;
......@@ -1391,6 +1362,59 @@ void Game::LoadExpansions() {
}
#endif //SERVER_ZIP_SUPPORT
}
void Game::LoadExpansionsAll() {
#ifdef SERVER_PRO2_SUPPORT
FileSystem::TraversalDir(L"./cdb", [](const wchar_t* name, bool isdir) {
if (isdir)
return;
wchar_t fpath[1024];
myswprintf(fpath, L"./cdb/%ls", name);
if(IsExtension(name, L".cdb")) {
dataManager.LoadDB(fpath);
}
});
#endif // SERVER_PRO2_SUPPORT
#ifdef SERVER_PRO3_SUPPORT
FileSystem::TraversalDir(L"./Data/locales/zh-CN", [](const wchar_t* name, bool isdir) {
wchar_t fpath[1024];
myswprintf(fpath, L"./Data/locales/zh-CN/%ls", name);
if(!isdir && IsExtension(name, L".cdb")) {
dataManager.LoadDB(fpath);
}
});
#endif // SERVER_PRO3_SUPPORT
auto list = GetExpansionsList();
for (const auto& exp : list) {
LoadExpansions(exp.c_str());
}
}
std::vector<std::wstring> Game::GetExpansionsList(const wchar_t* suffix) {
if(!suffix)
return expansions_list;
std::vector<std::wstring> list;
wchar_t buf[1024];
for(const auto& exp : expansions_list) {
myswprintf(buf, L"%ls%ls", exp.c_str(), suffix);
list.push_back(buf);
}
return list;
}
std::vector<std::string> Game::GetExpansionsListU(const char* suffix) {
auto list = GetExpansionsList(nullptr);
std::vector<std::string> expansions_list_u;
char exp_u[1024];
char exp_u2[1024];
for (const auto& exp : list) {
BufferIO::EncodeUTF8(exp.c_str(), exp_u);
if(!suffix)
expansions_list_u.push_back(exp_u);
else {
std::snprintf(exp_u2, sizeof exp_u2, "%s%s", exp_u, suffix);
expansions_list_u.push_back(exp_u2);
}
}
return expansions_list_u;
}
#ifndef YGOPRO_SERVER_MODE
void Game::RefreshCategoryDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck, bool selectlastused) {
cbCategory->clear();
......
......@@ -193,7 +193,10 @@ public:
#ifdef YGOPRO_SERVER_MODE
void MainServerLoop();
void MainTestLoop(int code);
void LoadExpansions();
void LoadExpansions(const wchar_t* expansions_path);
void LoadExpansionsAll();
std::vector<std::wstring> GetExpansionsList(const wchar_t * suffix = nullptr);
std::vector<std::string> GetExpansionsListU(const char* suffix = nullptr);
void AddDebugMsg(const char* msgbuf);
void initUtils();
void InjectEnvToRegistry(intptr_t pduel);
......@@ -203,8 +206,11 @@ public:
void BuildProjectionMatrix(irr::core::matrix4& mProjection, irr::f32 left, irr::f32 right, irr::f32 bottom, irr::f32 top, irr::f32 znear, irr::f32 zfar);
void InitStaticText(irr::gui::IGUIStaticText* pControl, irr::u32 cWidth, irr::u32 cHeight, irr::gui::CGUITTFont* font, const wchar_t* text);
std::wstring SetStaticText(irr::gui::IGUIStaticText* pControl, irr::u32 cWidth, irr::gui::CGUITTFont* font, const wchar_t* text, irr::u32 pos = 0);
void LoadExpansions();
void RefreshCategoryDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck, bool selectlastused = true);
void LoadExpansions(const wchar_t* expansions_path);
void LoadExpansionsAll();
std::vector<std::wstring> GetExpansionsList(const wchar_t * suffix = nullptr);
std::vector<std::string> GetExpansionsListU(const char* suffix = nullptr);
void RefreshCategoryDeck(irr::gui::IGUIComboBox *cbCategory, irr::gui::IGUIComboBox *cbDeck, bool selectlastused = true);
void RefreshDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck);
void RefreshDeck(const wchar_t* deckpath, const std::function<void(const wchar_t*)>& additem);
void RefreshReplay();
......
......@@ -9,7 +9,13 @@
#import <CoreFoundation/CoreFoundation.h>
#endif
#ifdef YGOPRO_SERVER_MODE
#include <sstream>
#endif
unsigned int enable_log = 0x3;
bool expansions_specified = false;
std::vector<std::wstring> expansions_list;
#ifndef YGOPRO_SERVER_MODE
bool exit_on_return = false;
bool auto_watch_mode = false;
......@@ -72,6 +78,36 @@ int main(int argc, char* argv[]) {
ygo::Game _game;
#ifdef YGOPRO_SERVER_MODE
enable_log = 1;
bool expansions_specified = false;
wchar_t* expansions_env_val = nullptr;
#ifdef _WIN32
expansions_env_val = _wgetenv(L"YGOPRO_EXPANSIONS");
#else
const char* env_utf8 = std::getenv("YGOPRO_EXPANSIONS");
if(env_utf8) {
expansions_env_val = (wchar_t*)malloc(1024 * sizeof(wchar_t));
BufferIO::DecodeUTF8String(env_utf8, expansions_env_val, 1024);
}
#endif
if (expansions_env_val && expansions_env_val[0] != L'\0') {
expansions_specified = true;
std::wstringstream ss(expansions_env_val);
std::wstring item;
while (std::getline(ss, item, L',')) {
if (!item.empty()) {
expansions_list.push_back(item);
}
}
} else {
expansions_specified = false;
expansions_list.push_back(L"./expansions");
#if defined(SERVER_PRO3_SUPPORT) && !defined(_WIN32) && !defined(__APPLE__)
expansions_list.push_back(L"./Expansions");
#endif
}
ygo::server_port = 7911;
ygo::replay_mode = 0;
ygo::duel_flags = 0;
......@@ -157,6 +193,7 @@ int main(int argc, char* argv[]) {
bool keep_on_return = false;
bool deckCategorySpecified = false;
expansions_list.push_back(L"./expansions");
for(int i = 1; i < wargc; ++i) {
if (wargc == 2 && std::wcslen(wargv[1]) >= 4) {
wchar_t* pstrext = wargv[1] + std::wcslen(wargv[1]) - 4;
......@@ -281,6 +318,16 @@ int main(int argc, char* argv[]) {
if(open_file)
ClickButton(ygo::mainGame->btnLoadSinglePlay);
break;
} else if(!std::wcscmp(wargv[i], L"--expansions")) { // specify expansions
++i;
if(i < wargc) {
if(!expansions_specified) {
expansions_list.clear();
expansions_specified = true;
}
expansions_list.push_back(wargv[i]);
}
continue;
}
}
ygo::mainGame->MainLoop();
......
......@@ -330,12 +330,17 @@ irr::video::ITexture* ImageManager::GetTexture(int code, bool fit) {
auto tit = tMap[fit ? 1 : 0].find(code);
if(tit == tMap[fit ? 1 : 0].end()) {
char file[256];
std::snprintf(file, sizeof file, "expansions/pics/%d.png", code);
irr::video::ITexture* img = GetTextureFromFile(file, width, height);
irr::video::ITexture *img = nullptr;
for(auto ex : mainGame->GetExpansionsListU()) {
if(img == nullptr) {
std::snprintf(file, sizeof file, "expansions/pics/%d.jpg", code);
std::snprintf(file, sizeof file, "%s/pics/%d.png", ex.c_str(), code);
img = GetTextureFromFile(file, width, height);
}
if(img == nullptr) {
std::snprintf(file, sizeof file, "%s/pics/%d.jpg", ex.c_str(), code);
img = GetTextureFromFile(file, width, height);
}
}
if(img == nullptr) {
std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/%d.png"), code);
img = GetTextureFromFile(file, width, height);
......@@ -373,8 +378,12 @@ irr::video::ITexture* ImageManager::GetBigPicture(int code, float zoom) {
}
irr::video::ITexture* texture;
char file[256];
std::snprintf(file, sizeof file, "expansions/pics/%d.jpg", code);
irr::video::IImage* srcimg = driver->createImageFromFile(file);
irr::video::IImage *srcimg = nullptr;
for(auto ex : mainGame->GetExpansionsListU())
if(srcimg == nullptr) {
std::snprintf(file, sizeof file, "%s/pics/%d.jpg", ex.c_str(), code);
srcimg = driver->createImageFromFile(file);
}
if(srcimg == nullptr) {
std::snprintf(file, sizeof file, "pics/%d.jpg", code);
srcimg = driver->createImageFromFile(file);
......@@ -402,12 +411,17 @@ int ImageManager::LoadThumbThread() {
imageManager.tThumbLoadingCodes.pop();
imageManager.tThumbLoadingMutex.unlock();
char file[256];
std::snprintf(file, sizeof file, "expansions/pics/thumbnail/%d.png", code);
irr::video::IImage* img = imageManager.driver->createImageFromFile(file);
irr::video::IImage *img = nullptr;
for(auto ex : mainGame->GetExpansionsListU()) {
if(img == nullptr) {
std::snprintf(file, sizeof file, "expansions/pics/thumbnail/%d.jpg", code);
std::snprintf(file, sizeof file, "%s/pics/thumbnail/%d.png", ex.c_str(), code);
img = imageManager.driver->createImageFromFile(file);
}
if(img == nullptr) {
std::snprintf(file, sizeof file, "%s/pics/thumbnail/%d.jpg", ex.c_str(), code);
img = imageManager.driver->createImageFromFile(file);
}
}
if(img == nullptr) {
std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/thumbnail/%d.png"), code);
img = imageManager.driver->createImageFromFile(file);
......@@ -425,12 +439,16 @@ int ImageManager::LoadThumbThread() {
img = imageManager.driver->createImageFromFile(file);
}
if(img == nullptr && mainGame->gameConf.use_image_scale) {
std::snprintf(file, sizeof file, "expansions/pics/%d.png", code);
for(auto ex : mainGame->GetExpansionsListU()) {
if(img == nullptr) {
std::snprintf(file, sizeof file, "%s/pics/%d.png", ex.c_str(), code);
img = imageManager.driver->createImageFromFile(file);
}
if(img == nullptr) {
std::snprintf(file, sizeof file, "expansions/pics/%d.jpg", code);
std::snprintf(file, sizeof file, "%s/pics/%d.jpg", ex.c_str(), code);
img = imageManager.driver->createImageFromFile(file);
}
}
if(img == nullptr) {
std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/%d.png"), code);
img = imageManager.driver->createImageFromFile(file);
......@@ -488,24 +506,31 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
auto tit = tThumb.find(code);
if(tit == tThumb.end() && !mainGame->gameConf.use_image_load_background_thread) {
char file[256];
std::snprintf(file, sizeof file, "expansions/pics/thumbnail/%d.jpg", code);
int width = CARD_THUMB_WIDTH * mainGame->xScale;
int height = CARD_THUMB_HEIGHT * mainGame->yScale;
irr::video::ITexture* img = GetTextureFromFile(file, width, height);
if(img == NULL) {
irr::video::ITexture *img = nullptr;
for(auto ex : mainGame->GetExpansionsListU())
if(img == nullptr) {
std::snprintf(file, sizeof file, "%s/pics/thumbnail/%d.jpg", ex.c_str(), code);
img = GetTextureFromFile(file, width, height);
}
if(img == nullptr) {
std::snprintf(file, sizeof file, "pics/thumbnail/%d.jpg", code);
img = GetTextureFromFile(file, width, height);
}
if(img == NULL && mainGame->gameConf.use_image_scale) {
std::snprintf(file, sizeof file, "expansions/pics/%d.jpg", code);
if(img == nullptr && mainGame->gameConf.use_image_scale) {
for(auto ex : mainGame->GetExpansionsListU())
if(img == nullptr) {
std::snprintf(file, sizeof file, "%s/pics/%d.jpg", ex.c_str(), code);
img = GetTextureFromFile(file, width, height);
if(img == NULL) {
}
if(img == nullptr) {
std::snprintf(file, sizeof file, "pics/%d.jpg", code);
img = GetTextureFromFile(file, width, height);
}
}
tThumb[code] = img;
return (img == NULL) ? tUnknownThumb : img;
return (img == nullptr) ? tUnknownThumb : img;
}
if(tit == tThumb.end() || tit->second == tLoading) {
imageManager.tThumbLoadingMutex.lock();
......@@ -544,12 +569,17 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
auto tit = tFields.find(code);
if(tit == tFields.end()) {
char file[256];
std::snprintf(file, sizeof file, "expansions/pics/field/%d.png", code);
irr::video::ITexture* img = nullptr;
for(auto ex : mainGame->GetExpansionsListU()) {
if(img == nullptr) {
std::snprintf(file, sizeof file, "%s/pics/field/%d.png", ex.c_str(), code);
irr::video::ITexture* img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale);
}
if(img == nullptr) {
std::snprintf(file, sizeof file, "expansions/pics/field/%d.jpg", code);
std::snprintf(file, sizeof file, "%s/pics/field/%d.jpg", ex.c_str(), code);
img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale);
}
}
if(img == nullptr) {
std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/field/%d.png"), code);
img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale);
......@@ -588,12 +618,17 @@ irr::video::ITexture* ImageManager::GetTextureField(int code) {
auto tit = tFields.find(code);
if(tit == tFields.end()) {
char file[256];
std::snprintf(file, sizeof file, "expansions/pics/field/%d.png", code);
irr::video::ITexture* img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale);
irr::video::ITexture *img = nullptr;
for(auto ex : mainGame->GetExpansionsListU()) {
if(img == nullptr) {
std::snprintf(file, sizeof file, "expansions/pics/field/%d.jpg", code);
std::snprintf(file, sizeof file, "%s/pics/field/%d.png", ex.c_str(), code);
img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale);
}
if(img == nullptr) {
std::snprintf(file, sizeof file, "%s/pics/field/%d.jpg", ex.c_str(), code);
img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale);
}
}
if(img == nullptr) {
std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/field/%d.png"), code);
img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale);
......
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