浏览代码

* directional attack in battles
* CSystemOptionsWindow partially done
* added a few consts and references to improve performance

mateuszb 17 年之前
父节点
当前提交
6a3d0b666f

+ 2 - 2
AdventureMapButton.cpp

@@ -90,7 +90,7 @@ void AdventureMapButton::activate()
 	KeyInterested::activate();
 }
 
-void AdventureMapButton::keyPressed (SDL_KeyboardEvent & key)
+void AdventureMapButton::keyPressed (const SDL_KeyboardEvent & key)
 {
 	//TODO: check if it's shortcut
 }
@@ -272,7 +272,7 @@ void CSlider::sliderClicked()
 	}
 }
 
-void CSlider::mouseMoved (SDL_MouseMotionEvent & sEvent)
+void CSlider::mouseMoved (const SDL_MouseMotionEvent & sEvent)
 {
 	float v = sEvent.x - pos.x - 24;
 	v/= (pos.w - 48);

+ 2 - 2
AdventureMapButton.h

@@ -17,7 +17,7 @@ public:
 	virtual void clickLeft (tribool down);
 	void hover (bool on);
 	void block(bool on); //if button is blocked then it'll change it's graphic to inactive (offset==2) and won't react on l-clicks
-	void keyPressed (SDL_KeyboardEvent & key);
+	void keyPressed (const SDL_KeyboardEvent & key);
 	void activate(); // makes button active
 	void deactivate(); // makes button inactive (but doesn't delete)
 
@@ -78,7 +78,7 @@ public:
 	void sliderClicked();
 	void moveLeft();
 	void clickLeft (tribool down);
-	void mouseMoved (SDL_MouseMotionEvent & sEvent);
+	void mouseMoved (const SDL_MouseMotionEvent & sEvent);
 	void moveRight();
 	void moveTo(int to);
 	void block(bool on);

+ 9 - 4
CAdvmapInterface.cpp

@@ -219,7 +219,7 @@ void CMinimap::hover (bool on)
 	else if (LOCPLINT->adventureInt->statusbar.current==statusbarTxt)
 		LOCPLINT->adventureInt->statusbar.clear();
 }
-void CMinimap::mouseMoved (SDL_MouseMotionEvent & sEvent)
+void CMinimap::mouseMoved (const SDL_MouseMotionEvent & sEvent)
 {
 	if (pressedL)
 	{
@@ -395,7 +395,7 @@ endchkpt:
 void CTerrainRect::clickRight(tribool down)
 {
 }
-void CTerrainRect::mouseMoved (SDL_MouseMotionEvent & sEvent)
+void CTerrainRect::mouseMoved (const SDL_MouseMotionEvent & sEvent)
 {
 	int3 pom=LOCPLINT->adventureInt->verifyPos(whichTileIsIt(sEvent.x,sEvent.y));
 	if (pom!=curHoveredTile)
@@ -438,7 +438,7 @@ void CTerrainRect::mouseMoved (SDL_MouseMotionEvent & sEvent)
 	}
 	CGI->curh->changeGraphic(0,0);
 }
-void CTerrainRect::keyPressed (SDL_KeyboardEvent & key){}
+void CTerrainRect::keyPressed (const SDL_KeyboardEvent & key){}
 void CTerrainRect::hover(bool on)
 {
 	if (!on)
@@ -698,7 +698,7 @@ void CTerrainRect::show()
 	}
 }
 
-int3 CTerrainRect::whichTileIsIt(int x, int y)
+int3 CTerrainRect::whichTileIsIt(const int & x, const int & y)
 {
 	int3 ret;
 	ret.x = LOCPLINT->adventureInt->position.x + ((LOCPLINT->current->motion.x-pos.x)/32);
@@ -1048,6 +1048,11 @@ void CAdvMapInt::fadventureOPtions()
 }
 void CAdvMapInt::fsystemOptions()
 {
+	LOCPLINT->curint->deactivate();
+
+	CSystemOptionsWindow * sysopWindow = new CSystemOptionsWindow(genRect(487, 481, 159, 57));
+	sysopWindow->activate();
+	LOCPLINT->objsToBlit.push_back(sysopWindow);
 }
 void CAdvMapInt::fnextHero()
 {

+ 4 - 4
CAdvmapInterface.h

@@ -34,7 +34,7 @@ public:
 	void clickRight (tribool down);
 	void clickLeft (tribool down);
 	void hover (bool on);
-	void mouseMoved (SDL_MouseMotionEvent & sEvent);
+	void mouseMoved (const SDL_MouseMotionEvent & sEvent);
 	void activate(); // makes button active
 	void deactivate(); // makes button inactive (but don't deletes)
 	void hideTile(int3 pos); //puts FoW
@@ -56,11 +56,11 @@ public:
 	void clickLeft(tribool down);
 	void clickRight(tribool down);
 	void hover(bool on);
-	void mouseMoved (SDL_MouseMotionEvent & sEvent);
-	void keyPressed (SDL_KeyboardEvent & key);
+	void mouseMoved (const SDL_MouseMotionEvent & sEvent);
+	void keyPressed (const SDL_KeyboardEvent & key);
 	void show();
 	void showPath();
-	int3 whichTileIsIt(int x, int y); //x,y are cursor position
+	int3 whichTileIsIt(const int & x, const int & y); //x,y are cursor position
 	int3 whichTileIsIt(); //uses current cursor pos
 };
 class CResDataBar

