浏览代码

-rewrote GarrisonInt with use of object capturing
- BitmapHandler can now load images from any format supported by SDL_Image
note: file can have any possible format but extension should be .bmp or .pcx
- fixed some warnings

Ivan Savenko 15 年之前
父节点
当前提交
4d171bd53c

+ 30 - 25
client/CBitmapHandler.cpp

@@ -140,6 +140,14 @@ SDL_Surface * CPCXConv::getSurface() const
 	return ret;
 }
 
+bool isPCX(const unsigned char *header)//check whether file can be PCX according to 1st 12 bytes
+{
+	int fSize  = readNormalNr(header, 0);
+	int width  = readNormalNr(header, 4);
+	int height = readNormalNr(header, 8);
+	return fSize == width*height || fSize == width*height*3;
+}
+
 SDL_Surface * BitmapHandler::loadBitmap(std::string fname, bool setKey)
 {
 	if(!fname.size())
@@ -153,47 +161,44 @@ SDL_Surface * BitmapHandler::loadBitmap(std::string fname, bool setKey)
 	Entry *e = bitmaph->entries.znajdz(fname);
 	if(!e)
 	{
-		tlog2<<"File "<<fname<<" not found"<<std::endl;
+		tlog2<<"Entry for file "<<fname<<" was not found"<<std::endl;
 		return NULL;
 	}
-	if(e->offset<0)
+	if(e->offset<0)//not in LOD
 	{
 		fname = e->realName;
 		fname = DATA_DIR "/Data/" + fname;
 		FILE * f = fopen(fname.c_str(),"r");
-		char sign[3];
-		f = fopen(fname.c_str(),"r");
+		unsigned char sign[12];
 		if(!f)
 		{
-			tlog1 << "Cannot open " << fname << " - not present as bmp nor as pcx.\n";
+			tlog1 << "Cannot open " << fname << " - file not found!\n";
 			return NULL; 
 		}
-		fread(sign,1,3,f);
-		if(sign[0]=='B' && sign[1]=='M') //BMP named as PCX - people (eg. Kulex) sometimes use such files
+		fread(sign,1,12,f);
+		SDL_Surface * ret=NULL;
+		if (isPCX(sign))//H3-style PCX
 		{
+			CPCXConv cp;
+			pcx = new unsigned char[e->realSize];
+			memcpy(pcx,sign,3);
+			int res = fread((char*)pcx+3, 1, e->realSize-3, f); //TODO use me
 			fclose(f);
-			return SDL_LoadBMP(fname.c_str());
+			cp.openPCX((char*)pcx,e->realSize);
+			ret = cp.getSurface();
+			if (!ret)
+				tlog1<<"Failed to open "<<fname<<" as H3 PCX!\n";
 		}
-		else //PCX - but we don't know which
+		else //try loading via SDL_Image
 		{
-			if((sign[0]==10) && (sign[1]<6) && (sign[2]==1)) //ZSoft PCX
-			{
-				fclose(f);
-				return IMG_Load(fname.c_str());
-			}
-			else //H3-style PCX
-			{
-				CPCXConv cp;
-				pcx = new unsigned char[e->realSize];
-				memcpy(pcx,sign,3);
-				int res = fread((char*)pcx+3, 1, e->realSize-3, f); //TODO use me
-				fclose(f);
-				cp.openPCX((char*)pcx,e->realSize);
-				return cp.getSurface();
-			}
+			fclose(f);
+			ret = IMG_Load(fname.c_str());
+			if (!ret)
+				tlog1<<"Failed to open "<<fname<<" via SDL_Image\n";
 		}
+		return ret;
 	}
-
+	//loading from LOD
 	pcx = bitmaph->giveFile(e->nameStr, NULL);
 
 	CPCXConv cp;

+ 1 - 1
client/CCastleInterface.cpp

@@ -435,7 +435,7 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, int listPos)
 	exit->assignedKeys.insert(SDLK_ESCAPE);
 	split = new AdventureMapButton(CGI->generaltexth->tcommands[3],"",boost::bind(&CGarrisonInt::splitClick,garr),pos.x+744,pos.y+382,"TSBTNS.DEF");
 	split->callback += boost::bind(&CCastleInterface::splitClicked,this);
