Commit aaa1d3cf authored by Chen Bill's avatar Chen Bill Committed by GitHub

fix ScriptReader (#2642)

* fix ScriptReader

* increase scriptBuffer

* fix DeckManager::LoadCurrentDeck
parent cc18709f
......@@ -6,7 +6,7 @@
namespace ygo {
const wchar_t* DataManager::unknown_string = L"???";
unsigned char DataManager::scriptBuffer[0x20000];
unsigned char DataManager::scriptBuffer[0x100000];
IFileSystem* DataManager::FileSystem;
DataManager dataManager;
......@@ -424,14 +424,11 @@ unsigned char* DataManager::ScriptReader(const char* script_name, int* slen) {
#endif
if (!reader)
return nullptr;
size_t size = reader->getSize();
if (size > sizeof scriptBuffer) {
reader->drop();
return nullptr;
}
reader->read(scriptBuffer, size);
int size = reader->read(scriptBuffer, sizeof scriptBuffer);
reader->drop();
*slen = (int)size;
if (size >= (int)sizeof scriptBuffer)
return nullptr;
*slen = size;
return scriptBuffer;
}
unsigned char* DataManager::DefaultScriptReader(const char* script_name, int* slen) {
......
......@@ -50,7 +50,7 @@ public:
std::unordered_map<unsigned int, std::wstring> _sysStrings;
char errmsg[512]{};
static unsigned char scriptBuffer[0x20000];
static unsigned char scriptBuffer[0x100000];
static const wchar_t* unknown_string;
static uint32_t CardReader(uint32_t, card_data*);
static unsigned char* ScriptReaderEx(const char* script_name, int* slen);
......
......@@ -280,25 +280,23 @@ bool DeckManager::LoadCurrentDeck(const wchar_t* file, bool is_packlist) {
current_deck.clear();
IReadFile* reader = OpenDeckReader(file);
if(!reader) {
wchar_t localfile[64];
wchar_t localfile[256];
myswprintf(localfile, L"./deck/%ls.ydk", file);
reader = OpenDeckReader(localfile);
}
if(!reader && !mywcsncasecmp(file, L"./pack", 6)) {
wchar_t zipfile[64];
wchar_t zipfile[256];
myswprintf(zipfile, L"%ls", file + 2);
reader = OpenDeckReader(zipfile);
}
if(!reader)
return false;
auto size = reader->getSize();
if(size >= (int)sizeof deckBuffer) {
reader->drop();
return false;
}
std::memset(deckBuffer, 0, sizeof deckBuffer);
reader->read(deckBuffer, size);
int size = reader->read(deckBuffer, sizeof deckBuffer);
reader->drop();
if (size >= (int)sizeof deckBuffer) {
return false;
}
std::istringstream deckStream(deckBuffer);
LoadDeck(current_deck, deckStream, is_packlist);
return true; // the above LoadDeck has return value but we ignore it here for now
......
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