+ 127 - 39
CBattleInterface.cpp

@@ -248,6 +248,7 @@ void CBattleInterface::setPrintMouseShadow(bool set)
 
 void CBattleInterface::activate()
 {
+	MotionInterested::activate();
 	subInt = NULL;
 	bOptions->activate();
 	bSurrender->activate();
@@ -270,6 +271,7 @@ void CBattleInterface::activate()
 
 void CBattleInterface::deactivate()
 {
+	MotionInterested::deactivate();
 	bOptions->deactivate();
 	bSurrender->deactivate();
 	bFlee->deactivate();
@@ -461,6 +463,85 @@ void CBattleInterface::show(SDL_Surface * to)
 	}
 }
 
+void CBattleInterface::mouseMoved(const SDL_MouseMotionEvent &sEvent)
+{
+	if(activeStack>=0)
+	{
+		int myNumber = -1; //number of hovered tile
+		for(int g=0; g<187; ++g)
+		{
+			if(bfield[g].hovered && bfield[g].strictHovered)
+			{
+				myNumber = g;
+				break;
+			}
+		}
+		if(myNumber == -1)
+		{
+			CGI->curh->changeGraphic(1, 6);
+		}
+		else
+		{
+			if(std::find(shadedHexes.begin(),shadedHexes.end(),myNumber) == shadedHexes.end())
+			{
+				CStack *shere = LOCPLINT->cb->battleGetStackByPos(myNumber);
+				if(shere)
+				{
+					if(shere->owner == LOCPLINT->playerID) //our stack
+						CGI->curh->changeGraphic(1,5);
+					else if(LOCPLINT->cb->battleGetStackByID(activeStack)->creature->isShooting()) //we can shoot enemy
+						CGI->curh->changeGraphic(1,3);
+					else if(isTileAttackable(myNumber)) //available enemy (melee attackable)
+					{
+						int fromHex = -1;
+						for(int b=0; b<187; ++b)
+							if(bfield[b].hovered && !bfield[b].strictHovered)
+							{
+								fromHex = b;
+								break;
+							}
+						if(fromHex!=-1 && fromHex%17!=0 && fromHex%17!=16)
+						{
+							switch(BattleInfo::mutualPosition(fromHex, myNumber))
+							{
+							case 0:
+								CGI->curh->changeGraphic(1,12);
+								break;
+							case 1:
+								CGI->curh->changeGraphic(1,7);
+								break;
+							case 2:
+								CGI->curh->changeGraphic(1,8);
+								break;
+							case 3:
+								CGI->curh->changeGraphic(1,9);
+								break;
+							case 4:
+								CGI->curh->changeGraphic(1,10);
+								break;
+							case 5:
+								CGI->curh->changeGraphic(1,11);
+								break;
+							}
+						}
+					}
+					else //unavailable enemy
+						CGI->curh->changeGraphic(1,0);
+				}
+				else //empty unavailable tile
+					CGI->curh->changeGraphic(1,0);
+			}
+			else //available tile
+			{
+				if(LOCPLINT->cb->battleGetStackByID(activeStack)->creature->isFlying())
+					CGI->curh->changeGraphic(1,2);
+				else
+					CGI->curh->changeGraphic(1,1);
+			}
+		}
+	}
+}
+
 bool CBattleInterface::reverseCreature(int number, int hex, bool wideTrick)
 {
 	if(creAnims[number]==NULL)
@@ -518,7 +599,6 @@ void CBattleInterface::bSurrenderf()
 
 void CBattleInterface::bFleef()
 {
-	
 	CFunctionList<void()> ony = boost::bind(&CBattleInterface::activate,this);
 	ony += boost::bind(&CBattleInterface::reallyFlee,this);
 	LOCPLINT->showYesNoDialog(CGI->generaltexth->allTexts[28],std::vector<SComponent*>(), ony, boost::bind(&CBattleInterface::activate,this), true, false);
@@ -951,6 +1031,16 @@ void CBattleInterface::giveCommand(ui8 action, ui16 tile, ui32 stack, si32 addit
 	activeStack = -1;
 }
 
+bool CBattleInterface::isTileAttackable(int number)
+{
+	for(int b=0; b<shadedHexes.size(); ++b)
+	{
+		if(BattleInfo::mutualPosition(shadedHexes[b], number) != -1 || shadedHexes[b] == number)
+			return true;
+	}
+	return false;
+}
+
 void CBattleInterface::hexLclicked(int whichOne)
 {
 	if((whichOne%17)!=0 && (whichOne%17)!=16) //if player is trying to attack enemey unit or move creature stack
@@ -972,15 +1062,36 @@ void CBattleInterface::hexLclicked(int whichOne)
 		}
 		else if(dest->owner != attackingHeroInstance->tempOwner) //attacking
 		{
-			std::vector<int> n = BattleInfo::neighbouringTiles(whichOne);
-			for(int i=0;i<n.size();i++)
+			//std::vector<int> n = BattleInfo::neighbouringTiles(whichOne);
+			//for(int i=0;i<n.size();i++)
+			//{
+			//	//TODO: now we are using first available tile, but in the future we should add possibility of choosing from which tile we want to attack
+			//	if(vstd::contains(shadedHexes,n[i]))
+			//	{
+			//		giveCommand(6,n[i],activeStack,whichOne);
+			//		return;
+			//	}
+			//}
+			switch(CGI->curh->number)
 			{
-				//TODO: now we are using first available tile, but in the future we should add possibility of choosing from which tile we want to attack
-				if(vstd::contains(shadedHexes,n[i]))
-				{
-					giveCommand(6,n[i],activeStack,whichOne);
-					return;
-				}
+			case 12:
+				giveCommand(6,whichOne + ( (whichOne/17)%2 ? 17 : 18 ),activeStack,whichOne);
+				break;
+			case 7:
+				giveCommand(6,whichOne + ( (whichOne/17)%2 ? 16 : 17 ),activeStack,whichOne);
+				break;
+			case 8:
+				giveCommand(6,whichOne - 1,activeStack,whichOne);
+				break;
+			case 9:
+				giveCommand(6,whichOne - ( (whichOne/17)%2 ? 18 : 17 ),activeStack,whichOne);
+				break;
+			case 10:
+				giveCommand(6,whichOne - ( (whichOne/17)%2 ? 17 : 16 ),activeStack,whichOne);
+				break;
+			case 11:
+				giveCommand(6,whichOne + 1,activeStack,whichOne);
+				break;
 			}
 		}
 	}
@@ -1089,6 +1200,8 @@ float CBattleInterface::getAnimSpeedMultiplier() const
 		return 2.2f;
 	case 4:
 		return 1.0f;
+	default:
+		return 0.0f;
 	}
 }
 