-	garr->splitButtons.push_back(split);
+	garr->addSplitBtn(split);
 	statusbar = new CStatusBar(pos.x+7,pos.y+555,"TSTATBAR.bmp",732);
 	resdatabar = new CResDataBar("ZRESBAR.bmp",pos.x+3,pos.y+575,32,2,85,85);
 

+ 4 - 0
client/CConfigHandler.cpp

@@ -2,7 +2,11 @@
 #include "CConfigHandler.h"
 #include <boost/bind.hpp>
 #include <boost/function.hpp>
+#if BOOST_VERSION >= 103800
+#include <boost/spirit/include/classic.hpp>
+#else
 #include <boost/spirit.hpp>
+#endif
 #include <fstream>
 using namespace config;
 using namespace boost::spirit;

+ 1 - 2
client/CHeroWindow.cpp

@@ -239,11 +239,10 @@ void CHeroWindow::setHero(const CGHeroInstance *hero)
 
 	delete garr;
 	garr = new CGarrisonInt(pos.x+80, pos.y+493, 8, Point(), curBack, Point(16,486), curHero);
-	garr->update = false;
 
 	AdventureMapButton * split = new AdventureMapButton(CGI->generaltexth->allTexts[256], CGI->generaltexth->heroscrn[32], boost::bind(&CGarrisonInt::splitClick,garr), pos.x+604, pos.y+527, "hsbtns9.def", false, NULL, false); //deleted by garrison destructor
 	boost::algorithm::replace_first(split->hoverTexts[0],"%s",CGI->generaltexth->allTexts[43]);
-	garr->splitButtons.push_back(split);
+	garr->addSplitBtn(split);
 
 	//primary skills support
 	for(size_t g=0; g<primSkillAreas.size(); ++g)

+ 0 - 1
client/CKingdomInterface.cpp

@@ -517,7 +517,6 @@ void CKingdomInterface::CTownItem::setTown(const CGTownInstance * newTown)
 		garr = NULL;
 	}
 	garr = new CGarrisonInt(pos.x+313,pos.y+3,4,Point(232,0),parent->slots->ourImages[parent->PicCount+2].bitmap,Point(313,2),town,town->visitingHero,true,true, true);
-	garr->update = true;
 
 	garrHero->hero = town->garrisonHero;
 	visitHero->hero = town->visitingHero;

+ 6 - 2
client/CSpellWindow.cpp

@@ -530,6 +530,7 @@ void CSpellWindow::keyPressed(const SDL_KeyboardEvent & key)
 			break;
 		case SDLK_UP:
 		case SDLK_DOWN:
+		{
 			bool down = key.keysym.sym == SDLK_DOWN;
 			static const int schoolsOrder[] = {0, 3, 1, 2, 4};
 			int index = -1;
@@ -540,6 +541,9 @@ void CSpellWindow::keyPressed(const SDL_KeyboardEvent & key)
 				selectSchool(schoolsOrder[index]);
 			break;
 		}
+		default://to get rid of warnings
+			break;
+		}
 
 		//alt + 1234567890-= casts spell from 1 - 12 slot
 		if(LOCPLINT->altPressed())
@@ -602,8 +606,8 @@ void CSpellWindow::SpellArea::clickLeft(tribool down, bool previousState)
 		}
 
 		//battle spell on adv map or adventure map spell during combat => display infowindow, not cast
