فهرست منبع

Working windmill, water wheel, mystical garden (not tested).
Info windows.
Minor changes.

Michał W. Urbańczyk 18 سال پیش
والد
کامیت
736af28c05
20فایلهای تغییر یافته به همراه472 افزوده شده و 122 حذف شده
  1. 2 2
      CAdvmapInterface.h
  2. 38 1
      CCallback.cpp
  3. 2 0
      CCallback.h
  4. 0 1
      CGameInterface.h
  5. 133 53
      CLua.cpp
  6. 12 14
      CLua.h
  7. 7 1
      CMT.cpp
  8. 59 28
      CMessage.cpp
  9. 1 0
      CMessage.h
  10. 148 3
      CPlayerInterface.cpp
  11. 53 9
      CPlayerInterface.h
  12. BIN
      CPreGame.cpp
  13. 2 2
      CPreGame.h
  14. 1 0
      hch/CHeroHandler.cpp
  15. 2 2
      hch/CHeroHandler.h
  16. 0 1
      hch/CLodHandler.cpp
  17. 7 2
      hch/CObjectHandler.cpp
  18. 2 1
      hch/CObjectHandler.h
  19. 2 2
      map.h
  20. 1 0
      mapHandler.cpp

+ 2 - 2
CAdvmapInterface.h

@@ -93,14 +93,14 @@ public:
 	void draw();
 };
 class CResourceBar
-	:public ClickableR, public CIntObject
+	:public ClickableR
 {
 	SDL_Surface * bg;
 	void clickRight(tribool down);
 	void refresh();
 };
 class CDataBar
-	:public ClickableR, public CIntObject
+	:public ClickableR
 {
 	SDL_Surface * bg;
 	void clickRight(tribool down);

+ 38 - 1
CCallback.cpp

@@ -38,6 +38,11 @@ void CCallback::newTurn()
 {
 	//std::map<int, PlayerState>::iterator i = gs->players.begin() ;
 	gs->day++;
+	for (int i=0;i<CGI->objh->objInstances.size();i++)
+	{
+		if (CGI->objh->objInstances[i]->state)
+			CGI->objh->objInstances[i]->state->newTurn();
+	}
 	for ( std::map<int, PlayerState>::iterator i=gs->players.begin() ; i!=gs->players.end();i++)
 	{
 		for (int j=0;j<(*i).second.heroes.size();j++)
@@ -373,6 +378,37 @@ int CScriptCallback::getSelectedHero()
 		ret = -1;;
 	return ret;
 }
+int CScriptCallback::getDate(int mode)
+{
+	int temp;
+	switch (mode)
+	{
+	case 0:
+		return gs->day;
+		break;
+	case 1:
+		temp = (gs->day)%7;
+		if (temp)
+			return temp;
+		else return 7;
+		break;
+	case 2:
+		temp = ((gs->day-1)/7)+1;
+		if (!(temp%4))
+			return 4;
+		else 
+			return (temp%4);
+		break;
+	case 3:
+		return ((gs->day-1)/28)+1;
+		break;
+	}
+	return 0;
+}
+void CScriptCallback::giveResource(int player, int which, int val)
+{
+	gs->players[player].resources[which]+=val;
+}
 void CLuaCallback::registerFuncs(lua_State * L)
 {
 	lua_newtable(L);
@@ -397,7 +433,8 @@ void CLuaCallback::registerFuncs(lua_State * L)
 	
 
 	lua_setglobal(L, "vcmi");
-#undef REGISTER_C_FUNC(x)
+	#undef REGISTER_C_FUNC(x)
+
 }
 int CLuaCallback::getPos(lua_State * L)//(CGObjectInstance * object);
 {	

+ 2 - 0
CCallback.h

@@ -61,6 +61,8 @@ public:
 	void showInfoDialog(int player, std::string text, std::vector<SComponent*> * components);
 	int getHeroOwner(int heroID);
 	int getSelectedHero();
+	int getDate(int mode=0);
+	void giveResource(int player, int which, int val);
 	friend void initGameState(CGameInfo * cgi);
 };
 class CLuaCallback : public CScriptCallback

+ 0 - 1
CGameInterface.h

@@ -5,7 +5,6 @@
 BOOST_TRIBOOL_THIRD_STATE(outOfRange)
 
 using namespace boost::logic;
-class CAdvMapInt;
 class CCallback;
 class CGlobalAI;
 class CGHeroInstance;

+ 133 - 53
CLua.cpp

@@ -15,6 +15,8 @@
 #include "CCallback.h"
 #include "hch/CGeneralTextHandler.h"
 #include <sstream>
+#include "CPlayerInterface.h"
+#pragma warning (disable : 4311)
 bool getGlobalFunc(lua_State * L, std::string fname)
 {
 	unsigned int hash = lua_calchash(fname.c_str(), fname.size());
@@ -25,7 +27,7 @@ bool getGlobalFunc(lua_State * L, std::string fname)
 
 CObjectScript::CObjectScript()
 {
-	language == ESLan::UNDEF;
+	language = ESLan::UNDEF;
 	//std::cout << "Tworze obiekt objectscript "<<this<<std::endl;
 }
 
@@ -107,7 +109,7 @@ void CLua::findFS(std::string fname)
 
 CLuaObjectScript::CLuaObjectScript(std::string filename)
 {
-	language == ESLan::LUA;
+	language = ESLan::LUA;
 	open(filename);
 	//binit = bnewobject = bonherovisit = brightext = false;
 	//std::cout << "Tworze obiekt CLuaObjectScript "<<this<<std::endl;
@@ -163,6 +165,7 @@ std::string CLuaObjectScript::hoverText(CGObjectInstance *os)
 	}
 	std::string ret = lua_tostring(is,1);
 	lua_settop(is, 0);
+	return ret;
 }
 
 std::string CCPPObjectScript::hoverText(CGObjectInstance *os)
@@ -197,6 +200,26 @@ void CVisitableOPH::onHeroVisit(CGObjectInstance *os, int heroID)
 };
 void CVisitableOPH::onNAHeroVisit(CGObjectInstance *os, int heroID, bool alreadyVisited)
 {
+	int w=0, ot=0;
+	switch(os->ID)
+	{
+	case 51:
+		w=0;
+		ot=80;
+		break;
+	case 23:
+		w=1;
+		ot=39;
+		break;
+	case 61:
+		w=2;
+		ot=100;
+		break;
+	case 32:
+		w=3;
+		ot=59;
+		break;
+	}
 	if (!alreadyVisited)
 	{
 		switch (os->ID)
@@ -206,36 +229,21 @@ void CVisitableOPH::onNAHeroVisit(CGObjectInstance *os, int heroID, bool already
 		case 61:
 		case 32:
 			{
-				int w=0, ot=0;
-				switch(os->ID)
-				{
-				case 51:
-					w=0;
-					ot=80;
-					break;
-				case 23:
-					w=1;
-					ot=29;
-					break;
-				case 61:
-					w=2;
-					ot=100;
-					break;
-				case 32:
-					w=3;
-					ot=59;
-					break;
-				}
 				cb->changePrimSkill(heroID,w,1);
 				std::vector<SComponent*> weko;
-				weko.push_back(new SComponent(SComponent::primskill,1,1));
-				cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[ot],&weko);
-				for (int ii=0; ii<weko.size();ii++)
-					delete weko[ii];
+				weko.push_back(new SComponent(SComponent::primskill,w,1)); 
+				cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[ot],&weko); //TODO: maybe we have memory leak with these windows
+				//for (int ii=0; ii<weko.size();ii++)
+				//	delete weko[ii];
 				break;
 			}
 		}
 	}
