浏览代码

A little threading and minor changes.

Michał W. Urbańczyk 17 年之前
父节点
当前提交
d5b0bdcf9e
共有 10 个文件被更改,包括 175 次插入320 次删除
  1. 25 31
      CMT.cpp
  2. 二进制
      CPreGame.cpp
  3. 1 0
      CPreGame.h
  4. 130 283
      client/Graphics.cpp
  5. 3 0
      client/Graphics.h
  6. 1 1
      client/VCMI_client.vcproj
  7. 6 1
      hch/CLodHandler.cpp
  8. 3 1
      hch/CLodHandler.h
  9. 1 2
      hch/CObjectHandler.cpp
  10. 5 1
      lib/VCMI_lib.vcproj

+ 25 - 31
CMT.cpp

@@ -48,6 +48,7 @@
 #include "CAdvmapInterface.h"
 #include "CCastleInterface.h"
 #include "client\Graphics.h"
+#include <boost/lambda/lambda.hpp>
 #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
 #  include <fcntl.h>
 #  include <io.h>
@@ -324,57 +325,43 @@ void initGameState(Mapa * map, CGameInfo * cgi)
 
 int _tmain(int argc, _TCHAR* argv[])
 { 
-	//std::ios_base::sync_with_stdio(0);
+	srand ( time(NULL) );
+	CPG=NULL;
+	atexit(SDL_Quit);
+	CGameInfo * cgi = CGI = new CGameInfo; //contains all global informations about game (texts, lodHandlers, map handler itp.)
 	//CLuaHandler luatest;
 	//luatest.test(); 
-	
 		//CBIKHandler cb;
 		//cb.open("CSECRET.BIK");
+	std::cout << "Starting... " << std::endl;
 	THC timeHandler tmh, total, pomtime;
-	int xx=0, yy=0, zz=0;
-	srand ( time(NULL) );
-	std::vector<SDL_Surface*> Sprites;
 	if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO/*|SDL_INIT_EVENTTHREAD*/)==0)
 	{
-		screen = SDL_SetVideoMode(800,600,24,SDL_SWSURFACE|SDL_DOUBLEBUF/*|SDL_FULLSCREEN*/);
-		
-		//initializing important global surface
-#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
+		screen = SDL_SetVideoMode(800,600,24,SDL_SWSURFACE|SDL_DOUBLEBUF/*|SDL_FULLSCREEN*/);  //initializing important global surface
+		THC std::cout<<"\tInitializing screen: "<<pomtime.getDif()<<std::endl;
+		SDL_WM_SetCaption(NAME,""); //set window title
+		#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
 		CSDL_Ext::std32bppSurface = SDL_CreateRGBSurface(SDL_SWSURFACE, 1, 1, 32, rmask, gmask, bmask, amask);
-
-		CPG=NULL;
+		THC std::cout<<"\tInitializing minors: "<<pomtime.getDif()<<std::endl;
 		TTF_Init();
-		atexit(TTF_Quit);
-		atexit(SDL_Quit);
 		TNRB16 = TTF_OpenFont("Fonts\\tnrb.ttf",16);
 		GEOR13 = TTF_OpenFont("Fonts\\georgia.ttf",13);
 		GEOR16 = TTF_OpenFont("Fonts\\georgia.ttf",16);
 		GEORXX = TTF_OpenFont("Fonts\\tnrb.ttf",22);
 		GEORM = TTF_OpenFont("Fonts\\georgia.ttf",10);
+		atexit(TTF_Quit);
+		THC std::cout<<"\tInitializing fonts: "<<pomtime.getDif()<<std::endl;
 		CMusicHandler * mush = new CMusicHandler;  //initializing audio
 		mush->initMusics();
 		//audio initialized 
-
-
-		//screen2 = SDL_SetVideoMode(800,600,24,SDL_SWSURFACE|SDL_DOUBLEBUF/*|SDL_FULLSCREEN*/);
-		//screen = SDL_ConvertSurface(screen2, screen2->format, SDL_SWSURFACE);
-
-		SDL_WM_SetCaption(NAME,""); //set window title
-		CGameInfo * cgi = CGI = new CGameInfo; //contains all global informations about game (texts, lodHandlers, map handler itp.)
 		cgi->consoleh = new CConsoleHandler;
 		cgi->mush = mush;
 		cgi->curh = new CCursorHandler; 
-		
+		THC std::cout<<"\tInitializing sound and cursor: "<<pomtime.getDif()<<std::endl;
 		THC std::cout<<"Initializing screen, fonts and sound handling: "<<tmh.getDif()<<std::endl;
 		CDefHandler::Spriteh = cgi->spriteh = new CLodHandler();
 		cgi->spriteh->init("Data\\H3sprite.lod","Sprites");
@@ -403,7 +390,14 @@ int _tmain(int argc, _TCHAR* argv[])
 		cgi->heroh = heroh;
 		THC std::cout<<"\tHero handler: "<<pomtime.getDif()<<std::endl;
 		THC std::cout<<"Preparing first handlers: "<<tmh.getDif()<<std::endl;
+		pomtime.getDif();
 		graphics = new Graphics();
+		THC std::cout<<"\tMain graphics: "<<tmh.getDif()<<std::endl;
+		std::vector<CDefHandler **> animacje;
+		for(std::vector<CHeroClass *>::iterator i = cgi->heroh->heroClasses.begin();i!=cgi->heroh->heroClasses.end();i++)
+			animacje.push_back(&((*i)->*(&CHeroClass::moveAnim)));
+		graphics->loadHeroAnim(animacje);
+		THC std::cout<<"\tHero animations: "<<tmh.getDif()<<std::endl;
 		THC std::cout<<"Initializing game graphics: "<<tmh.getDif()<<std::endl;
 
 		//colors initialization

二进制
CPreGame.cpp


+ 1 - 0
CPreGame.h

@@ -203,6 +203,7 @@ public:
 	void moveByOne(bool up);
 	void printSelectedInfo();
 	void printFlags();
+	void processMaps(std::vector<std::string> &pliczkiTemp, int &index);
 	MapSel();
 	~MapSel();
 };