-		if(sp->combatSpell && !owner->myInt->battleInt
-			|| !sp->combatSpell && owner->myInt->battleInt)
+		if((sp->combatSpell && !owner->myInt->battleInt)
+			|| (!sp->combatSpell && owner->myInt->battleInt))
 		{
 			std::vector<SComponent*> hlp(1, new SComponent(SComponent::spell, mySpell, 0));
 			LOCPLINT->showInfoDialog(sp->descriptions[schoolLevel], hlp);

+ 1 - 1
client/GUIBase.h

@@ -472,7 +472,7 @@ public:
 
 	CPicture(const Rect &r, const SDL_Color &color, bool screenFormat = false); //rect filled with given color
 	CPicture(const Rect &r, ui32 color, bool screenFormat = false); //rect filled with given color
-	CPicture(SDL_Surface *BG, int x, int y, bool Free = true); //wrap existing SDL_Surface
+	CPicture(SDL_Surface *BG, int x=0, int y=0, bool Free = true); //wrap existing SDL_Surface
 	CPicture(const std::string &bmpname, int x=0, int y=0);
 	CPicture(SDL_Surface *BG, const Rect &SrcRext, int x = 0, int y = 0, bool free = false); //wrap subrect of given surface
 	void init();

+ 75 - 206
client/GUIClasses.cpp

@@ -167,11 +167,6 @@ void CGarrisonSlot::clickRight(tribool down, bool previousState)
 }
 void CGarrisonSlot::clickLeft(tribool down, bool previousState)
 {
-	if(owner->ignoreEvent)
-	{
-		owner->ignoreEvent = false;
-		return;
-	}
 	if(down)
 	{
 		bool refr = false;
@@ -308,8 +303,8 @@ CGarrisonSlot::CGarrisonSlot(CGarrisonInt *Owner, int x, int y, int IID, int Upg
 	myStack = Creature;
 	creature = Creature ? Creature->type : NULL;
 	count = Creature ? Creature->count : 0;
-	pos.x = x;
-	pos.y = y;
+	pos.x += x;
+	pos.y += y;
 	if(Owner->smallIcons)
 	{
 		pos.w = 32;
@@ -355,102 +350,42 @@ void CGarrisonSlot::show(SDL_Surface * to)
 	}
 }
 CGarrisonInt::~CGarrisonInt()
-{
-	if(sup)
-	{
-		for(size_t i=0;i<sup->size();i++)
-		{
-			delete (*sup)[i];
-		}
-		delete sup;
-	}
-	if(sdown)
-	{
-		for(size_t i=0;i<sdown->size();i++)
-		{
-			delete (*sdown)[i]; //XXX what about smartpointers? boost or auto_ptr from std
-		}
-		delete sdown;
-	}
-
+{/*
 	for(size_t i = 0; i<splitButtons.size(); i++)
-		delete splitButtons[i];
+		delete splitButtons[i];*/
 }
 
-void CGarrisonInt::show(SDL_Surface * to)
-{
-	if(sup)
-	{
-		for(size_t i = 0; i<sup->size(); i++)
-		{
-			if((*sup)[i])
-			{
-				(*sup)[i]->show(to);
-			}
-		}
-	}
-	if(sdown)
-	{
-		for(size_t i = 0; i<sdown->size(); i++)
-		{
-			if((*sdown)[i])
-			{
-				(*sdown)[i]->show(to);
-			}
-		}
-	}
-
-	for(size_t i = 0; i<splitButtons.size(); i++)
-		splitButtons[i]->show(to);
-}
-void CGarrisonInt::deactiveteSlots()
+void CGarrisonInt::addSplitBtn(AdventureMapButton * button)
 {
-	if(sup)
-	{
-		for(int i = 0; i<sup->size(); i++)
-		{
-			if((*sup)[i])
-			{
-				(*sup)[i]->deactivate();
-			}
-		}
-	}
-	if(sdown)
-	{
-		for(int i = 0; i<sdown->size(); i++)
-		{
-			if((*sdown)[i])
-			{
-				(*sdown)[i]->deactivate();
-			}
-		}
-	}
+	addChild(button);
+	button->recActions = defActions;
+	splitButtons.push_back(button);
 }
-void CGarrisonInt::activeteSlots()
+
+void CGarrisonInt::createSet(std::vector<CGarrisonSlot*> &ret, const CCreatureSet * set, int posX, int posY, int distance, int Upg )
 {
-	if(sup)
+	ret.resize(7);
+	
+	for(TSlots::const_iterator i=set->Slots().begin(); i!=set->Slots().end(); i++)
 	{
-		for(int i = 0; i<sup->size(); i++)
-		{
-			if((*sup)[i])
-			{
-				(*sup)[i]->activate();
-			}
-		}
+		ret[i->first] = new CGarrisonSlot(this, posX + (i->first*distance), posY, i->first, Upg, &i->second);
 	}
-	if(sdown)
-	{
-		for(int i = 0; i<sdown->size(); i++)
+
+	for(int i=0; i<ret.size(); i++)
+		if(!ret[i])
+			ret[i] = new CGarrisonSlot(this, posX + (i*distance), posY,i,Upg,NULL);
+
+	if (twoRows)
+		for (int i=4; i<ret.size(); i++)
 		{
-			if((*sdown)[i])
-			{
-				(*sdown)[i]->activate();
-			}
-		}
-	}
+			ret[i]->pos.x -= 126;
+			ret[i]->pos.y += 37;
+		};
 }
+
 void CGarrisonInt::createSlots()
 {
+	OBJ_CONSTRUCTION_CAPTURING_ALL;
 	int h, w; //height and width of slot
 	if(smallIcons)
 	{
@@ -463,90 +398,46 @@ void CGarrisonInt::createSlots()
 	}
 
 	if(set1)
-	{
-		sup = new std::vector<CGarrisonSlot*>(7,(CGarrisonSlot *)(NULL));
-		for(TSlots::const_iterator i=set1->Slots().begin(); i!=set1->Slots().end(); i++)
-			(*sup)[i->first] =	new CGarrisonSlot(this, pos.x + (i->first*(w+interx)), pos.y, i->first, 0, &i->second);
-
-		for(int i=0; i<sup->size(); i++)
-			if((*sup)[i] == NULL)
-				(*sup)[i] = new CGarrisonSlot(this, pos.x + (i*(w+interx)), pos.y,i,0,NULL);
+		createSet(slotsUp, set1, 0, 0, w+interx, 0);
 
-		if (twoRows)
-			for (int i=4; i<sup->size(); i++)
-			{
-				(*sup)[i]->pos.x -= 126;
-				(*sup)[i]->pos.y += 37;
-			};
-	}
 	if(set2)
-	{
-		sdown = new std::vector<CGarrisonSlot*>(7,(CGarrisonSlot *)(NULL));
-		for(TSlots::const_iterator i=set2->Slots().begin(); i!=set2->Slots().end(); i++)
-		{
-			(*sdown)[i->first] =
-				new CGarrisonSlot(this, pos.x + (i->first*(w+interx)) + garOffset.x, pos.y + garOffset.y,i->first,1, &i->second);
-		}
-		for(int i=0; i<sdown->size(); i++)
-			if((*sdown)[i] == NULL)
-				(*sdown)[i] = new CGarrisonSlot(this, pos.x + (i*(w+interx)) + garOffset.x,	pos.y + garOffset.y,i,1, NULL);
-		
-		if (twoRows)
-			for (int i=4; i<sup->size(); i++)
-			{
-				(*sup)[i]->pos.x -= 126;
-				(*sup)[i]->pos.y += 37;
-			};
-	}
+		createSet (slotsDown, set2, garOffset.x, garOffset.y, w+interx, 1);
 }
+
 void CGarrisonInt::deleteSlots()
 {
-	if(sup)
-	{
-		for(int i = 0; i<sup->size(); i++)
-		{
-			if((*sup)[i])
-			{
-				delete (*sup)[i];
-			}
-		}
-		delete sup;
-		sup = NULL;
-	}
-	if(sdown)
-	{
-		for(int i = 0; i<sdown->size(); i++)
-		{
-			if((*sdown)[i])
-			{
-				delete (*sdown)[i];
-			}
-		}
-		delete sdown;
-		sdown = NULL;
-	}
+	for (int i=0; i<slotsUp.size(); i++)
+		delChildNUll(slotsUp[i]);
+		
+	for (int i=0; i<slotsDown.size(); i++)
+		delChildNUll(slotsDown[i]);
 }
+
 void CGarrisonInt::recreateSlots()
 {
+
 	splitting = false;
 	highlighted = NULL;
 
 	for(size_t i = 0; i<splitButtons.size(); i++)
 		splitButtons[i]->block(true);
 
+	bool wasActive = active;
 	if(active)
 	{
-		deactiveteSlots();
+		deactivate();
 	}
+	
 	deleteSlots();
 	createSlots();
-	if(active)
+	
+	if(wasActive)
 	{
-		//ignoreEvent = true;
-		activeteSlots();
-		//show(screen2);
+		activate();
+		showAll(screen2);
 	}
 }
+
 void CGarrisonInt::splitClick()
 {
 	if(!highlighted)
@@ -564,23 +455,20 @@ void CGarrisonInt::splitStacks(int am2)
 		am2);
 
 }
-CGarrisonInt::CGarrisonInt(int x, int y, int inx, const Point &garsOffset, SDL_Surface *&pomsur, const Point& SurOffset, 
-						   const CArmedInstance *s1, const CArmedInstance *s2, bool _removableUnits, bool smallImgs, bool _twoRows )
-	 :interx(inx),garOffset(garsOffset),highlighted(NULL),sur(pomsur),surOffset(SurOffset),sup(NULL),
-	 sdown(NULL),oup(s1),odown(s2), smallIcons(smallImgs), twoRows(_twoRows)
+CGarrisonInt::CGarrisonInt(int x, int y, int inx, const Point &garsOffset, 
+                            SDL_Surface *&pomsur, const Point& SurOffset, 
+                            const CArmedInstance *s1, const CArmedInstance *s2, 
+                            bool _removableUnits, bool smallImgs, bool _twoRows )
+
+	:interx(inx), garOffset(garsOffset), surOffset(SurOffset), highlighted(NULL), sur(pomsur), splitting(false),
+	 smallIcons(smallImgs), removableUnits (_removableUnits), twoRows(_twoRows), oup(s1), odown(s2)
 {
 	ourUp =  s1?s1->tempOwner == LOCPLINT->playerID:false;
 	ourDown = s2?s2->tempOwner == LOCPLINT->playerID:false;
-	active = false;
-	splitting = false;
 	set1 = LOCPLINT->cb->getGarrison(s1);
 	set2 = LOCPLINT->cb->getGarrison(s2);
-	ignoreEvent = false;
-	update = true;
-	pos.x=(x);
-	pos.y=(y);
-	pos.w=(58);
-	pos.h=(64);
+	pos.x += x;
+	pos.y += y;
 	createSlots();
 }
 
@@ -590,29 +478,7 @@ void CGarrisonInt::activate()
 		if(splitButtons[i]->blocked != !highlighted)
 			splitButtons[i]->block(!highlighted);
 
-	active = true;
-	if(sup)
-	{
-		for(int i = 0; i<sup->size(); i++)
-			if((*sup)[i])
-				(*sup)[i]->activate();
-	}
-	if(sdown)
-	{
-		for(int i = 0; i<sdown->size(); i++)
-			if((*sdown)[i])
-				(*sdown)[i]->activate();
-	}
-
-	for(size_t i = 0; i<splitButtons.size(); i++)
-		splitButtons[i]->activate();
-}
-void CGarrisonInt::deactivate()
-{
-	active = false;
-	deactiveteSlots();
-	for(size_t i = 0; i<splitButtons.size(); i++)
-		splitButtons[i]->deactivate();
+	CIntObject::activate();
 }
 
 CInfoWindow::CInfoWindow(std::string Text, int player, const std::vector<SComponent*> &comps, std::vector<std::pair<std::string,CFunctionList<void()> > > &Buttons, bool delComps)
