Jeck - Removed some unused bits of code, added zip support to themes' card overrides. @Jean, please check WResourceManager::dirOK() on Linux.
This needs some impact testing, to be certain it doesn't noticeably slow anything down. In a future version I'd like to memoize checking for zip file existence in each "Res/sets/XXX/" directory once during boot, and in the themed directory whenever switching themes.
This commit is contained in:
@@ -13,4 +13,4 @@ This is themeinfo.txt. The first line should contain theme authorship informatio
|
||||
|
||||
To build a theme, copy any file from the res/graphics/ directory to a directory just like this one. Then comes the fun part... edit it, save it, and load it up in Wagic. Be sure to include a 227*128 pixel "preview.png" to show off your new theme in options menu!
|
||||
|
||||
You can also replace card images! Just place your new card picture in the same place it would be under the sets directory. Be careful, though, as you can't use zipped card images in themes. For example, to replace 10th Edition's Demystify in "My Theme", use a file like this: "themes/my theme/sets/10E/129524.jpg"
|
||||
You can also replace card images! Just place your new card picture in the same place it would be under the sets directory. For example, to replace 10th Edition's Demystify in "My Theme", use a file like this: "themes/my theme/sets/10E/129524.jpg". You can also use zipped card images, just like with the normal sets directory!
|
||||
@@ -162,12 +162,13 @@ public:
|
||||
JQuad* GetQuad(int id);
|
||||
|
||||
//Our file redirect system.
|
||||
string graphicsFile(const string filename, const string specific = "");
|
||||
string avatarFile(const string filename, const string specific = "");
|
||||
string cardFile(const string filename, const string specific = "");
|
||||
string musicFile(const string filename, const string specific = "");
|
||||
string sfxFile(const string filename, const string specific = "");
|
||||
string graphicsFile(const string filename);
|
||||
string avatarFile(const string filename);
|
||||
string cardFile(const string filename);
|
||||
string musicFile(const string filename);
|
||||
string sfxFile(const string filename);
|
||||
int fileOK(string filename, bool relative = false);
|
||||
int dirOK(string dirname);
|
||||
|
||||
//For backwards compatibility with JResourceManager. Avoid using these, they're not optimal.
|
||||
int CreateTexture(const string &textureName);
|
||||
@@ -190,6 +191,7 @@ public:
|
||||
#endif
|
||||
|
||||
private:
|
||||
bool bThemedCards; //Does the theme have a "sets" directory for overwriting cards?
|
||||
void FlattenTimes(); //To prevent bad cache timing on int overflow
|
||||
|
||||
//For cached stuff
|
||||
|
||||
@@ -273,8 +273,8 @@ bool WCachedTexture::Attempt(string filename, int submode, int & error){
|
||||
if(submode & TEXTURE_SUB_5551)
|
||||
format = GU_PSM_5551;
|
||||
|
||||
if(!realname.size()){ //realname should not be empty, even if file 404s.
|
||||
error = CACHE_ERROR_BAD;
|
||||
if(!realname.size()){
|
||||
error = CACHE_ERROR_404;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
#include <JFileSystem.h>
|
||||
#include <assert.h>
|
||||
#include "../include/WResourceManager.h"
|
||||
#if defined (WIN32)
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
int idCounter = OTHERS_OFFSET;
|
||||
|
||||
@@ -171,6 +175,8 @@ WResourceManager::WResourceManager(){
|
||||
textureWCache.Resize(TEXTURES_CACHE_MINSIZE,MAX_CACHE_OBJECTS);
|
||||
lastTime = 0;
|
||||
lastError = CACHE_ERROR_NONE;
|
||||
|
||||
bThemedCards = false;
|
||||
}
|
||||
WResourceManager::~WResourceManager(){
|
||||
LOG("==Destroying WResourceManager==");
|
||||
@@ -495,16 +501,9 @@ JSample * WResourceManager::RetrieveSample(string filename, int style, int submo
|
||||
return NULL;
|
||||
}
|
||||
|
||||
string WResourceManager::graphicsFile(const string filename, const string specific){
|
||||
string WResourceManager::graphicsFile(const string filename){
|
||||
char buf[512];
|
||||
|
||||
//Check the specific location, if any.
|
||||
if(specific != ""){
|
||||
sprintf(buf,"%s/%s",specific.c_str(),filename.c_str());
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
|
||||
//Check the theme folder.
|
||||
string theme = options[Options::ACTIVE_THEME].str;
|
||||
|
||||
@@ -513,7 +512,8 @@ string WResourceManager::graphicsFile(const string filename, const string specif
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
|
||||
/*
|
||||
//FIXME Put back when we're using modes.
|
||||
//Failure. Check mode graphics
|
||||
string mode = options[Options::ACTIVE_MODE].str;
|
||||
|
||||
@@ -522,7 +522,7 @@ string WResourceManager::graphicsFile(const string filename, const string specif
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
|
||||
*/
|
||||
//Failure. Check graphics
|
||||
char graphdir[512];
|
||||
sprintf(graphdir,"graphics/%s",filename.c_str());
|
||||
@@ -539,16 +539,9 @@ string WResourceManager::graphicsFile(const string filename, const string specif
|
||||
}
|
||||
|
||||
|
||||
string WResourceManager::avatarFile(const string filename, const string specific){
|
||||
string WResourceManager::avatarFile(const string filename){
|
||||
char buf[512];
|
||||
|
||||
//Check the specific location, if any.
|
||||
if(specific != ""){
|
||||
sprintf(buf,"%s/%s",specific.c_str(),filename.c_str());
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
|
||||
//Check the profile folder.
|
||||
string profile = options[Options::ACTIVE_PROFILE].str;
|
||||
|
||||
@@ -570,7 +563,8 @@ string WResourceManager::avatarFile(const string filename, const string specific
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
|
||||
/*
|
||||
//FIXME Put back when we're using modes.
|
||||
//Failure. Check mode graphics
|
||||
string mode = options[Options::ACTIVE_MODE].str;
|
||||
|
||||
@@ -579,6 +573,7 @@ string WResourceManager::avatarFile(const string filename, const string specific
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
*/
|
||||
|
||||
//Failure. Check Baka
|
||||
sprintf(buf,"ai/baka/avatars/%s",filename.c_str());
|
||||
@@ -595,30 +590,42 @@ string WResourceManager::avatarFile(const string filename, const string specific
|
||||
return graphdir;
|
||||
}
|
||||
|
||||
string WResourceManager::cardFile(const string filename, const string specific){
|
||||
JFileSystem* fs = JFileSystem::GetInstance();
|
||||
|
||||
|
||||
//PUT Back the following when we have an actual usage for it (theme, or whatever)
|
||||
//Right now I'm removing this for performance
|
||||
/*
|
||||
string WResourceManager::cardFile(const string filename){
|
||||
char buf[512];
|
||||
//Check the specific location, if any.
|
||||
if(specific != ""){
|
||||
sprintf(buf,"%s/sets/%s",specific.c_str(),filename.c_str());
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
|
||||
string::size_type i;
|
||||
string set;
|
||||
JFileSystem* fs = JFileSystem::GetInstance();
|
||||
|
||||
//Check the theme folder.
|
||||
string theme = options[Options::ACTIVE_THEME].str;
|
||||
|
||||
if(theme != "" && theme != "Default"){
|
||||
sprintf(buf,"themes/%s/sets/%s",theme.c_str(),filename.c_str());
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
//Does this theme use custom cards?
|
||||
if(bThemedCards){
|
||||
//Check zipped first. Discover set name.
|
||||
for(i = 0;i < filename.size();i++){
|
||||
if(filename[i] == '\\' || filename[i] == '/')
|
||||
break;
|
||||
}
|
||||
|
||||
if(i != filename.size())
|
||||
set = filename.substr(0,i);
|
||||
|
||||
if(set.size()){
|
||||
char zipname[512];
|
||||
sprintf(zipname, "Res/themes/%s/sets/%s/%s.zip", theme.c_str(), set.c_str(),set.c_str());
|
||||
if (fs->AttachZipFile(zipname))
|
||||
return filename.substr(i+1);
|
||||
}
|
||||
|
||||
sprintf(buf,"themes/%s/sets/%s",theme.c_str(),filename.c_str());
|
||||
if(fileOK(buf,true))
|
||||
return buf; //Themed, unzipped.
|
||||
}
|
||||
}
|
||||
|
||||
//FIXME Put back when we're using modes.
|
||||
/*
|
||||
//Failure. Check mode
|
||||
string mode = options[Options::ACTIVE_MODE].str;
|
||||
|
||||
@@ -627,48 +634,38 @@ string WResourceManager::cardFile(const string filename, const string specific){
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
|
||||
*/
|
||||
//Failure. Check sets
|
||||
//Failure. Assume it's in a zip file?
|
||||
if(!set.size()){ //Didn't fill "set" string, so do it now.
|
||||
for(i = 0;i < filename.size();i++){
|
||||
if(filename[i] == '\\' || filename[i] == '/')
|
||||
break;
|
||||
}
|
||||
|
||||
if(i != filename.size())
|
||||
set = filename.substr(0,i);
|
||||
}
|
||||
|
||||
if(set.size()){
|
||||
char zipname[512];
|
||||
sprintf(zipname, "Res/sets/%s/%s.zip", set.c_str(),set.c_str());
|
||||
if (fs->AttachZipFile(zipname))
|
||||
return filename.substr(i+1);
|
||||
}
|
||||
|
||||
//Failure. Check for unzipped file in sets
|
||||
char defdir[512];
|
||||
sprintf(defdir,"sets/%s",filename.c_str());
|
||||
if(fileOK(defdir,true))
|
||||
return defdir;
|
||||
|
||||
//Failure. Assume it's in a zip file?
|
||||
string::size_type i;
|
||||
for(i = 0;i < filename.size();i++){
|
||||
if(filename[i] == '\\' || filename[i] == '/')
|
||||
break;
|
||||
}
|
||||
|
||||
if(i != filename.size()){
|
||||
string set = filename.substr(0,i);
|
||||
|
||||
if(set.size()){
|
||||
char zipname[512];
|
||||
sprintf(zipname, "Res/sets/%s/%s.zip", set.c_str(),set.c_str());
|
||||
if (fileOK(zipname)){
|
||||
fs->AttachZipFile(zipname);
|
||||
return filename.substr(i+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Complete failure.
|
||||
return "";
|
||||
}
|
||||
|
||||
string WResourceManager::musicFile(const string filename, const string specific){
|
||||
string WResourceManager::musicFile(const string filename){
|
||||
char buf[512];
|
||||
|
||||
//Check the specific location, if any.
|
||||
if(specific != ""){
|
||||
sprintf(buf,"%s/%s",specific.c_str(),filename.c_str());
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
|
||||
//Check the theme folder.
|
||||
string theme = options[Options::ACTIVE_THEME].str;
|
||||
|
||||
@@ -678,6 +675,8 @@ string WResourceManager::musicFile(const string filename, const string specific)
|
||||
return buf;
|
||||
}
|
||||
|
||||
/*
|
||||
//FIXME Put back when we're using modes.
|
||||
//Failure. Check mode
|
||||
string mode = options[Options::ACTIVE_MODE].str;
|
||||
|
||||
@@ -685,7 +684,7 @@ string WResourceManager::musicFile(const string filename, const string specific)
|
||||
sprintf(buf,"modes/%s/sound/%s",mode.c_str(),filename.c_str());
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
}*/
|
||||
|
||||
//Failure. Check sound
|
||||
char defdir[512];
|
||||
@@ -697,16 +696,9 @@ string WResourceManager::musicFile(const string filename, const string specific)
|
||||
return defdir;
|
||||
}
|
||||
|
||||
string WResourceManager::sfxFile(const string filename, const string specific){
|
||||
string WResourceManager::sfxFile(const string filename){
|
||||
char buf[512];
|
||||
|
||||
//Check the specific location, if any.
|
||||
if(specific != ""){
|
||||
sprintf(buf,"%s/%s",specific.c_str(),filename.c_str());
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
|
||||
//Check the theme folder.
|
||||
string theme = options[Options::ACTIVE_THEME].str;
|
||||
|
||||
@@ -716,6 +708,8 @@ string WResourceManager::sfxFile(const string filename, const string specific){
|
||||
return buf;
|
||||
}
|
||||
|
||||
/*
|
||||
//FIXME: Put back when we're using modes.
|
||||
//Failure. Check mode
|
||||
string mode = options[Options::ACTIVE_MODE].str;
|
||||
if(mode != "" && mode != "Default"){
|
||||
@@ -723,7 +717,7 @@ string WResourceManager::sfxFile(const string filename, const string specific){
|
||||
if(fileOK(buf,true))
|
||||
return buf;
|
||||
}
|
||||
|
||||
*/
|
||||
//Failure. Check sound
|
||||
char defdir[512];
|
||||
sprintf(defdir,"sound/sfx/%s",filename.c_str());
|
||||
@@ -734,6 +728,25 @@ string WResourceManager::sfxFile(const string filename, const string specific){
|
||||
return "";
|
||||
}
|
||||
|
||||
int WResourceManager::dirOK(string dirname){
|
||||
char fname[512];
|
||||
|
||||
#if defined (WIN32)
|
||||
sprintf(fname,RESPATH"/%s",dirname.c_str());
|
||||
|
||||
struct _stat statBuffer;
|
||||
return (_stat(fname, &statBuffer) >= 0 && // make sure it exists
|
||||
statBuffer.st_mode & S_IFDIR); // and it's not a file
|
||||
#else
|
||||
sprintf(fname,RESPATH"/%s",dirname.c_str());
|
||||
struct stat st;
|
||||
if(stat(fname,&st) == 0)
|
||||
return 1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int WResourceManager::fileOK(string filename, bool relative){
|
||||
char fname[512];
|
||||
std::ifstream * fp = NULL;
|
||||
@@ -863,6 +876,16 @@ void WResourceManager::Refresh(){
|
||||
|
||||
SAFE_DELETE(oldtex);
|
||||
}
|
||||
|
||||
//Check for card images in theme.
|
||||
bThemedCards = false;
|
||||
if(!options[Options::ACTIVE_THEME].isDefault()){
|
||||
char buf[512];
|
||||
sprintf(buf,"themes/%s/sets",options[Options::ACTIVE_THEME].str.c_str());
|
||||
|
||||
if(dirOK(buf))
|
||||
bThemedCards = true;
|
||||
}
|
||||
}
|
||||
|
||||
//WCache
|
||||
|
||||
Reference in New Issue
Block a user