+	else
+	{
+		ot++;
+		cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[ot],&std::vector<SComponent*>());
+	}
 }
 
 std::vector<int> CVisitableOPH::yourObjects()
@@ -282,6 +290,104 @@ std::string CVisitableOPH::hoverText(CGObjectInstance *os)
 	return CGI->objh->objects[os->defInfo->id].name + add;
 }
 
+void CVisitableOPW::onNAHeroVisit(CGObjectInstance *os, int heroID, bool alreadyVisited)
+{
+	int mid;
+	switch (os->ID)
+	{
+	case 55:
+		mid = 92;
+		break;
+	case 112:
+		mid = 170;
+		break;
+	case 109:
+		mid = 164;
+		break;
+	}
+	if (alreadyVisited)
+	{
+		if (os->ID!=112)
+			mid++;
+		else 
+			mid--;
+		cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[mid],&std::vector<SComponent*>()); //TODO: maybe we have memory leak with these windows
+	}
+	else
+	{
+		int type, sub, val;
+		type = SComponent::resource;
+		switch (os->ID)
+		{
+		case 55:
+			if (rand()%2)
+			{
+				sub = 5;
+				val = 5;
+			}
+			else
+			{
+				sub = 6;
+				val = 500;
+			}
+			break;
+		case 112:
+			mid = 170;
+			sub = rand() % 6;
+			val = (rand() % 4) + 3;
+			break;
+		case 109:
+			mid = 164;
+			sub = 6;
+			if(cb->getDate(2)<2)
+				val = 500;
+			else
+				val = 1000;
+		}
+		SComponent * com = new SComponent((SComponent::Etype)type,sub,val);
+		std::vector<SComponent*> weko;
+		weko.push_back(com);
+		cb->giveResource(cb->getHeroOwner(heroID),sub,val);
+		cb->showInfoDialog(cb->getHeroOwner(heroID),CGI->objh->advobtxt[mid],&weko);
+		visited[os] = true;
+	}
+}
+void CVisitableOPW::newTurn ()
+{
+	if (cb->getDate(1)==1)
+	{
+		for (std::map<CGObjectInstance*,bool>::iterator i = visited.begin(); i != visited.end(); i++)
+		{
+			(*i).second = false;
+		}
+	}
+} 
+void CVisitableOPW::newObject(CGObjectInstance *os)
+{
+	visited.insert(std::pair<CGObjectInstance*,bool>(os,false));
+}
+
+void CVisitableOPW::onHeroVisit(CGObjectInstance *os, int heroID)
+{
+	if(visited[os])
+		onNAHeroVisit(os,heroID,true);
+	else 
+		onNAHeroVisit(os,heroID,false);
+}
+
+std::vector<int> CVisitableOPW::yourObjects() //returns IDs of objects which are handled by script
+{
+	std::vector<int> ret(3);
+	ret.push_back(55); //mystical garden
+	ret.push_back(112); //windmill
+	ret.push_back(109); //water wheel
+	return ret;
+}
+
+std::string CVisitableOPW::hoverText(CGObjectInstance *os)
+{
+	return CGI->objh->objects[os->defInfo->id].name + " " + ( (visited[os]) ? (CGI->generaltexth->allTexts[352]) : (CGI->generaltexth->allTexts[353]))  ;
+}
 
 //std::string SComponent::getSubtitle()
 //{