@@ -864,6 +730,12 @@ void SComponent::init(Etype Type, int Subtype, int Val)
 		subtitle += CGI->generaltexth->levels[Val-1] + " " + CGI->generaltexth->skillName[Subtype];
 		description = CGI->generaltexth->skillInfoTexts[Subtype][Val-1];
 		break;
+	case morale:
+		description = CGI->generaltexth->heroscrn[ 4 - (val>0) + (val<0)];
+		break;
+	case luck:
+		description = CGI->generaltexth->heroscrn[ 7 - (val>0) + (val<0)];
+		break;
 	case resource:
 		description = CGI->generaltexth->allTexts[242];
 		oss << Val;
@@ -1948,7 +1820,7 @@ void CRecruitmentWindow::show(SDL_Surface * to)
 }
 
 CRecruitmentWindow::CRecruitmentWindow(const CGDwelling *Dwelling, int Level, const CArmedInstance *Dst, const boost::function<void(int,int)> &Recruit, int y_offset)
-:recruit(Recruit), dwelling(Dwelling), dst(Dst), level(Level)
+:recruit(Recruit), dwelling(Dwelling), level(Level), dst(Dst)
 {
 	which = 0;
 	SDL_Surface *hhlp = BitmapHandler::loadBitmap("TPRCRT.bmp");
@@ -2203,7 +2075,6 @@ void CSplitWindow::clickLeft(tribool down, bool previousState)
 
 void CCreInfoWindow::show(SDL_Surface * to)
 {
-	char pom[15];
 	blitAt(*bitmap,pos.x,pos.y,to);
 	anim->blitPic(to,pos.x+21,pos.y+48,(type) && !(anf%4));
 	if(++anf==4) 
@@ -2569,7 +2440,8 @@ CMinorResDataBar::~CMinorResDataBar()
 }
 
 CObjectListWindow::CObjectListWindow(const std::vector<int> &_items, CPicture * titlePic, std::string _title, std::string _descr,
-				boost::function<void(int)> Callback, int initState):items(_items), title(_title), descr(_descr),selected(initState)
+				boost::function<void(int)> Callback, int initState)
+				:title(_title), descr(_descr),items(_items),selected(initState)
 {
 	init = false;
 	OBJ_CONSTRUCTION_CAPTURING_ALL;
@@ -2896,7 +2768,7 @@ std::string CTradeWindow::CTradeableItem::getName(int number /*= -1*/) const
 }
 
 CTradeWindow::CTradeWindow(const IMarket *Market, const CGHeroInstance *Hero, EMarketMode Mode)