@@ -1415,7 +1528,7 @@ void CBattleHero::clickLeft(boost::logic::tribool down)
 	}
 }
 
-CBattleHero::CBattleHero(std::string defName, int phaseG, int imageG, bool flipG, unsigned char player, const CGHeroInstance * hero): phase(phaseG), image(imageG), flip(flipG), flagAnim(0), myHero(hero)
+CBattleHero::CBattleHero(const std::string & defName, int phaseG, int imageG, bool flipG, unsigned char player, const CGHeroInstance * hero): phase(phaseG), image(imageG), flip(flipG), flagAnim(0), myHero(hero)
 {
 	dh = CDefHandler::giveDef( defName );
 	for(int i=0; i<dh->ourImages.size(); ++i) //transforming images
@@ -1508,7 +1621,7 @@ CBattleHex::CBattleHex() : myNumber(-1), accesible(true), hovered(false), strict
 {
 }
 
-void CBattleHex::mouseMoved(SDL_MouseMotionEvent &sEvent)
+void CBattleHex::mouseMoved(const SDL_MouseMotionEvent &sEvent)
 {
 	if(myInterface->cellShade)
 	{
@@ -1519,31 +1632,6 @@ void CBattleHex::mouseMoved(SDL_MouseMotionEvent &sEvent)
 		else //hovered pixel is inside hex
 		{
 			strictHovered = true;
-			if(myInterface->activeStack>=0)
-			{
-				if(std::find(myInterface->shadedHexes.begin(),myInterface->shadedHexes.end(),myNumber) == myInterface->shadedHexes.end())
-				{
-					CStack *shere = LOCPLINT->cb->battleGetStackByPos(myNumber);
-					if(shere)
-					{
-						if(shere->owner == LOCPLINT->playerID) //our stack
-							CGI->curh->changeGraphic(1,5);
-						else if(LOCPLINT->cb->battleGetStackByID(myInterface->activeStack)->creature->isShooting()) //we can shoot enemy
-							CGI->curh->changeGraphic(1,3);
-						else //unavailable enemy
-							CGI->curh->changeGraphic(1,0);
-					}
-					else //empty unavailable tile
-						CGI->curh->changeGraphic(1,0);
-				}
-				else //available tile
-				{
-					if(LOCPLINT->cb->battleGetStackByID(myInterface->activeStack)->creature->isFlying())
-						CGI->curh->changeGraphic(1,2);
-					else
-						CGI->curh->changeGraphic(1,1);
-				}
-			}
 		}
 	}
 
@@ -1555,7 +1643,7 @@ void CBattleHex::mouseMoved(SDL_MouseMotionEvent &sEvent)
 		{
 			char tabh[160];
 			CStack attackedStack = *LOCPLINT->cb->battleGetStackByPos(myNumber);
-			std::string attackedName = attackedStack.amount == 1 ? attackedStack.creature->nameSing : attackedStack.creature->namePl;
+			const std::string & attackedName = attackedStack.amount == 1 ? attackedStack.creature->nameSing : attackedStack.creature->namePl;
 			sprintf(tabh, CGI->generaltexth->allTexts[220].c_str(), attackedName.c_str());
 			myInterface->console->alterTxt = std::string(tabh);
 			setAlterText = true;
@@ -1632,7 +1720,7 @@ void CBattleConsole::show(SDL_Surface * to)
 	}
 }
 
-bool CBattleConsole::addText(std::string text)
+bool CBattleConsole::addText(const std::string & text)
 {
 	if(text.size()>70)
 		return false; //text too long!
@@ -1661,7 +1749,7 @@ void CBattleConsole::eraseText(unsigned int pos)
 	}
 }
 
