Commit 1ae7b399 authored by nanahira's avatar nanahira

Merge branch 'master' into server

parents bc9c0526 3214865a
...@@ -465,7 +465,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) { ...@@ -465,7 +465,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
// text // text
wchar_t formatBuffer[2048]; wchar_t formatBuffer[2048];
if(conti_selecting) if(conti_selecting)
myswprintf(formatBuffer, L"%ls", DataManager::unknown_string); myswprintf(formatBuffer, L"%ls", dataManager.unknown_string);
else if(cant_check_grave && selectable_cards[i]->location == LOCATION_GRAVE) else if(cant_check_grave && selectable_cards[i]->location == LOCATION_GRAVE)
myswprintf(formatBuffer, L"%ls", dataManager.FormatLocation(selectable_cards[i]->location, 0)); myswprintf(formatBuffer, L"%ls", dataManager.FormatLocation(selectable_cards[i]->location, 0));
else if(selectable_cards[i]->location == LOCATION_OVERLAY) else if(selectable_cards[i]->location == LOCATION_OVERLAY)
...@@ -1569,7 +1569,8 @@ void ClientField::UpdateDeclarableList() { ...@@ -1569,7 +1569,8 @@ void ClientField::UpdateDeclarableList() {
int trycode = BufferIO::GetVal(pname); int trycode = BufferIO::GetVal(pname);
CardData cd; CardData cd;
if (dataManager.GetData(trycode, &cd) && is_declarable(cd, declare_opcodes)) { if (dataManager.GetData(trycode, &cd) && is_declarable(cd, declare_opcodes)) {
auto it = dataManager.GetStringPointer(trycode); auto& _strings = dataManager.GetStringTable();
auto it = _strings.find(trycode);
mainGame->lstANCard->clear(); mainGame->lstANCard->clear();
ancard.clear(); ancard.clear();
mainGame->lstANCard->addItem(it->second.name.c_str()); mainGame->lstANCard->addItem(it->second.name.c_str());
...@@ -1590,19 +1591,23 @@ void ClientField::UpdateDeclarableList() { ...@@ -1590,19 +1591,23 @@ void ClientField::UpdateDeclarableList() {
// if(ancard.size()) // if(ancard.size())
// return; // return;
} }
for(auto cit = dataManager.strings_begin(); cit != dataManager.strings_end(); ++cit) { auto& _datas = dataManager.GetDataTable();
if(cit->second.name.find(pname) != std::wstring::npos || mainGame->CheckRegEx(cit->second.name, pname)) { auto& _strings = dataManager.GetStringTable();
auto cp = dataManager.GetCodePointer(cit->first); for(auto& entry : _strings) {
if (cp == dataManager.datas_end()) auto& code = entry.first;
auto& str = entry.second;
if(str.name.find(pname) != std::wstring::npos) {
auto cp = _datas.find(code);
if (cp == _datas.end())
continue; continue;
//datas.alias can be double card names or alias //datas.alias can be double card names or alias
if(is_declarable(cp->second, declare_opcodes)) { if(is_declarable(cp->second, declare_opcodes)) {
if(pname == cit->second.name) { //exact match if(pname == str.name) { //exact match
mainGame->lstANCard->insertItem(0, cit->second.name.c_str(), -1); mainGame->lstANCard->insertItem(0, str.name.c_str(), -1);
ancard.insert(ancard.begin(), cit->first); ancard.insert(ancard.begin(), code);
} else { } else {
mainGame->lstANCard->addItem(cit->second.name.c_str()); mainGame->lstANCard->addItem(str.name.c_str());
ancard.push_back(cit->first); ancard.push_back(code);
} }
} }
} }
......
...@@ -108,7 +108,7 @@ extern bool auto_watch_mode; ...@@ -108,7 +108,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; extern std::vector<std::wstring> expansions_list;
extern std::vector<std::wstring> extra_script_list;
#endif #endif
...@@ -6,11 +6,7 @@ ...@@ -6,11 +6,7 @@
namespace ygo { namespace ygo {
const wchar_t* DataManager::unknown_string = L"???";
unsigned char DataManager::scriptBuffer[0x100000] = {}; unsigned char DataManager::scriptBuffer[0x100000] = {};
#if !defined(YGOPRO_SERVER_MODE) || defined(SERVER_ZIP_SUPPORT)
irr::io::IFileSystem* DataManager::FileSystem = nullptr;
#endif
DataManager dataManager; DataManager dataManager;
DataManager::DataManager() : _datas(32768), _strings(32768) { DataManager::DataManager() : _datas(32768), _strings(32768) {
...@@ -614,9 +610,9 @@ unsigned char* DataManager::ReadScriptFromIrrFS(const char* script_name, int* sl ...@@ -614,9 +610,9 @@ unsigned char* DataManager::ReadScriptFromIrrFS(const char* script_name, int* sl
#ifdef _WIN32 #ifdef _WIN32
wchar_t fname[256]{}; wchar_t fname[256]{};
BufferIO::DecodeUTF8(script_name, fname); BufferIO::DecodeUTF8(script_name, fname);
auto reader = FileSystem->createAndOpenFile(fname); auto reader = dataManager.FileSystem->createAndOpenFile(fname);
#else #else
auto reader = FileSystem->createAndOpenFile(script_name); auto reader = dataManager.FileSystem->createAndOpenFile(script_name);
#endif #endif
if (!reader) if (!reader)
return nullptr; return nullptr;
...@@ -639,6 +635,13 @@ unsigned char* DataManager::ReadScriptFromFile(const char* script_name, int* sle ...@@ -639,6 +635,13 @@ unsigned char* DataManager::ReadScriptFromFile(const char* script_name, int* sle
*slen = (int)len; *slen = (int)len;
return scriptBuffer; return scriptBuffer;
} }
void DataManager::LoadExtraScripts(intptr_t pduel) {
char sname[1024];
for(auto name : extra_script_list) {
BufferIO::EncodeUTF8(name.c_str(), sname);
preload_script(pduel, sname);
}
}
#ifndef YGOPRO_SERVER_MODE #ifndef YGOPRO_SERVER_MODE
bool DataManager::deck_sort_lv(code_pointer p1, code_pointer p2) { bool DataManager::deck_sort_lv(code_pointer p1, code_pointer p2) {
if ((p1->second.type & 0x7) != (p2->second.type & 0x7)) if ((p1->second.type & 0x7) != (p2->second.type & 0x7))
......
...@@ -85,17 +85,13 @@ public: ...@@ -85,17 +85,13 @@ public:
code_pointer GetCodePointer(uint32_t code) const; code_pointer GetCodePointer(uint32_t code) const;
#ifndef YGOPRO_SERVER_MODE #ifndef YGOPRO_SERVER_MODE
string_pointer GetStringPointer(uint32_t code) const; string_pointer GetStringPointer(uint32_t code) const;
code_pointer datas_begin() const noexcept { #endif //YGOPRO_SERVER_MODE
return _datas.cbegin(); const std::unordered_map<uint32_t, CardDataC>& GetDataTable() const {
} return _datas;
code_pointer datas_end() const noexcept {
return _datas.cend();
}
string_pointer strings_begin() const noexcept {
return _strings.cbegin();
} }
string_pointer strings_end() const noexcept { #ifndef YGOPRO_SERVER_MODE
return _strings.cend(); const std::unordered_map<uint32_t, CardString>& GetStringTable() const {
return _strings;
} }
#endif //YGOPRO_SERVER_MODE #endif //YGOPRO_SERVER_MODE
bool GetData(uint32_t code, CardData* pData) const; bool GetData(uint32_t code, CardData* pData) const;
...@@ -123,13 +119,17 @@ public: ...@@ -123,13 +119,17 @@ public:
std::unordered_map<unsigned int, std::wstring> _sysStrings; std::unordered_map<unsigned int, std::wstring> _sysStrings;
std::vector<std::pair<std::wstring, std::wstring>> _serverStrings; std::vector<std::pair<std::wstring, std::wstring>> _serverStrings;
#endif #endif
const wchar_t* unknown_string{ L"???" };
char errmsg[512]{}; char errmsg[512]{};
#if !defined(YGOPRO_SERVER_MODE) || defined(SERVER_ZIP_SUPPORT)
irr::io::IFileSystem* FileSystem{};
#endif
static unsigned char scriptBuffer[0x100000]; static unsigned char scriptBuffer[0x100000];
static const wchar_t* unknown_string;
static uint32_t CardReader(uint32_t, card_data*); static uint32_t CardReader(uint32_t, card_data*);
static unsigned char* ScriptReaderEx(const char* script_name, int* slen); static unsigned char* ScriptReaderEx(const char* script_name, int* slen);
static unsigned char* ScriptReaderExSingle(const char* path, const char* script_name, int* slen, int pre_len = 2, unsigned int use_irr = FALSE); static unsigned char* ScriptReaderExSingle(const char* path, const char* script_name, int* slen, int pre_len = 2, unsigned int use_irr = FALSE);
void LoadExtraScripts(intptr_t pduel);
#if !defined(YGOPRO_SERVER_MODE) || defined(SERVER_ZIP_SUPPORT) #if !defined(YGOPRO_SERVER_MODE) || defined(SERVER_ZIP_SUPPORT)
//read by IFileSystem //read by IFileSystem
...@@ -138,10 +138,6 @@ public: ...@@ -138,10 +138,6 @@ public:
//read by fread //read by fread
static unsigned char* ReadScriptFromFile(const char* script_name, int* slen); static unsigned char* ReadScriptFromFile(const char* script_name, int* slen);
#if !defined(YGOPRO_SERVER_MODE) || defined(SERVER_ZIP_SUPPORT)
static irr::io::IFileSystem* FileSystem;
#endif
#ifndef YGOPRO_SERVER_MODE #ifndef YGOPRO_SERVER_MODE
static bool deck_sort_lv(code_pointer l1, code_pointer l2); static bool deck_sort_lv(code_pointer l1, code_pointer l2);
static bool deck_sort_atk(code_pointer l1, code_pointer l2); static bool deck_sort_atk(code_pointer l1, code_pointer l2);
......
...@@ -141,6 +141,7 @@ void DeckBuilder::Terminate() { ...@@ -141,6 +141,7 @@ void DeckBuilder::Terminate() {
bool DeckBuilder::OnEvent(const irr::SEvent& event) { bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(mainGame->dField.OnCommonEvent(event)) if(mainGame->dField.OnCommonEvent(event))
return false; return false;
auto& _datas = dataManager.GetDataTable();
switch(event.EventType) { switch(event.EventType) {
case irr::EET_GUI_EVENT: { case irr::EET_GUI_EVENT: {
irr::s32 id = event.GUIEvent.Caller->getID(); irr::s32 id = event.GUIEvent.Caller->getID();
...@@ -472,7 +473,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -472,7 +473,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->lstCategories->addItem(catename); mainGame->lstCategories->addItem(catename);
catesel = mainGame->lstCategories->getItemCount() - 1; catesel = mainGame->lstCategories->getItemCount() - 1;
} else { } else {
for(int i = 3; i < (int)mainGame->lstCategories->getItemCount(); i++) { for(int i = DECK_CATEGORY_CUSTOM; i < (int)mainGame->lstCategories->getItemCount(); i++) {
if(!mywcsncasecmp(mainGame->lstCategories->getListItem(i), catename, 256)) { if(!mywcsncasecmp(mainGame->lstCategories->getListItem(i), catename, 256)) {
catesel = i; catesel = i;
mainGame->stACMessage->setText(dataManager.GetSysString(1474)); mainGame->stACMessage->setText(dataManager.GetSysString(1474));
...@@ -492,6 +493,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -492,6 +493,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
case BUTTON_RENAME_CATEGORY: { case BUTTON_RENAME_CATEGORY: {
int catesel = mainGame->lstCategories->getSelected(); int catesel = mainGame->lstCategories->getSelected();
if (catesel < DECK_CATEGORY_CUSTOM)
break;
const wchar_t* oldcatename = mainGame->lstCategories->getListItem(catesel); const wchar_t* oldcatename = mainGame->lstCategories->getListItem(catesel);
const wchar_t* newcatename = mainGame->ebDMName->getText(); const wchar_t* newcatename = mainGame->ebDMName->getText();
if(DeckManager::RenameCategory(oldcatename, newcatename)) { if(DeckManager::RenameCategory(oldcatename, newcatename)) {
...@@ -502,7 +505,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -502,7 +505,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
catesel = mainGame->lstCategories->getItemCount() - 1; catesel = mainGame->lstCategories->getItemCount() - 1;
} else { } else {
catesel = 0; catesel = 0;
for(int i = 3; i < (int)mainGame->lstCategories->getItemCount(); i++) { for(int i = DECK_CATEGORY_CUSTOM; i < (int)mainGame->lstCategories->getItemCount(); i++) {
if(!mywcsncasecmp(mainGame->lstCategories->getListItem(i), newcatename, 256)) { if(!mywcsncasecmp(mainGame->lstCategories->getListItem(i), newcatename, 256)) {
catesel = i; catesel = i;
mainGame->stACMessage->setText(dataManager.GetSysString(1474)); mainGame->stACMessage->setText(dataManager.GetSysString(1474));
...@@ -522,11 +525,13 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -522,11 +525,13 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
case BUTTON_DELETE_CATEGORY: { case BUTTON_DELETE_CATEGORY: {
int catesel = mainGame->lstCategories->getSelected(); int catesel = mainGame->lstCategories->getSelected();
if (catesel < DECK_CATEGORY_CUSTOM)
break;
const wchar_t* catename = mainGame->lstCategories->getListItem(catesel); const wchar_t* catename = mainGame->lstCategories->getListItem(catesel);
if(DeckManager::DeleteCategory(catename)) { if(DeckManager::DeleteCategory(catename)) {
mainGame->cbDBCategory->removeItem(catesel); mainGame->cbDBCategory->removeItem(catesel);
mainGame->lstCategories->removeItem(catesel); mainGame->lstCategories->removeItem(catesel);
catesel = 2; catesel = DECK_CATEGORY_NONE;
mainGame->lstCategories->setSelected(catesel); mainGame->lstCategories->setSelected(catesel);
RefreshDeckList(); RefreshDeckList();
mainGame->lstDecks->setSelected(0); mainGame->lstDecks->setSelected(0);
...@@ -1118,8 +1123,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1118,8 +1123,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
dragx = event.MouseInput.X; dragx = event.MouseInput.X;
dragy = event.MouseInput.Y; dragy = event.MouseInput.Y;
draging_pointer = dataManager.GetCodePointer(hovered_code); draging_pointer = _datas.find(hovered_code);
if(draging_pointer == dataManager.datas_end()) if (draging_pointer == _datas.end())
break; break;
if(hovered_pos == 4) { if(hovered_pos == 4) {
if(!check_limit(draging_pointer)) if(!check_limit(draging_pointer))
...@@ -1172,8 +1177,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1172,8 +1177,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
if(hovered_pos == 0 || hovered_seq == -1) if(hovered_pos == 0 || hovered_seq == -1)
break; break;
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = _datas.find(hovered_code);
if(pointer == dataManager.datas_end()) if (pointer == _datas.end())
break; break;
soundManager.PlaySoundEffect(SOUND_CARD_DROP); soundManager.PlaySoundEffect(SOUND_CARD_DROP);
if(hovered_pos == 1) { if(hovered_pos == 1) {
...@@ -1207,8 +1212,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1207,8 +1212,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} else if(hovered_pos == 3) { } else if(hovered_pos == 3) {
pop_side(hovered_seq); pop_side(hovered_seq);
} else { } else {
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = _datas.find(hovered_code);
if(pointer == dataManager.datas_end()) if (pointer == _datas.end())
break; break;
if(!check_limit(pointer)) if(!check_limit(pointer))
break; break;
...@@ -1242,8 +1247,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1242,8 +1247,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
if (is_draging) if (is_draging)
break; break;
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = _datas.find(hovered_code);
if (pointer == dataManager.datas_end()) if (pointer == _datas.end())
break; break;
if(!check_limit(pointer)) if(!check_limit(pointer))
break; break;
...@@ -1512,10 +1517,13 @@ void DeckBuilder::FilterCards() { ...@@ -1512,10 +1517,13 @@ void DeckBuilder::FilterCards() {
query_elements.push_back(element); query_elements.push_back(element);
} }
} }
for(code_pointer ptr = dataManager.datas_begin(); ptr != dataManager.datas_end(); ++ptr) { auto& _datas = dataManager.GetDataTable();
const CardDataC& data = ptr->second; auto& _strings = dataManager.GetStringTable();
auto strpointer = dataManager.GetStringPointer(ptr->first); for (code_pointer ptr = _datas.begin(); ptr != _datas.end(); ++ptr) {
if (strpointer == dataManager.strings_end()) auto& code = ptr->first;
auto& data = ptr->second;
auto strpointer = _strings.find(code);
if (strpointer == _strings.end())
continue; continue;
const CardString& strings = strpointer->second; const CardString& strings = strpointer->second;
if(data.type & TYPE_TOKEN) if(data.type & TYPE_TOKEN)
...@@ -1924,16 +1932,16 @@ bool DeckBuilder::check_limit(code_pointer pointer) { ...@@ -1924,16 +1932,16 @@ bool DeckBuilder::check_limit(code_pointer pointer) {
auto flit = filterList->content.find(limitcode); auto flit = filterList->content.find(limitcode);
if(flit != filterList->content.end()) if(flit != filterList->content.end())
limit = flit->second; limit = flit->second;
for(auto it = deckManager.current_deck.main.begin(); it != deckManager.current_deck.main.end(); ++it) { for (auto& card : deckManager.current_deck.main) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode) if (card->first == limitcode || card->second.alias == limitcode)
limit--; limit--;
} }
for(auto it = deckManager.current_deck.extra.begin(); it != deckManager.current_deck.extra.end(); ++it) { for (auto& card : deckManager.current_deck.extra) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode) if (card->first == limitcode || card->second.alias == limitcode)
limit--; limit--;
} }
for(auto it = deckManager.current_deck.side.begin(); it != deckManager.current_deck.side.end(); ++it) { for (auto& card : deckManager.current_deck.side) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode) if (card->first == limitcode || card->second.alias == limitcode)
limit--; limit--;
} }
return limit > 0; return limit > 0;
......
...@@ -6,9 +6,6 @@ ...@@ -6,9 +6,6 @@
namespace ygo { namespace ygo {
#ifndef YGOPRO_SERVER_MODE
char DeckManager::deckBuffer[0x10000]{};
#endif
DeckManager deckManager; DeckManager deckManager;
void DeckManager::LoadLFListSingle(const char* path, bool insert) { void DeckManager::LoadLFListSingle(const char* path, bool insert) {
...@@ -154,42 +151,46 @@ unsigned int DeckManager::CheckDeck(const Deck& deck, unsigned int lfhash, int r ...@@ -154,42 +151,46 @@ unsigned int DeckManager::CheckDeck(const Deck& deck, unsigned int lfhash, int r
uint32_t DeckManager::LoadDeck(Deck& deck, uint32_t dbuf[], int mainc, int sidec, bool is_packlist) { uint32_t DeckManager::LoadDeck(Deck& deck, uint32_t dbuf[], int mainc, int sidec, bool is_packlist) {
deck.clear(); deck.clear();
uint32_t errorcode = 0; uint32_t errorcode = 0;
CardData cd; auto& _datas = dataManager.GetDataTable();
for(int i = 0; i < mainc; ++i) { for(int i = 0; i < mainc; ++i) {
auto code = dbuf[i]; auto code = dbuf[i];
if(!dataManager.GetData(code, &cd)) { auto it = _datas.find(code);
if(it == _datas.end()) {
errorcode = code; errorcode = code;
continue; continue;
} }
auto& cd = it->second;
if (cd.type & TYPE_TOKEN) { if (cd.type & TYPE_TOKEN) {
errorcode = code; errorcode = code;
continue; continue;
} }
if(is_packlist) { if(is_packlist) {
deck.main.push_back(dataManager.GetCodePointer(code)); deck.main.push_back(it);
continue; continue;
} }
if (cd.type & TYPES_EXTRA_DECK) { if (cd.type & TYPES_EXTRA_DECK) {
if (deck.extra.size() < EXTRA_MAX_SIZE) if (deck.extra.size() < EXTRA_MAX_SIZE)
deck.extra.push_back(dataManager.GetCodePointer(code)); deck.extra.push_back(it);
} }
else { else {
if (deck.main.size() < DECK_MAX_SIZE) if (deck.main.size() < DECK_MAX_SIZE)
deck.main.push_back(dataManager.GetCodePointer(code)); deck.main.push_back(it);
} }
} }
for(int i = 0; i < sidec; ++i) { for(int i = 0; i < sidec; ++i) {
auto code = dbuf[mainc + i]; auto code = dbuf[mainc + i];
if(!dataManager.GetData(code, &cd)) { auto it = _datas.find(code);
if(it == _datas.end()) {
errorcode = code; errorcode = code;
continue; continue;
} }
auto& cd = it->second;
if (cd.type & TYPE_TOKEN) { if (cd.type & TYPE_TOKEN) {
errorcode = code; errorcode = code;
continue; continue;
} }
if(deck.side.size() < SIDE_MAX_SIZE) if(deck.side.size() < SIDE_MAX_SIZE)
deck.side.push_back(dataManager.GetCodePointer(code)); deck.side.push_back(it);
} }
return errorcode; return errorcode;
} }
...@@ -253,15 +254,15 @@ bool DeckManager::LoadSide(Deck& deck, uint32_t dbuf[], int mainc, int sidec) { ...@@ -253,15 +254,15 @@ bool DeckManager::LoadSide(Deck& deck, uint32_t dbuf[], int mainc, int sidec) {
void DeckManager::GetCategoryPath(wchar_t* ret, int index, const wchar_t* text) { void DeckManager::GetCategoryPath(wchar_t* ret, int index, const wchar_t* text) {
wchar_t catepath[256]; wchar_t catepath[256];
switch(index) { switch(index) {
case 0: case DECK_CATEGORY_PACK:
myswprintf(catepath, L"./pack"); myswprintf(catepath, L"./pack");
break; break;
case 1: case DECK_CATEGORY_BOT:
BufferIO::CopyWideString(mainGame->gameConf.bot_deck_path, catepath); BufferIO::CopyWideString(mainGame->gameConf.bot_deck_path, catepath);
break; break;
case -1: case -1:
case 2: case DECK_CATEGORY_NONE:
case 3: case DECK_CATEGORY_SEPARATOR:
myswprintf(catepath, L"./deck"); myswprintf(catepath, L"./deck");
break; break;
default: default:
...@@ -287,11 +288,11 @@ FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) { ...@@ -287,11 +288,11 @@ FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) {
} }
irr::io::IReadFile* DeckManager::OpenDeckReader(const wchar_t* file) { irr::io::IReadFile* DeckManager::OpenDeckReader(const wchar_t* file) {
#ifdef _WIN32 #ifdef _WIN32
auto reader = DataManager::FileSystem->createAndOpenFile(file); auto reader = dataManager.FileSystem->createAndOpenFile(file);
#else #else
char file2[256]; char file2[256];
BufferIO::EncodeUTF8(file, file2); BufferIO::EncodeUTF8(file, file2);
auto reader = DataManager::FileSystem->createAndOpenFile(file2); auto reader = dataManager.FileSystem->createAndOpenFile(file2);
#endif #endif
return reader; return reader;
} }
...@@ -301,6 +302,9 @@ bool DeckManager::LoadCurrentDeck(std::istringstream& deckStream, bool is_packli ...@@ -301,6 +302,9 @@ bool DeckManager::LoadCurrentDeck(std::istringstream& deckStream, bool is_packli
} }
bool DeckManager::LoadCurrentDeck(const wchar_t* file, bool is_packlist) { bool DeckManager::LoadCurrentDeck(const wchar_t* file, bool is_packlist) {
current_deck.clear(); current_deck.clear();
if (!file[0])
return false;
char deckBuffer[MAX_YDK_SIZE]{};
auto reader = OpenDeckReader(file); auto reader = OpenDeckReader(file);
if(!reader) { if(!reader) {
wchar_t localfile[256]; wchar_t localfile[256];
...@@ -327,11 +331,12 @@ bool DeckManager::LoadCurrentDeck(const wchar_t* file, bool is_packlist) { ...@@ -327,11 +331,12 @@ bool DeckManager::LoadCurrentDeck(const wchar_t* file, bool is_packlist) {
bool DeckManager::LoadCurrentDeck(int category_index, const wchar_t* category_name, const wchar_t* deckname) { bool DeckManager::LoadCurrentDeck(int category_index, const wchar_t* category_name, const wchar_t* deckname) {
wchar_t filepath[256]; wchar_t filepath[256];
GetDeckFile(filepath, category_index, category_name, deckname); GetDeckFile(filepath, category_index, category_name, deckname);
bool is_packlist = (category_index == 0); bool is_packlist = (category_index == DECK_CATEGORY_PACK);
bool res = LoadCurrentDeck(filepath, is_packlist); if(!LoadCurrentDeck(filepath, is_packlist))
if (res && mainGame->is_building) return false;
if (mainGame->is_building)
mainGame->deckBuilder.RefreshPackListScroll(); mainGame->deckBuilder.RefreshPackListScroll();
return res; return true;
} }
void DeckManager::SaveDeck(const Deck& deck, std::stringstream& deckStream) { void DeckManager::SaveDeck(const Deck& deck, std::stringstream& deckStream) {
deckStream << "#created by ..." << std::endl; deckStream << "#created by ..." << std::endl;
......
...@@ -33,6 +33,12 @@ namespace ygo { ...@@ -33,6 +33,12 @@ namespace ygo {
constexpr int MAINC_MAX = 250; // the limit of card_state constexpr int MAINC_MAX = 250; // the limit of card_state
constexpr int SIDEC_MAX = MAINC_MAX; constexpr int SIDEC_MAX = MAINC_MAX;
constexpr int DECK_CATEGORY_PACK = 0;
constexpr int DECK_CATEGORY_BOT = 1;
constexpr int DECK_CATEGORY_NONE = 2;
constexpr int DECK_CATEGORY_SEPARATOR = 3;
constexpr int DECK_CATEGORY_CUSTOM = 4;
struct LFList { struct LFList {
unsigned int hash{}; unsigned int hash{};
std::wstring listName; std::wstring listName;
...@@ -68,6 +74,7 @@ public: ...@@ -68,6 +74,7 @@ public:
#ifndef YGOPRO_SERVER_MODE #ifndef YGOPRO_SERVER_MODE
static char deckBuffer[0x10000]; static char deckBuffer[0x10000];
static constexpr int MAX_YDK_SIZE = 0x10000;
#endif #endif
void LoadLFListSingle(const char* path, bool insert = false); void LoadLFListSingle(const char* path, bool insert = false);
......
...@@ -921,7 +921,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -921,7 +921,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
myswprintf(formatBuffer, L""); myswprintf(formatBuffer, L"");
} else { } else {
if(conti_selecting) if(conti_selecting)
myswprintf(formatBuffer, L"%ls", DataManager::unknown_string); myswprintf(formatBuffer, L"%ls", dataManager.unknown_string);
else if(cant_check_grave && selectable_cards[i]->location == LOCATION_GRAVE) else if(cant_check_grave && selectable_cards[i]->location == LOCATION_GRAVE)
myswprintf(formatBuffer, L"%ls", dataManager.FormatLocation(selectable_cards[i]->location, 0)); myswprintf(formatBuffer, L"%ls", dataManager.FormatLocation(selectable_cards[i]->location, 0));
else if(selectable_cards[i + pos]->location == LOCATION_OVERLAY) else if(selectable_cards[i + pos]->location == LOCATION_OVERLAY)
......
...@@ -93,16 +93,16 @@ HostInfo game_info; ...@@ -93,16 +93,16 @@ HostInfo game_info;
void Game::MainServerLoop() { void Game::MainServerLoop() {
#ifdef SERVER_ZIP_SUPPORT #ifdef SERVER_ZIP_SUPPORT
DataManager::FileSystem = new irr::io::CFileSystem(); deckManager.FileSystem = new irr::io::CFileSystem();
#endif #endif
initUtils(); initUtils();
deckManager.LoadLFList(); deckManager.LoadLFList();
dataManager.LoadDB(L"cards.cdb"); dataManager.LoadDB(L"cards.cdb");
LoadExpansionsAll(); LoadExpansionsAll();
#ifdef SERVER_PRO2_SUPPORT #ifdef SERVER_PRO2_SUPPORT
DataManager::FileSystem->addFileArchive("data/script.zip", true, false, irr::io::EFAT_ZIP); deckManager.FileSystem->addFileArchive("data/script.zip", true, false, irr::io::EFAT_ZIP);
#elif defined(SERVER_PRO3_SUPPORT) #elif defined(SERVER_PRO3_SUPPORT)
DataManager::FileSystem->addFileArchive("Data/script.zip", true, false, irr::io::EFAT_ZIP); deckManager.FileSystem->addFileArchive("Data/script.zip", true, false, irr::io::EFAT_ZIP);
#endif #endif
server_port = NetServer::StartServer(server_port); server_port = NetServer::StartServer(server_port);
...@@ -168,7 +168,7 @@ bool Game::Initialize() { ...@@ -168,7 +168,7 @@ bool Game::Initialize() {
ErrorLog("Failed to load textures!"); ErrorLog("Failed to load textures!");
return false; return false;
} }
DataManager::FileSystem = device->getFileSystem(); dataManager.FileSystem = device->getFileSystem();
if(dataManager.LoadDB(GetLocaleDirWide("cards.cdb"))) {} else if(dataManager.LoadDB(GetLocaleDirWide("cards.cdb"))) {} else
if(!dataManager.LoadDB(L"cards.cdb")) { if(!dataManager.LoadDB(L"cards.cdb")) {
ErrorLog("Failed to load card database (cards.cdb)!"); ErrorLog("Failed to load card database (cards.cdb)!");
...@@ -1337,19 +1337,19 @@ void Game::LoadExpansions(const wchar_t* expansions_path) { ...@@ -1337,19 +1337,19 @@ void Game::LoadExpansions(const wchar_t* expansions_path) {
#if defined(SERVER_ZIP_SUPPORT) || !defined(YGOPRO_SERVER_MODE) #if defined(SERVER_ZIP_SUPPORT) || !defined(YGOPRO_SERVER_MODE)
if (IsExtension(name, L".zip") || IsExtension(name, L".ypk")) { if (IsExtension(name, L".zip") || IsExtension(name, L".ypk")) {
#ifdef _WIN32 #ifdef _WIN32
DataManager::FileSystem->addFileArchive(fpath, true, false, irr::io::EFAT_ZIP); dataManager.FileSystem->addFileArchive(fpath, true, false, irr::io::EFAT_ZIP);
#else #else
char upath[1024]; char upath[1024];
BufferIO::EncodeUTF8(fpath, upath); BufferIO::EncodeUTF8(fpath, upath);
DataManager::FileSystem->addFileArchive(upath, true, false, irr::io::EFAT_ZIP); dataManager.FileSystem->addFileArchive(upath, true, false, irr::io::EFAT_ZIP);
#endif #endif
return; return;
} }
#endif //SERVER_ZIP_SUPPORT #endif //SERVER_ZIP_SUPPORT
}); });
#if defined(SERVER_ZIP_SUPPORT) || !defined(YGOPRO_SERVER_MODE) #if defined(SERVER_ZIP_SUPPORT) || !defined(YGOPRO_SERVER_MODE)
for(irr::u32 i = 0; i < DataManager::FileSystem->getFileArchiveCount(); ++i) { for(irr::u32 i = 0; i < dataManager.FileSystem->getFileArchiveCount(); ++i) {
auto archiveObj = DataManager::FileSystem->getFileArchive(i); auto archiveObj = dataManager.FileSystem->getFileArchive(i);
auto archive = archiveObj->getFileList(); auto archive = archiveObj->getFileList();
for(irr::u32 j = 0; j < archive->getFileCount(); ++j) { for(irr::u32 j = 0; j < archive->getFileCount(); ++j) {
#ifdef _WIN32 #ifdef _WIN32
...@@ -2001,8 +2001,9 @@ void Game::ShowCardInfo(int code, bool resize) { ...@@ -2001,8 +2001,9 @@ void Game::ShowCardInfo(int code, bool resize) {
if(showingcode == code && !resize) if(showingcode == code && !resize)
return; return;
wchar_t formatBuffer[256]; wchar_t formatBuffer[256];
auto cit = dataManager.GetCodePointer(code); auto& _datas = dataManager.GetDataTable();
bool is_valid = (cit != dataManager.datas_end()); auto cit = _datas.find(code);
bool is_valid = (cit != _datas.end());
imgCard->setImage(imageManager.GetTexture(code, true)); imgCard->setImage(imageManager.GetTexture(code, true));
if (is_valid) { if (is_valid) {
auto& cd = cit->second; auto& cd = cit->second;
...@@ -2023,8 +2024,8 @@ void Game::ShowCardInfo(int code, bool resize) { ...@@ -2023,8 +2024,8 @@ void Game::ShowCardInfo(int code, bool resize) {
if (is_valid && !gameConf.hide_setname) { if (is_valid && !gameConf.hide_setname) {
auto& cd = cit->second; auto& cd = cit->second;
auto target = cit; auto target = cit;
if (cd.alias && dataManager.GetCodePointer(cd.alias) != dataManager.datas_end()) { if (cd.alias && _datas.find(cd.alias) != _datas.end()) {
target = dataManager.GetCodePointer(cd.alias); target = _datas.find(cd.alias);
} }
if (target->second.setcode[0]) { if (target->second.setcode[0]) {
offset = 23;// *yScale; offset = 23;// *yScale;
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
unsigned int enable_log = 0x3; unsigned int enable_log = 0x3;
bool expansions_specified = false; bool expansions_specified = false;
std::vector<std::wstring> expansions_list; std::vector<std::wstring> expansions_list;
std::vector<std::wstring> extra_script_list;
#ifndef YGOPRO_SERVER_MODE #ifndef YGOPRO_SERVER_MODE
bool exit_on_return = false; bool exit_on_return = false;
bool auto_watch_mode = false; bool auto_watch_mode = false;
...@@ -219,6 +220,7 @@ int main(int argc, char* argv[]) { ...@@ -219,6 +220,7 @@ int main(int argc, char* argv[]) {
bool keep_on_return = false; bool keep_on_return = false;
bool deckCategorySpecified = false; bool deckCategorySpecified = false;
bool expansions_specified = false;
expansions_list.push_back(L"./expansions"); 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) {
...@@ -354,6 +356,12 @@ int main(int argc, char* argv[]) { ...@@ -354,6 +356,12 @@ int main(int argc, char* argv[]) {
expansions_list.push_back(wargv[i]); expansions_list.push_back(wargv[i]);
} }
continue; continue;
} else if (!std::wcscmp(wargv[i], L"--extra-script")) { // specify extra script
++i;
if(i < wargc) {
extra_script_list.push_back(wargv[i]);
}
continue;
} }
} }
ygo::mainGame->MainLoop(); ygo::mainGame->MainLoop();
......
...@@ -470,7 +470,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -470,7 +470,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
if(prev_operation == BUTTON_RENAME_REPLAY) { if(prev_operation == BUTTON_RENAME_REPLAY) {
wchar_t newname[256]; wchar_t newname[256];
BufferIO::CopyWideString(mainGame->ebRSName->getText(), newname); BufferIO::CopyWideString(mainGame->ebRSName->getText(), newname);
if(mywcsncasecmp(newname + std::wcslen(newname) - 4, L".yrp", 4)) { if (!IsExtension(newname, L".yrp")) {
myswprintf(newname, L"%ls.yrp", mainGame->ebRSName->getText()); myswprintf(newname, L"%ls.yrp", mainGame->ebRSName->getText());
} }
if(Replay::RenameReplay(mainGame->lstReplayList->getListItem(prev_sel), newname)) { if(Replay::RenameReplay(mainGame->lstReplayList->getListItem(prev_sel), newname)) {
......
...@@ -21,7 +21,7 @@ class FileSystem { ...@@ -21,7 +21,7 @@ class FileSystem {
public: public:
static void SafeFileName(wchar_t* wfile) { static void SafeFileName(wchar_t* wfile) {
while((wfile = std::wcspbrk(wfile, L"<>:\"/\\|?*")) != nullptr) while((wfile = std::wcspbrk(wfile, L"<>:\"/\\|?*")) != nullptr)
*wfile++ = '_'; *wfile++ = L'_';
} }
static bool IsFileExists(const wchar_t* wfile) { static bool IsFileExists(const wchar_t* wfile) {
...@@ -125,7 +125,7 @@ class FileSystem { ...@@ -125,7 +125,7 @@ class FileSystem {
public: public:
static void SafeFileName(wchar_t* wfile) { static void SafeFileName(wchar_t* wfile) {
while((wfile = std::wcspbrk(wfile, L"/")) != nullptr) while((wfile = std::wcspbrk(wfile, L"/")) != nullptr)
*wfile++ = '_'; *wfile++ = L'_';
} }
static bool IsFileExists(const char* file) { static bool IsFileExists(const char* file) {
......
...@@ -192,6 +192,7 @@ bool ReplayMode::StartDuel() { ...@@ -192,6 +192,7 @@ bool ReplayMode::StartDuel() {
preload_script(pduel, "./script/patches/entry.lua"); preload_script(pduel, "./script/patches/entry.lua");
preload_script(pduel, "./script/special.lua"); preload_script(pduel, "./script/special.lua");
preload_script(pduel, "./script/init.lua"); preload_script(pduel, "./script/init.lua");
dataManager.LoadExtraScripts(pduel);
mainGame->dInfo.lp[0] = cur_replay.params.start_lp; mainGame->dInfo.lp[0] = cur_replay.params.start_lp;
mainGame->dInfo.lp[1] = cur_replay.params.start_lp; mainGame->dInfo.lp[1] = cur_replay.params.start_lp;
mainGame->dInfo.start_lp = cur_replay.params.start_lp; mainGame->dInfo.start_lp = cur_replay.params.start_lp;
......
...@@ -620,6 +620,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -620,6 +620,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
preload_script(pduel, "./script/patches/entry.lua"); preload_script(pduel, "./script/patches/entry.lua");
preload_script(pduel, "./script/special.lua"); preload_script(pduel, "./script/special.lua");
preload_script(pduel, "./script/init.lua"); preload_script(pduel, "./script/init.lua");
dataManager.LoadExtraScripts(pduel);
unsigned int opt = (unsigned int)host_info.duel_rule << 16; unsigned int opt = (unsigned int)host_info.duel_rule << 16;
if(host_info.no_shuffle_deck) if(host_info.no_shuffle_deck)
opt |= DUEL_PSEUDO_SHUFFLE; opt |= DUEL_PSEUDO_SHUFFLE;
......
...@@ -64,6 +64,7 @@ int SingleMode::SinglePlayThread() { ...@@ -64,6 +64,7 @@ int SingleMode::SinglePlayThread() {
preload_script(pduel, "./script/patches/entry.lua"); preload_script(pduel, "./script/patches/entry.lua");
preload_script(pduel, "./script/special.lua"); preload_script(pduel, "./script/special.lua");
preload_script(pduel, "./script/init.lua"); preload_script(pduel, "./script/init.lua");
dataManager.LoadExtraScripts(pduel);
mainGame->dInfo.lp[0] = start_lp; mainGame->dInfo.lp[0] = start_lp;
mainGame->dInfo.lp[1] = start_lp; mainGame->dInfo.lp[1] = start_lp;
mainGame->dInfo.start_lp = start_lp; mainGame->dInfo.start_lp = start_lp;
......
...@@ -596,6 +596,7 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -596,6 +596,7 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
preload_script(pduel, "./script/patches/entry.lua"); preload_script(pduel, "./script/patches/entry.lua");
preload_script(pduel, "./script/special.lua"); preload_script(pduel, "./script/special.lua");
preload_script(pduel, "./script/init.lua"); preload_script(pduel, "./script/init.lua");
dataManager.LoadExtraScripts(pduel);
unsigned int opt = (unsigned int)host_info.duel_rule << 16; unsigned int opt = (unsigned int)host_info.duel_rule << 16;
if(host_info.no_shuffle_deck) if(host_info.no_shuffle_deck)
opt |= DUEL_PSEUDO_SHUFFLE; opt |= DUEL_PSEUDO_SHUFFLE;
......
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