@@ -292,30 +398,4 @@ std::string CVisitableOPH::hoverText(CGObjectInstance *os)
 //}
 //void SComponent::getDescription(Etype Type, int Subtype)
 //{
-//}
-SComponent::SComponent(Etype Type, int Subtype, int Val)
-{
-	switch (Type)
-	{
-	case primskill:
-		description = CGI->generaltexth->arraytxt[2+Subtype];
-		std::ostringstream oss;
-		oss << ((Val>0)?("+"):("-")) << Val << " " << CGI->heroh->pskillsn[Subtype];
-		subtitle = oss.str();
-		break;
-	}
-	type = Type;
-	subtype = Subtype;
-	val = Val;
-}
-
-SDL_Surface * SComponent::getImg()
-{
-	switch (type)
-	{
-	case primskill:
-		return CGI->heroh->pskillsb[subtype].ourImages[0].bitmap;
-		break;
-	}
-	return NULL;
-}
+//}

+ 12 - 14
CLua.h

@@ -25,6 +25,8 @@ public:
 	virtual void newObject(CGObjectInstance *os){};
 	virtual void onHeroVisit(CGObjectInstance *os, int heroID){};
 	virtual std::string hoverText(CGObjectInstance *os){return "";};
+	virtual void newTurn (){}; 
+
 
 	//TODO: implement functions below:
 	virtual void equipArtefact(int HID, int AID, int slot, bool putOn){}; //putOn==0 means that artifact is taken off
@@ -34,7 +36,6 @@ public:
 	//virtual void mouseClick (down,left,screen?, pos??){};
 	virtual void heroLevelUp (int HID){}; //add possibility of changing available sec. skills
 
-
 };
 class CScript
 {
@@ -100,19 +101,16 @@ class CVisitableOPH : public CCPPObjectScript  //once per hero
 	friend void initGameState(CGameInfo * cgi);
 };
 
-struct SComponent
+class CVisitableOPW : public CCPPObjectScript  //once per week
 {
-	enum Etype
-	{
-		primskill, secskill, resource, creature, artifact
-	} type;
-	int subtype; 
-	int val;
-
-	std::string description; //r-click
-	std::string subtitle; 
+	CVisitableOPW(CScriptCallback * CB):CCPPObjectScript(CB){};
+	std::map<CGObjectInstance*,bool> visited;
+	void onNAHeroVisit(CGObjectInstance *os, int heroID, bool alreadyVisited);
+	void newObject(CGObjectInstance *os);
+	void onHeroVisit(CGObjectInstance *os, int heroID);
+	std::vector<int> yourObjects(); //returns IDs of objects which are handled by script
+	std::string hoverText(CGObjectInstance *os);
+	void newTurn (); 
 
-	SComponent(Etype Type, int Subtype, int Val);
-	//SComponent(const & SComponent r);
-	SDL_Surface * getImg();
+	friend void initGameState(CGameInfo * cgi);
 };

+ 7 - 1
CMT.cpp

