mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	less bugs and works faster
This commit is contained in:
		| @@ -1757,13 +1757,13 @@ void CAmbarCendamo::loadDefs() | ||||
| 		{ | ||||
| 			if (loadedTypes.find(map.terrain[i][j].tertype)==loadedTypes.end()) | ||||
| 			{ | ||||
| 				CSemiDefHandler  *sdh = CGI->sspriteh->giveDef(CSemiDefHandler::nameFromType(map.terrain[i][j].tertype).c_str()); | ||||
| 				CDefHandler  *sdh = CGI->spriteh->giveDef(CSemiDefHandler::nameFromType(map.terrain[i][j].tertype).c_str()); | ||||
| 				loadedTypes.insert(map.terrain[i][j].tertype); | ||||
| 				defs.push_back(sdh); | ||||
| 			} | ||||
| 			if (map.twoLevel && loadedTypes.find(map.undergroungTerrain[i][j].tertype)==loadedTypes.end()) | ||||
| 			{ | ||||
| 				CSemiDefHandler  *sdh = CGI->sspriteh->giveDef(CSemiDefHandler::nameFromType(map.undergroungTerrain[i][j].tertype).c_str()); | ||||
| 				CDefHandler  *sdh = CGI->spriteh->giveDef(CSemiDefHandler::nameFromType(map.undergroungTerrain[i][j].tertype).c_str()); | ||||
| 				loadedTypes.insert(map.undergroungTerrain[i][j].tertype); | ||||
| 				defs.push_back(sdh); | ||||
| 			} | ||||
|   | ||||
| @@ -21,7 +21,7 @@ public: | ||||
| 	std::ifstream * is; // stream used to read map file | ||||
| 	int andame; // length of map file | ||||
| 	unsigned char * bufor; // here we store map bytecode | ||||
| 	std::vector<CSemiDefHandler*> defs; | ||||
| 	std::vector<CDefHandler*> defs; | ||||
| /////////////////funkcje skladowe | ||||
| 	CAmbarCendamo (const char * tie); // c-tor; tie is the path of the map file | ||||
| 	CAmbarCendamo (unsigned char * map); // c-tor; map is pointer to array containing map; it is not copied, so don't delete | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								CDefHandler.cpp
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								CDefHandler.cpp
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										133
									
								
								CLodHandler.cpp
									
									
									
									
									
								
							
							
						
						
									
										133
									
								
								CLodHandler.cpp
									
									
									
									
									
								
							| @@ -163,22 +163,23 @@ void CPCXConv::convert() | ||||
| SDL_Surface * CPCXConv::getSurface() | ||||
| { | ||||
| 	SDL_Surface * ret; | ||||
|  | ||||
| 	BMPHeader bh; | ||||
| 	BMPPalette pal[256]; | ||||
| 	Epcxformat format; | ||||
| 	int fSize, maxx, maxy,i,y; | ||||
| 	int fSize,i,y; | ||||
| 	bool check1, check2; | ||||
| 	unsigned char add; | ||||
| 	int it=0; | ||||
|  | ||||
| 	fSize = readNormalNr(it,4,pcx);it+=4; | ||||
| 	maxx = readNormalNr(it,4,pcx);it+=4; | ||||
| 	maxy = readNormalNr(it,4,pcx);it+=4; | ||||
| 	if (fSize==maxx*maxy*3) | ||||
| 	bh.x = readNormalNr(it,4,pcx);it+=4; | ||||
| 	bh.y = readNormalNr(it,4,pcx);it+=4; | ||||
| 	if (fSize==bh.x*bh.y*3) | ||||
| 		check1=true; | ||||
| 	else  | ||||
| 		check1=false; | ||||
| 	if (fSize==maxx*maxy) | ||||
| 	if (fSize==bh.x*bh.y) | ||||
| 		check2=true; | ||||
| 	else  | ||||
| 		check2=false; | ||||
| @@ -188,9 +189,41 @@ SDL_Surface * CPCXConv::getSurface() | ||||
| 		format=Epcxformat::PCX8B; | ||||
| 	else  | ||||
| 		return NULL; | ||||
| 	add=(int)(4*(((float)1)-(((float)maxx/(float)4)-((int)((float)maxx/(float)4))))); | ||||
| 	add = 4 - bh.x%4; | ||||
| 	if (add==4) | ||||
| 		add=0; | ||||
| 	bh._h3=bh.x*bh.y; | ||||
| 	if (format==Epcxformat::PCX8B) | ||||
| 	{ | ||||
| 		int bmask = 0x0000ff; | ||||
| 		int gmask = 0x00ff00; | ||||
| 		int rmask = 0xff0000; | ||||
| 		ret = SDL_CreateRGBSurface(SDL_SWSURFACE, bh.x+add, bh.y, 8, 0, 0, 0, 0); | ||||
| 		bh._c1=0x436; | ||||
| 		bh._c2=0x28; | ||||
| 		bh._c3=1; | ||||
| 		bh._c4=8; | ||||
| 		//bh.dataSize2=bh.dataSize1=maxx*maxy; | ||||
| 		bh.dataSize1=bh.x; | ||||
| 		bh.dataSize2=bh.y; | ||||
| 		bh.fullSize = bh.dataSize1+436; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		int bmask = 0x0000ff; | ||||
| 		int gmask = 0x00ff00; | ||||
| 		int rmask = 0xff0000; | ||||
| 		ret = SDL_CreateRGBSurface(SDL_SWSURFACE, bh.x+add, bh.y, 24, rmask, gmask, bmask, 0); | ||||
| 		bh._c1=0x36; | ||||
| 		bh._c2=0x28; | ||||
| 		bh._c3=1; | ||||
| 		bh._c4=0x18; | ||||
| 		//bh.dataSize2=bh.dataSize1=0xB12; | ||||
| 		bh.dataSize1=bh.x; | ||||
| 		bh.dataSize2=bh.y; | ||||
| 		bh.fullSize=(bh.x+add)*bh.y*3+36+18; | ||||
| 		bh._h3*=3; | ||||
| 	} | ||||
| 	if (format==Epcxformat::PCX8B) | ||||
| 	{ | ||||
| 		it = pcxs-256*3; | ||||
| @@ -202,50 +235,53 @@ SDL_Surface * CPCXConv::getSurface() | ||||
| 			pal[i].F='\0'; | ||||
| 		} | ||||
| 	} | ||||
| #if SDL_BYTEORDER == SDL_BIG_ENDIAN | ||||
|     int rmask = 0xff000000; | ||||
|     int gmask = 0x00ff0000; | ||||
|     int bmask = 0x0000ff00; | ||||
|     int amask = 0x000000ff; | ||||
| #else | ||||
|     int rmask = 0x000000ff; | ||||
|     int gmask = 0x0000ff00; | ||||
|     int bmask = 0x00ff0000; | ||||
|     int amask = 0xff000000; | ||||
| #endif | ||||
| 	ret = SDL_CreateRGBSurface(SDL_SWSURFACE, maxx, maxy, (format==Epcxformat::PCX8B ? 8 : 24), rmask, gmask, bmask, amask); | ||||
| 	if (format==Epcxformat::PCX8B) | ||||
| 	{ | ||||
| 		 | ||||
| 		for(int i=0; i<256; ++i) | ||||
| 		{ | ||||
| 			SDL_Color pr; | ||||
| 			pr.r = pal[i].R; | ||||
| 			pr.g = pal[i].G; | ||||
| 			pr.b = pal[i].B; | ||||
| 			pr.unused = pal[i].F; | ||||
| 			(*(ret->format->palette->colors+i)) = pr; | ||||
| 			SDL_Color tp; | ||||
| 			tp.r = pal[i].R; | ||||
| 			tp.g = pal[i].G; | ||||
| 			tp.b = pal[i].B; | ||||
| 			tp.unused = pal[i].F; | ||||
| 			*(ret->format->palette->colors+i) = tp; | ||||
| 		} | ||||
| 		for(y=maxy; y>0; --y) | ||||
| 		for (y=bh.y;y>0;y--) | ||||
| 		{ | ||||
| 			it = 0xc + (y-1)*maxx; | ||||
| 			for(int j=0; j<maxx; ++j) | ||||
| 				*((char*)ret->pixels + ret->format->BytesPerPixel * (y*(maxx+add) + j)) = pcx[it+j]; | ||||
| 			for(int j=0; j<add; ++j) | ||||
| 				*((char*)ret->pixels + ret->format->BytesPerPixel * (y*(maxx+add) + maxx + j)) = 0; | ||||
| 			it=0xC+(y-1)*bh.x; | ||||
| 			for (int j=0;j<bh.x;j++) | ||||
| 			{ | ||||
| 				//out<<pcx[it+j]; | ||||
| 				*((char*)ret->pixels + ret->pitch * (y-1) + ret->format->BytesPerPixel * j) = pcx[it+j]; | ||||
| 			} | ||||
| 			if (add>0) | ||||
| 			{ | ||||
| 				for (int j=0;j<add;j++) | ||||
| 				{ | ||||
| 					//out<<'\0'; //bylo z buforu, ale onnie byl incjalizowany (?!) | ||||
| 					*((char*)ret->pixels + ret->pitch * (y-1) + ret->format->BytesPerPixel * (j+bh.x)) = 0; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		for(int y=maxy; y>0; --y) | ||||
| 		for (y=bh.y; y>0; y--) | ||||
| 		{ | ||||
| 			it = 0xc + (y-1)*maxx*3; | ||||
| 			for(int j=0; j<maxx*3; ++j) | ||||
| 			it=0xC+(y-1)*bh.x*3; | ||||
| 			for (int j=0;j<bh.x*3;j++) | ||||
| 			{ | ||||
| 				*((char*)ret->pixels + (y*(maxx+add) + j)) = pcx[it+j]; | ||||
| 				//out<<pcx[it+j]; | ||||
| 				*((char*)ret->pixels + ret->pitch * (y-1) + j) = pcx[it+j]; | ||||
| 			} | ||||
| 			for(int j=0; j<add*3; ++j) | ||||
| 			if (add>0) | ||||
| 			{ | ||||
| 				*((char*)ret->pixels + (y*(maxx+add) + j)) = 0; | ||||
| 				for (int j=0;j<add*3;j++) | ||||
| 				{ | ||||
| 					//out<<'\0'; //bylo z buforu, ale onnie byl incjalizowany (?!) | ||||
| 					*((char*)ret->pixels + ret->pitch * (y-1) + (j+bh.x*3)) = 0; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| @@ -277,17 +313,21 @@ SDL_Surface * CLodHandler::loadBitmap(std::string fname) | ||||
| 	{ | ||||
| 		unsigned char * pcd = new unsigned char[entries[index].size]; | ||||
| 		FLOD.read((char*)pcd,entries[index].size); | ||||
| 		infs2(pcd,entries[index].size,entries[index].realSize,pcx); | ||||
| 		int res=infs2(pcd,entries[index].size,entries[index].realSize,pcx); | ||||
| 		if(res!=0) | ||||
| 		{ | ||||
| 			std::cout<<"an error "<<res<<" ocured during extracting file "<<fname<<std::endl; | ||||
| 		} | ||||
| 	} | ||||
| 	CPCXConv cp; | ||||
| 	cp.openPCX((char*)pcx,entries[index].realSize); | ||||
| 	cp.convert(); | ||||
| 	cp.saveBMP("vctemp.bmp"); | ||||
| 	SDL_Surface * ret = SDL_LoadBMP("vctemp.bmp"); | ||||
| 	boost::filesystem::path p("vctemp.bmp"); | ||||
| 	boost::filesystem::remove(p); | ||||
| 	//return cp.getSurface(); | ||||
| 	return ret; | ||||
| 	//cp.convert(); | ||||
| 	//cp.saveBMP("vctemp.bmp"); | ||||
| 	//SDL_Surface * ret = SDL_LoadBMP("vctemp.bmp"); | ||||
| 	//boost::filesystem::path p("vctemp.bmp"); | ||||
| 	//boost::filesystem::remove(p); | ||||
| 	return cp.getSurface(); | ||||
| 	//return ret; | ||||
| } | ||||
|  | ||||
| int CLodHandler::decompress (unsigned char * source, int size, int realSize, std::string & dest) | ||||
| @@ -383,14 +423,13 @@ std::vector<CDefHandler *> CLodHandler::extractManyFiles(std::vector<std::string | ||||
| 	{ | ||||
| 		std::transform(defNamesIn[hh].begin(), defNamesIn[hh].end(), defNamesIn[hh].begin(), (int(*)(int))toupper); | ||||
| 	} | ||||
| 	std::ofstream FOut; | ||||
| 	int i; | ||||
| 	std::vector<char> found(defNamesIn.size(), 0); | ||||
| 	for (int i=0;i<totalFiles;i++) | ||||
| 	{ | ||||
| 		//std::cout<<'\r'<<"Reading defs: "<<(100.0*i)/((float)(totalFiles))<<"%      "; | ||||
| 		std::string buf1 = std::string((char*)entries[i].name); | ||||
| 		std::transform(buf1.begin(), buf1.end(), buf1.begin(), (int(*)(int))toupper); | ||||
| 		//std::transform(buf1.begin(), buf1.end(), buf1.begin(), (int(*)(int))toupper); | ||||
| 		bool exists = false; | ||||
| 		int curDef; | ||||
| 		for(int hh=0; hh<defNamesIn.size(); ++hh) | ||||
| @@ -406,7 +445,6 @@ std::vector<CDefHandler *> CLodHandler::extractManyFiles(std::vector<std::string | ||||
| 		if(!exists) | ||||
| 			continue; | ||||
| 		FLOD.seekg(entries[i].offset,std::ios_base::beg); | ||||
| 		//std::string bufff = (lodName.substr(0, lodName.size()-4) + "\\" + (char*)entries[i].name); | ||||
| 		unsigned char * outp; | ||||
| 		if (entries[i].size==0) //file is not compressed | ||||
| 		{ | ||||
| @@ -415,7 +453,6 @@ std::vector<CDefHandler *> CLodHandler::extractManyFiles(std::vector<std::string | ||||
| 			CDefHandler * nh = new CDefHandler; | ||||
| 			nh->openFromMemory(outp, entries[i].realSize, std::string((char*)entries[i].name)); | ||||
| 			ret[curDef] = nh; | ||||
|  | ||||
| 		} | ||||
| 		else //we will decompressing file | ||||
| 		{ | ||||
|   | ||||
| @@ -4,6 +4,7 @@ | ||||
| #include "CSemiDefHandler.h" | ||||
| #include "CDefHandler.h" | ||||
| #include "CGameInfo.h" | ||||
| #include "SDL_Extensions.h" | ||||
| #define CGI (CGameInfo::mainObj) | ||||
|  | ||||
| SDL_Color tytulowy, tlo, zwykly ; | ||||
| @@ -31,7 +32,9 @@ SDL_Surface * CMessage::drawBox1(int w, int h) | ||||
| 	{ | ||||
| 		for (int j=0; j<w; j+=background->w-1) | ||||
| 			SDL_BlitSurface(background,&genRect(background->h,background->w-1,1,0),ret,&genRect(h,w,j,i)); | ||||
| 	}SDL_Flip(ekran); | ||||
| 	} | ||||
| 	//SDL_Flip(ekran); | ||||
| 	CSDL_Ext::update(ekran); | ||||
| 	//obwodka I-szego rzedu pozioma | ||||
| 	for (int i=0; i<w; i+=piecesOfBox->ourImages[6].bitmap->w) | ||||
| 	{ | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								CPreGame.cpp
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								CPreGame.cpp
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -432,3 +432,8 @@ Uint32 CSDL_Ext::colorToUint32(const SDL_Color * color) | ||||
| 	ret+=color->r; | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| void CSDL_Ext::update(SDL_Surface * what) | ||||
| { | ||||
| 	SDL_UpdateRect(what, 0, 0, what->w, what->h); | ||||
| } | ||||
|   | ||||
| @@ -21,6 +21,7 @@ namespace CSDL_Ext | ||||
| 	Uint32 colorToUint32(const SDL_Color * color); //little endian only | ||||
| 	void printAtMiddle(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=ekran, unsigned char quality = 2); // quality: 0 - lowest, 1 - medium, 2 - highest | ||||
| 	void printAt(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=ekran, unsigned char quality = 2); // quality: 0 - lowest, 1 - medium, 2 - highest | ||||
| 	void update(SDL_Surface * what = ekran); //updates whole surface (default - main screen) | ||||
| }; | ||||
|  | ||||
| #endif // SDL_EXTENSIONS_H | ||||
		Reference in New Issue
	
	Block a user