From ad36e59a719985e15d3b720f467ece6cda5b473f Mon Sep 17 00:00:00 2001 From: kervala Date: Wed, 13 Jan 2016 19:43:46 +0100 Subject: [PATCH 01/12] Fixed: Save filenames in .bank with / instead of system separator --HG-- branch : develop --- code/nel/include/nel/3d/tile_bank.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/nel/include/nel/3d/tile_bank.h b/code/nel/include/nel/3d/tile_bank.h index 00e0f2cae..32a205e6d 100644 --- a/code/nel/include/nel/3d/tile_bank.h +++ b/code/nel/include/nel/3d/tile_bank.h @@ -20,6 +20,7 @@ #include "nel/misc/debug.h" #include "nel/misc/stream.h" #include "nel/misc/rgba.h" +#include "nel/misc/path.h" #include #include #include @@ -82,8 +83,8 @@ public: // not free _Flags&=~NL3D_CTILE_FREE_FLAG; - // set filename - _BitmapName[bitmapType]=name; + // set filename, replacing \\ by / if needed + _BitmapName[bitmapType] = NLMISC::CPath::standardizePath(name, false); } std::string getFileName (TBitmap bitmapType) const From af9610328f0dffcd715e4308a109f8ee532df4ae Mon Sep 17 00:00:00 2001 From: kervala Date: Wed, 13 Jan 2016 19:45:02 +0100 Subject: [PATCH 02/12] Changed: Implement expandEnvironmentVariables function --HG-- branch : develop --- code/nel/include/nel/misc/common.h | 5 ++ code/nel/src/misc/common.cpp | 74 ++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/code/nel/include/nel/misc/common.h b/code/nel/include/nel/misc/common.h index 7dc394f24..710a9e6df 100644 --- a/code/nel/include/nel/misc/common.h +++ b/code/nel/include/nel/misc/common.h @@ -360,6 +360,11 @@ sint launchProgramAndWaitForResult (const std::string &programName, const std::s /// This function executes a program and returns output as a string std::string getCommandOutput(const std::string &command); +/// This function replace all environment variables in a string by their content. +/// Environment variables names can use both Windows (%NAME%) and UNIX syntax ($NAME) +/// Authorized characters in names are A-Z, a-z, 0-9 and _ +std::string expandEnvironmentVariables(const std::string &s); + /// This function kills a program using his pid (on unix, it uses the kill() POSIX function) bool killProgram(uint32 pid); diff --git a/code/nel/src/misc/common.cpp b/code/nel/src/misc/common.cpp index 982d42da3..e57ce635b 100644 --- a/code/nel/src/misc/common.cpp +++ b/code/nel/src/misc/common.cpp @@ -913,6 +913,80 @@ std::string getCommandOutput(const std::string &command) return result; } +std::string expandEnvironmentVariables(const std::string &s) +{ + size_t len = s.length(); + std::string ret; + + std::string::size_type pos1 = 0, pos2 = 0; + + // look for environement variables delimiters + while(pos2 < len && (pos1 = s.find_first_of("%$", pos2)) != std::string::npos) + { + // copy string unprocessed part + ret += s.substr(pos2, pos1-pos2); + + // extract a valid variable name (a-zA-Z0-9_) + pos2 = pos1+1; + + while(pos2 < len && (isalnum(s[pos2]) || s[pos2] == '_')) ++pos2; + + // check if variable name is empty + bool found = pos2 > pos1+1; + + std::string name; + + if (found) + { + // found at least 1 character + name = s.substr(pos1+1, pos2-pos1-1); + } + + // Windows format needs a trailing % delimiter + if (found && s[pos1] == '%') + { + if (pos2 >= len || s[pos2] != '%') + { + // not a variable name, because no trailing % + found = false; + } + else + { + // found a trailing %, next character to check + ++pos2; + } + } + + // get variable value if name found + if (found) + { + const char *value = getenv(name.c_str()); + + if (value) + { + // value found + ret += std::string(value); + } + else + { + // value not found + found = false; + } + } + + if (!found) + { + // variable or value not found, don't evaluate variable + ret += s.substr(pos1, pos2-pos1); + } + } + + // copy last unprocessed part + ret += s.substr(pos2); + + return ret; +} + /* * Display the bits (with 0 and 1) composing a byte (from right to left) */ From a66fa8cc9c35c20ba1da9ccd18594b371ec4d8a0 Mon Sep 17 00:00:00 2001 From: kervala Date: Wed, 13 Jan 2016 19:46:27 +0100 Subject: [PATCH 03/12] Changed: Implement CPath::isAbsolutePath --HG-- branch : develop --- code/nel/include/nel/misc/path.h | 6 ++++++ code/nel/src/misc/path.cpp | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/code/nel/include/nel/misc/path.h b/code/nel/include/nel/misc/path.h index ff7711b06..fed90efd5 100644 --- a/code/nel/include/nel/misc/path.h +++ b/code/nel/include/nel/misc/path.h @@ -514,6 +514,12 @@ public: */ static std::string makePathAbsolute (const std::string &relativePath, const std::string &directory ); + /** Return if a path is absolute or not. + * \param path - The path + * returns true if path is absolute or false if relative. + */ + static bool isAbsolutePath (const std::string &path); + /** If File in this list is added more than one in an addSearchPath, it doesn't launch a warning. */ static void addIgnoredDoubleFile(const std::string &ignoredFile); diff --git a/code/nel/src/misc/path.cpp b/code/nel/src/misc/path.cpp index de36efa56..19403c964 100644 --- a/code/nel/src/misc/path.cpp +++ b/code/nel/src/misc/path.cpp @@ -2597,6 +2597,25 @@ std::string CPath::makePathAbsolute( const std::string &relativePath, const std: return npath; } +bool CPath::isAbsolutePath(const std::string &path) +{ + if (path.empty()) return false; + +#ifdef NL_OS_WINDOWS + // Windows root of current disk. Eg.: "\" or + // Windows network address. Eg.: \\someshare\path + if (path[0] == '\\') return true; + + // Normal Windows absolute path. Eg.: C:\something + if (path.length() > 2 && isalpha(path[0]) && (path[1] == ':' ) && ((path[2] == '\\') || (path[2] == '/' ))) return true; +#endif + + // Unix filesystem absolute path (works also under Windows) + if (path[0] == '/') return true; + + return false; +} + bool CFile::setRWAccess(const std::string &filename) { #ifdef NL_OS_WINDOWS From e1c14db5a02e239d3971c1be1c1234b5b8430256 Mon Sep 17 00:00:00 2001 From: kervala Date: Wed, 13 Jan 2016 19:47:35 +0100 Subject: [PATCH 04/12] Fixed: getLastSeparator should return std::string::size_type instead of an integer --HG-- branch : develop --- code/nel/include/nel/misc/path.h | 2 +- code/nel/src/misc/path.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/nel/include/nel/misc/path.h b/code/nel/include/nel/misc/path.h index fed90efd5..ffae98f92 100644 --- a/code/nel/include/nel/misc/path.h +++ b/code/nel/include/nel/misc/path.h @@ -618,7 +618,7 @@ struct CFile * Return the position between [begin,end[ of the last separator between path and filename ('/' or '\'). * If there's no separator, it returns string::npos. */ - static int getLastSeparator (const std::string &filename); + static std::string::size_type getLastSeparator (const std::string &filename); static std::string getFilenameWithoutExtension (const std::string &filename); static std::string getExtension (const std::string &filename); diff --git a/code/nel/src/misc/path.cpp b/code/nel/src/misc/path.cpp index 19403c964..7ec61fdd7 100644 --- a/code/nel/src/misc/path.cpp +++ b/code/nel/src/misc/path.cpp @@ -1854,7 +1854,7 @@ std::string CFileContainer::getTemporaryDirectory() ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// -int CFile::getLastSeparator (const string &filename) +std::string::size_type CFile::getLastSeparator (const string &filename) { string::size_type pos = filename.find_last_of ('/'); if (pos == string::npos) @@ -1865,7 +1865,7 @@ int CFile::getLastSeparator (const string &filename) pos = filename.find_last_of ('@'); } } - return (int)pos; + return pos; } string CFile::getFilename (const string &filename) From 6a3292c6002ad2e7ee0adbe607875e74a76d6187 Mon Sep 17 00:00:00 2001 From: kervala Date: Wed, 13 Jan 2016 19:51:00 +0100 Subject: [PATCH 05/12] Fixed: Convert .bank filenames with / and use existing CFile::fileExists --HG-- branch : develop --- .../3d/build_far_bank/build_far_bank.cpp | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/code/nel/tools/3d/build_far_bank/build_far_bank.cpp b/code/nel/tools/3d/build_far_bank/build_far_bank.cpp index bd060417e..2699dca7b 100644 --- a/code/nel/tools/3d/build_far_bank/build_far_bank.cpp +++ b/code/nel/tools/3d/build_far_bank/build_far_bank.cpp @@ -50,16 +50,6 @@ bool recompute (const char* f1, const char* f2) return buf1.st_mtime > buf2.st_mtime; } -// Return true if the file exist -bool isFileExist (const char* sName) -{ - FILE *pFile=fopen (sName, "rb"); - if (!pFile) - return false; - fclose (pFile); - return true; -} - // Fill tile far pixel with this bitmap bool fillTileFar (uint tile, const char* sName, CTileFarBank::TFarType type, CTileFarBank& farBank, bool _256, uint8 rotate) { @@ -287,8 +277,8 @@ int main (int argc, char **argv) if (pTile->getRelativeFileName (CTile::diffuse)!="") { // File exist ? - string tileFilename = bank.getAbsPath()+pTile->getRelativeFileName (CTile::diffuse); - if (isFileExist (tileFilename.c_str())) + string tileFilename = bank.getAbsPath()+CPath::standardizePath(pTile->getRelativeFileName (CTile::diffuse), false); + if (CFile::fileExists(tileFilename)) { // Recompute it? if (recompute (tileFilename.c_str(), argv[2])||forceRecomputation) @@ -318,8 +308,8 @@ int main (int argc, char **argv) if (pTile->getRelativeFileName (CTile::additive)!="") { // File exist ? - string tileFilename = bank.getAbsPath()+pTile->getRelativeFileName (CTile::additive); - if (isFileExist (tileFilename.c_str())) + string tileFilename = bank.getAbsPath()+CPath::standardizePath(pTile->getRelativeFileName (CTile::additive), false); + if (CFile::fileExists(tileFilename)) { // Recompute it? if (recompute (tileFilename.c_str(), argv[2])||forceRecomputation) @@ -349,8 +339,8 @@ int main (int argc, char **argv) if (pTile->getRelativeFileName (CTile::alpha)!="") { // File exist ? - string tileFilename = bank.getAbsPath()+pTile->getRelativeFileName (CTile::alpha); - if (isFileExist (tileFilename.c_str())) + string tileFilename = bank.getAbsPath()+CPath::standardizePath(pTile->getRelativeFileName (CTile::alpha), false); + if (CFile::fileExists(tileFilename)) { // Recompute it? if (recompute (tileFilename.c_str(), argv[2])||forceRecomputation) From a4dd37efc9c670e4fd8be6e075a63ce456d4191b Mon Sep 17 00:00:00 2001 From: kervala Date: Wed, 13 Jan 2016 19:52:58 +0100 Subject: [PATCH 06/12] Changed: Try different alternative paths for game folders --HG-- branch : develop --- code/ryzom/client/src/init.cpp | 140 ++++++++++++++------------------- 1 file changed, 61 insertions(+), 79 deletions(-) diff --git a/code/ryzom/client/src/init.cpp b/code/ryzom/client/src/init.cpp index fec51a93e..b0098ccba 100644 --- a/code/ryzom/client/src/init.cpp +++ b/code/ryzom/client/src/init.cpp @@ -616,6 +616,63 @@ void initStereoDisplayDevice() IStereoDisplay::releaseUnusedLibraries(); } +static void addPaths(IProgressCallback &progress, const std::vector &paths, bool recurse) +{ + // all prefixes for paths + std::vector directoryPrefixes; + + // current directory has priority everywhere + directoryPrefixes.push_back(""); + +#if defined(NL_OS_WINDOWS) + char path[MAX_PATH]; + GetModuleFileNameA(GetModuleHandleA(NULL), path, MAX_PATH); + + // check in same directory as executable + directoryPrefixes.push_back(CPath::standardizePath(CFile::getPath(path))); +#elif defined(NL_OS_MAC) + // check in bundle (Installer) + directoryPrefixes.push_back(CPath::standardizePath(getAppBundlePath() + "/Contents/Resources")); + + // check in same directory as bundle (Steam) + directoryPrefixes.push_back(CPath::standardizePath(getAppBundlePath()); +#elif defined(NL_OS_UNIX) + if (CFile::isDirectory(getRyzomSharePrefix())) directoryPrefixes.push_back(CPath::standardizePath(getRyzomSharePrefix())); +#endif + + float total = (float)(directoryPrefixes.size() * paths.size()); + float current = 0.f, next = 0.f; + + for (uint j = 0; j < directoryPrefixes.size(); j++) + { + std::string directoryPrefix = directoryPrefixes[j]; + + for (uint i = 0; i < paths.size(); i++) + { + std::string directory = NLMISC::expandEnvironmentVariables(paths[i]); + + // only prepend default directory if path is relative + if (!directory.empty() && !directoryPrefix.empty() && !CPath::isAbsolutePath(directory)) + { + directory = directoryPrefix + directory; + } + + // update next progress value + next += 1.f; + + progress.progress (current/total); + progress.pushCropedValues (current/total, next/total); + + // next is current value + current = next; + + CPath::addSearchPath(directory, recurse, false, &progress); + + progress.popCropedValues (); + } + } +} + void addSearchPaths(IProgressCallback &progress) { // Add search path of UI addon. Allow only a subset of files. @@ -625,54 +682,13 @@ void addSearchPaths(IProgressCallback &progress) // Add Standard search paths { H_AUTO(InitRZAddSearchPath2) - for (uint i = 0; i < ClientCfg.DataPath.size(); i++) - { - progress.progress ((float)i/(float)ClientCfg.DataPath.size()); - progress.pushCropedValues ((float)i/(float)ClientCfg.DataPath.size(), (float)(i+1)/(float)ClientCfg.DataPath.size()); - CPath::addSearchPath(ClientCfg.DataPath[i], true, false, &progress); - - progress.popCropedValues (); - } + addPaths(progress, ClientCfg.DataPath, true); CPath::loadRemappedFiles("remap_files.csv"); } - for (uint i = 0; i < ClientCfg.DataPathNoRecurse.size(); i++) - { - progress.progress ((float)i/(float)ClientCfg.DataPathNoRecurse.size()); - progress.pushCropedValues ((float)i/(float)ClientCfg.DataPathNoRecurse.size(), (float)(i+1)/(float)ClientCfg.DataPathNoRecurse.size()); - - CPath::addSearchPath(ClientCfg.DataPathNoRecurse[i], false, false, &progress); - - progress.popCropedValues (); - } - - std::string defaultDirectory; - -#ifdef NL_OS_MAC - defaultDirectory = CPath::standardizePath(getAppBundlePath() + "/Contents/Resources"); -#elif defined(NL_OS_UNIX) - if (CFile::isDirectory(getRyzomSharePrefix())) defaultDirectory = CPath::standardizePath(getRyzomSharePrefix()); -#endif - - // add in last position, a specific possibly read only directory - if (!defaultDirectory.empty()) - { - for (uint i = 0; i < ClientCfg.DataPath.size(); i++) - { - // don't prepend default directory if path is absolute - if (!ClientCfg.DataPath[i].empty() && ClientCfg.DataPath[i][0] != '/') - { - progress.progress ((float)i/(float)ClientCfg.DataPath.size()); - progress.pushCropedValues ((float)i/(float)ClientCfg.DataPath.size(), (float)(i+1)/(float)ClientCfg.DataPath.size()); - - CPath::addSearchPath(defaultDirectory + ClientCfg.DataPath[i], true, false, &progress); - - progress.popCropedValues (); - } - } - } + addPaths(progress, ClientCfg.DataPathNoRecurse, false); } void addPreDataPaths(NLMISC::IProgressCallback &progress) @@ -681,43 +697,9 @@ void addPreDataPaths(NLMISC::IProgressCallback &progress) H_AUTO(InitRZAddSearchPaths); - for (uint i = 0; i < ClientCfg.PreDataPath.size(); i++) - { - progress.progress ((float)i/(float)ClientCfg.PreDataPath.size()); - progress.pushCropedValues ((float)i/(float)ClientCfg.PreDataPath.size(), (float)(i+1)/(float)ClientCfg.PreDataPath.size()); - - CPath::addSearchPath(ClientCfg.PreDataPath[i], true, false, &progress); - - progress.popCropedValues (); - } + addPaths(progress, ClientCfg.PreDataPath, true); //nlinfo ("PROFILE: %d seconds for Add search paths Predata", (uint32)(ryzomGetLocalTime ()-initPaths)/1000); - - std::string defaultDirectory; - -#ifdef NL_OS_MAC - defaultDirectory = CPath::standardizePath(getAppBundlePath() + "/Contents/Resources"); -#elif defined(NL_OS_UNIX) - if (CFile::isDirectory(getRyzomSharePrefix())) defaultDirectory = CPath::standardizePath(getRyzomSharePrefix()); -#endif - - // add in last position, a specific possibly read only directory - if (!defaultDirectory.empty()) - { - for (uint i = 0; i < ClientCfg.PreDataPath.size(); i++) - { - // don't prepend default directory if path is absolute - if (!ClientCfg.PreDataPath[i].empty() && ClientCfg.PreDataPath[i][0] != '/') - { - progress.progress ((float)i/(float)ClientCfg.PreDataPath.size()); - progress.pushCropedValues ((float)i/(float)ClientCfg.PreDataPath.size(), (float)(i+1)/(float)ClientCfg.PreDataPath.size()); - - CPath::addSearchPath(defaultDirectory + ClientCfg.PreDataPath[i], true, false, &progress); - - progress.popCropedValues (); - } - } - } } static void addPackedSheetUpdatePaths(NLMISC::IProgressCallback &progress) @@ -726,7 +708,7 @@ static void addPackedSheetUpdatePaths(NLMISC::IProgressCallback &progress) { progress.progress((float)i/(float)ClientCfg.UpdatePackedSheetPath.size()); progress.pushCropedValues ((float)i/(float)ClientCfg.UpdatePackedSheetPath.size(), (float)(i+1)/(float)ClientCfg.UpdatePackedSheetPath.size()); - CPath::addSearchPath(ClientCfg.UpdatePackedSheetPath[i], true, false, &progress); + CPath::addSearchPath(NLMISC::expandEnvironmentVariables(ClientCfg.UpdatePackedSheetPath[i]), true, false, &progress); progress.popCropedValues(); } } From d0c587e445866bee274cca85294977178acf55f4 Mon Sep 17 00:00:00 2001 From: kervala Date: Wed, 13 Jan 2016 19:53:20 +0100 Subject: [PATCH 07/12] Changed: Remove duplicate lines --HG-- branch : develop --- code/nel/tools/3d/build_far_bank/build_far_bank.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/nel/tools/3d/build_far_bank/build_far_bank.cpp b/code/nel/tools/3d/build_far_bank/build_far_bank.cpp index 2699dca7b..05130b908 100644 --- a/code/nel/tools/3d/build_far_bank/build_far_bank.cpp +++ b/code/nel/tools/3d/build_far_bank/build_far_bank.cpp @@ -153,8 +153,6 @@ int main (int argc, char **argv) outputVersion=true; if (strcmp (argv[n], "-?")==0) outputHelp=true; - if (strcmp (argv[n], "-?")==0) - outputHelp=true; if (strncmp (argv[n], "-d", 2)==0) { rootDir = argv[n]; @@ -182,7 +180,6 @@ int main (int argc, char **argv) "\t-d#: change the root directory of the small bank. # is the new directory\n" "\t-p#: postfix tiles filename by #\n" "\t-r: load the bitmaps from the current directory\n" - "\t-r: load the bitmaps from the current directory\n" "\t-f: force recomputation of all the tiles\n" "\t-v: print the version\n" "\t-?: print help\n" From bd5f838d6ddf117be558dcd1785e82cec849066d Mon Sep 17 00:00:00 2001 From: kervala Date: Wed, 13 Jan 2016 19:54:23 +0100 Subject: [PATCH 08/12] Changed: Minor changes --HG-- branch : develop --- code/nel/include/nel/misc/path.h | 22 +++++++++---------- .../3d/build_far_bank/build_far_bank.cpp | 8 +++---- .../tools/skill_extractor/skill_extractor.cpp | 2 -- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/code/nel/include/nel/misc/path.h b/code/nel/include/nel/misc/path.h index ffae98f92..20ea9b2a9 100644 --- a/code/nel/include/nel/misc/path.h +++ b/code/nel/include/nel/misc/path.h @@ -497,7 +497,7 @@ public: static void getFileListByName(const std::string &extension, const std::string &name, std::vector &filenames); /** Create a list of file having the requested string in the path and the requested extension - */ + */ static void getFileListByPath(const std::string &extension, const std::string &path, std::vector &filenames); /** Make a path relative to another if possible, else doesn't change it. @@ -508,10 +508,10 @@ public: static bool makePathRelative (const char *basePath, std::string &relativePath); /** Make path absolute - * \param relativePath - The relative path - * \param directory - the directory to which the path is relative to - * returns the absolute path, or empty if something went wrong. - */ + * \param relativePath - The relative path + * \param directory - the directory to which the path is relative to + * returns the absolute path, or empty if something went wrong. + */ static std::string makePathAbsolute (const std::string &relativePath, const std::string &directory ); /** Return if a path is absolute or not. @@ -525,7 +525,7 @@ public: static void addIgnoredDoubleFile(const std::string &ignoredFile); /** For the moment after memoryCompress you cant addsearchpath anymore - */ + */ static void memoryCompress(); static void memoryUncompress(); @@ -533,17 +533,17 @@ public: static bool isMemoryCompressed() { return getInstance()->_FileContainer.isMemoryCompressed(); } /** Get the ms windows directory (in standardized way with end slash), or returns an empty string on other os - */ + */ static std::string getWindowsDirectory(); /** Get application directory. - * \return directory where applications should write files. - */ + * \return directory where applications should write files. + */ static std::string getApplicationDirectory(const std::string &appName = ""); /** Get a temporary directory. - * \return temporary directory where applications should write files. - */ + * \return temporary directory where applications should write files. + */ static std::string getTemporaryDirectory(); // release singleton diff --git a/code/nel/tools/3d/build_far_bank/build_far_bank.cpp b/code/nel/tools/3d/build_far_bank/build_far_bank.cpp index 05130b908..dfc3f7f65 100644 --- a/code/nel/tools/3d/build_far_bank/build_far_bank.cpp +++ b/code/nel/tools/3d/build_far_bank/build_far_bank.cpp @@ -80,7 +80,7 @@ bool fillTileFar (uint tile, const char* sName, CTileFarBank::TFarType type, CTi // Get bitmap size uint width=bitmap.getWidth(); uint height=bitmap.getHeight(); - + // Check size.. if ((!((_256&&(width==256)&&(height==256))||((!_256)&&(width==128)&&(height==128))))) @@ -210,7 +210,7 @@ int main (int argc, char **argv) // Serial the bank in input farBank.serial (inputFarBank); } - + // Force recomputation ? if (recompute (argv[1], argv[2])) { @@ -294,7 +294,7 @@ int main (int argc, char **argv) { // One more tile tileCount++; - + printf ("Skipping %s...\n", tileFilename.c_str()); bDeleteDiffuse=false; } @@ -405,7 +405,7 @@ int main (int argc, char **argv) { nlwarning ("ERROR Can't open file %s for reading\n", argv[1]); } - } + } // exit return 0; diff --git a/code/ryzom/tools/skill_extractor/skill_extractor.cpp b/code/ryzom/tools/skill_extractor/skill_extractor.cpp index a37d22ba8..054d5788c 100644 --- a/code/ryzom/tools/skill_extractor/skill_extractor.cpp +++ b/code/ryzom/tools/skill_extractor/skill_extractor.cpp @@ -542,7 +542,6 @@ sint main( sint argc, char ** argv ) // output begin skill.h file - //if( ! fo.open( string( "r:/code/ryzom/src_v2/game_share/skills.h" ) ) ) if( ! fo.open( srcDir + string( "skills.h" ) ) ) { nlwarning(" Can't open file %s for writing", "skills.h" ); @@ -648,7 +647,6 @@ sint main( sint argc, char ** argv ) ///////////////////////////////////////////////////////////////////////////////////// // begin output skill.cpp file -// if( ! fo.open( string( "r:/code/ryzom/src_v2/game_share/skills.cpp" ) ) ) if( ! fo.open( srcDir + string( "skills.cpp" ) ) ) { nlwarning(" Can't open file skills.cpp for writing"); From 57f216dc3e5c496dc336a2f1c696547872949a11 Mon Sep 17 00:00:00 2001 From: kervala Date: Wed, 13 Jan 2016 19:59:09 +0100 Subject: [PATCH 09/12] Changed: Expand environment variables in paths read from cfg files --HG-- branch : develop --- code/nel/src/net/service.cpp | 4 ++-- code/ryzom/server/src/ai_service/sheets.cpp | 8 ++++---- code/ryzom/tools/client/client_patcher/main.cpp | 2 +- .../leveldesign/alias_synchronizer/alias_synchronizer.cpp | 2 +- code/ryzom/tools/make_alias_file/make_alias_file.cpp | 2 +- .../build_world_packed_col/build_world_packed_col.cpp | 2 +- code/ryzom/tools/sheets_packer/sheets_packer_init.cpp | 2 +- code/ryzom/tools/translation_tools/extract_bot_names.cpp | 6 +++--- .../tools/translation_tools/extract_new_sheet_names.cpp | 6 +++--- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/code/nel/src/net/service.cpp b/code/nel/src/net/service.cpp index 1f3436d1c..f7dc40da1 100644 --- a/code/nel/src/net/service.cpp +++ b/code/nel/src/net/service.cpp @@ -1169,7 +1169,7 @@ sint IService::main (const char *serviceShortName, const char *serviceLongName, { for (uint i = 0; i < var->size(); i++) { - CPath::addSearchPath (var->asString(i), true, false); + CPath::addSearchPath (NLMISC::expandEnvironmentVariables(var->asString(i)), true, false); } } @@ -1177,7 +1177,7 @@ sint IService::main (const char *serviceShortName, const char *serviceLongName, { for (uint i = 0; i < var->size(); i++) { - CPath::addSearchPath (var->asString(i), false, false); + CPath::addSearchPath (NLMISC::expandEnvironmentVariables(var->asString(i)), false, false); } } diff --git a/code/ryzom/server/src/ai_service/sheets.cpp b/code/ryzom/server/src/ai_service/sheets.cpp index 56060db1e..57b26f4d2 100644 --- a/code/ryzom/server/src/ai_service/sheets.cpp +++ b/code/ryzom/server/src/ai_service/sheets.cpp @@ -906,7 +906,7 @@ void AISHEETS::CSheets::packSheets(const std::string &writeFilesDirectoryName) { addSearchPath=true; for (uint32 i=0;isize();++i) - CPath::addSearchPath(varPtr->asString(i).c_str(), true, false); + CPath::addSearchPath(NLMISC::expandEnvironmentVariables(varPtr->asString(i)), true, false); } loadForm2("aiaction", writeFilesDirectoryName+AISPackedActionSheetsFilename, _ActionSheets, true); } @@ -918,7 +918,7 @@ void AISHEETS::CSheets::packSheets(const std::string &writeFilesDirectoryName) { addSearchPath=true; for (uint32 i=0;isize();++i) - CPath::addSearchPath(varPtr->asString(i).c_str(), true, false); + CPath::addSearchPath(NLMISC::expandEnvironmentVariables(varPtr->asString(i)), true, false); } loadForm("actionlist", writeFilesDirectoryName+AISPackedFightConfigSheetsFilename, _ActionListSheets, true); } @@ -931,7 +931,7 @@ void AISHEETS::CSheets::packSheets(const std::string &writeFilesDirectoryName) { addSearchPath=true; for (uint32 i=0;isize();++i) - CPath::addSearchPath(varPtr->asString(i).c_str(), true, false); + CPath::addSearchPath(NLMISC::expandEnvironmentVariables(varPtr->asString(i)), true, false); } loadForm2("creature", writeFilesDirectoryName+AISPackedSheetsFilename, _Sheets, true); } @@ -943,7 +943,7 @@ void AISHEETS::CSheets::packSheets(const std::string &writeFilesDirectoryName) { addSearchPath=true; for (uint32 i=0;isize();++i) - CPath::addSearchPath(varPtr->asString(i).c_str(), true, false); + CPath::addSearchPath(NLMISC::expandEnvironmentVariables(varPtr->asString(i)), true, false); } loadForm2("race_stats", writeFilesDirectoryName+AISPackedRaceStatsSheetsFilename, _RaceStatsSheets, true); } diff --git a/code/ryzom/tools/client/client_patcher/main.cpp b/code/ryzom/tools/client/client_patcher/main.cpp index a0730b19f..004e3d861 100644 --- a/code/ryzom/tools/client/client_patcher/main.cpp +++ b/code/ryzom/tools/client/client_patcher/main.cpp @@ -249,7 +249,7 @@ int main(int argc, char *argv[]) { for(uint i = 0; i < ClientCfg.PreDataPath.size(); ++i) { - CPath::addSearchPath(ClientCfg.PreDataPath[i], true, false); + CPath::addSearchPath(NLMISC::expandEnvironmentVariables(ClientCfg.PreDataPath[i]), true, false); } } diff --git a/code/ryzom/tools/leveldesign/alias_synchronizer/alias_synchronizer.cpp b/code/ryzom/tools/leveldesign/alias_synchronizer/alias_synchronizer.cpp index c080fd038..5bfd98eae 100644 --- a/code/ryzom/tools/leveldesign/alias_synchronizer/alias_synchronizer.cpp +++ b/code/ryzom/tools/leveldesign/alias_synchronizer/alias_synchronizer.cpp @@ -390,7 +390,7 @@ int main() // add the search paths for (uint i=0; i Date: Wed, 13 Jan 2016 20:01:36 +0100 Subject: [PATCH 10/12] Fixed: Remove some hardcoded paths and replaced them by LeveldesignDataPath variable --HG-- branch : develop --- .../translation_tools/extract_new_sheet_names.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/code/ryzom/tools/translation_tools/extract_new_sheet_names.cpp b/code/ryzom/tools/translation_tools/extract_new_sheet_names.cpp index d593a44b1..70d01c93f 100644 --- a/code/ryzom/tools/translation_tools/extract_new_sheet_names.cpp +++ b/code/ryzom/tools/translation_tools/extract_new_sheet_names.cpp @@ -356,6 +356,7 @@ int extractNewSheetNames(int argc, char *argv[]) CConfigFile::CVar &paths = cf.getVar("Paths"); CConfigFile::CVar &pathNoRecurse= cf.getVar("PathsNoRecurse"); CConfigFile::CVar &ligoClassFile= cf.getVar("LigoClassFile"); + CConfigFile::CVar &leveldesignDataPathVar = cf.getVar("LeveldesignDataPath"); // parse path for (uint i=0; i Date: Wed, 13 Jan 2016 20:02:24 +0100 Subject: [PATCH 11/12] Changed: Replace \\ by / --HG-- branch : develop --- code/ryzom/tools/leveldesign/mp_generator/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ryzom/tools/leveldesign/mp_generator/main.cpp b/code/ryzom/tools/leveldesign/mp_generator/main.cpp index 0d3402e84..45ae45b05 100644 --- a/code/ryzom/tools/leveldesign/mp_generator/main.cpp +++ b/code/ryzom/tools/leveldesign/mp_generator/main.cpp @@ -145,7 +145,7 @@ void LoadCraftParts() void LoadCreatureFiles() { printf( "-- REGISTERING CREATURE FILES --\n" ); - CSString inputSheetPath = LEVEL_DESIGN_PATH + "leveldesign\\Game_elem\\Creature\\Fauna\\bestiary"; + CSString inputSheetPath = LEVEL_DESIGN_PATH + "leveldesign/Game_elem/Creature/Fauna/bestiary"; CPath::addSearchPath( inputSheetPath, true, false ); vector files; From bcb1aa242d152e0d260da4bb87ce3755209c8926 Mon Sep 17 00:00:00 2001 From: kervala Date: Wed, 13 Jan 2016 20:04:01 +0100 Subject: [PATCH 12/12] Fixed: Use map for faster search for example (implemented a TODO of GUIGUI) --HG-- branch : develop --- .../src/game_share/visual_slot_manager.cpp | 51 ++++++++----------- .../src/game_share/visual_slot_manager.h | 6 +++ .../tools/leveldesign/mp_generator/main.cpp | 1 + 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/code/ryzom/common/src/game_share/visual_slot_manager.cpp b/code/ryzom/common/src/game_share/visual_slot_manager.cpp index eed01388d..bc2410eea 100644 --- a/code/ryzom/common/src/game_share/visual_slot_manager.cpp +++ b/code/ryzom/common/src/game_share/visual_slot_manager.cpp @@ -94,70 +94,59 @@ void CVisualSlotManager::init() f.close(); // Display elements read. -// for(uint i=0; i<_VisualSlot.size(); ++i) -// { + for(uint i=0, len = _VisualSlot.size(); i you probably need to rebuild the tab."); - - // No Item - return 0; + return sheet2Index(id, SLOTTYPE::RIGHT_HAND_SLOT); }// rightItem2Index // //----------------------------------------------- // leftItem2Index : // Return the visual slot index from a sheet Id for items in left hand. -// \todo GUIGUI : Use map for faster search for example //----------------------------------------------- uint32 CVisualSlotManager::leftItem2Index(const NLMISC::CSheetId &id) { - if(SLOTTYPE::LEFT_HAND_SLOT < _VisualSlot.size()) - { - for(uint i=0; i<_VisualSlot[SLOTTYPE::LEFT_HAND_SLOT].Element.size(); ++i) - if(_VisualSlot[SLOTTYPE::LEFT_HAND_SLOT].Element[i].SheetId == id) - return _VisualSlot[SLOTTYPE::LEFT_HAND_SLOT].Element[i].Index; - } - else - nlwarning("VSMngr:leftItem2Index: Bad slot -> you probably need to rebuild the tab."); - - // No Item - return 0; + return sheet2Index(id, SLOTTYPE::LEFT_HAND_SLOT); }// leftItem2Index // //----------------------------------------------- // sheet2Index : // Return the visual index from a sheet Id and the visual slot. -// \todo GUIGUI : Use map for faster search for example //----------------------------------------------- uint32 CVisualSlotManager::sheet2Index(const NLMISC::CSheetId &id, SLOTTYPE::EVisualSlot slot) { if((uint)slot < _VisualSlot.size()) { - for(uint i=0; i<_VisualSlot[slot].Element.size(); ++i) - if(_VisualSlot[slot].Element[i].SheetId == id) - return _VisualSlot[slot].Element[i].Index; + const TElementList &el = _VisualSlot[slot]; + TElementList::SheetIdToIndexMapType::const_iterator it = el.SheetIdToIndexMap.find(id); + if (it != el.SheetIdToIndexMap.end()) return it->second; } else nlwarning("VSMngr:sheet2Index: Bad slot '%d' -> you probably need to rebuild the tab.", (sint)slot); diff --git a/code/ryzom/common/src/game_share/visual_slot_manager.h b/code/ryzom/common/src/game_share/visual_slot_manager.h index 9d2f67dc0..ee9d8371a 100644 --- a/code/ryzom/common/src/game_share/visual_slot_manager.h +++ b/code/ryzom/common/src/game_share/visual_slot_manager.h @@ -71,11 +71,17 @@ public: // elements list for a visual slot. std::vector Element; + // std::map to increase access speed + typedef std::map SheetIdToIndexMapType; + SheetIdToIndexMapType SheetIdToIndexMap; + /// Load/Save the values using the serial system void serial(class NLMISC::IStream &s) throw(NLMISC::EStream) { s.serialCont(Element); } + + void updateMaps(); } TElementList; typedef std::vector TVisualSlot; diff --git a/code/ryzom/tools/leveldesign/mp_generator/main.cpp b/code/ryzom/tools/leveldesign/mp_generator/main.cpp index 45ae45b05..935ba31d6 100644 --- a/code/ryzom/tools/leveldesign/mp_generator/main.cpp +++ b/code/ryzom/tools/leveldesign/mp_generator/main.cpp @@ -1472,6 +1472,7 @@ void SetupDirectories() data.readFromFile( "raw_material_generation.cfg" ); + // beurk :s Use CConfigFile instead LEVEL_DESIGN_PATH = data.splitFrom( "LevelDesignPath = \"").splitTo( "\"" ); TRANSLATION_PATH = data.splitFrom( "TranslationPath = \"" ).splitTo( "\"" );