@@ -218,7 +218,9 @@ void initGameState(CGameInfo * cgi)
 	/****************************C++ OBJECT SCRIPTS************************************************/
 	std::map<int,CCPPObjectScript*> scripts;
 	CScriptCallback * csc = new CScriptCallback();
+	csc->gs = cgi->state;
 	handleCPPObjS(&scripts,new CVisitableOPH(csc));
+	handleCPPObjS(&scripts,new CVisitableOPW(csc));
 	//created map
 
 
@@ -330,6 +332,8 @@ int _tmain(int argc, _TCHAR* argv[])
 		cgi->screenh = new CScreenHandler;
 		cgi->screenh->initScreen();
 
+		THC std::cout<<"Preparing first handlers: "<<tmh.getDif()<<std::endl;
+
 		//colors initialization
 		SDL_Color p;
 		p.unused = 0;
@@ -352,6 +356,7 @@ int _tmain(int argc, _TCHAR* argv[])
 		p.r = 0x84; p.g = 0x84; p.b = 0x84;//gray
 		cgi->neutralColor = p;//gray
 		//colors initialized
+		THC std::cout<<"Preparing players' colours: "<<tmh.getDif()<<std::endl;
 		CMessage::init();
 		cgi->townh = new CTownHandler;
 		cgi->townh->loadNames();
@@ -364,6 +369,7 @@ int _tmain(int argc, _TCHAR* argv[])
 		cgi->heroh = heroh;
 		cgi->generaltexth = new CGeneralTextHandler;
 		cgi->generaltexth->load();
+		THC std::cout<<"Preparing more handlers: "<<tmh.getDif()<<std::endl;
 
 		//initializing hero flags
 
@@ -641,7 +647,7 @@ int _tmain(int argc, _TCHAR* argv[])
 
 		//hero flags initialized
 
-		THC std::cout<<"Preparing first handlers: "<<tmh.getDif()<<std::endl;
+		THC std::cout<<"Initializing colours and flags: "<<tmh.getDif()<<std::endl;
 		CPreGame * cpg = new CPreGame(); //main menu and submenus
 		THC std::cout<<"Initialization CPreGame (together): "<<tmh.getDif()<<std::endl;
 		cpg->mush = mush;

+ 59 - 28
CMessage.cpp