+ 130 - 283
client/Graphics.cpp

@@ -2,7 +2,13 @@
 #include "Graphics.h"
 #include "../hch/CDefHandler.h"
 #include "../hch/CObjectHandler.h"
+//#include "../hch/CHeroHandler.h"
 #include "../SDL_Extensions.h"
+#include <boost/assign/std/vector.hpp> 
+#include <sstream>
+#include <iomanip>
+#include <boost/thread.hpp>
+#include <boost/bind.hpp>
 using namespace CSDL_Ext;
 Graphics * graphics = NULL;
 SDL_Surface * Graphics::drawPrimarySkill(const CGHeroInstance *curh, SDL_Surface *ret, int from, int to)
@@ -157,381 +163,222 @@ Graphics::Graphics()
 	smallIcons = CDefHandler::giveDef("ITPA.DEF");
 	resources32 = CDefHandler::giveDef("RESOURCE.DEF");
 	loadHeroFlags();
-
-
-
-		//std::stringstream nm;
-		//nm<<"AH";
-		//nm<<std::setw(2);
-		//nm<<std::setfill('0');
-		//nm<<heroClasses.size();
-		//nm<<"_.DEF";
-		//hc->moveAnim = CDefHandler::giveDef(nm.str());
-
-		//for(int o=0; o<hc->moveAnim->ourImages.size(); ++o)
-		//{
-		//	if(hc->moveAnim->ourImages[o].groupNumber==6)
-		//	{
-		//		for(int e=0; e<8; ++e)
-		//		{
-		//			Cimage nci;
-		//			nci.bitmap = CSDL_Ext::rotate01(hc->moveAnim->ourImages[o+e].bitmap);
-		//			nci.groupNumber = 10;
-		//			nci.imName = std::string();
-		//			hc->moveAnim->ourImages.push_back(nci);
-		//		}
-		//		o+=8;
-		//	}
-		//	if(hc->moveAnim->ourImages[o].groupNumber==7)
-		//	{
-		//		for(int e=0; e<8; ++e)
-		//		{
-		//			Cimage nci;
-		//			nci.bitmap = CSDL_Ext::rotate01(hc->moveAnim->ourImages[o+e].bitmap);
-		//			nci.groupNumber = 11;
-		//			nci.imName = std::string();
-		//			hc->moveAnim->ourImages.push_back(nci);
-		//		}
-		//		o+=8;
-		//	}
-		//	if(hc->moveAnim->ourImages[o].groupNumber==8)
-		//	{
-		//		for(int e=0; e<8; ++e)
-		//		{
-		//			Cimage nci;
-		//			nci.bitmap = CSDL_Ext::rotate01(hc->moveAnim->ourImages[o+e].bitmap);
-		//			nci.groupNumber = 12;
-		//			nci.imName = std::string();
-		//			hc->moveAnim->ourImages.push_back(nci);
-		//		}
-		//		o+=8;
-		//	}
-		//}
-		//for(int o=0; o<hc->moveAnim->ourImages.size(); ++o)
-		//{
-		//	if(hc->moveAnim->ourImages[o].groupNumber==1)
-		//	{
-		//		Cimage nci;
-		//		nci.bitmap = CSDL_Ext::rotate01(hc->moveAnim->ourImages[o].bitmap);
-		//		nci.groupNumber = 13;
-		//		nci.imName = std::string();
-		//		hc->moveAnim->ourImages.push_back(nci);
-		//		//o+=1;
-		//	}
-		//	if(hc->moveAnim->ourImages[o].groupNumber==2)
-		//	{
-		//		Cimage nci;
-		//		nci.bitmap = CSDL_Ext::rotate01(hc->moveAnim->ourImages[o].bitmap);
-		//		nci.groupNumber = 14;
-		//		nci.imName = std::string();
-		//		hc->moveAnim->ourImages.push_back(nci);
-		//		//o+=1;
-		//	}
-		//	if(hc->moveAnim->ourImages[o].groupNumber==3)
-		//	{
-		//		Cimage nci;
-		//		nci.bitmap = CSDL_Ext::rotate01(hc->moveAnim->ourImages[o].bitmap);
-		//		nci.groupNumber = 15;
-		//		nci.imName = std::string();
-		//		hc->moveAnim->ourImages.push_back(nci);
-		//		//o+=1;
-		//	}
-		//}
-
-		//for(int ff=0; ff<hc->moveAnim->ourImages.size(); ++ff)
-		//{
-		//	CSDL_Ext::alphaTransform(hc->moveAnim->ourImages[ff].bitmap);
-		//}
-		//hc->moveAnim->alphaTransformed = true;
 }