-void CBattleConsole::changeTextAt(std::string text, unsigned int pos)
+void CBattleConsole::changeTextAt(const std::string & text, unsigned int pos)
 {
 	if(pos >= texts.size()) //no such pos
 		return;

+ 7 - 5
CBattleInterface.h

@@ -27,7 +27,7 @@ public:
 	void activate();
 	void deactivate();
 	void clickLeft(boost::logic::tribool down);
-	CBattleHero(std::string defName, int phaseG, int imageG, bool filpG, unsigned char player, const CGHeroInstance * hero); //c-tor
+	CBattleHero(const std::string & defName, int phaseG, int imageG, bool filpG, unsigned char player, const CGHeroInstance * hero); //c-tor
 	~CBattleHero(); //d-tor
 };
 
@@ -48,7 +48,7 @@ public:
 	void hover (bool on);
 	void activate();
 	void deactivate();
-	void mouseMoved (SDL_MouseMotionEvent & sEvent);
+	void mouseMoved (const SDL_MouseMotionEvent & sEvent);
 	void clickLeft(boost::logic::tribool down);
 	void clickRight(boost::logic::tribool down);
 	CBattleHex();
@@ -69,9 +69,9 @@ public:
 	CBattleConsole(); //c-tor
 	~CBattleConsole(); //d-tor
 	void show(SDL_Surface * to = 0);
-	bool addText(std::string text); //adds text at the last position; returns false if failed (e.g. text longer than 70 characters)
+	bool addText(const std::string & text); //adds text at the last position; returns false if failed (e.g. text longer than 70 characters)
 	void eraseText(unsigned int pos); //erases added text at position pos
-	void changeTextAt(std::string text, unsigned int pos); //if we have more than pos texts, pos-th is changed to given one
+	void changeTextAt(const std::string & text, unsigned int pos); //if we have more than pos texts, pos-th is changed to given one
 	void scrollUp(unsigned int by = 1); //scrolls console up by 'by' positions
 	void scrollDown(unsigned int by = 1); //scrolls console up by 'by' positions
 };
@@ -112,7 +112,7 @@ public:
 	void show(SDL_Surface * to = 0);
 };
 
-class CBattleInterface : public CMainInterface
+class CBattleInterface : public CMainInterface, public MotionInterested
 {
 private:
 	SDL_Surface * background, * menu, * amountBasic, * amountNormal, * cellBorders, * backgroundWithHexes;
@@ -160,6 +160,7 @@ private:
 	std::list<SProjectileInfo> projectiles;
 	void projectileShowHelper(SDL_Surface * to=NULL); //prints projectiles present on the battlefield
 	void giveCommand(ui8 action, ui16 tile, ui32 stack, si32 additional=-1);
+	bool isTileAttackable(int number); //returns true if tile 'number' is neighbouring any tile from active stack's range or is one of these tiles
 public:
 	CBattleInterface(CCreatureSet * army1, CCreatureSet * army2, CGHeroInstance *hero1, CGHeroInstance *hero2); //c-tor
 	~CBattleInterface(); //d-tor
@@ -198,6 +199,7 @@ public:
 	void activate();
 	void deactivate();
 	void show(SDL_Surface * to = NULL);
+	void mouseMoved(const SDL_MouseMotionEvent &sEvent);
 	bool reverseCreature(int number, int hex, bool wideTrick = false); //reverses animation of given creature playing animation of reversing
 
 	//call-ins

+ 1 - 1
CCastleInterface.cpp

@@ -143,7 +143,7 @@ void CBuildingRect::clickRight (tribool down)
 	}
 }
 