@@ -275,45 +275,76 @@ CInfoWindow * CMessage::genIWindow(std::string text, int player, int charperline
 {
 	//TODO: support for more than one component
 	CInfoWindow * ret = new CInfoWindow();
-
-	std::vector<std::string> * brtext = breakText(text,32,true,true);
-	std::vector<std::string> * brdtext = breakText(comps[0]->subtitle,12,true,true);
+	ret->components = comps;
+	//for (int i=0;i<comps.size();i++)
+	//	comps[i]->
+	std::vector<std::string> * brtext = breakText(text,charperline,true,true);
+	std::vector<std::string> * brdtext;
+	if (comps.size())
+		brdtext = breakText(comps[0]->subtitle,12,true,true);
+	else 
+		brdtext = NULL;
 	std::vector<std::vector<SDL_Surface*> > * txtg = drawText(brtext);
 	std::pair<int,int> txts = getMaxSizes(txtg);
 	txts.second = txts.second
-		+ 30 //space to first component
-		+ comps[0]->getImg()->h
-		+ brdtext->size() * 10 //subtitle //!!!!!!!!!!!!!!!!!!!!
-		+ 20 // space between subtitle and button
 		+ ok->ourImages[0].bitmap->h //button
-		+ 30; //after button
+		+ 15 //after button
+		+ 20; // space between subtitle and button
+	if (comps.size())
+			txts.second = txts.second
+			+ 30 //space to first component
+			+ comps[0]->getImg()->h
+			+ 5 //img <-> subtitle
+			+ brdtext->size() * 10; //subtitle //!!!!!!!!!!!!!!!!!!!!
 	ret->bitmap = drawBox1(txts.first+70,txts.second+70,0); 
 	ret->pos.h=ret->bitmap->h;
 	ret->pos.w=ret->bitmap->w;
 
+	int curh = 30; //gorny margines
+	for (int i=0; i<txtg->size();i++)
+	{
+		int lw=0;
+		for (int j=0;j<(*txtg)[i].size();j++)
+			lw+=(*txtg)[i][j]->w;
+		int pw = ret->bitmap->w/2;
+		//int pw = Tmar, ph = Lmar;
+		pw -= lw/2;
 
-	//for (int i=0; i<txtg->size();i++)
-	//{
-	//	int lw=0;
-	//	for (int j=0;j<(*txtg)[i].size();j++)
-	//		lw+=(*txtg)[i][j]->w;
-	//	int pw = ret->bitmap->w/2, ph =  ret->bitmap->h/2;
-	//	//int pw = Tmar, ph = Lmar;
-	//	pw -= lw/2;
-	//	ph -= (19*txtg->size())/2;
+		int tw = pw;
+		for (int j=0;j<(*txtg)[i].size();j++) //blit text
+		{
+				//std::stringstream n;
+				//n <<"temp_"<<i<<"__"<<j<<".bmp";
+				//SDL_SaveBMP(ret->bitmap,n.str().c_str());	
+			blitAt((*txtg)[i][j],tw,curh+i*19,ret->bitmap);
+			tw+=(*txtg)[i][j]->w;
+			SDL_FreeSurface((*txtg)[i][j]);
+		}
+	}
+	curh += (19 * txtg->size()); //wys. tekstu
+
+	if (comps.size())
+	{
+		curh += 30;
+		comps[0]->pos.x = (ret->bitmap->w/2) - ((comps[0]->getImg()->w)/2);
+		comps[0]->pos.y = curh;
+		blitAt(comps[0]->getImg(),comps[0]->pos.x,comps[0]->pos.y,ret->bitmap);
+		curh += comps[0]->getImg()->h + 5; //obrazek + przerwa
+		for (int i=0; i<brdtext->size();i++) //descr.
+		{
+			SDL_Surface * tesu = TTF_RenderText_Blended(GEOR13,(*brdtext)[i].c_str(),zwykly);
+			blitAt(tesu,((comps[0]->getImg()->w - tesu->w)/2)+comps[0]->pos.x,curh,ret->bitmap);
+			curh+=tesu->h;
+			SDL_FreeSurface(tesu);
+		}
+	}
 
-	//	int tw = pw;
-	//	for (int j=0;j<(*txtg)[i].size();j++)
-	//	{
-	//			//std::stringstream n;
-	//			//n <<"temp_"<<i<<"__"<<j<<".bmp";
-	//		blitAt((*txtg)[i][j],tw,ph+i*19,ret->bitmap);
-	//			//SDL_SaveBMP(ret->bitmap,n.str().c_str());	
-	//		tw+=(*txtg)[i][j]->w;
-	//		SDL_FreeSurface((*txtg)[i][j]);
-	//	}
-	//}
+	curh += 20; //to buttton
 
+	ret->okb.posr.x = (ret->bitmap->w/2) - (ret->okb.imgs[0][0]->w/2);
+	ret->okb.posr.y = curh;
+	ret->okb.show();
+	curh+=ret->okb.imgs[0][0]->h;
 
 	return ret;
 }

+ 1 - 0
CMessage.h

@@ -13,6 +13,7 @@ class CDefHandler;
 struct SComponent;
 namespace NMessage
 {
+	extern CDefHandler * ok, *cancel;
 	extern std::vector<std::vector<SDL_Surface*> > piecesOfBox; //in colors of all players
 	extern SDL_Surface * background ;
 }

+ 148 - 3
CPlayerInterface.cpp

@@ -14,6 +14,7 @@
 #include <sstream>
 #include "hch/CHeroHandler.h"
 #include "SDL_framerate.h"
+#include "hch/CGeneralTextHandler.h"
 using namespace CSDL_Ext;
 
 class OCM_HLP_CGIN
@@ -24,11 +25,142 @@ public:
 		return (*a.first)<(*b.first);
 	}
 } ocmptwo_cgin ;