-	: market(Market), hero(Hero), hLeft(NULL), hRight(NULL), readyToTrade(false), arts(NULL)
+	: market(Market), hero(Hero),  arts(NULL), hLeft(NULL), hRight(NULL), readyToTrade(false)
 {
 	type = BLOCK_ADV_HOTKEYS;
 	mode = Mode;
@@ -4553,7 +4425,7 @@ CGarrisonWindow::CGarrisonWindow( const CArmedInstance *up, const CGHeroInstance
 	pos.h = screen->h;
 
 	garr = new CGarrisonInt(pos.x+92, pos.y+127, 4, Point(0,96), bg, Point(93,127), up, down, removableUnits);
-	garr->splitButtons.push_back(new AdventureMapButton(CGI->generaltexth->tcommands[3],"",boost::bind(&CGarrisonInt::splitClick,garr),pos.x+88,pos.y+314,"IDV6432.DEF"));
+	garr->addSplitBtn(new AdventureMapButton(CGI->generaltexth->tcommands[3],"",boost::bind(&CGarrisonInt::splitClick,garr),pos.x+88,pos.y+314,"IDV6432.DEF"));
 	quit = new AdventureMapButton(CGI->generaltexth->tcommands[8],"",boost::bind(&CGarrisonWindow::close,this),pos.x+399,pos.y+314,"IOK6432.DEF",SDLK_RETURN);
 }
 
@@ -5186,7 +5058,7 @@ void CArtifactsOfHero::eraseSlotData (CArtPlace* artPlace, int slotID)
 }
 
 CArtifactsOfHero::CArtifactsOfHero(const Point &position) :