-void CBuildingRect::mouseMoved (SDL_MouseMotionEvent & sEvent)
+void CBuildingRect::mouseMoved (const SDL_MouseMotionEvent & sEvent)
 {
 	if(area)
 	{

+ 1 - 1
CCastleInterface.h

@@ -26,7 +26,7 @@ public:
 	void hover(bool on);
 	void clickLeft (tribool down);
 	void clickRight (tribool down);
-	void mouseMoved (SDL_MouseMotionEvent & sEvent);
+	void mouseMoved (const SDL_MouseMotionEvent & sEvent);
 };
 class CHeroGSlot : public ClickableL, public ClickableR, public Hoverable
 {

+ 2 - 2
CCursorHandler.cpp

@@ -18,13 +18,13 @@ void CCursorHandler::initCursor()
 	SDL_ShowCursor(SDL_DISABLE);
 }
 
-void CCursorHandler::changeGraphic(int type, int no)
+void CCursorHandler::changeGraphic(const int & type, const int & no)
 {
 	mode = type;
 	number = no;
 }
 
-void CCursorHandler::cursorMove(int x, int y)
+void CCursorHandler::cursorMove(const int & x, const int & y)
 {
 	xpos = x;
 	ypos = y;

+ 2 - 2
CCursorHandler.h

@@ -16,8 +16,8 @@ public:
 	std::vector<CDefHandler*> cursors;
 	int xpos, ypos; //position of cursor
 	void initCursor(); //inits cursorHandler
-	void cursorMove(int x, int y); //change cursor's positions to (x, y)
-	void changeGraphic(int type, int no); //changes cursor graphic for type type (0 - adventure, 1 - combat, 2 - default, 3 - spellbook) and frame no (not used for type 3)
+	void cursorMove(const int & x, const int & y); //change cursor's positions to (x, y)
+	void changeGraphic(const int & type, const int & no); //changes cursor graphic for type type (0 - adventure, 1 - combat, 2 - default, 3 - spellbook) and frame no (not used for type 3)
 	void draw1();
 	void draw2();
 	void hide(){Show=0;};

+ 92 - 8
CPlayerInterface.cpp

@@ -2269,7 +2269,7 @@ void CStatusBar::clear()
 	SDL_Rect pom = genRect(pos.h,pos.w,pos.x,pos.y);
 	SDL_BlitSurface(bg,&genRect(pos.h,pos.w,0,0),screen,&pom);
 }
-void CStatusBar::print(std::string text)
+void CStatusBar::print(const std::string & text)
 {
 	current=text;
 	SDL_Rect pom = genRect(pos.h,pos.w,pos.x,pos.y);
@@ -2432,7 +2432,7 @@ void CHeroList::clickLeft(tribool down)
 
 	}
 }
-void CHeroList::mouseMoved (SDL_MouseMotionEvent & sEvent)
+void CHeroList::mouseMoved (const SDL_MouseMotionEvent & sEvent)
 {
 	if(isItIn(&arrupp,LOCPLINT->current->motion.x,LOCPLINT->current->motion.y))
 	{
@@ -2502,7 +2502,7 @@ void CHeroList::clickRight(tribool down)
 void CHeroList::hover (bool on)
 {
 }
-void CHeroList::keyPressed (SDL_KeyboardEvent & key)
+void CHeroList::keyPressed (const SDL_KeyboardEvent & key)
 {
 }
 void CHeroList::updateHList()
@@ -2617,7 +2617,7 @@ void CTownList::select(int which)
 		fun();
 }
 
-void CTownList::mouseMoved (SDL_MouseMotionEvent & sEvent)
+void CTownList::mouseMoved (const SDL_MouseMotionEvent & sEvent)
 {
 	if(isItIn(&arrupp,LOCPLINT->current->motion.x,LOCPLINT->current->motion.y))
 	{
@@ -2749,7 +2749,7 @@ void CTownList::hover (bool on)
 {
 }
 
-void CTownList::keyPressed (SDL_KeyboardEvent & key)
+void CTownList::keyPressed (const SDL_KeyboardEvent & key)
 {
 }
 
@@ -3070,7 +3070,7 @@ void CSplitWindow::show(SDL_Surface * to)
 	anim->blitPic(screen,pos.x+20,pos.y+54,false);
 	anim->blitPic(screen,pos.x+177,pos.y+54,false);
 }
-void CSplitWindow::keyPressed (SDL_KeyboardEvent & key)
+void CSplitWindow::keyPressed (const SDL_KeyboardEvent & key)
 {
 	//TODO: make manual typing possible
 }
@@ -3287,7 +3287,7 @@ void CCreInfoWindow::dismissF()
 	dsm();
 	close();
 }
-void CCreInfoWindow::keyPressed (SDL_KeyboardEvent & key)
+void CCreInfoWindow::keyPressed (const SDL_KeyboardEvent & key)
 {
 }
 void CCreInfoWindow::deactivate()
@@ -3732,4 +3732,88 @@ void CMarketplaceWindow::selectionChanged(bool side)
 			rSubs[i] = oss.str();
 		}
 	}
