From cc3aed0af200786b301caca0b7cc7b49e93e1e5f Mon Sep 17 00:00:00 2001 From: gerstrong Date: Fri, 24 Jul 2009 21:38:30 +0000 Subject: [PATCH] Bug fix CPatcher Class for Mods, especially. git-svn-id: https://clonekeenplus.svn.sourceforge.net/svnroot/clonekeenplus/cgenius/trunk@158 4df4b0f3-56ce-47cb-b001-ed939b7d65a6 --- src/fileio/CPatcher.cpp | 82 ++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/src/fileio/CPatcher.cpp b/src/fileio/CPatcher.cpp index 91287394c..db9324380 100644 --- a/src/fileio/CPatcher.cpp +++ b/src/fileio/CPatcher.cpp @@ -11,6 +11,7 @@ #include #include "../FindFile.h" #include "../StringUtils.h" +#include "../CLogFile.h" CPatcher::CPatcher(int episode, int version,unsigned char *data, const std::string& datadir) { m_episode = episode; @@ -36,11 +37,11 @@ void CPatcher::patchMemory() if(strCaseStartsWith(line,"\%version")) { - std::string verstring = line.substr(strlen("\%version")); + std::string verstring = line.substr(strlen("\%version ")); - if((stringcaseequal(verstring,"1.31") && m_version == 131 ) - || (stringcaseequal(verstring,"1.1") && m_version == 110 ) - || stringcaseequal(verstring,"ALL")) + if((strCaseStartsWith(verstring,"1.31") && m_version == 131 ) + || (strCaseStartsWith(verstring,"1.1") && m_version == 110 ) + || strCaseStartsWith(verstring,"ALL")) { while(!m_TextList.empty()) { @@ -55,8 +56,9 @@ void CPatcher::patchMemory() std::string newbuf = line.substr(strlen("\%patchfile")); size_t p = newbuf.find(' '); if(p != std::string::npos) { - sscanf(newbuf.substr(0,p).c_str(), "%lx", &offset); // Only hexadecimal numbers supported - patch_file_name = newbuf.substr(p+1); + char temp[256]; + sscanf(newbuf.c_str(), "%lx %s", &offset, temp); // Only hexadecimal numbers supported + patch_file_name.append(temp); patchMemfromFile("data/" + m_datadirectory + "/" + patch_file_name,offset); } } @@ -77,46 +79,50 @@ void CPatcher::patchMemory() } +struct PatchListFiller { + std::set list; + + bool operator() (const std::string& filename) { + std::string ext = GetFileExtension(filename); + if (stringcaseequal(ext, "pat")) + list.insert(filename); + + return true; + } +}; + bool CPatcher::loadPatchfile() { - std::string fullfname = GetFullFileName("data/" + m_datadirectory); - if(fullfname.size() == 0) + std::string path = "data/" + m_datadirectory; + + //Get the list of ".pat" files + PatchListFiller patchlist; + FindFiles(patchlist, path, false, FM_REG); + + // Nothing to play, just quit + if (!patchlist.list.size()) return false; - - // Detect the patchfile - DIR *dir = opendir(Utf8ToSystemNative(fullfname).c_str()); - - bool ret = false; - if(dir) + + if (patchlist.list.size() > 1) + g_pLogFile->textOut(PURPLE,"Multiple Patch are not yet supported! Please remove a file. Taking one File.
"); + + while(!patchlist.list.empty()) { - struct dirent *dp; - while( ( dp = readdir(dir) ) ) + std::string buf = *patchlist.list.begin(); + std::ifstream Patchfile; OpenGameFileR(Patchfile, buf); + + while(!Patchfile.eof()) { - if(strstr(dp->d_name,".pat")) - { - // The file was found! now read it into the memory! - - std::ifstream Patchfile; OpenGameFileR(Patchfile, dp->d_name); - - while(!Patchfile.eof()) - { - char buf[256]; - Patchfile.getline(buf,sizeof(buf)); - fix_markend(buf); - m_TextList.push_back(buf); - } - - Patchfile.close(); - - ret = true; - break; - } + char buf[256]; + Patchfile.getline(buf, sizeof(buf)); + fix_markend(buf); + m_TextList.push_back(buf); } + Patchfile.close(); + patchlist.list.clear(); } - closedir(dir); - - return ret; + return true; } void CPatcher::patchMemfromFile(const std::string& patch_file_name, int offset)