-	backpackPos(0), updateState(false), commonInfo(NULL), curHero(NULL), allowedAssembling(true)
+	curHero(NULL), backpackPos(0), commonInfo(NULL), updateState(false), allowedAssembling(true)
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL;
 	pos += position;
@@ -5570,8 +5442,8 @@ CExchangeWindow::CExchangeWindow(si32 hero1, si32 hero2) : bg(NULL)
 	//garrison interface
 	garr = new CGarrisonInt(pos.x + 69, pos.y + 131, 4, Point(418,0), bg, Point(69,131), heroInst[0],heroInst[1], true, true);
 
-	garr->splitButtons.push_back(new AdventureMapButton(CGI->generaltexth->tcommands[3],"",boost::bind(&CGarrisonInt::splitClick,garr),pos.x+10,pos.y+132,"TSBTNS.DEF"));
-	garr->splitButtons.push_back(new AdventureMapButton(CGI->generaltexth->tcommands[3],"",boost::bind(&CGarrisonInt::splitClick,garr),pos.x+740,pos.y+132,"TSBTNS.DEF"));
+	garr->addSplitBtn(new AdventureMapButton(CGI->generaltexth->tcommands[3],"",boost::bind(&CGarrisonInt::splitClick,garr),pos.x+10,pos.y+132,"TSBTNS.DEF"));
+	garr->addSplitBtn(new AdventureMapButton(CGI->generaltexth->tcommands[3],"",boost::bind(&CGarrisonInt::splitClick,garr),pos.x+740,pos.y+132,"TSBTNS.DEF"));
 }
 
 CExchangeWindow::~CExchangeWindow() //d-tor