-}
+}
+
+CSystemOptionsWindow::CSystemOptionsWindow(const SDL_Rect &pos)
+{
+	this->pos = pos;
+	background = BitmapHandler::loadBitmap("SysOpbck.bmp", true);
+	graphics->blueToPlayersAdv(background, LOCPLINT->playerID);
+
+	//printing texts
+	CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[568], 240, 32, GEOR16, tytulowy, background); //window title
+	CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[569], 122, 65, GEOR16, tytulowy, background); //hero speed
+	CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[570], 122, 131, GEOR16, tytulowy, background); //enemy speed
+	CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[571], 122, 197, GEOR16, tytulowy, background); //map scroll speed
+	CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[20], 122, 263, GEOR16, tytulowy, background); //video quality
+	CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[394], 122, 348, GEOR16, tytulowy, background); //music volume
+	CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[395], 122, 414, GEOR16, tytulowy, background); //effects volume
+
+	CSDL_Ext::printAt(CGI->generaltexth->allTexts[572], 283, 57, GEOR16, zwykly, background); //show move path
+	CSDL_Ext::printAt(CGI->generaltexth->allTexts[573], 283, 89, GEOR16, zwykly, background); //show hero reminder
+	CSDL_Ext::printAt(CGI->generaltexth->allTexts[574], 283, 121, GEOR16, zwykly, background); //quick combat
+	CSDL_Ext::printAt(CGI->generaltexth->allTexts[575], 283, 153, GEOR16, zwykly, background); //video subtitles
+	CSDL_Ext::printAt(CGI->generaltexth->allTexts[576], 283, 185, GEOR16, zwykly, background); //town building outlines
+	CSDL_Ext::printAt(CGI->generaltexth->allTexts[577], 283, 217, GEOR16, zwykly, background); //spell book animation
+
+	//setting up buttons
+	quitGame = new AdventureMapButton (CGI->preth->zelp[324].first, CGI->preth->zelp[324].second, boost::bind(&CSystemOptionsWindow::bquitf, this), 405, 471, "soquit.def", false, NULL, false);
+	std::swap(quitGame->imgs[0][0], quitGame->imgs[0][1]);
+	backToMap = new AdventureMapButton (CGI->preth->zelp[325].first, CGI->preth->zelp[325].second, boost::bind(&CSystemOptionsWindow::breturnf, this), 516, 471, "soretrn.def", false, NULL, false);
+	std::swap(backToMap->imgs[0][0], backToMap->imgs[0][1]);
+}
+
+CSystemOptionsWindow::~CSystemOptionsWindow()
+{
+	SDL_FreeSurface(background);
+
+	delete quitGame;
+	delete backToMap;
+}
+
+void CSystemOptionsWindow::bquitf()
+{
+	this->deactivate();
+	LOCPLINT->showYesNoDialog(CGI->generaltexth->allTexts[578], std::vector<SComponent*>(), boost::bind(exit, 0), boost::bind(&CSystemOptionsWindow::activate, this), false, false);
+}
+
+void CSystemOptionsWindow::breturnf()
+{
+	deactivate();
+
+	for(int g=0; g<LOCPLINT->objsToBlit.size(); ++g)
+	{
+		if(dynamic_cast<CSystemOptionsWindow*>(LOCPLINT->objsToBlit[g]))
+		{
+			LOCPLINT->objsToBlit.erase(LOCPLINT->objsToBlit.begin()+g);
+			break;
+		}
+	}
+
+	delete this;
+	LOCPLINT->curint->activate();
+}
+
+void CSystemOptionsWindow::activate()
+{
+	quitGame->activate();
+	backToMap->activate();
+}
+
+void CSystemOptionsWindow::deactivate()
+{
+	quitGame->deactivate();
+	backToMap->deactivate();
+}
+
+void CSystemOptionsWindow::show(SDL_Surface *to)
+{
+	//evaluating to
+	if(!to)
+		to = screen;
+
+	SDL_BlitSurface(background, NULL, to, &pos);
+
+	quitGame->show(to);
+	backToMap->show(to);
+}

+ 29 - 11
CPlayerInterface.h

@@ -44,7 +44,7 @@ class IStatusBar
 {
 public:
 	virtual ~IStatusBar(){}; //d-tor
-	virtual void print(std::string text)=0; //prints text and refreshes statusbar
+	virtual void print(const std::string & text)=0; //prints text and refreshes statusbar
 	virtual void clear()=0;//clears statusbar and refreshes
 	virtual void show()=0; //shows statusbar (with current text)
 	virtual std::string getCurrent()=0;
@@ -134,7 +134,7 @@ class KeyInterested : public virtual CIntObject
 {
 public:
 	virtual ~KeyInterested(){};
-	virtual void keyPressed (SDL_KeyboardEvent & key)=0;
+	virtual void keyPressed (const SDL_KeyboardEvent & key)=0;
 	virtual void activate()=0;
 	virtual void deactivate()=0;
 };
@@ -144,7 +144,7 @@ public:
 	bool strongInterest; //if true - report all mouse movements, if not - only when hovered
 	MotionInterested(){strongInterest=false;};
 	virtual ~MotionInterested(){};
-	virtual void mouseMoved (SDL_MouseMotionEvent & sEvent)=0;
+	virtual void mouseMoved (const SDL_MouseMotionEvent & sEvent)=0;
 	virtual void activate()=0;
 	virtual void deactivate()=0;
 };
@@ -400,7 +400,7 @@ public:
 
 	CStatusBar(int x, int y, std::string name="ADROLLVR.bmp", int maxw=-1); //c-tor
 	~CStatusBar(); //d-tor
-	void print(std::string text); //prints text and refreshes statusbar
+	void print(const std::string & text); //prints text and refreshes statusbar
 	void clear();//clears statusbar and refreshes
 	void show(); //shows statusbar (with current text)
 	std::string getCurrent();
@@ -424,7 +424,7 @@ public:
 	void clickLeft(boost::logic::tribool down);
 	void activate();
 	void deactivate();
-	virtual void mouseMoved (SDL_MouseMotionEvent & sEvent)=0;
+	virtual void mouseMoved (const SDL_MouseMotionEvent & sEvent)=0;
 	virtual void genList()=0;
 	virtual void select(int which)=0;
 	virtual void draw()=0;
@@ -441,11 +441,11 @@ public:
 	int getPosOfHero(const CArmedInstance* h);
 	void genList();
 	void select(int which);