-void Graphics::loadHeroFlags()
+void Graphics::loadHeroAnim(std::vector<CDefHandler **> & anims)
 {
-	flags1.push_back(CDefHandler::giveDef("ABF01L.DEF")); //red
-	flags1.push_back(CDefHandler::giveDef("ABF01G.DEF")); //blue
-	flags1.push_back(CDefHandler::giveDef("ABF01R.DEF")); //tan
-	flags1.push_back(CDefHandler::giveDef("ABF01D.DEF")); //green
-	flags1.push_back(CDefHandler::giveDef("ABF01B.DEF")); //orange
-	flags1.push_back(CDefHandler::giveDef("ABF01P.DEF")); //purple
-	flags1.push_back(CDefHandler::giveDef("ABF01W.DEF")); //teal
-	flags1.push_back(CDefHandler::giveDef("ABF01K.DEF")); //pink
-
-	for(int q=0; q<8; ++q)
+	for(int i=0; i<anims.size();i++)
 	{
-		for(int o=0; o<flags1[q]->ourImages.size(); ++o)
+		std::stringstream nm;
+		nm<<"AH";
+		nm<<std::setw(2);
+		nm<<std::setfill('0');
+		nm<<i;
+		nm<<"_.DEF";
+		std::string name = nm.str();
+		(*anims[i]) = CDefHandler::giveDef(name);
+		//(CDefHandler*)(((void*)hc)+((void*)moveAnim)) = CDefHandler::giveDef(name);
+		for(int o=0; o<(*anims[i])->ourImages.size(); ++o)
 		{
-			if(flags1[q]->ourImages[o].groupNumber==6)
+			if((*anims[i])->ourImages[o].groupNumber==6)
 			{
 				for(int e=0; e<8; ++e)
 				{
 					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags1[q]->ourImages[o+e].bitmap);
+					nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o+e].bitmap);
 					nci.groupNumber = 10;
 					nci.imName = std::string();
-					flags1[q]->ourImages.push_back(nci);
+					(*anims[i])->ourImages.push_back(nci);
 				}
 				o+=8;
 			}