+CInfoWindow::CInfoWindow()
+:okb(NMessage::ok,NULL,&CInfoWindow::okClicked)
+{
+	okb.ourObj = this;
+	okb.delg = this;
+}
+
+void CInfoWindow::okClicked(tribool down)
+{
+	if (!down)
+		close();
+}
+
+void CInfoWindow::close()
+{
+	for (int i=0;i<components.size();i++)
+		delete components[i];
+	okb.deactivate();
+	SDL_FreeSurface(bitmap);
+	bitmap = NULL;
+	LOCPLINT->removeObjToBlit(this);
+	//delete this;
+	LOCPLINT->adventureInt->show();
+}
+CInfoWindow::~CInfoWindow()
+{
+}
+SComponent::SComponent(Etype Type, int Subtype, int Val)
+{
+	std::ostringstream oss;
+	switch (Type)
+	{
+	case primskill:
+		description = CGI->generaltexth->arraytxt[2+Subtype];
+		oss << ((Val>0)?("+"):("-")) << Val << " " << CGI->heroh->pskillsn[Subtype];
+		subtitle = oss.str();
+		break;
+	case resource:
+		//description = CGI->generaltexth->arraytxt[2+Subtype];
+		std::ostringstream oss;
+		oss << Val;
+		subtitle = oss.str();
+		break;
+	}
+	type = Type;
+	subtype = Subtype;
+	val = Val;
+	SDL_Surface * temp = getImg();
+	pos.w = temp->w;
+	pos.h = temp->h;
+}
+
+SDL_Surface * SComponent::getImg()
+{
+	switch (type)
+	{
+	case primskill:
+		return CGI->heroh->pskillsb->ourImages[subtype].bitmap;
+		break;
+	case resource:
+		return CGI->heroh->resources->ourImages[subtype].bitmap;
+		break;
+	}
+	return NULL;
+}
+
+void SComponent::clickRight (tribool down)
+{
+	LOCPLINT->adventureInt->handleRightClick(description,down,this);
+}
+void SComponent::activate()
+{
+	ClickableR::activate();
+}
+void SComponent::deactivate()
+{
+	ClickableR::deactivate();
+}
 CSimpleWindow::~CSimpleWindow()
 {
 	if (bitmap)
+	{
 		SDL_FreeSurface(bitmap);
-	bitmap=NULL;
+		bitmap=NULL;
+	}
+}
+
+template <typename T>CSCButton<T>::CSCButton(CDefHandler * img, CIntObject * obj, void(T::*poin)(tribool), T* Delg)
+{
+	ourObj = obj;
+	delg = Delg;
+	func = poin;
+	imgs.resize(1);
+	for (int i =0; i<img->ourImages.size();i++)
+	{
+		imgs[0].push_back(img->ourImages[i].bitmap);
+	}
+	pos.w = imgs[0][0]->w;
+	pos.h = imgs[0][0]->h;
+	state = 0;
+}
+template <typename T> void CSCButton<T>::clickLeft (tribool down)
+{
+	if (down)
+	{
+		state=1;
+	}
+	else 
+	{
+		state=0;
+	}
+	show();
+	if (delg)
+		(delg->*func)(down);
+	pressedL=state;
+}
+template <typename T> void CSCButton<typename T>::activate()
+{
+	ClickableL::activate();
+}
+template <typename T> void CSCButton<typename T>::deactivate()
+{
+	ClickableL::deactivate();
+}
+
+template <typename T> void CSCButton<typename T>::show()
+{
+	if (delg)
+	{
+		blitAt(imgs[curimg][state],posr.x,posr.y,delg->bitmap);
+		updateRect(&genRect(pos.h,pos.w,posr.x,posr.y),delg->bitmap);
+	}
+	else
+	{
+		CButtonBase::show();
+	}
 }
 CButtonBase::CButtonBase()
 {
@@ -1061,7 +1193,20 @@ void CPlayerInterface::heroPrimarySkillChanged(const CGHeroInstance * hero, int
 		adventureInt->infoBar.draw();
 	return;
 }
-void CPlayerInterface::showInfoDialog(std::string text, std::vector<SComponent*> components)
+void CPlayerInterface::showInfoDialog(std::string text, std::vector<SComponent*> & components)
+{
+	adventureInt->hide();
+	CInfoWindow * temp = CMessage::genIWindow(text,LOCPLINT->playerID,32,components);
+	LOCPLINT->objsToBlit.push_back(temp);
+	temp->pos.x=300-(temp->pos.w/2);
+	temp->pos.y=300-(temp->pos.h/2);
+	temp->okb.pos.x = temp->okb.posr.x + temp->pos.x;
+	temp->okb.pos.y = temp->okb.posr.y + temp->pos.y;
+	temp->okb.activate();
+}
+void CPlayerInterface::removeObjToBlit(CSimpleWindow* obj)
 {
-	;
+	objsToBlit.erase
+		(std::find(objsToBlit.begin(),objsToBlit.end(),obj));
+	//delete obj;
 }

+ 53 - 9
CPlayerInterface.h

@@ -10,7 +10,7 @@ class CDefHandler;
 struct HeroMoveDetails;
 class CDefEssential;
 class CGHeroInstance;
-struct SComponent;
+class CAdvMapInt;
 class CIntObject //interface object
 {
 public:
@@ -25,19 +25,13 @@ public:
 	CSimpleWindow():bitmap(NULL),owner(NULL){};
 	virtual ~CSimpleWindow();
 };
-class CInfoWindow : public CSimpleWindow //text + comp. + ok button
-{
-public:
-	std::vector<SComponent *> components;
-	CInfoWindow(){};
-};
 class CButtonBase : public virtual CIntObject //basic buttton class
 {
 public:
 	int type; //advmapbutton=2
 	bool abs;
 	bool active;
-	CIntObject * ourObj;
+	CIntObject * ourObj; // "owner"
 	int state;
 	std::vector< std::vector<SDL_Surface*> > imgs;
 	int curimg;
@@ -45,6 +39,7 @@ public:
 	virtual void activate()=0;
 	virtual void deactivate()=0;
 	CButtonBase();
+	virtual ~CButtonBase(){};
 };
 class ClickableL : public virtual CIntObject  //for left-clicks
 {
@@ -87,6 +82,54 @@ public:
 	virtual void activate()=0;
 	virtual void deactivate()=0;
 };
+
+template <typename T> class CSCButton: public CButtonBase, public ClickableL //prosty guzik, ktory tylko zmienia obrazek
+{
+public:
+	int3 posr; //position in the bitmap
+	int state;
+	T* delg;
+	void(T::*func)(tribool);
+	CSCButton(CDefHandler * img, CIntObject * obj, void(T::*poin)(tribool), T* Delg=NULL);
+	void clickLeft (tribool down);
+	void activate();
+	void deactivate();
+	void show();
+};
+
+class CInfoWindow : public CSimpleWindow //text + comp. + ok button
+{
+public:
+	CSCButton<CInfoWindow> okb;
+	std::vector<SComponent*> components;
+	void okClicked(tribool down);
+	void close();
+	CInfoWindow();
+	~CInfoWindow();
+};
+
+class SComponent : public ClickableR
+{
+public:
+	enum Etype
+	{
+		primskill, secskill, resource, creature, artifact
+	} type;
+	int subtype; 
+	int val;
+
+	std::string description; //r-click
+	std::string subtitle; 
+
+	SComponent(Etype Type, int Subtype, int Val);
+	//SComponent(const & SComponent r);
+	SDL_Surface * getImg();
+	
+	void clickRight (tribool down);
+	void activate();
+	void deactivate();
+};
+
 class CPlayerInterface : public CGameInterface
 {
 public:
@@ -121,7 +164,8 @@ public:
 	void handleEvent(SDL_Event * sEvent);
 	void init(CCallback * CB);
 	int3 repairScreenPos(int3 pos);
-	void showInfoDialog(std::string text, std::vector<SComponent*> components);
+	void showInfoDialog(std::string text, std::vector<SComponent*> & components);
+	void removeObjToBlit(CSimpleWindow* obj);
 
 	CPlayerInterface(int Player, int serial);
 };

BIN
CPreGame.cpp


+ 2 - 2
CPreGame.h

@@ -91,13 +91,13 @@ public:
 		: Button(Pos,Fun,Imgs,Sel,gr),key(My){ourPoinGroup=gr;};
 	void select(bool on=true) {(*this).Button::select(on);ourPoinGroup->setYour(this);CPG->printRating();}
 };