-	void mouseMoved (SDL_MouseMotionEvent & sEvent);
+	void mouseMoved (const SDL_MouseMotionEvent & sEvent);
 	void clickLeft(boost::logic::tribool down);
 	void clickRight(boost::logic::tribool down);
 	void hover (bool on);
-	void keyPressed (SDL_KeyboardEvent & key);
+	void keyPressed (const SDL_KeyboardEvent & key);
 	void updateHList();
 	void updateMove(const CGHeroInstance* which); //draws move points bar
 	void redrawAllOne(int which);
@@ -465,11 +465,11 @@ public:
 	~CTownList();
 	void genList();
 	void select(int which);
-	void mouseMoved (SDL_MouseMotionEvent & sEvent);
+	void mouseMoved (const SDL_MouseMotionEvent & sEvent);
 	void clickLeft(boost::logic::tribool down);
 	void clickRight(boost::logic::tribool down);
 	void hover (bool on);
-	void keyPressed (SDL_KeyboardEvent & key);
+	void keyPressed (const SDL_KeyboardEvent & key);
 	void draw();
 };
 
@@ -534,7 +534,7 @@ public:
 	void close();
 	void deactivate();
 	void show(SDL_Surface * to = NULL);
-	void keyPressed (SDL_KeyboardEvent & key);
+	void keyPressed (const SDL_KeyboardEvent & key);
 	void sliderMoved(int to);
 };
 
@@ -560,7 +560,7 @@ public:
 	void close();
 	void clickRight(boost::logic::tribool down);
 	void dismissF();
-	void keyPressed (SDL_KeyboardEvent & key);
+	void keyPressed (const SDL_KeyboardEvent & key);
 	void deactivate();
 	void show(SDL_Surface * to = NULL);
 	void onUpgradeYes();
@@ -636,6 +636,24 @@ public:
 	void clear();
 };
 
+class CSystemOptionsWindow : public IShowActivable, public CIntObject
+{
+private:
+	SDL_Surface * background; //background of window
+	AdventureMapButton * quitGame, * backToMap;
+public:
+	CSystemOptionsWindow(const SDL_Rect & pos); //c-tor
+	~CSystemOptionsWindow(); //d-tor
+
+	//functions for butons
+	void bquitf(); //quit game
+	void breturnf(); //return to game
+
+	void activate();
+	void deactivate();
+	void show(SDL_Surface * to = NULL);
+};
+
 extern CPlayerInterface * LOCPLINT;
 
 #endif //CPLAYERINTERFACE_H

+ 6 - 6
SDL_Extensions.cpp

@@ -69,7 +69,7 @@ void updateRect (SDL_Rect * rect, SDL_Surface * scr)
 {
 	SDL_UpdateRect(scr,rect->x,rect->y,rect->w,rect->h);
 }
