Commit bd56c1a2 authored by nanahira's avatar nanahira

add --expansions

parent f746bf7d
...@@ -114,5 +114,7 @@ extern bool auto_watch_mode; ...@@ -114,5 +114,7 @@ extern bool auto_watch_mode;
extern bool open_file; extern bool open_file;
extern wchar_t open_file_name[256]; extern wchar_t open_file_name[256];
extern bool bot_mode; extern bool bot_mode;
extern bool expansions_specified;
extern std::vector<std::wstring> expansions_list;
#endif #endif
...@@ -402,9 +402,11 @@ unsigned char* DataManager::ScriptReaderEx(const char* script_name, int* slen) { ...@@ -402,9 +402,11 @@ unsigned char* DataManager::ScriptReaderEx(const char* script_name, int* slen) {
buffer = ScriptReaderExSingle("specials/", script_name, slen, 9); buffer = ScriptReaderExSingle("specials/", script_name, slen, 9);
if(buffer) if(buffer)
return buffer; return buffer;
buffer = ScriptReaderExSingle("expansions/", script_name, slen); for(auto ex : mainGame->GetExpansionsListU("/")) {
if(buffer) buffer = ScriptReaderExSingle(ex.c_str(), script_name, slen);
return buffer; if(buffer)
return buffer;
}
buffer = ScriptReaderExSingle("", script_name, slen, 2, TRUE); buffer = ScriptReaderExSingle("", script_name, slen, 2, TRUE);
if(buffer) if(buffer)
return buffer; return buffer;
......
...@@ -124,7 +124,6 @@ bool Game::Initialize() { ...@@ -124,7 +124,6 @@ bool Game::Initialize() {
ErrorLog("Failed to load strings!"); ErrorLog("Failed to load strings!");
return false; return false;
} }
LoadExpansions();
dataManager.LoadDB(L"specials/special.cdb"); dataManager.LoadDB(L"specials/special.cdb");
env = device->getGUIEnvironment(); env = device->getGUIEnvironment();
numFont = irr::gui::CGUITTFont::createTTFont(env, gameConf.numfont, 16); numFont = irr::gui::CGUITTFont::createTTFont(env, gameConf.numfont, 16);
...@@ -1044,6 +1043,7 @@ bool Game::Initialize() { ...@@ -1044,6 +1043,7 @@ bool Game::Initialize() {
return true; return true;
} }
void Game::MainLoop() { void Game::MainLoop() {
LoadExpansionsAll();
wchar_t cap[256]; wchar_t cap[256];
camera = smgr->addCameraSceneNode(0); camera = smgr->addCameraSceneNode(0);
irr::core::matrix4 mProjection; irr::core::matrix4 mProjection;
...@@ -1229,12 +1229,12 @@ std::wstring Game::SetStaticText(irr::gui::IGUIStaticText* pControl, irr::u32 cW ...@@ -1229,12 +1229,12 @@ std::wstring Game::SetStaticText(irr::gui::IGUIStaticText* pControl, irr::u32 cW
ret.assign(strBuffer); ret.assign(strBuffer);
return ret; return ret;
} }
void Game::LoadExpansions() { void Game::LoadExpansions(const wchar_t* expansions_path) {
FileSystem::TraversalDir(L"./expansions", [](const wchar_t* name, bool isdir) { FileSystem::TraversalDir(expansions_path, [&](const wchar_t* name, bool isdir) {
if (isdir) if (isdir)
return; return;
wchar_t fpath[1024]; wchar_t fpath[1024];
myswprintf(fpath, L"./expansions/%ls", name); myswprintf(fpath, L"%ls/%ls", expansions_path, name);
if (IsExtension(name, L".cdb")) { if (IsExtension(name, L".cdb")) {
dataManager.LoadDB(fpath); dataManager.LoadDB(fpath);
return; return;
...@@ -1293,6 +1293,39 @@ void Game::LoadExpansions() { ...@@ -1293,6 +1293,39 @@ void Game::LoadExpansions() {
} }
} }
} }
void Game::LoadExpansionsAll() {
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;
}
void Game::RefreshCategoryDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck, bool selectlastused) { void Game::RefreshCategoryDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck, bool selectlastused) {
cbCategory->clear(); cbCategory->clear();
cbCategory->addItem(dataManager.GetSysString(1450)); cbCategory->addItem(dataManager.GetSysString(1450));
......
...@@ -187,8 +187,11 @@ public: ...@@ -187,8 +187,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 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); 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); 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 LoadExpansions(const wchar_t* expansions_path);
void RefreshCategoryDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck, bool selectlastused = true); 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(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck);
void RefreshDeck(const wchar_t* deckpath, const std::function<void(const wchar_t*)>& additem); void RefreshDeck(const wchar_t* deckpath, const std::function<void(const wchar_t*)>& additem);
void RefreshReplay(); void RefreshReplay();
......
...@@ -15,6 +15,8 @@ bool auto_watch_mode = false; ...@@ -15,6 +15,8 @@ bool auto_watch_mode = false;
bool open_file = false; bool open_file = false;
wchar_t open_file_name[256] = L""; wchar_t open_file_name[256] = L"";
bool bot_mode = false; bool bot_mode = false;
bool expansions_specified = false;
std::vector<std::wstring> expansions_list;
void ClickButton(irr::gui::IGUIElement* btn) { void ClickButton(irr::gui::IGUIElement* btn) {
irr::SEvent event; irr::SEvent event;
...@@ -87,6 +89,7 @@ int main(int argc, char* argv[]) { ...@@ -87,6 +89,7 @@ int main(int argc, char* argv[]) {
bool keep_on_return = false; bool keep_on_return = false;
bool deckCategorySpecified = false; bool deckCategorySpecified = false;
expansions_list.push_back(L"./expansions");
for(int i = 1; i < wargc; ++i) { for(int i = 1; i < wargc; ++i) {
if (wargc == 2 && std::wcslen(wargv[1]) >= 4) { if (wargc == 2 && std::wcslen(wargv[1]) >= 4) {
wchar_t* pstrext = wargv[1] + std::wcslen(wargv[1]) - 4; wchar_t* pstrext = wargv[1] + std::wcslen(wargv[1]) - 4;
...@@ -211,6 +214,16 @@ int main(int argc, char* argv[]) { ...@@ -211,6 +214,16 @@ int main(int argc, char* argv[]) {
if(open_file) if(open_file)
ClickButton(ygo::mainGame->btnLoadSinglePlay); ClickButton(ygo::mainGame->btnLoadSinglePlay);
break; 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(); ygo::mainGame->MainLoop();
......
...@@ -331,13 +331,15 @@ irr::video::ITexture* ImageManager::GetTexture(int code, bool fit) { ...@@ -331,13 +331,15 @@ irr::video::ITexture* ImageManager::GetTexture(int code, bool fit) {
if(tit == tMap[fit ? 1 : 0].end()) { if(tit == tMap[fit ? 1 : 0].end()) {
char file[256]; char file[256];
irr::video::ITexture *img = nullptr; irr::video::ITexture *img = nullptr;
if(img == nullptr) { for(auto ex : mainGame->GetExpansionsListU()) {
std::snprintf(file, sizeof file, "expansions/pics/%d.png", code); if(img == nullptr) {
img = GetTextureFromFile(file, width, height); 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, "expansions/pics/%d.jpg", code); if(img == nullptr) {
img = GetTextureFromFile(file, width, height); std::snprintf(file, sizeof file, "%s/pics/%d.jpg", ex.c_str(), code);
img = GetTextureFromFile(file, width, height);
}
} }
if(img == nullptr) { if(img == nullptr) {
std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/%d.png"), code); std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/%d.png"), code);
...@@ -377,10 +379,11 @@ irr::video::ITexture* ImageManager::GetBigPicture(int code, float zoom) { ...@@ -377,10 +379,11 @@ irr::video::ITexture* ImageManager::GetBigPicture(int code, float zoom) {
irr::video::ITexture* texture; irr::video::ITexture* texture;
char file[256]; char file[256];
irr::video::IImage *srcimg = nullptr; irr::video::IImage *srcimg = nullptr;
if(srcimg == nullptr) { for(auto ex : mainGame->GetExpansionsListU())
std::snprintf(file, sizeof file, "expansions/pics/%d.jpg", code); if(srcimg == nullptr) {
srcimg = driver->createImageFromFile(file); std::snprintf(file, sizeof file, "%s/pics/%d.jpg", ex.c_str(), code);
} srcimg = driver->createImageFromFile(file);
}
if(srcimg == nullptr) { if(srcimg == nullptr) {
std::snprintf(file, sizeof file, "pics/%d.jpg", code); std::snprintf(file, sizeof file, "pics/%d.jpg", code);
srcimg = driver->createImageFromFile(file); srcimg = driver->createImageFromFile(file);
...@@ -409,13 +412,15 @@ int ImageManager::LoadThumbThread() { ...@@ -409,13 +412,15 @@ int ImageManager::LoadThumbThread() {
imageManager.tThumbLoadingMutex.unlock(); imageManager.tThumbLoadingMutex.unlock();
char file[256]; char file[256];
irr::video::IImage *img = nullptr; irr::video::IImage *img = nullptr;
if(img == nullptr) { for(auto ex : mainGame->GetExpansionsListU()) {
std::snprintf(file, sizeof file, "expansions/pics/thumbnail/%d.png", code); if(img == nullptr) {
img = imageManager.driver->createImageFromFile(file); 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, "expansions/pics/thumbnail/%d.jpg", code); if(img == nullptr) {
img = imageManager.driver->createImageFromFile(file); std::snprintf(file, sizeof file, "%s/pics/thumbnail/%d.jpg", ex.c_str(), code);
img = imageManager.driver->createImageFromFile(file);
}
} }
if(img == nullptr) { if(img == nullptr) {
std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/thumbnail/%d.png"), code); std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/thumbnail/%d.png"), code);
...@@ -434,13 +439,15 @@ int ImageManager::LoadThumbThread() { ...@@ -434,13 +439,15 @@ int ImageManager::LoadThumbThread() {
img = imageManager.driver->createImageFromFile(file); img = imageManager.driver->createImageFromFile(file);
} }
if(img == nullptr && mainGame->gameConf.use_image_scale) { if(img == nullptr && mainGame->gameConf.use_image_scale) {
if(img == nullptr) { for(auto ex : mainGame->GetExpansionsListU()) {
std::snprintf(file, sizeof file, "expansions/pics/%d.png", code); if(img == nullptr) {
img = imageManager.driver->createImageFromFile(file); 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); if(img == nullptr) {
img = imageManager.driver->createImageFromFile(file); std::snprintf(file, sizeof file, "%s/pics/%d.jpg", ex.c_str(), code);
img = imageManager.driver->createImageFromFile(file);
}
} }
if(img == nullptr) { if(img == nullptr) {
std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/%d.png"), code); std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/%d.png"), code);
...@@ -502,19 +509,21 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) { ...@@ -502,19 +509,21 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
int width = CARD_THUMB_WIDTH * mainGame->xScale; int width = CARD_THUMB_WIDTH * mainGame->xScale;
int height = CARD_THUMB_HEIGHT * mainGame->yScale; int height = CARD_THUMB_HEIGHT * mainGame->yScale;
irr::video::ITexture *img = nullptr; irr::video::ITexture *img = nullptr;
if(img == nullptr) { for(auto ex : mainGame->GetExpansionsListU())
std::snprintf(file, sizeof file, "expansions/pics/thumbnail/%d.jpg", code); if(img == nullptr) {
img = GetTextureFromFile(file, width, height); std::snprintf(file, sizeof file, "%s/pics/thumbnail/%d.jpg", ex.c_str(), code);
} img = GetTextureFromFile(file, width, height);
}
if(img == nullptr) { if(img == nullptr) {
std::snprintf(file, sizeof file, "pics/thumbnail/%d.jpg", code); std::snprintf(file, sizeof file, "pics/thumbnail/%d.jpg", code);
img = GetTextureFromFile(file, width, height); img = GetTextureFromFile(file, width, height);
} }
if(img == nullptr && mainGame->gameConf.use_image_scale) { if(img == nullptr && mainGame->gameConf.use_image_scale) {
if(img == nullptr) { for(auto ex : mainGame->GetExpansionsListU())
std::snprintf(file, sizeof file, "expansions/pics/%d.jpg", code); if(img == nullptr) {
img = GetTextureFromFile(file, width, height); std::snprintf(file, sizeof file, "%s/pics/%d.jpg", ex.c_str(), code);
} img = GetTextureFromFile(file, width, height);
}
if(img == nullptr) { if(img == nullptr) {
std::snprintf(file, sizeof file, "pics/%d.jpg", code); std::snprintf(file, sizeof file, "pics/%d.jpg", code);
img = GetTextureFromFile(file, width, height); img = GetTextureFromFile(file, width, height);
...@@ -561,13 +570,15 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) { ...@@ -561,13 +570,15 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
if(tit == tFields.end()) { if(tit == tFields.end()) {
char file[256]; char file[256];
irr::video::ITexture* img = nullptr; irr::video::ITexture* img = nullptr;
if(img == nullptr) { for(auto ex : mainGame->GetExpansionsListU()) {
std::snprintf(file, sizeof file, "expansions/pics/field/%d.png", code); if(img == nullptr) {
irr::video::ITexture* img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale); 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); if(img == nullptr) {
img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale); 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) { if(img == nullptr) {
std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/field/%d.png"), code); std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/field/%d.png"), code);
...@@ -608,13 +619,15 @@ irr::video::ITexture* ImageManager::GetTextureField(int code) { ...@@ -608,13 +619,15 @@ irr::video::ITexture* ImageManager::GetTextureField(int code) {
if(tit == tFields.end()) { if(tit == tFields.end()) {
char file[256]; char file[256];
irr::video::ITexture *img = nullptr; irr::video::ITexture *img = nullptr;
if(img == nullptr) { for(auto ex : mainGame->GetExpansionsListU()) {
std::snprintf(file, sizeof file, "expansions/pics/field/%d.png", code); if(img == nullptr) {
img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale); 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, "expansions/pics/field/%d.jpg", code); if(img == nullptr) {
img = GetTextureFromFile(file, 512 * mainGame->xScale, 512 * mainGame->yScale); 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) { if(img == nullptr) {
std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/field/%d.png"), code); std::snprintf(file, sizeof file, mainGame->GetLocaleDir("pics/field/%d.png"), code);
......
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