-template <class T=ttt> class CPoinGroup :public CGroup<T>
+template <class T> class CPoinGroup :public CGroup<T>
 {
 public:
 	int * gdzie; //where (po polsku, bo by by³o s³owo kluczowe :/)
 	void setYour(IntSelBut<T> * your){*gdzie=your->key;};
 };
-template <class T=ttt> class CGroup
+template <class T> class CGroup
 {
 public:
 	Button<T> * selected;

+ 1 - 0
hch/CHeroHandler.cpp

@@ -40,6 +40,7 @@ void CHeroHandler::loadPortraits()
 	}
 	of.close();
 	pskillsb = CGI->spriteh->giveDef("PSKILL.DEF");
+	resources = CGI->spriteh->giveDef("RESOUR82.DEF");
 
 	std::string  strs = CGI->bitmaph->getTextFile("PRISKILL.TXT");
 	int itr=0;

+ 2 - 2
hch/CHeroHandler.h

@@ -69,7 +69,7 @@ public:
 	unsigned int getTileCost(EterrainType & ttype, Eroad & rdtype, Eriver & rvtype);
 	unsigned int getLowestCreatureSpeed();
 	unsigned int getAdditiveMoveBonus();
-	unsigned float getMultiplicativeMoveBonus();
+	float getMultiplicativeMoveBonus();
 	static int3 convertPosition(int3 src, bool toh3m); //toh3m=true: manifest->h3m; toh3m=false: h3m->manifest
 	int3 getPosition(bool h3m) const; //h3m=true - returns position of hero object; h3m=false - returns position of hero 'manifestation'
 	int getSightDistance() const; //returns sight distance of this hero
@@ -89,7 +89,7 @@ public:
 	std::vector<CHero*> heroes; //by³o nodrze
 	std::vector<CHeroClass *> heroClasses;
 	std::vector<CDefHandler *> flags1, flags2, flags3, flags4; //flags blitted on heroes when ,
-	CDefHandler * pskillsb; //82x93
+	CDefHandler * pskillsb, *resources; //82x93
 	std::vector<std::string> pskillsn;
 	unsigned int level(unsigned int experience);
 	void loadHeroes();