-void CSDL_Ext::printAtMiddleWB(std::string text, int x, int y, TTF_Font * font, int charpr, SDL_Color kolor, SDL_Surface * dst)
+void CSDL_Ext::printAtMiddleWB(const std::string & text, int x, int y, TTF_Font * font, int charpr, SDL_Color kolor, SDL_Surface * dst)
 {
 	std::vector<std::string> * ws = CMessage::breakText(text,charpr);
 	std::vector<SDL_Surface*> wesu;
@@ -97,7 +97,7 @@ void CSDL_Ext::printAtMiddleWB(std::string text, int x, int y, TTF_Font * font,
 		SDL_FreeSurface(wesu[i]);
 	delete ws;
 }
-void CSDL_Ext::printAtWB(std::string text, int x, int y, TTF_Font * font, int charpr, SDL_Color kolor, SDL_Surface * dst)
+void CSDL_Ext::printAtWB(const std::string & text, int x, int y, TTF_Font * font, int charpr, SDL_Color kolor, SDL_Surface * dst)
 {
 	std::vector<std::string> * ws = CMessage::breakText(text,charpr);
 	std::vector<SDL_Surface*> wesu;
@@ -116,7 +116,7 @@ void CSDL_Ext::printAtWB(std::string text, int x, int y, TTF_Font * font, int ch
 		SDL_FreeSurface(wesu[i]);
 	delete ws;
 }
-void CSDL_Ext::printAtMiddle(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor, SDL_Surface * dst, unsigned char quality, bool refresh)
+void CSDL_Ext::printAtMiddle(const std::string & text, int x, int y, TTF_Font * font, SDL_Color kolor, SDL_Surface * dst, unsigned char quality, bool refresh)
 {
 	if(text.length()==0) return;
 	SDL_Surface * temp;
@@ -145,7 +145,7 @@ void CSDL_Ext::printAtMiddle(std::string text, int x, int y, TTF_Font * font, SD
 		SDL_UpdateRect(dst,x-(temp->w/2),y-(temp->h/2),temp->w,temp->h);
 	SDL_FreeSurface(temp);
 }
-void CSDL_Ext::printAt(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor, SDL_Surface * dst, unsigned char quality)
+void CSDL_Ext::printAt(const std::string & text, int x, int y, TTF_Font * font, SDL_Color kolor, SDL_Surface * dst, unsigned char quality)
 {
 	if (text.length()==0)
 		return;
@@ -174,7 +174,7 @@ void CSDL_Ext::printAt(std::string text, int x, int y, TTF_Font * font, SDL_Colo
 	SDL_UpdateRect(dst,x,y,temp->w,temp->h);
 	SDL_FreeSurface(temp);
 }
-void CSDL_Ext::printTo(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor, SDL_Surface * dst, unsigned char quality)
+void CSDL_Ext::printTo(const std::string & text, int x, int y, TTF_Font * font, SDL_Color kolor, SDL_Surface * dst, unsigned char quality)
 {
 	if (text.length()==0)
 		return;
@@ -204,7 +204,7 @@ void CSDL_Ext::printTo(std::string text, int x, int y, TTF_Font * font, SDL_Colo
 	SDL_FreeSurface(temp);
 }
 
-void CSDL_Ext::printToWR(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor, SDL_Surface * dst, unsigned char quality)
+void CSDL_Ext::printToWR(const std::string & text, int x, int y, TTF_Font * font, SDL_Color kolor, SDL_Surface * dst, unsigned char quality)
 {
 	if (text.length()==0)
 		return;

+ 6 - 6
SDL_Extensions.h

@@ -36,12 +36,12 @@ namespace CSDL_Ext
 	SDL_Surface * alphaTransform(SDL_Surface * src); //adds transparency and shadows (partial handling only; see examples of using for details)
 	int blit8bppAlphaTo24bpp(SDL_Surface * src, SDL_Rect * srcRect, SDL_Surface * dst, SDL_Rect * dstRect); //blits 8 bpp surface with alpha channel to 24 bpp surface
 	Uint32 colorToUint32(const SDL_Color * color); //little endian only
-	void printTo(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen, unsigned char quality = 2);// quality: 0 - lowest, 1 - medium, 2 - highest; prints at right bottom corner of specific area. position of corner indicated by (x, y)
-	void printToWR(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen, unsigned char quality = 2);// quality: 0 - lowest, 1 - medium, 2 - highest; prints at right bottom corner of specific area. position of corner indicated by (x, y)
-	void printAtMiddle(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen, unsigned char quality = 2, bool refresh = false); // quality: 0 - lowest, 1 - medium, 2 - highest
-	void printAtMiddleWB(std::string text, int x, int y, TTF_Font * font, int charpr, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen);
-	void printAtWB(std::string text, int x, int y, TTF_Font * font, int charpr, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen);
-	void printAt(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen, unsigned char quality = 2); // quality: 0 - lowest, 1 - medium, 2 - highest
+	void printTo(const std::string & text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen, unsigned char quality = 2);// quality: 0 - lowest, 1 - medium, 2 - highest; prints at right bottom corner of specific area. position of corner indicated by (x, y)
+	void printToWR(const std::string & text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen, unsigned char quality = 2);// quality: 0 - lowest, 1 - medium, 2 - highest; prints at right bottom corner of specific area. position of corner indicated by (x, y)
+	void printAtMiddle(const std::string & text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen, unsigned char quality = 2, bool refresh = false); // quality: 0 - lowest, 1 - medium, 2 - highest
+	void printAtMiddleWB(const std::string & text, int x, int y, TTF_Font * font, int charpr, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen);
+	void printAtWB(const std::string & text, int x, int y, TTF_Font * font, int charpr, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen);
+	void printAt(const std::string & text, int x, int y, TTF_Font * font, SDL_Color kolor=tytulowy, SDL_Surface * dst=screen, unsigned char quality = 2); // quality: 0 - lowest, 1 - medium, 2 - highest
 	void update(SDL_Surface * what = screen); //updates whole surface (default - main screen)
 	void drawBorder(SDL_Surface * sur, int x, int y, int w, int h, int3 color);
 	void setPlayerColor(SDL_Surface * sur, unsigned char player); //sets correct color of flags; -1 for neutral

+ 1 - 1
client/CSpellWindow.cpp

@@ -16,7 +16,7 @@ extern SDL_Surface * screen;
 extern SDL_Color tytulowy, zwykly ;
 extern TTF_Font *GEOR16;
 
-SpellbookInteractiveArea::SpellbookInteractiveArea(SDL_Rect & myRect, boost::function<void()> funcL, std::string textR, boost::function<void()> funcHon, boost::function<void()> funcHoff)
+SpellbookInteractiveArea::SpellbookInteractiveArea(const SDL_Rect & myRect, boost::function<void()> funcL, const std::string & textR, boost::function<void()> funcHon, boost::function<void()> funcHoff)
 {
 	pos = myRect;
 	onLeft = funcL;

+ 1 - 1
client/CSpellWindow.h

@@ -21,7 +21,7 @@ public:
 	void activate();
 	void deactivate();
 
-	SpellbookInteractiveArea(SDL_Rect & myRect, boost::function<void()> funcL, std::string textR, boost::function<void()> funcHon, boost::function<void()> funcHoff);//c-tor
+	SpellbookInteractiveArea(const SDL_Rect & myRect, boost::function<void()> funcL, const std::string & textR, boost::function<void()> funcHon, boost::function<void()> funcHoff);//c-tor
 };
 
 class CSpellWindow : public IShowActivable, public CIntObject