Commit eba2ca9c authored by mercury233's avatar mercury233

update script reader

parent 851bf27e
...@@ -332,13 +332,17 @@ byte* DataManager::ScriptReaderEx(const char* script_name, int* slen) { ...@@ -332,13 +332,17 @@ byte* DataManager::ScriptReaderEx(const char* script_name, int* slen) {
sprintf(first, "%s", script_name + 2); sprintf(first, "%s", script_name + 2);
sprintf(second, "expansions/%s", script_name + 2); sprintf(second, "expansions/%s", script_name + 2);
} }
// byte* buffer = irr::android::android_script_reader(first, slen); if(mainGame->gameConf.prefer_expansion_script) {
if(ScriptReader(first, slen)) if(ScriptReader(first, slen))
return irr::android::android_script_reader(first, slen); return scriptBuffer;
if(ScriptReader(second, slen))
return scriptBuffer;
}
if(ScriptReaderZip(first, slen))
return scriptBuffer;
else else
return irr::android::android_script_reader(second, slen); return ScriptReaderZip(second, slen);
} }
byte* DataManager::ScriptReader(const char* script_name, int* slen) { byte* DataManager::ScriptReader(const char* script_name, int* slen) {
FILE *fp; FILE *fp;
#ifdef _WIN32 #ifdef _WIN32
...@@ -357,5 +361,22 @@ byte* DataManager::ScriptReader(const char* script_name, int* slen) { ...@@ -357,5 +361,22 @@ byte* DataManager::ScriptReader(const char* script_name, int* slen) {
*slen = len; *slen = len;
return scriptBuffer; return scriptBuffer;
} }
byte* DataManager::ScriptReaderZip(const char* script_name, int* slen) {
wchar_t fname[256];
BufferIO::DecodeUTF8(script_name, fname);
IFileSystem* fs = mainGame->device->getFileSystem();
IReadFile* reader = fs->createAndOpenFile(fname);
if(reader == NULL)
return 0;
size_t size = reader->getSize();
if(size > sizeof(scriptBuffer)) {
reader->drop();
return 0;
}
reader->read(scriptBuffer, size);
reader->drop();
*slen = size;
return scriptBuffer;
}
} }
...@@ -58,6 +58,7 @@ public: ...@@ -58,6 +58,7 @@ public:
static int CardReader(int, void*); static int CardReader(int, void*);
static byte* ScriptReaderEx(const char* script_name, int* slen); static byte* ScriptReaderEx(const char* script_name, int* slen);
static byte* ScriptReader(const char* script_name, int* slen); static byte* ScriptReader(const char* script_name, int* slen);
static byte* ScriptReaderZip(const char* script_name, int* slen);
}; };
......
...@@ -8,8 +8,6 @@ ...@@ -8,8 +8,6 @@
namespace irr { namespace irr {
namespace android { namespace android {
static unsigned char script_buffer[0x20000];
inline static void ReadString(irr::io::path &path, char*& p) { inline static void ReadString(irr::io::path &path, char*& p) {
int length = BufferIO::ReadInt32(p); int length = BufferIO::ReadInt32(p);
if (length != 0) { if (length != 0) {
...@@ -900,75 +898,6 @@ s32 handleInput(ANDROID_APP app, AInputEvent* androidEvent) { ...@@ -900,75 +898,6 @@ s32 handleInput(ANDROID_APP app, AInputEvent* androidEvent) {
return Status; return Status;
} }
unsigned char* android_script_reader(const char* script_name, int* slen) {
IFileSystem* fs = ygo::mainGame->device->getFileSystem();
std::string handledname = script_name;
if (handledname[0] == '.' && handledname[1] == '/') {
handledname = handledname.substr(2, handledname.length() - 2);
}
int firstSeperatorIndex = handledname.find_first_of('/');
std::string typeDir = handledname.substr(0, firstSeperatorIndex);
if (typeDir == "single") {
FILE *fp;
fp = fopen(script_name, "rb");
if (!fp)
return 0;
fseek(fp, 0, SEEK_END);
uint32 len = ftell(fp);
if (len > sizeof(script_buffer)) {
fclose(fp);
LOGW("read %s failed: too large file", script_name);
return 0;
}
fseek(fp, 0, SEEK_SET);
fread(script_buffer, len, 1, fp);
fclose(fp);
*slen = len;
return script_buffer;
//} else if (typeDir == "script") {
} else {
//try to find in directory based script.
if (access(script_name, F_OK) != -1) {
FILE *fp;
fp = fopen(script_name, "rb");
fseek(fp, 0, SEEK_END);
uint32 len = ftell(fp);
if (len > sizeof(script_buffer)) {
fclose(fp);
LOGW("read %s failed: too large file", script_name);
return 0;
}
fseek(fp, 0, SEEK_SET);
fread(script_buffer, len, 1, fp);
fclose(fp);
*slen = len;
return script_buffer;
} else {
IReadFile* file = fs->createAndOpenFile(handledname.c_str());
if (!file) {
LOGW("read %s failed: file not exist", script_name);
return 0;
}
if (file->getSize() > 0x20000) {
LOGW("read %s failed: too large file", script_name);
return 0;
}
*slen = file->getSize();
if (file->read(script_buffer, *slen) != *slen) {
LOGW("read %s failed: insufficient read length %d", script_name,
*slen);
*slen = 0;
return 0;
} else {
return script_buffer;
}
}
//} else {
// LOGW("read %s failed: unknown script source", script_name);
// return 0;
}
}
bool android_deck_delete(const char* deck_name) { bool android_deck_delete(const char* deck_name) {
int status; int status;
std::string ext_deck_name; std::string ext_deck_name;
......
...@@ -173,8 +173,6 @@ extern void process_input(ANDROID_APP app, ...@@ -173,8 +173,6 @@ extern void process_input(ANDROID_APP app,
extern s32 handleInput(ANDROID_APP app, AInputEvent* androidEvent); extern s32 handleInput(ANDROID_APP app, AInputEvent* androidEvent);
extern unsigned char* android_script_reader(const char* script_name, int* slen);
extern bool android_deck_delete(const char* deck_name); extern bool android_deck_delete(const char* deck_name);
extern void runWindbot(ANDROID_APP app, const char* args); extern void runWindbot(ANDROID_APP app, const char* args);
......
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