-			if(flags1[q]->ourImages[o].groupNumber==7)
+			if((*anims[i])->ourImages[o].groupNumber==7)
 			{
 				for(int e=0; e<8; ++e)
 				{
 					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags1[q]->ourImages[o+e].bitmap);
+					nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o+e].bitmap);
 					nci.groupNumber = 11;
 					nci.imName = std::string();
-					flags1[q]->ourImages.push_back(nci);
+					(*anims[i])->ourImages.push_back(nci);
 				}
 				o+=8;
 			}
-			if(flags1[q]->ourImages[o].groupNumber==8)
+			if((*anims[i])->ourImages[o].groupNumber==8)
 			{
 				for(int e=0; e<8; ++e)
 				{
 					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags1[q]->ourImages[o+e].bitmap);
+					nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o+e].bitmap);
 					nci.groupNumber = 12;
 					nci.imName = std::string();
-					flags1[q]->ourImages.push_back(nci);
+					(*anims[i])->ourImages.push_back(nci);
 				}
 				o+=8;
 			}
 		}
-
-		for(int ff=0; ff<flags1[q]->ourImages.size(); ++ff)
+		for(int o=0; o<(*anims[i])->ourImages.size(); ++o)
 		{
-			SDL_SetColorKey(flags1[q]->ourImages[ff].bitmap, SDL_SRCCOLORKEY,
-				SDL_MapRGB(flags1[q]->ourImages[ff].bitmap->format, 0, 255, 255)
-				);
-		}
-		flags1[q]->alphaTransformed = true;
-	}
-
-	flags2.push_back(CDefHandler::giveDef("ABF02L.DEF")); //red
-	flags2.push_back(CDefHandler::giveDef("ABF02G.DEF")); //blue
-	flags2.push_back(CDefHandler::giveDef("ABF02R.DEF")); //tan
-	flags2.push_back(CDefHandler::giveDef("ABF02D.DEF")); //green
-	flags2.push_back(CDefHandler::giveDef("ABF02B.DEF")); //orange
-	flags2.push_back(CDefHandler::giveDef("ABF02P.DEF")); //purple
-	flags2.push_back(CDefHandler::giveDef("ABF02W.DEF")); //teal
-	flags2.push_back(CDefHandler::giveDef("ABF02K.DEF")); //pink
-
-	for(int q=0; q<8; ++q)
-	{
-		for(int o=0; o<flags2[q]->ourImages.size(); ++o)
-		{
-			if(flags2[q]->ourImages[o].groupNumber==6)
+			if((*anims[i])->ourImages[o].groupNumber==1)
 			{
-				for(int e=0; e<8; ++e)
-				{
-					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags2[q]->ourImages[o+e].bitmap);
-					nci.groupNumber = 10;
-					nci.imName = std::string();
-					flags2[q]->ourImages.push_back(nci);
-				}
-				o+=8;
+				Cimage nci;
+				nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o].bitmap);
+				nci.groupNumber = 13;
+				nci.imName = std::string();
+				(*anims[i])->ourImages.push_back(nci);
+				//o+=1;
 			}
-			if(flags2[q]->ourImages[o].groupNumber==7)
+			if((*anims[i])->ourImages[o].groupNumber==2)
 			{
-				for(int e=0; e<8; ++e)
-				{
-					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags2[q]->ourImages[o+e].bitmap);
-					nci.groupNumber = 11;
-					nci.imName = std::string();
-					flags2[q]->ourImages.push_back(nci);
-				}
-				o+=8;
+				Cimage nci;
+				nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o].bitmap);
+				nci.groupNumber = 14;
+				nci.imName = std::string();
+				(*anims[i])->ourImages.push_back(nci);
+				//o+=1;
 			}
-			if(flags2[q]->ourImages[o].groupNumber==8)
+			if((*anims[i])->ourImages[o].groupNumber==3)
 			{
-				for(int e=0; e<8; ++e)
-				{
-					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags2[q]->ourImages[o+e].bitmap);
-					nci.groupNumber = 12;
-					nci.imName = std::string();
-					flags2[q]->ourImages.push_back(nci);
-				}
-				o+=8;
+				Cimage nci;
+				nci.bitmap = CSDL_Ext::rotate01((*anims[i])->ourImages[o].bitmap);
+				nci.groupNumber = 15;
+				nci.imName = std::string();
+				(*anims[i])->ourImages.push_back(nci);
+				//o+=1;
 			}
 		}
 