@@ -5844,7 +5716,7 @@ void CTransformerWindow::CItem::clickLeft(tribool down, bool previousState)
 }
 
 CTransformerWindow::CItem::CItem(CTransformerWindow * _parent, int _size, int _id):
-	parent(_parent), id(_id), size(_size)
+	id(_id), size(_size), parent(_parent)
 {
 	used = LCLICK;
 	left = true;
@@ -5981,8 +5853,8 @@ void CUniversityWindow::CItem::showAll(SDL_Surface * to)
 	CPicture::showAll(to);
 }
 
-CUniversityWindow::CItem::CItem(CUniversityWindow * _parent, int _ID, int X, int Y):ID(_ID), parent(_parent),
-	CPicture (graphics->abils44->ourImages[_ID*3+3].bitmap,X,Y,false)
+CUniversityWindow::CItem::CItem(CUniversityWindow * _parent, int _ID, int X, int Y):
+	CPicture (graphics->abils44->ourImages[_ID*3+3].bitmap,X,Y,false),ID(_ID), parent(_parent)
 {
 	used = LCLICK | RCLICK | HOVER;
 }
@@ -6080,9 +5952,8 @@ void CUnivConfirmWindow::makeDeal(int skill)
 }
 
 CHillFortWindow::CHillFortWindow(const CGHeroInstance *visitor, const CGObjectInstance *object):
