2
0
Эх сурвалжийг харах

* leading files from Data/ instead of h3bitmap.lod when possible (as in OH3)
* minor improvements

Michał W. Urbańczyk 17 жил өмнө
parent
commit
c9cfdacbc5
3 өөрчлөгдсөн 86 нэмэгдсэн , 51 устгасан
  1. 21 1
      CMT.cpp
  2. 58 49
      hch/CLodHandler.cpp
  3. 7 1
      nodrze.h

+ 21 - 1
CMT.cpp

@@ -48,6 +48,9 @@
 #include "CLua.h"
 #include "CAdvmapInterface.h"
 #include "CCastleInterface.h"
+#include "boost/filesystem/operations.hpp"
+#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/replace.hpp>
 #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
 #  include <fcntl.h>
 #  include <io.h>
@@ -338,7 +341,7 @@ int _tmain(int argc, _TCHAR* argv[])
 		cgi->consoleh = new CConsoleHandler;
 		cgi->mush = mush;
 		cgi->curh = new CCursorHandler;
-
+		
 		THC std::cout<<"Initializing screen, fonts and sound handling: "<<tmh.getDif()<<std::endl;
 		cgi->spriteh = new CLodHandler;
 		cgi->spriteh->init(std::string("Data\\H3sprite.lod"));
@@ -346,6 +349,23 @@ int _tmain(int argc, _TCHAR* argv[])
 		cgi->bitmaph->init(std::string("Data\\H3bitmap.lod"));
 		THC std::cout<<"Loading .lod files: "<<tmh.getDif()<<std::endl;
 
+		boost::filesystem::directory_iterator enddir;
+		for (boost::filesystem::directory_iterator dir("Data");dir!=enddir;dir++)
+		{
+			if(boost::filesystem::is_regular(dir->status()))
+			{
+				std::string name = dir->path().leaf();
+				std::transform(name.begin(), name.end(), name.begin(), (int(*)(int))toupper);
+				boost::algorithm::replace_all(name,".BMP",".PCX");
+				Entry * e = cgi->bitmaph->entries.znajdz(name);
+				if(e)
+				{
+					e->offset = -1;
+					e->realSize = e->size = boost::filesystem::file_size(dir->path());
+				}
+			}
+		}
+		THC std::cout<<"Scanning Data/: "<<tmh.getDif()<<std::endl;
 		cgi->curh->initCursor();
 		cgi->curh->showGraphicCursor();
 

+ 58 - 49
hch/CLodHandler.cpp

@@ -259,32 +259,29 @@ SDL_Surface * CLodHandler::loadBitmap(std::string fname)
 	unsigned char * pcx;
 	std::transform(fname.begin(),fname.end(),fname.begin(),toupper);
 	fname.replace(fname.find_first_of('.'),fname.find_first_of('.')+4,".PCX");
-	int index=-1;
-	for (int i=0;i<entries.size();i++)
-	{
-		std::string buf1 = std::string((char*)entries[i].name);
-		if(buf1==fname)
-		{
-			index=i;
-			break;
-		}
-	}
-	if(index==-1)
+	Entry *e = entries.znajdz(fname);
+	if(!e)
 	{
 		std::cout<<"File "<<fname<<" not found"<<std::endl;
 		return NULL;
 	}
-	fseek(FLOD, entries[index].offset, 0);
-	if (entries[index].size==0) //file is not compressed
+	if(e->offset<0)
 	{
-		pcx = new unsigned char[entries[index].realSize];
-		fread((char*)pcx, 1, entries[index].realSize, FLOD);
+		fname.replace(fname.find_first_of('.'),fname.find_first_of('.')+4,".BMP");
+		fname = "Data/"+fname;
+		return SDL_LoadBMP(fname.c_str());
+	}
+	fseek(FLOD, e->offset, 0);
+	if (e->size==0) //file is not compressed
+	{
+		pcx = new unsigned char[e->realSize];
+		fread((char*)pcx, 1, e->realSize, FLOD);
 	}
 	else 
 	{
-		unsigned char * pcd = new unsigned char[entries[index].size];
-		fread((char*)pcd, 1, entries[index].size, FLOD);
-		int res=infs2(pcd,entries[index].size,entries[index].realSize,pcx);
+		unsigned char * pcd = new unsigned char[e->size];
+		fread((char*)pcd, 1, e->size, FLOD);
+		int res=infs2(pcd,e->size,e->realSize,pcx);
 		if(res!=0)
 		{
 			std::cout<<"an error "<<res<<" occured while extracting file "<<fname<<std::endl;
@@ -292,7 +289,7 @@ SDL_Surface * CLodHandler::loadBitmap(std::string fname)
 		delete [] pcd;
 	}
 	CPCXConv cp;
-	cp.openPCX((char*)pcx,entries[index].realSize);
+	cp.openPCX((char*)pcx,e->realSize);
 	return cp.getSurface();
 }
 