-		for(int ff=0; ff<flags2[q]->ourImages.size(); ++ff)
+		for(int ff=0; ff<(*anims[i])->ourImages.size(); ++ff)
 		{
-			SDL_SetColorKey(flags2[q]->ourImages[ff].bitmap, SDL_SRCCOLORKEY,
-				SDL_MapRGB(flags2[q]->ourImages[ff].bitmap->format, 0, 255, 255)
-				);
+			CSDL_Ext::alphaTransform((*anims[i])->ourImages[ff].bitmap);
 		}
-		flags2[q]->alphaTransformed = true;
+		(*anims[i])->alphaTransformed = true;
 	}
+}
 
-	flags3.push_back(CDefHandler::giveDef("ABF03L.DEF")); //red
-	flags3.push_back(CDefHandler::giveDef("ABF03G.DEF")); //blue
-	flags3.push_back(CDefHandler::giveDef("ABF03R.DEF")); //tan
-	flags3.push_back(CDefHandler::giveDef("ABF03D.DEF")); //green
-	flags3.push_back(CDefHandler::giveDef("ABF03B.DEF")); //orange
-	flags3.push_back(CDefHandler::giveDef("ABF03P.DEF")); //purple
-	flags3.push_back(CDefHandler::giveDef("ABF03W.DEF")); //teal
-	flags3.push_back(CDefHandler::giveDef("ABF03K.DEF")); //pink
-
-	for(int q=0; q<8; ++q)
-	{
-		for(int o=0; o<flags3[q]->ourImages.size(); ++o)
-		{
-			if(flags3[q]->ourImages[o].groupNumber==6)
-			{
-				for(int e=0; e<8; ++e)
-				{
-					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags3[q]->ourImages[o+e].bitmap);
-					nci.groupNumber = 10;
-					nci.imName = std::string();
-					flags3[q]->ourImages.push_back(nci);
-				}
-				o+=8;
-			}
-			if(flags3[q]->ourImages[o].groupNumber==7)
-			{
-				for(int e=0; e<8; ++e)
-				{
-					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags3[q]->ourImages[o+e].bitmap);
-					nci.groupNumber = 11;
-					nci.imName = std::string();
-					flags3[q]->ourImages.push_back(nci);
-				}
-				o+=8;
-			}
-			if(flags3[q]->ourImages[o].groupNumber==8)
-			{
-				for(int e=0; e<8; ++e)
-				{
-					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags3[q]->ourImages[o+e].bitmap);
-					nci.groupNumber = 12;
-					nci.imName = std::string();
-					flags3[q]->ourImages.push_back(nci);
-				}
-				o+=8;
-			}
-		}
-
-		for(int ff=0; ff<flags3[q]->ourImages.size(); ++ff)
-		{
-			SDL_SetColorKey(flags3[q]->ourImages[ff].bitmap, SDL_SRCCOLORKEY,
-				SDL_MapRGB(flags3[q]->ourImages[ff].bitmap->format, 0, 255, 255)
-				);
-		}
-		flags3[q]->alphaTransformed = true;
-	}
-
-	flags4.push_back(CDefHandler::giveDef("AF00.DEF")); //red
-	flags4.push_back(CDefHandler::giveDef("AF01.DEF")); //blue
-	flags4.push_back(CDefHandler::giveDef("AF02.DEF")); //tan
-	flags4.push_back(CDefHandler::giveDef("AF03.DEF")); //green
-	flags4.push_back(CDefHandler::giveDef("AF04.DEF")); //orange
-	flags4.push_back(CDefHandler::giveDef("AF05.DEF")); //purple
-	flags4.push_back(CDefHandler::giveDef("AF06.DEF")); //teal
-	flags4.push_back(CDefHandler::giveDef("AF07.DEF")); //pink
-
+void Graphics::loadHeroFlags(std::pair<std::vector<CDefHandler *> Graphics::*, std::vector<const char *> > &pr, bool mode)
+{
+	for(int i=0;i<8;i++)
+		(this->*pr.first).push_back(CDefHandler::giveDef(pr.second[i]));
 
 	for(int q=0; q<8; ++q)
 	{
-		for(int o=0; o<flags4[q]->ourImages.size(); ++o)
+		for(int o=0; o<(this->*pr.first)[q]->ourImages.size(); ++o)
 		{
-			if(flags4[q]->ourImages[o].groupNumber==6)
+			if((this->*pr.first)[q]->ourImages[o].groupNumber==6)
 			{
 				for(int e=0; e<8; ++e)
 				{
 					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
+					nci.bitmap = CSDL_Ext::rotate01((this->*pr.first)[q]->ourImages[o+e].bitmap);
 					nci.groupNumber = 10;
 					nci.imName = std::string();
-					flags4[q]->ourImages.push_back(nci);
+					(this->*pr.first)[q]->ourImages.push_back(nci);
 				}
 				o+=8;
 			}
-			if(flags4[q]->ourImages[o].groupNumber==7)
+			if((this->*pr.first)[q]->ourImages[o].groupNumber==7)
 			{
 				for(int e=0; e<8; ++e)
 				{
 					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
-					nci.groupNumber = 10;
+					nci.bitmap = CSDL_Ext::rotate01((this->*pr.first)[q]->ourImages[o+e].bitmap);
 					nci.groupNumber = 11;
 					nci.imName = std::string();
-					flags4[q]->ourImages.push_back(nci);
+					(this->*pr.first)[q]->ourImages.push_back(nci);
 				}
 				o+=8;
 			}
-			if(flags4[q]->ourImages[o].groupNumber==8)
+			if((this->*pr.first)[q]->ourImages[o].groupNumber==8)
 			{
 				for(int e=0; e<8; ++e)
 				{
 					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
-					nci.groupNumber = 10;
+					nci.bitmap = CSDL_Ext::rotate01((this->*pr.first)[q]->ourImages[o+e].bitmap);
 					nci.groupNumber = 12;
 					nci.imName = std::string();
-					flags4[q]->ourImages.push_back(nci);
+					(this->*pr.first)[q]->ourImages.push_back(nci);
 				}
 				o+=8;
 			}
 		}
-
-		for(int o=0; o<flags4[q]->ourImages.size(); ++o)
+		if (mode)
 		{
-			if(flags4[q]->ourImages[o].groupNumber==1)
+			for(int o=0; o<flags4[q]->ourImages.size(); ++o)
 			{
-				for(int e=0; e<8; ++e)
+				if(flags4[q]->ourImages[o].groupNumber==1)
 				{
-					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
-					nci.groupNumber = 10;
-					nci.groupNumber = 13;
-					nci.imName = std::string();
-					flags4[q]->ourImages.push_back(nci);
+					for(int e=0; e<8; ++e)
+					{
+						Cimage nci;
+						nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
+						nci.groupNumber = 13;
+						nci.imName = std::string();
+						flags4[q]->ourImages.push_back(nci);
+					}
+					o+=8;
 				}
-				o+=8;
-			}
-			if(flags4[q]->ourImages[o].groupNumber==2)
-			{
-				for(int e=0; e<8; ++e)
+				if(flags4[q]->ourImages[o].groupNumber==2)
 				{
-					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
-					nci.groupNumber = 10;
-					nci.groupNumber = 14;
-					nci.imName = std::string();
-					flags4[q]->ourImages.push_back(nci);
+					for(int e=0; e<8; ++e)
+					{
+						Cimage nci;
+						nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
+						nci.groupNumber = 14;
+						nci.imName = std::string();
+						flags4[q]->ourImages.push_back(nci);
+					}
+					o+=8;
 				}
-				o+=8;
-			}
-			if(flags4[q]->ourImages[o].groupNumber==3)
-			{
-				for(int e=0; e<8; ++e)
+				if(flags4[q]->ourImages[o].groupNumber==3)
 				{
-					Cimage nci;
-					nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
-					nci.groupNumber = 10;
-					nci.groupNumber = 15;
-					nci.imName = std::string();
-					flags4[q]->ourImages.push_back(nci);
+					for(int e=0; e<8; ++e)
+					{
+						Cimage nci;
+						nci.bitmap = CSDL_Ext::rotate01(flags4[q]->ourImages[o+e].bitmap);
+						nci.groupNumber = 15;
+						nci.imName = std::string();
+						flags4[q]->ourImages.push_back(nci);
+					}
+					o+=8;
 				}
-				o+=8;
 			}
 		}
-
-		for(int ff=0; ff<flags4[q]->ourImages.size(); ++ff)
+		for(int ff=0; ff<(this->*pr.first)[q]->ourImages.size(); ++ff)
 		{
-			SDL_SetColorKey(flags4[q]->ourImages[ff].bitmap, SDL_SRCCOLORKEY,
-				SDL_MapRGB(flags4[q]->ourImages[ff].bitmap->format, 0, 255, 255)
+			SDL_SetColorKey((this->*pr.first)[q]->ourImages[ff].bitmap, SDL_SRCCOLORKEY,
+				SDL_MapRGB((this->*pr.first)[q]->ourImages[ff].bitmap->format, 0, 255, 255)
 				);
 		}
-		flags4[q]->alphaTransformed = true;
+		(this->*pr.first)[q]->alphaTransformed = true;
 	}
 }
+
+void Graphics::loadHeroFlags()
+{
+	using namespace boost::assign;
+	timeHandler th;
+	std::vector<CDefHandler *> Graphics::*point;
+	std::pair<std::vector<CDefHandler *> Graphics::*, std::vector<const char *> > pr[4];
+	pr[0].first = &Graphics::flags1;
+	pr[0].second+=("ABF01L.DEF"),("ABF01G.DEF"),("ABF01R.DEF"),("ABF01D.DEF"),("ABF01B.DEF"),
+		("ABF01P.DEF"),("ABF01W.DEF"),("ABF01K.DEF");
+	pr[1].first = &Graphics::flags2;
+	pr[1].second+=("ABF02L.DEF"),("ABF02G.DEF"),("ABF02R.DEF"),("ABF02D.DEF"),("ABF02B.DEF"),
+		("ABF02P.DEF"),("ABF02W.DEF"),("ABF02K.DEF");
+	pr[2].first = &Graphics::flags3;
+	pr[2].second+=("ABF03L.DEF"),("ABF03G.DEF"),("ABF03R.DEF"),("ABF03D.DEF"),("ABF03B.DEF"),
+		("ABF03P.DEF"),("ABF03W.DEF"),("ABF03K.DEF");
+	pr[3].first = &Graphics::flags4;
+	pr[3].second+=("AF00.DEF"),("AF01.DEF"),("AF02.DEF"),("AF03.DEF"),("AF04.DEF"),
+		("AF05.DEF"),("AF06.DEF"),("AF07.DEF");
+	boost::thread_group grupa;
+	grupa.create_thread(boost::bind(&Graphics::loadHeroFlags,this,boost::ref(pr[3]),true));
+	grupa.create_thread(boost::bind(&Graphics::loadHeroFlags,this,boost::ref(pr[2]),false));
+	grupa.create_thread(boost::bind(&Graphics::loadHeroFlags,this,boost::ref(pr[1]),false));
+	grupa.create_thread(boost::bind(&Graphics::loadHeroFlags,this,boost::ref(pr[0]),false));
+	grupa.join_all();
+	std::cout << "Flagi: "<<th.getDif()<<std::endl;
+}
 SDL_Surface * Graphics::getPic(int ID, bool fort, bool builded)
 {
 	if (ID==-1)

+ 3 - 0
client/Graphics.h

@@ -5,6 +5,7 @@ struct SDL_Surface;
 class CGHeroInstance;
 class CGTownInstance;
 class CDefHandler;
+class CHeroClass;
 class Graphics
 {
 public:
@@ -31,6 +32,8 @@ public:
 	//functions
 	Graphics();
 	void loadHeroFlags();
+	void loadHeroFlags(std::pair<std::vector<CDefHandler *> Graphics::*, std::vector<const char *> > &pr, bool mode);
+	void loadHeroAnim(std::vector<CDefHandler **> & anims);
 	SDL_Surface * drawHeroInfoWin(const CGHeroInstance * curh);
 	SDL_Surface * drawPrimarySkill(const CGHeroInstance *curh, SDL_Surface *ret, int from=0, int to=PRIMARY_SKILLS);
 	SDL_Surface * drawTownInfoWin(const CGTownInstance * curh);

+ 1 - 1
client/VCMI_client.vcproj

@@ -121,7 +121,7 @@
 				AdditionalIncludeDirectories="G:\vcmt\repa\include"
 				StringPooling="true"
 				BasicRuntimeChecks="0"
-				RuntimeLibrary="3"
+				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="false"
 				WarningLevel="3"
 				DebugInformationFormat="3"

+ 6 - 1
hch/CLodHandler.cpp

@@ -9,6 +9,7 @@
 #include "boost/filesystem/operations.hpp"
 #include <boost/algorithm/string.hpp>
 #include <boost/algorithm/string/replace.hpp>
+#include <boost/thread.hpp>
 DLL_EXPORT int readNormalNr (int pos, int bytCon, unsigned char * str)
 {
 	int ret=0;
@@ -34,6 +35,7 @@ unsigned char * CLodHandler::giveFile(std::string defName, int * length)
 		return NULL;
 	}
 	if(length) *length = ourEntry->realSize;
+	mutex->lock();
 	fseek(FLOD, ourEntry->offset, 0);
 	unsigned char * outp;
 	if (ourEntry->offset<0) //file is in the sprites/ folder; no compression
@@ -44,6 +46,7 @@ unsigned char * CLodHandler::giveFile(std::string defName, int * length)
 		strcat(name,(char*)ourEntry->name);
 		FILE * f = fopen(name,"rb");
 		int result = fread(outp,1,ourEntry->realSize,f);
+		mutex->unlock();
 		if(result<0) {std::cout<<"Error in file reading: "<<name<<std::endl;delete[] outp; return NULL;}
 		else
 			return outp;
@@ -52,13 +55,14 @@ unsigned char * CLodHandler::giveFile(std::string defName, int * length)
 	{
 		outp = new unsigned char[ourEntry->realSize];
 		fread((char*)outp, 1, ourEntry->realSize, FLOD);
+		mutex->unlock();
 		return outp;
 	}
 	else //we will decompress file
 	{
 		outp = new unsigned char[ourEntry->size];
 		fread((char*)outp, 1, ourEntry->size, FLOD);
-		fseek(FLOD, 0, 0);
+		mutex->unlock();
 		unsigned char * decomp = NULL;
 		int decRes = infs2(outp, ourEntry->size, ourEntry->realSize, decomp);
 		delete[] outp;
@@ -340,6 +344,7 @@ int CLodHandler::readNormalNr (unsigned char* bufor, int bytCon, bool cyclic)
 
 void CLodHandler::init(std::string lodFile, std::string dirName)
 {
+	mutex = new boost::mutex;
 	std::string Ts;
 	FLOD = fopen(lodFile.c_str(), "rb");
 	fseek(FLOD, 8, 0);

+ 3 - 1
hch/CLodHandler.h

@@ -9,7 +9,8 @@
 struct SDL_Surface;
 class CDefHandler;
 class CDefEssential;
-
+namespace boost
+{class mutex;};
 namespace NLoadHandlerHelp
 {
 	const int dmHelp=0, dmNoExtractingMask=1;
@@ -44,6 +45,7 @@ public:
 	FILE* FLOD;
 	nodrze<Entry> entries;
 	unsigned int totalFiles;
+	boost::mutex *mutex;
 
 	int readNormalNr (unsigned char* bufor, int bytCon, bool cyclic=false); //lod header reading helper
 	int infs(unsigned char * in, int size, int realSize, std::ofstream & out, int wBits=15); //zlib fast handler

+ 1 - 2
hch/CObjectHandler.cpp

@@ -326,7 +326,6 @@ CGTownInstance::CGTownInstance()
 	builded=-1;
 	destroyed=-1;
 	garrisonHero=NULL;
-	//state->owner=-1;
 	town=NULL;
 	visitingHero = NULL;
 }
@@ -335,7 +334,7 @@ CGObjectInstance::CGObjectInstance(): animPhaseShift(rand()%0xff)
 {
 	//std::cout << "Tworze obiekt "<<this<<std::endl;
 	//state = new CLuaObjectScript();
-	//state = NULL;
+	state = NULL;
 	tempOwner = 254;
 	blockVisit = false;
 }

+ 5 - 1
lib/VCMI_lib.vcproj

@@ -121,7 +121,7 @@
 				StringPooling="true"
 				MinimalRebuild="false"
 				BasicRuntimeChecks="0"
-				RuntimeLibrary="3"
+				RuntimeLibrary="2"
 				EnableFunctionLevelLinking="false"
 				WarningLevel="3"
 				DebugInformationFormat="3"
@@ -367,6 +367,10 @@
 			Filter="h;hpp;hxx;hm;inl;inc;xsd"
 			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
 			>
+			<File
+				RelativePath="..\hch\CArtHandler.h"
+				>
+			</File>
 			<File
 				RelativePath="..\hch\CCreatureHandler.h"
 				>