+ 0 - 1
hch/CLodHandler.cpp

@@ -6,7 +6,6 @@
 #include <cctype>
 #include <cstring>
 #include "boost/filesystem.hpp"   // includes all needed Boost.Filesystem declarations
-
 int readNormalNr (int pos, int bytCon, unsigned char * str)
 {
 	int ret=0;

+ 7 - 2
hch/CObjectHandler.cpp

@@ -8,6 +8,7 @@
 #include "CDefObjInfoHandler.h"
 #include "../CLua.h"
 #include "CHeroHandler.h"
+#include <boost/algorithm/string/replace.hpp>
 void CObjectHandler::loadObjects()
 {
 	int ID=0;
@@ -28,6 +29,8 @@ void CObjectHandler::loadObjects()
 	while (it<buf.length()-1)
 	{
 		CGeneralTextHandler::loadToIt(temp,buf,it,3);
+		temp = temp.substr(1,temp.length()-2);
+		boost::algorithm::replace_all(temp,"\"\"","\"");
 		advobtxt.push_back(temp);
 	}
 
@@ -122,9 +125,9 @@ bool CGObjectInstance::visitableAt(int x, int y) const //returns true if ibject
 }
 bool CGObjectInstance::operator<(const CGObjectInstance & cmp) const  //screen printing priority comparing
 {
-	if(defInfo->printPriority==1 && defInfo->printPriority==0)
+	if(defInfo->printPriority==1 && cmp.defInfo->printPriority==0)
 		return true;
-	if(defInfo->printPriority==1 && defInfo->printPriority==0)
+	if(cmp.defInfo->printPriority==1 && defInfo->printPriority==0)
 		return false;
 	if(this->pos.y<cmp.pos.y)
 		return true;
@@ -277,6 +280,7 @@ CGObjectInstance::CGObjectInstance(const CGObjectInstance & right)
 	defInfo = right.defInfo;
 	info = right.info;
 	defObjInfoNumber = right.defObjInfoNumber;
+	blockVisit = false;
 	//state = new CLuaObjectScript(right.state->);
 	//*state = *right.state;
 	//state = right.state;
@@ -291,6 +295,7 @@ CGObjectInstance& CGObjectInstance::operator=(const CGObjectInstance & right)
 	defInfo = right.defInfo;
 	info = right.info;
 	defObjInfoNumber = right.defObjInfoNumber;
+	blockVisit = right.blockVisit;
 	//state = new CLuaObjectScript();
 	//*state = *right.state;
 	tempOwner = right.tempOwner;

+ 2 - 1
hch/CObjectHandler.h

@@ -367,6 +367,7 @@ public:
 	int defObjInfoNumber;
 
 	int tempOwner; //uzywane dla szybkosci, skrypt ma obowiazek aktualizowac te zmienna
+	bool blockVisit;
 	
 	virtual bool isHero() const;
 	int getOwner() const; 
@@ -405,7 +406,7 @@ public:
 	unsigned int getTileCost(EterrainType & ttype, Eroad & rdtype, Eriver & rvtype);
 	unsigned int getLowestCreatureSpeed();
 	unsigned int getAdditiveMoveBonus();
-	unsigned float getMultiplicativeMoveBonus();
+	float getMultiplicativeMoveBonus();
 	static int3 convertPosition(int3 src, bool toh3m); //toh3m=true: manifest->h3m; toh3m=false: h3m->manifest
 	int3 getPosition(bool h3m) const; //h3m=true - returns position of hero object; h3m=false - returns position of hero 'manifestation'
 	int getSightDistance() const; //returns sight distance of this hero

+ 2 - 2
map.h

@@ -1,6 +1,6 @@
 #ifndef MAPD_H
 #define MAPD_H
-
+#pragma warning (disable : 4482) 
 #include <string>
 #include <vector>
 #include "global.h"
@@ -174,7 +174,7 @@ public:
 struct Mapa
 {
 	Eformat version; // version of map Eformat
-	bool twoLevel; // if map has underground level
+	int twoLevel; // if map has underground level
 	int difficulty; // 0 easy - 4 impossible
 	int levelLimit;
 	bool areAnyPLayers; // if there are any playable players on map

+ 1 - 0
mapHandler.cpp

@@ -1524,6 +1524,7 @@ std::string CMapHandler::getDefName(int id, int subid)
 		if(CGI->dobjinfo->objs[i].type==id && CGI->dobjinfo->objs[i].subtype==subid)
 			return CGI->dobjinfo->objs[i].defName;
 	}
+	throw new std::exception("Def not found.");
 }
 
 bool CMapHandler::printObject(CGObjectInstance *obj)