-	hero(visitor), fort(object)
+	fort(object),hero(visitor)
 {
-	{
 	OBJ_CONSTRUCTION_CAPTURING_ALL;
 	
 	slotsCount=7;
@@ -6108,9 +5979,7 @@ CHillFortWindow::CHillFortWindow(const CGHeroInstance *visitor, const CGObjectIn
 	upgradeAll = new AdventureMapButton(CGI->generaltexth->allTexts[432],"",boost::bind(&CHillFortWindow::makeDeal, this, slotsCount), 30, 231, getDefForSlot(slotsCount));
 	quit = new AdventureMapButton("","",boost::bind(&CGuiHandler::popIntTotally, &GH, this), 294, 275, "IOKAY.DEF", SDLK_RETURN);
 	bar = new CGStatusBar(327, 332);
-	
-	}
-	BLOCK_CAPTURING;
+
 	garr = new CGarrisonInt(pos.x+108, pos.y+60, 18, Point(),bg->bg,Point(108,60),hero,NULL);
 	updateGarrisons();
 }
@@ -6552,7 +6421,7 @@ void CLabel::showAll(SDL_Surface * to)
 }
 
 CLabel::CLabel(int x, int y, EFonts Font /*= FONT_SMALL*/, EAlignment Align, const SDL_Color &Color /*= zwykly*/, const std::string &Text /*= ""*/)
-:font(Font), color(Color), text(Text), alignment(Align)
+:alignment(Align), font(Font), color(Color), text(Text)
 {
 	autoRedraw = true;
 	pos.x += x;
@@ -6574,7 +6443,7 @@ void CLabel::setTxt(const std::string &Txt)
 }
 
 CTextBox::CTextBox(std::string Text, const Rect &rect, int SliderStyle, EFonts Font /*= FONT_SMALL*/, EAlignment Align /*= TOPLEFT*/, const SDL_Color &Color /*= zwykly*/)
-	:CLabel(rect.x, rect.y, Font, Align, Color, Text), slider(NULL), sliderStyle(SliderStyle)
+	:CLabel(rect.x, rect.y, Font, Align, Color, Text), sliderStyle(SliderStyle), slider(NULL)
 {
 	redrawParentOnScrolling = false;
 	autoRedraw = false;

+ 7 - 8
client/GUIClasses.h

@@ -222,14 +222,14 @@ class CGarrisonInt :public CIntObject
 public:
 	int interx; //space between slots
 	Point garOffset, //offset between garrisons (not used if only one hero)
-		surOffset; //offset between garrison position on the bg surface and position on the screen
+	      surOffset; //offset between garrison position on the bg surface and position on the screen
 	CGarrisonSlot *highlighted; //chosen slot
 	std::vector<AdventureMapButton *> splitButtons; //may be empty if no buttons
 
 	SDL_Surface *&sur; //bg surface
 	int p2, //TODO: comment me
 	    shiftPos;//1st slot of the second row, set shiftPoint for effect
-	bool ignoreEvent, update, active, splitting, pb, 
+	bool splitting, pb, 
 	     smallIcons, //true - 32x32 imgs, false - 58x64
 	     removableUnits,//player can remove units from up
 	     twoRows,//slots will be placed in 2 rows
@@ -238,16 +238,15 @@ public:
 	const CCreatureSet *set1; //top set of creatures
 	const CCreatureSet *set2; //bottom set of creatures
 
-	std::vector<CGarrisonSlot*> *sup, *sdown; //slots of upper and lower garrison
+	std::vector<CGarrisonSlot*> slotsUp, slotsDown; //slots of upper and lower garrison
 	const CArmedInstance *oup, *odown; //upper and lower garrisons (heroes or towns)
 
+	void addSplitBtn(AdventureMapButton * button);
+	void createSet(std::vector<CGarrisonSlot*> &ret, const CCreatureSet * set, int posX, int distance, int posY, int Upg );
+	
 	void activate();
-	void deactivate();
-	void show(SDL_Surface * to);
-	void activeteSlots();
-	void deactiveteSlots();
-	void deleteSlots();
 	void createSlots();
+	void deleteSlots();
 	void recreateSlots();
 
 	void splitClick(); //handles click on split button