Commit cb8fa2e7 authored by nanahira's avatar nanahira

merge

parents b0743676 f5152094
...@@ -73,6 +73,7 @@ inline int myswprintf(wchar_t(&buf)[N], const wchar_t* fmt, TR... args) { ...@@ -73,6 +73,7 @@ inline int myswprintf(wchar_t(&buf)[N], const wchar_t* fmt, TR... args) {
#include <memory.h> #include <memory.h>
#include <time.h> #include <time.h>
#include "bufferio.h" #include "bufferio.h"
#include "myfilesystem.h"
#include "mymutex.h" #include "mymutex.h"
#include "mysignal.h" #include "mysignal.h"
#include "mythread.h" #include "mythread.h"
......
...@@ -251,6 +251,8 @@ bool DeckManager::LoadDeck(const wchar_t* file) { ...@@ -251,6 +251,8 @@ bool DeckManager::LoadDeck(const wchar_t* file) {
return true; return true;
} }
bool DeckManager::SaveDeck(Deck& deck, const wchar_t* name) { bool DeckManager::SaveDeck(Deck& deck, const wchar_t* name) {
if(!FileSystem::IsDirExists(L"./deck") && !FileSystem::MakeDir(L"./deck"))
return false;
wchar_t file[64]; wchar_t file[64];
myswprintf(file, L"./deck/%ls.ydk", name); myswprintf(file, L"./deck/%ls.ydk", name);
FILE* fp = OpenDeckFile(file, "w"); FILE* fp = OpenDeckFile(file, "w");
......
...@@ -728,7 +728,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -728,7 +728,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->actionParam = 1; mainGame->actionParam = 1;
wchar_t msgbuf[256]; wchar_t msgbuf[256];
myswprintf(msgbuf, dataManager.GetSysString(1376), timetext); myswprintf(msgbuf, dataManager.GetSysString(1376), timetext);
mainGame->SetStaticText(mainGame->stACMessage, 310, mainGame->textFont, msgbuf); mainGame->SetStaticText(mainGame->stACMessage, 310, mainGame->guiFont, msgbuf);
mainGame->PopupElement(mainGame->wACMessage, 20); mainGame->PopupElement(mainGame->wACMessage, 20);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->WaitFrameSignal(30); mainGame->WaitFrameSignal(30);
......
...@@ -17,16 +17,6 @@ ...@@ -17,16 +17,6 @@
#include <sstream> #include <sstream>
#endif //YGOPRO_SERVER_MODE #endif //YGOPRO_SERVER_MODE
#ifndef _WIN32
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
#else
#include <direct.h>
#include <io.h>
#endif
unsigned short PRO_VERSION = 0x1346; unsigned short PRO_VERSION = 0x1346;
namespace ygo { namespace ygo {
...@@ -1054,71 +1044,26 @@ void Game::SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gu ...@@ -1054,71 +1044,26 @@ void Game::SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gu
} }
#endif //YGOPRO_SERVER_MODE #endif //YGOPRO_SERVER_MODE
void Game::LoadExpansionDB() { void Game::LoadExpansionDB() {
#ifdef _WIN32 FileSystem::TraversalDir("./expansions", [](const char* name, bool isdir) {
char fpath[1000]; if(!isdir && strrchr(name, '.') && !mystrncasecmp(strrchr(name, '.'), ".cdb", 4)) {
WIN32_FIND_DATAW fdataw; char fpath[1024];
HANDLE fh = FindFirstFileW(L"./expansions/*.cdb", &fdataw); sprintf(fpath, "./expansions/%s", name);
if(fh != INVALID_HANDLE_VALUE) { dataManager.LoadDB(fpath);
do {
if(!(fdataw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
char fname[780];
BufferIO::EncodeUTF8(fdataw.cFileName, fname);
sprintf(fpath, "./expansions/%s", fname);
dataManager.LoadDB(fpath);
}
} while(FindNextFileW(fh, &fdataw));
FindClose(fh);
}
#else
DIR * dir;
struct dirent * dirp;
if((dir = opendir("./expansions/")) != NULL) {
while((dirp = readdir(dir)) != NULL) {
size_t len = strlen(dirp->d_name);
if(len < 5 || strcasecmp(dirp->d_name + len - 4, ".cdb") != 0)
continue;
char filepath[1000];
sprintf(filepath, "./expansions/%s", dirp->d_name);
dataManager.LoadDB(filepath);
} }
closedir(dir); });
}
#endif
} }
#ifndef YGOPRO_SERVER_MODE #ifndef YGOPRO_SERVER_MODE
void Game::RefreshDeck(irr::gui::IGUIComboBox* cbDeck) { void Game::RefreshDeck(irr::gui::IGUIComboBox* cbDeck) {
cbDeck->clear(); cbDeck->clear();
#ifdef _WIN32 FileSystem::TraversalDir(L"./deck", [cbDeck](const wchar_t* name, bool isdir) {
WIN32_FIND_DATAW fdataw; if(!isdir && wcsrchr(name, '.') && !mywcsncasecmp(wcsrchr(name, '.'), L".ydk", 4)) {
HANDLE fh = FindFirstFileW(L"./deck/*.ydk", &fdataw); size_t len = wcslen(name);
if(fh == INVALID_HANDLE_VALUE) wchar_t deckname[256];
return; wcsncpy(deckname, name, len - 4);
do { deckname[len - 4] = 0;
if(!(fdataw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { cbDeck->addItem(deckname);
wchar_t* pf = fdataw.cFileName;
while(*pf) pf++;
while(*pf != L'.') pf--;
*pf = 0;
cbDeck->addItem(fdataw.cFileName);
} }
} while(FindNextFileW(fh, &fdataw)); });
FindClose(fh);
#else
DIR * dir;
struct dirent * dirp;
if((dir = opendir("./deck/")) == NULL)
return;
while((dirp = readdir(dir)) != NULL) {
size_t len = strlen(dirp->d_name);
if(len < 5 || strcasecmp(dirp->d_name + len - 4, ".ydk") != 0)
continue;
dirp->d_name[len - 4] = 0;
wchar_t wname[256];
BufferIO::DecodeUTF8(dirp->d_name, wname);
cbDeck->addItem(wname);
}
closedir(dir);
#endif
for(size_t i = 0; i < cbDeck->getItemCount(); ++i) { for(size_t i = 0; i < cbDeck->getItemCount(); ++i) {
if(!wcscmp(cbDeck->getItem(i), gameConf.lastdeck)) { if(!wcscmp(cbDeck->getItem(i), gameConf.lastdeck)) {
cbDeck->setSelected(i); cbDeck->setSelected(i);
...@@ -1128,90 +1073,26 @@ void Game::RefreshDeck(irr::gui::IGUIComboBox* cbDeck) { ...@@ -1128,90 +1073,26 @@ void Game::RefreshDeck(irr::gui::IGUIComboBox* cbDeck) {
} }
void Game::RefreshReplay() { void Game::RefreshReplay() {
lstReplayList->clear(); lstReplayList->clear();
#ifdef _WIN32 FileSystem::TraversalDir(L"./replay", [this](const wchar_t* name, bool isdir) {
WIN32_FIND_DATAW fdataw; if(!isdir && wcsrchr(name, '.') && !mywcsncasecmp(wcsrchr(name, '.'), L".yrp", 4) && Replay::CheckReplay(name))
HANDLE fh = FindFirstFileW(L"./replay/*.yrp", &fdataw); lstReplayList->addItem(name);
if(fh == INVALID_HANDLE_VALUE) });
return;
do {
if(!(fdataw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && Replay::CheckReplay(fdataw.cFileName)) {
lstReplayList->addItem(fdataw.cFileName);
}
} while(FindNextFileW(fh, &fdataw));
FindClose(fh);
#else
DIR * dir;
struct dirent * dirp;
if((dir = opendir("./replay/")) == NULL)
return;
while((dirp = readdir(dir)) != NULL) {
size_t len = strlen(dirp->d_name);
if(len < 5 || strcasecmp(dirp->d_name + len - 4, ".yrp") != 0)
continue;
wchar_t wname[256];
BufferIO::DecodeUTF8(dirp->d_name, wname);
if(Replay::CheckReplay(wname))
lstReplayList->addItem(wname);
}
closedir(dir);
#endif
} }
void Game::RefreshSingleplay() { void Game::RefreshSingleplay() {
lstSinglePlayList->clear(); lstSinglePlayList->clear();
#ifdef _WIN32 FileSystem::TraversalDir(L"./single", [this](const wchar_t* name, bool isdir) {
WIN32_FIND_DATAW fdataw; if(!isdir && wcsrchr(name, '.') && !mywcsncasecmp(wcsrchr(name, '.'), L".lua", 4))
HANDLE fh = FindFirstFileW(L"./single/*.lua", &fdataw); lstSinglePlayList->addItem(name);
if(fh == INVALID_HANDLE_VALUE) });
return;
do {
if(!(fdataw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
lstSinglePlayList->addItem(fdataw.cFileName);
} while(FindNextFileW(fh, &fdataw));
FindClose(fh);
#else
DIR * dir;
struct dirent * dirp;
if((dir = opendir("./single/")) == NULL)
return;
while((dirp = readdir(dir)) != NULL) {
size_t len = strlen(dirp->d_name);
if(len < 5 || strcasecmp(dirp->d_name + len - 4, ".lua") != 0)
continue;
wchar_t wname[256];
BufferIO::DecodeUTF8(dirp->d_name, wname);
lstSinglePlayList->addItem(wname);
}
closedir(dir);
#endif
} }
void Game::RefreshLocales() { void Game::RefreshLocales() {
cbLocale->clear(); cbLocale->clear();
cbLocale->addItem(L"default"); cbLocale->addItem(L"default");
#ifdef _WIN32 cbLocale->clear();
WIN32_FIND_DATAW fdataw; FileSystem::TraversalDir(L"./locales", [this](const wchar_t* name, bool isdir) {
HANDLE fh = FindFirstFileW(L"./locales/*", &fdataw); if(isdir && wcscmp(name, L".") && wcscmp(name, L".."))
if(fh == INVALID_HANDLE_VALUE) cbLocale->addItem(name);
return; });
do {
if((fdataw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && wcscmp(fdataw.cFileName, L".") && wcscmp(fdataw.cFileName, L".."))
cbLocale->addItem(fdataw.cFileName);
} while(FindNextFileW(fh, &fdataw));
FindClose(fh);
#else
DIR * dir;
struct dirent * dirp;
if((dir = opendir("./locales/")) == NULL)
return;
while((dirp = readdir(dir)) != NULL) {
size_t len = strlen(dirp->d_name);
wchar_t wname[256];
BufferIO::DecodeUTF8(dirp->d_name, wname);
if(!wcscmp(wname, L".") || !wcscmp(wname, L".."))
continue;
cbLocale->addItem(wname);
}
closedir(dir);
#endif
for(size_t i = 0; i < cbLocale->getItemCount(); ++i) { for(size_t i = 0; i < cbLocale->getItemCount(); ++i) {
if(!wcscmp(cbLocale->getItem(i), gameConf.locale)) { if(!wcscmp(cbLocale->getItem(i), gameConf.locale)) {
cbLocale->setSelected(i); cbLocale->setSelected(i);
...@@ -1742,7 +1623,7 @@ void Game::ClearCardInfo(int player) { ...@@ -1742,7 +1623,7 @@ void Game::ClearCardInfo(int player) {
stText->setText(L""); stText->setText(L"");
scrCardText->setVisible(false); scrCardText->setVisible(false);
} }
void Game::AddChatMsg(wchar_t* msg, int player) { void Game::AddChatMsg(const wchar_t* msg, int player) {
for(int i = 7; i > 0; --i) { for(int i = 7; i > 0; --i) {
chatMsg[i] = chatMsg[i - 1]; chatMsg[i] = chatMsg[i - 1];
chatTiming[i] = chatTiming[i - 1]; chatTiming[i] = chatTiming[i - 1];
...@@ -1798,8 +1679,7 @@ void Game::ClearChatMsg() { ...@@ -1798,8 +1679,7 @@ void Game::ClearChatMsg() {
} }
} }
#endif //YGOPRO_SERVER_MODE #endif //YGOPRO_SERVER_MODE
void Game::AddDebugMsg(char* msg) void Game::AddDebugMsg(const char* msg) {
{
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
fprintf(stderr, "%s\n", msg); fprintf(stderr, "%s\n", msg);
#else #else
...@@ -1814,7 +1694,7 @@ void Game::AddDebugMsg(char* msg) ...@@ -1814,7 +1694,7 @@ void Game::AddDebugMsg(char* msg)
ErrorLog(msgbuf); ErrorLog(msgbuf);
} }
} }
void Game::ErrorLog(char* msg) { void Game::ErrorLog(const char* msg) {
FILE* fp = fopen("error.log", "at"); FILE* fp = fopen("error.log", "at");
if(!fp) if(!fp)
return; return;
...@@ -1826,74 +1706,53 @@ void Game::ErrorLog(char* msg) { ...@@ -1826,74 +1706,53 @@ void Game::ErrorLog(char* msg) {
fclose(fp); fclose(fp);
#endif //YGOPRO_SERVER_MODE #endif //YGOPRO_SERVER_MODE
} }
bool Game::MakeDirectory(const std::string folder) {
std::string folder_builder;
std::string sub;
sub.reserve(folder.size());
for(auto it = folder.begin(); it != folder.end(); ++it) {
const char c = *it;
sub.push_back(c);
if(c == '/' || it == folder.end() - 1) {
folder_builder.append(sub);
if(access(folder_builder.c_str(), 0) != 0)
#ifdef _WIN32
if(mkdir(folder_builder.c_str()) != 0)
#else
if(mkdir(folder_builder.c_str(), 0777) != 0)
#endif
return false;
sub.clear();
}
}
return true;
}
void Game::initUtils() { void Game::initUtils() {
//user files //user files
MakeDirectory("replay"); FileSystem::MakeDir("replay");
//cards from extra pack //cards from extra pack
MakeDirectory("expansions"); FileSystem::MakeDir("expansions");
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
//special scripts //special scripts
MakeDirectory("specials"); FileSystem::MakeDir("specials");
MakeDirectory("beta"); FileSystem::MakeDir("beta");
#else #else
MakeDirectory("screenshots"); FileSystem::MakeDir("screenshots");
//files in ygopro-starter-pack //files in ygopro-starter-pack
MakeDirectory("deck"); FileSystem::MakeDir("deck");
MakeDirectory("single"); FileSystem::MakeDir("single");
//original files //original files
MakeDirectory("script"); FileSystem::MakeDir("script");
MakeDirectory("skin"); FileSystem::MakeDir("skin");
MakeDirectory("textures"); FileSystem::MakeDir("textures");
//subdirs in textures //subdirs in textures
MakeDirectory("textures/act"); FileSystem::MakeDir("textures/act");
MakeDirectory("textures/attack"); FileSystem::MakeDir("textures/attack");
MakeDirectory("textures/bg"); FileSystem::MakeDir("textures/bg");
MakeDirectory("textures/bg_deck"); FileSystem::MakeDir("textures/bg_deck");
MakeDirectory("textures/bg_menu"); FileSystem::MakeDir("textures/bg_menu");
MakeDirectory("textures/cover"); FileSystem::MakeDir("textures/cover");
MakeDirectory("textures/cover2"); FileSystem::MakeDir("textures/cover2");
MakeDirectory("textures/pscale"); FileSystem::MakeDir("textures/pscale");
//sound //sound
#ifdef YGOPRO_USE_IRRKLANG #ifdef YGOPRO_USE_IRRKLANG
MakeDirectory("sound"); FileSystem::MakeDir("sound");
MakeDirectory("sound/BGM"); FileSystem::MakeDir("sound/BGM");
MakeDirectory("sound/BGM/advantage"); FileSystem::MakeDir("sound/BGM/advantage");
MakeDirectory("sound/BGM/deck"); FileSystem::MakeDir("sound/BGM/deck");
MakeDirectory("sound/BGM/disadvantage"); FileSystem::MakeDir("sound/BGM/disadvantage");
MakeDirectory("sound/BGM/duel"); FileSystem::MakeDir("sound/BGM/duel");
MakeDirectory("sound/BGM/lose"); FileSystem::MakeDir("sound/BGM/lose");
MakeDirectory("sound/BGM/menu"); FileSystem::MakeDir("sound/BGM/menu");
MakeDirectory("sound/BGM/win"); FileSystem::MakeDir("sound/BGM/win");
//custom sound //custom sound
MakeDirectory("sound/custom"); FileSystem::MakeDir("sound/custom");
MakeDirectory("sound/BGM/custom"); FileSystem::MakeDir("sound/BGM/custom");
#endif #endif
//locales //locales
MakeDirectory("locales"); FileSystem::MakeDir("locales");
//pics //pics
MakeDirectory("pics"); FileSystem::MakeDir("pics");
MakeDirectory("pics/field"); FileSystem::MakeDir("pics/field");
#endif //YGOPRO_SERVER_MODE #endif //YGOPRO_SERVER_MODE
} }
#ifndef YGOPRO_SERVER_MODE #ifndef YGOPRO_SERVER_MODE
...@@ -2273,6 +2132,8 @@ void Game::FlashWindow() { ...@@ -2273,6 +2132,8 @@ void Game::FlashWindow() {
#endif #endif
} }
void Game::takeScreenshot() { void Game::takeScreenshot() {
if(!FileSystem::IsDirExists(L"./screenshots") && !FileSystem::MakeDir(L"./screenshots"))
return;
irr::video::IImage* const image = driver->createScreenShot(); irr::video::IImage* const image = driver->createScreenShot();
if(image) { if(image) {
irr::c8 filename[64]; irr::c8 filename[64];
......
...@@ -168,11 +168,10 @@ public: ...@@ -168,11 +168,10 @@ public:
void SaveConfig(); void SaveConfig();
void ShowCardInfo(int code, bool resize = false); void ShowCardInfo(int code, bool resize = false);
void ClearCardInfo(int player = 0); void ClearCardInfo(int player = 0);
void AddChatMsg(wchar_t* msg, int player); void AddChatMsg(const wchar_t* msg, int player);
void ClearChatMsg(); void ClearChatMsg();
void AddDebugMsg(char* msgbuf); void AddDebugMsg(const char* msgbuf);
void ErrorLog(char* msgbuf); void ErrorLog(const char* msgbuf);
bool MakeDirectory(const std::string folder);
void initUtils(); void initUtils();
void ClearTextures(); void ClearTextures();
void CloseDuelWindow(); void CloseDuelWindow();
......
#include "image_manager.h" #include "image_manager.h"
#include "game.h" #include "game.h"
#ifndef _WIN32
#include <dirent.h>
#endif
namespace ygo { namespace ygo {
...@@ -95,54 +92,27 @@ irr::video::ITexture* ImageManager::GetRandomImage(int image_type, s32 width, s3 ...@@ -95,54 +92,27 @@ irr::video::ITexture* ImageManager::GetRandomImage(int image_type, s32 width, s3
return GetTextureFromFile(ImageName, width, height); return GetTextureFromFile(ImageName, width, height);
} }
void ImageManager::RefreshRandomImageList() { void ImageManager::RefreshRandomImageList() {
RefreshImageDir(L"bg/", TEXTURE_DUEL); RefreshImageDir(L"bg", TEXTURE_DUEL);
RefreshImageDir(L"bg_duel/", TEXTURE_DUEL); RefreshImageDir(L"bg_duel", TEXTURE_DUEL);
RefreshImageDir(L"bg_deck/", TEXTURE_DECK); RefreshImageDir(L"bg_deck", TEXTURE_DECK);
RefreshImageDir(L"bg_menu/", TEXTURE_MENU); RefreshImageDir(L"bg_menu", TEXTURE_MENU);
RefreshImageDir(L"cover/", TEXTURE_COVER_S); RefreshImageDir(L"cover", TEXTURE_COVER_S);
RefreshImageDir(L"cover2/", TEXTURE_COVER_O); RefreshImageDir(L"cover2", TEXTURE_COVER_O);
RefreshImageDir(L"attack/", TEXTURE_ATTACK); RefreshImageDir(L"attack", TEXTURE_ATTACK);
RefreshImageDir(L"act/", TEXTURE_ACTIVATE); RefreshImageDir(L"act", TEXTURE_ACTIVATE);
for(int i = 0; i < 7; ++ i) { for(int i = 0; i < 7; ++ i) {
saved_image_id[i] = -1; saved_image_id[i] = -1;
} }
} }
void ImageManager::RefreshImageDir(std::wstring path, int image_type) { void ImageManager::RefreshImageDir(std::wstring path, int image_type) {
#ifdef _WIN32 std::wstring search = L"./textures/" + path;
WIN32_FIND_DATAW fdataw; FileSystem::TraversalDir(search.c_str(), [this, &path, image_type](const wchar_t* name, bool isdir) {
std::wstring search = L"./textures/" + path + L"*.*"; if(!isdir && wcsrchr(name, '.') && (!mywcsncasecmp(wcsrchr(name, '.'), L".jpg", 4) || !mywcsncasecmp(wcsrchr(name, '.'), L".png", 4))) {
HANDLE fh = FindFirstFileW(search.c_str(), &fdataw); std::wstring filename = path + L"/" + name;
if(fh == INVALID_HANDLE_VALUE) ImageList[image_type].push_back(filename);
return; }
do { });
size_t len = wcslen(fdataw.cFileName);
if((fdataw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || len < 5
|| !(_wcsicmp(fdataw.cFileName + len - 4, L".jpg") == 0 || _wcsicmp(fdataw.cFileName + len - 4, L".png") == 0))
continue;
std::wstring filename = path + (std::wstring)fdataw.cFileName;
ImageList[image_type].push_back(filename);
} while(FindNextFileW(fh, &fdataw));
FindClose(fh);
#else
DIR * dir;
struct dirent * dirp;
std::wstring wsearchpath = L"./textures/" + path;
char searchpath[256];
BufferIO::EncodeUTF8(wsearchpath.c_str(), searchpath);
if((dir = opendir(searchpath)) == NULL)
return;
while((dirp = readdir(dir)) != NULL) {
size_t len = strlen(dirp->d_name);
if(len < 5 || !(strcasecmp(dirp->d_name + len - 4, ".jpg") == 0 || strcasecmp(dirp->d_name + len - 4, ".png")))
continue;
wchar_t wname[256];
BufferIO::DecodeUTF8(dirp->d_name, wname);
std::wstring filename = path + (std::wstring)wname;
ImageList[image_type].push_back(filename);
}
closedir(dir);
#endif
} }
void ImageManager::SetDevice(irr::IrrlichtDevice* dev) { void ImageManager::SetDevice(irr::IrrlichtDevice* dev) {
device = dev; device = dev;
......
#ifndef FILESYSTEM_H
#define FILESYSTEM_H
#include <string.h>
#include <functional>
#include "bufferio.h"
#ifdef _WIN32
#include <direct.h>
#include <sys/stat.h>
#else
#include <dirent.h>
#include <sys/stat.h>
#endif
#ifdef _WIN32
#include <Windows.h>
class FileSystem {
public:
static bool IsFileExists(const wchar_t* wfile) {
struct _stat fileStat;
return (_wstat(wfile, &fileStat) == 0) && !(fileStat.st_mode & _S_IFDIR);
}
static bool IsFileExists(const char* file) {
wchar_t wfile[1024];
BufferIO::DecodeUTF8(file, wfile);
return IsFileExists(wfile);
}
static bool IsDirExists(const wchar_t* wdir) {
struct _stat fileStat;
return (_wstat(wdir, &fileStat) == 0) && (fileStat.st_mode & _S_IFDIR);
}
static bool IsDirExists(const char* dir) {
wchar_t wdir[1024];
BufferIO::DecodeUTF8(dir, wdir);
return IsDirExists(wdir);
}
static bool MakeDir(const wchar_t* wdir) {
return _wmkdir(wdir) == 0;
}
static bool MakeDir(const char* dir) {
wchar_t wdir[1024];
BufferIO::DecodeUTF8(dir, wdir);
return MakeDir(wdir);
}
static void TraversalDir(const wchar_t* wpath, const std::function<void(const wchar_t*, bool)>& cb) {
wchar_t findstr[1024];
wcscpy(findstr, wpath);
wcscat(findstr, L"/*");
WIN32_FIND_DATAW fdataw;
HANDLE fh = FindFirstFileW(findstr, &fdataw);
if(fh == INVALID_HANDLE_VALUE)
return;
do {
cb(fdataw.cFileName, (fdataw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY));
} while(FindNextFileW(fh, &fdataw));
FindClose(fh);
}
static void TraversalDir(const char* path, const std::function<void(const char*, bool)>& cb) {
wchar_t wpath[1024];
BufferIO::DecodeUTF8(path, wpath);
TraversalDir(wpath, [&cb](const wchar_t* wname, bool isdir) {
char name[1024];
BufferIO::EncodeUTF8(wname, name);
cb(name, isdir);
});
}
};
#else
class FileSystem {
public:
static bool IsFileExists(const char* file) {
struct stat fileStat;
return (stat(file, &fileStat) == 0) && !S_ISDIR(fileStat.st_mode);
}
static bool IsFileExists(const wchar_t* wfile) {
char file[1024];
BufferIO::EncodeUTF8(wfile, file);
return IsFileExists(file);
}
static bool IsDirExists(const char* dir) {
struct stat fileStat;
return (stat(dir, &fileStat) == 0) && S_ISDIR(fileStat.st_mode);
}
static bool IsDirExists(const wchar_t* wdir) {
char dir[1024];
BufferIO::EncodeUTF8(wdir, dir);
return IsDirExists(dir);
}
static bool MakeDir(const char* dir) {
return mkdir(dir, 0775) == 0;
}
static bool MakeDir(const wchar_t* wdir) {
char dir[1024];
BufferIO::EncodeUTF8(wdir, dir);
return MakeDir(dir);
}
static void TraversalDir(const char* path, const std::function<void(const char*, bool)>& cb) {
DIR* dir = nullptr;
struct dirent* dirp = nullptr;
if((dir = opendir(path)) == nullptr)
return;
struct stat fileStat;
while((dirp = readdir(dir)) != nullptr) {
char fname[1024];
strcpy(fname, path);
strcat(fname, "/");
strcat(fname, dirp->d_name);
stat(fname, &fileStat);
cb(dirp->d_name, S_ISDIR(fileStat.st_mode));
}
closedir(dir);
}
static void TraversalDir(const wchar_t* wpath, const std::function<void(const wchar_t*, bool)>& cb) {
char path[1024];
BufferIO::EncodeUTF8(wpath, path);
TraversalDir(path, [&cb](const char* name, bool isdir) {
wchar_t wname[1024];
BufferIO::DecodeUTF8(name, wname);
cb(wname, isdir);
});
}
};
#endif // _WIN32
#endif //FILESYSTEM_H
...@@ -24,6 +24,8 @@ void Replay::BeginRecord() { ...@@ -24,6 +24,8 @@ void Replay::BeginRecord() {
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
if(replay_mode > 0) { if(replay_mode > 0) {
#endif #endif
if(!FileSystem::IsDirExists(L"./replay") && !FileSystem::MakeDir(L"./replay"))
return;
#ifdef _WIN32 #ifdef _WIN32
if(is_recording) if(is_recording)
CloseHandle(recording_fp); CloseHandle(recording_fp);
...@@ -177,6 +179,8 @@ void Replay::EndRecord() { ...@@ -177,6 +179,8 @@ void Replay::EndRecord() {
is_recording = false; is_recording = false;
} }
void Replay::SaveReplay(const wchar_t* name) { void Replay::SaveReplay(const wchar_t* name) {
if(!FileSystem::IsDirExists(L"./replay") && !FileSystem::MakeDir(L"./replay"))
return;
wchar_t fname[256]; wchar_t fname[256];
myswprintf(fname, L"./replay/%ls.yrp", name); myswprintf(fname, L"./replay/%ls.yrp", name);
#ifdef WIN32 #ifdef WIN32
......
...@@ -149,7 +149,7 @@ int SingleMode::SinglePlayThread(void* param) { ...@@ -149,7 +149,7 @@ int SingleMode::SinglePlayThread(void* param) {
mainGame->actionParam = 1; mainGame->actionParam = 1;
wchar_t msgbuf[256]; wchar_t msgbuf[256];
myswprintf(msgbuf, dataManager.GetSysString(1376), timetext); myswprintf(msgbuf, dataManager.GetSysString(1376), timetext);
mainGame->SetStaticText(mainGame->stACMessage, 310, mainGame->textFont, msgbuf); mainGame->SetStaticText(mainGame->stACMessage, 310, mainGame->guiFont, msgbuf);
mainGame->PopupElement(mainGame->wACMessage, 20); mainGame->PopupElement(mainGame->wACMessage, 20);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->WaitFrameSignal(30); mainGame->WaitFrameSignal(30);
......
#include "sound_manager.h" #include "sound_manager.h"
#ifndef _WIN32
#include <dirent.h>
#endif
#ifdef YGOPRO_USE_IRRKLANG #ifdef YGOPRO_USE_IRRKLANG
#include "../ikpmp3/ikpMP3.h" #include "../ikpmp3/ikpMP3.h"
#endif #endif
...@@ -31,55 +28,25 @@ bool SoundManager::Init() { ...@@ -31,55 +28,25 @@ bool SoundManager::Init() {
void SoundManager::RefreshBGMList() { void SoundManager::RefreshBGMList() {
#ifdef YGOPRO_USE_IRRKLANG #ifdef YGOPRO_USE_IRRKLANG
RefershBGMDir(L"", BGM_DUEL); RefershBGMDir(L"", BGM_DUEL);
RefershBGMDir(L"duel/", BGM_DUEL); RefershBGMDir(L"duel", BGM_DUEL);
RefershBGMDir(L"menu/", BGM_MENU); RefershBGMDir(L"menu", BGM_MENU);
RefershBGMDir(L"deck/", BGM_DECK); RefershBGMDir(L"deck", BGM_DECK);
RefershBGMDir(L"advantage/", BGM_ADVANTAGE); RefershBGMDir(L"advantage", BGM_ADVANTAGE);
RefershBGMDir(L"disadvantage/", BGM_DISADVANTAGE); RefershBGMDir(L"disadvantage", BGM_DISADVANTAGE);
RefershBGMDir(L"win/", BGM_WIN); RefershBGMDir(L"win", BGM_WIN);
RefershBGMDir(L"lose/", BGM_LOSE); RefershBGMDir(L"lose", BGM_LOSE);
RefershBGMDir(L"custom/", BGM_CUSTOM); RefershBGMDir(L"custom", BGM_CUSTOM);
#endif #endif
} }
void SoundManager::RefershBGMDir(std::wstring path, int scene) { void SoundManager::RefershBGMDir(std::wstring path, int scene) {
#ifdef YGOPRO_USE_IRRKLANG std::wstring search = L"./sound/BGM/" + path;
#ifdef _WIN32 FileSystem::TraversalDir(search.c_str(), [this, &path, scene](const wchar_t* name, bool isdir) {
WIN32_FIND_DATAW fdataw; if(!isdir && wcsrchr(name, '.') && (!mywcsncasecmp(wcsrchr(name, '.'), L".mp3", 4) || !mywcsncasecmp(wcsrchr(name, '.'), L".ogg", 4))) {
std::wstring search = L"./sound/BGM/" + path + L"*.*"; std::wstring filename = path + L"/" + name;
HANDLE fh = FindFirstFileW(search.c_str(), &fdataw); BGMList[BGM_ALL].push_back(filename);
if(fh == INVALID_HANDLE_VALUE) BGMList[scene].push_back(filename);
return; }
do { });
size_t len = wcslen(fdataw.cFileName);
if((fdataw.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || len < 5
|| !(_wcsicmp(fdataw.cFileName + len - 4, L".mp3") == 0 || _wcsicmp(fdataw.cFileName + len - 4, L".ogg") == 0))
continue;
std::wstring filename = path + (std::wstring)fdataw.cFileName;
BGMList[BGM_ALL].push_back(filename);
BGMList[scene].push_back(filename);
} while(FindNextFileW(fh, &fdataw));
FindClose(fh);
#else
DIR * dir;
struct dirent * dirp;
std::wstring wsearchpath = L"./sound/BGM/" + path;
char searchpath[256];
BufferIO::EncodeUTF8(wsearchpath.c_str(), searchpath);
if((dir = opendir(searchpath)) == NULL)
return;
while((dirp = readdir(dir)) != NULL) {
size_t len = strlen(dirp->d_name);
if(len < 5 || !(strcasecmp(dirp->d_name + len - 4, ".mp3") == 0 || strcasecmp(dirp->d_name + len - 4, ".ogg")))
continue;
wchar_t wname[256];
BufferIO::DecodeUTF8(dirp->d_name, wname);
std::wstring filename = path + (std::wstring)wname;
BGMList[BGM_ALL].push_back(filename);
BGMList[scene].push_back(filename);
}
closedir(dir);
#endif
#endif
} }
void SoundManager::PlaySoundEffect(int sound) { void SoundManager::PlaySoundEffect(int sound) {
#ifdef YGOPRO_USE_IRRKLANG #ifdef YGOPRO_USE_IRRKLANG
......
...@@ -37,7 +37,7 @@ solution "ygo" ...@@ -37,7 +37,7 @@ solution "ygo"
optimize "Speed" optimize "Speed"
flags { "LinkTimeOptimization" } flags { "LinkTimeOptimization" }
staticruntime "On" staticruntime "On"
disablewarnings { "4244", "4267", "4838", "4577", "4819", "4018", "4996", "4477", "4091", "4305", "4828" } disablewarnings { "4244", "4267", "4838", "4577", "4819", "4018", "4996", "4477", "4091", "4305", "4828", "4800" }
configuration { "Release", "not vs*" } configuration { "Release", "not vs*" }
symbols "On" symbols "On"
......
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