@@ -845,38 +842,50 @@ std::string CLodHandler::getTextFile(std::string name)
 {
 	std::string ret0;
 	std::transform(name.begin(), name.end(), name.begin(), (int(*)(int))toupper);
-	int i;
+	Entry *e;
 	for (int i=0;i<totalFiles;i++)
 	{
-		std::string buf1 = std::string((char*)entries[i].name);
-		bool exists = false;
-		int curDef;
-		if(buf1!=name)
-			continue;
-		fseek(FLOD, entries[i].offset, 0);
-		unsigned char * outp;
-		if (entries[i].size==0) //file is not compressed
-		{
-			outp = new unsigned char[entries[i].realSize];
-			fread((char*)outp, 1, entries[i].realSize, FLOD);
-			std::string ret = std::string((char*)outp);
-			delete[] outp;
-			return ret;
-		}
-		else //we will decompressing file
-		{
-			outp = new unsigned char[entries[i].size];
-			fread((char*)outp, 1, entries[i].size, FLOD);
-			fseek(FLOD, 0, 0);
-			unsigned char * decomp = NULL;
-			int decRes = infs2(outp, entries[i].size, entries[i].realSize, decomp);
-			std::string ret;
-			for (int itr=0;itr<entries[i].realSize;itr++)
-				ret+= *((char*)decomp+itr);
-			delete[] outp;
-			delete[] decomp;
-			return ret;
-		}
+		e = entries.znajdz(name);
+	}
+	if(!e)
+		return ret0;
+	if(e->offset<0)
+	{
+		char * outp = new char[e->realSize];
+		char name[120];for(int i=0;i<120;i++) name[i]='\0';
+		strcat(name,"Data/");
+		strcat(name,(char*)e->name);
+		FILE * f = fopen(name,"rb");
+		int result = fread(outp,1,e->realSize,f);
+		if(result<0) {std::cout<<"Error in file reading: "<<name<<std::endl;return ret0;}
+		for (int itr=0;itr<e->realSize;itr++)
+			ret0+= *(outp+itr);
+		delete[] outp;
+		return ret0;
+	}
+	fseek(FLOD, e->offset, 0);
+	unsigned char * outp;
+	if (e->size==0) //file is not compressed
+	{
+		outp = new unsigned char[e->realSize];
+		fread((char*)outp, 1, e->realSize, FLOD);
+		std::string ret = std::string((char*)outp);
+		delete[] outp;
+		return ret;
+	}
+	else //we will decompressing file
+	{
+		outp = new unsigned char[e->size];
+		fread((char*)outp, 1, e->size, FLOD);
+		fseek(FLOD, 0, 0);
+		unsigned char * decomp = NULL;
+		int decRes = infs2(outp, e->size, e->realSize, decomp);
+		std::string ret;
+		for (int itr=0;itr<e->realSize;itr++)
+			ret+= *((char*)decomp+itr);
+		delete[] outp;
+		delete[] decomp;
+		return ret;
 	}
 	return ret0;
 }

+ 7 - 1
nodrze.h

@@ -76,6 +76,7 @@ public:
 	nodrze():ile(0) //najzwyczajniejszy w swiecie kosntruktor // c-tor
 	{
 		NIL=new wezel<T>(CZARNY);
+		NIL->zawart=NULL;
 		korzen=NIL;
 		ostatnio=NIL;
 		ktory=0;
@@ -678,7 +679,12 @@ template <typename T> void nodrze<T>::dodajRBT (wezel<T> * nowy)
 {
 	//CLOG("Dodaje do drzewa "<<nowy->zawart<<std::endl);
 	ile++;
-	if ((*nowy->zawart) < (*ostatnio->zawart))
+	if(ostatnio==NIL)
+	{
+		ostatnio = nowy;
+		ktory=0;
+	}
+	else if ((*nowy->zawart) < (*ostatnio->zawart))
 	{
 		ktory++;
 	}