Răsfoiți Sursa

* fixed a few problems with refreshing screen during blitting using CSDL_Ext::printAtMiddle
* fixed drawbacks in displaying secondary skills in hero window
* fixed two bugs with spellBook
* corrected order of spells in spellBook
* spellBook is opened when hero in battle is left-clicked

mateuszb 17 ani în urmă
părinte
comite
c5c9127673
7 a modificat fișierele cu 108 adăugiri și 39 ștergeri
  1. 32 3
      CBattleInterface.cpp
  2. 6 2
      CBattleInterface.h
  3. 19 19
      CHeroWindow.cpp
  4. 1 1
      CPlayerInterface.cpp
  5. 5 4
      SDL_Extensions.cpp
  6. 1 1
      SDL_Extensions.h
  7. 44 9
      client/CSpellWindow.cpp

+ 32 - 3
CBattleInterface.cpp

@@ -101,7 +101,7 @@ CBattleInterface::CBattleInterface(CCreatureSet * army1, CCreatureSet * army2, C
 	//loading hero animations
 	if(hero1) // attacking hero
 	{
-		attackingHero = new CBattleHero(graphics->battleHeroes[hero1->type->heroType], 0, 0, false, hero1->tempOwner);
+		attackingHero = new CBattleHero(graphics->battleHeroes[hero1->type->heroType], 0, 0, false, hero1->tempOwner, hero1->tempOwner == LOCPLINT->playerID ? hero1 : NULL);
 		attackingHero->pos = genRect(attackingHero->dh->ourImages[0].bitmap->h, attackingHero->dh->ourImages[0].bitmap->w, -40, 0);
 	}
 	else
@@ -110,7 +110,7 @@ CBattleInterface::CBattleInterface(CCreatureSet * army1, CCreatureSet * army2, C
 	}
 	if(hero2) // defending hero
 	{
-		defendingHero = new CBattleHero(graphics->battleHeroes[hero2->type->heroType], 0, 0, true, hero2->tempOwner);
+		defendingHero = new CBattleHero(graphics->battleHeroes[hero2->type->heroType], 0, 0, true, hero2->tempOwner, hero2->tempOwner == LOCPLINT->playerID ? hero2 : NULL);
 		defendingHero->pos = genRect(defendingHero->dh->ourImages[0].bitmap->h, defendingHero->dh->ourImages[0].bitmap->w, 690, 0);
 	}
 	else
@@ -243,6 +243,10 @@ void CBattleInterface::activate()
 	{
 		bfield[b].activate();
 	}
+	if(attackingHero)
+		attackingHero->activate();
+	if(defendingHero)
+		defendingHero->activate();
 }
 
 void CBattleInterface::deactivate()
@@ -260,6 +264,10 @@ void CBattleInterface::deactivate()
 	{
 		bfield[b].deactivate();
 	}
+	if(attackingHero)
+		attackingHero->deactivate();
+	if(defendingHero)
+		defendingHero->deactivate();
 }
 
 void CBattleInterface::show(SDL_Surface * to)
@@ -1311,7 +1319,28 @@ void CBattleHero::show(SDL_Surface *to)
 	}
 }
 
-CBattleHero::CBattleHero(std::string defName, int phaseG, int imageG, bool flipG, unsigned char player): phase(phaseG), image(imageG), flip(flipG), flagAnim(0)
+void CBattleHero::activate()
+{
+	ClickableL::activate();
+}
+void CBattleHero::deactivate()
+{
+	ClickableL::deactivate();
+}
+void CBattleHero::clickLeft(boost::logic::tribool down)
+{
+	if(!down && myHero)
+	{
+		CGI->curh->changeGraphic(0,0);
+		LOCPLINT->curint->deactivate();
+
+		CSpellWindow * spellWindow = new CSpellWindow(genRect(595, 620, 90, 2), myHero);
+		spellWindow->activate();
+		LOCPLINT->objsToBlit.push_back(spellWindow);
+	}
+}
+
+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)
 {
 	dh = CDefHandler::giveDef( defName );
 	for(int i=0; i<dh->ourImages.size(); ++i) //transforming images

+ 6 - 2
CBattleInterface.h

@@ -12,16 +12,20 @@ class AdventureMapButton;
 struct BattleResult;
 template <typename T> struct CondSh;
 
-class CBattleHero : public IShowable, public CIntObject
+class CBattleHero : public IShowable, public ClickableL
 {
 public:
 	bool flip; //false if it's attacking hero, true otherwise
 	CDefHandler * dh, *flag; //animation and flag
+	const CGHeroInstance * myHero; //this animation's hero instance
 	int phase; //stage of animation
 	int image; //frame of animation
 	unsigned char flagAnim, flagAnimCount; //for flag animation
 	void show(SDL_Surface * to); //prints next frame of animation to to
-	CBattleHero(std::string defName, int phaseG, int imageG, bool filpG, unsigned char player); //c-tor
+	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(); //d-tor
 };
 

+ 19 - 19
CHeroWindow.cpp

@@ -225,12 +225,12 @@ void CHeroWindow::setHero(const CGHeroInstance *Hero)
 	for(int g=0; g<hero->secSkills.size(); ++g)
 	{
 		secSkillAreas[g]->type = hero->secSkills[g].first;
-		secSkillAreas[g]->bonus = hero->secSkills[g].second;
+		secSkillAreas[g]->bonus = hero->secSkills[g].second-1;
 		std::string hlp = CGI->abilh->abilities[ hero->secSkills[g].first ]->infoTexts[hero->secSkills[g].second-1];
 		secSkillAreas[g]->text = hlp.substr(1, hlp.size()-2);
 
 		char * hlpp = new char[200];
-		sprintf(hlpp, CGI->generaltexth->heroscrn[21].c_str(), CGI->abilh->levels[hero->secSkills[g].second].c_str(), CGI->abilh->abilities[hero->secSkills[g].first]->name.c_str());
+		sprintf(hlpp, CGI->generaltexth->heroscrn[21].c_str(), CGI->abilh->levels[hero->secSkills[g].second-1].c_str(), CGI->abilh->abilities[hero->secSkills[g].first]->name.c_str());
 		secSkillAreas[g]->hoverText = std::string(hlpp);
 		delete [] hlpp;
 	}
@@ -256,7 +256,7 @@ void CHeroWindow::setHero(const CGHeroInstance *Hero)
 
 	std::vector<SDL_Rect> slotPos;
 
-	slotPos += genRect(44,44,509,30), genRect(44,44,567,240), genRect(44,44,509,30), genRect(44,44,383,68),
+	slotPos += genRect(44,44,509,30), genRect(44,44,567,240), genRect(44,44,509,80), genRect(44,44,383,68),
 		genRect(44,44,564,183), genRect(44,44,509,130), genRect(44,44,431,68), genRect(44,44,610,183),
 		genRect(44,44,515,295), genRect(44,44,383,143), genRect(44,44,399,194), genRect(44,44,415,245),
 		genRect(44,44,431,296), genRect(44,44,564,30), genRect(44,44,610,30), genRect(44,44,610,76),
@@ -597,50 +597,50 @@ void CHeroWindow::redrawCurBack()
 	//secondary skills
 	if(curHero->secSkills.size()>=1)
 	{
-		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[0].first*3+3+curHero->secSkills[0].second].bitmap, 18, 276, curBack);
-		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[0].second], 69, 279, GEOR13, zwykly, curBack);
+		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[0].first*3+3+curHero->secSkills[0].second-1].bitmap, 18, 276, curBack);
+		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[0].second-1], 69, 279, GEOR13, zwykly, curBack);
 		CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[0].first]->name, 69, 299, GEOR13, zwykly, curBack);
 	}
 	if(curHero->secSkills.size()>=2)
 	{
-		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[1].first*3+3+curHero->secSkills[1].second].bitmap, 161, 276, curBack);
-		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[1].second], 213, 279, GEOR13, zwykly, curBack);
+		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[1].first*3+3+curHero->secSkills[1].second-1].bitmap, 161, 276, curBack);
+		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[1].second-1], 213, 279, GEOR13, zwykly, curBack);
 		CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[1].first]->name, 213, 299, GEOR13, zwykly, curBack);
 	}
 	if(curHero->secSkills.size()>=3)
 	{
-		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[2].first*3+3+curHero->secSkills[2].second].bitmap, 18, 324, curBack);
-		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[2].second], 69, 327, GEOR13, zwykly, curBack);
+		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[2].first*3+3+curHero->secSkills[2].second-1].bitmap, 18, 324, curBack);
+		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[2].second-1], 69, 327, GEOR13, zwykly, curBack);
 		CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[2].first]->name, 69, 347, GEOR13, zwykly, curBack);
 	}
 	if(curHero->secSkills.size()>=4)
 	{
-		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[3].first*3+3+curHero->secSkills[3].second].bitmap, 161, 324, curBack);
-		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[3].second], 213, 327, GEOR13, zwykly, curBack);
+		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[3].first*3+3+curHero->secSkills[3].second-1].bitmap, 161, 324, curBack);
+		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[3].second-1], 213, 327, GEOR13, zwykly, curBack);
 		CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[3].first]->name, 213, 347, GEOR13, zwykly, curBack);
 	}
 	if(curHero->secSkills.size()>=5)
 	{
-		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[4].first*3+3+curHero->secSkills[4].second].bitmap, 18, 372, curBack);
-		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[4].second], 69, 375, GEOR13, zwykly, curBack);
+		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[4].first*3+3+curHero->secSkills[4].second-1].bitmap, 18, 372, curBack);
+		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[4].second-1], 69, 375, GEOR13, zwykly, curBack);
 		CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[4].first]->name, 69, 395, GEOR13, zwykly, curBack);
 	}
 	if(curHero->secSkills.size()>=6)
 	{
-		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[5].first*3+3+curHero->secSkills[5].second].bitmap, 161, 372, curBack);
-		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[5].second], 213, 375, GEOR13, zwykly, curBack);
+		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[5].first*3+3+curHero->secSkills[5].second-1].bitmap, 161, 372, curBack);
+		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[5].second-1], 213, 375, GEOR13, zwykly, curBack);
 		CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[5].first]->name, 213, 395, GEOR13, zwykly, curBack);
 	}
 	if(curHero->secSkills.size()>=7)
 	{
-		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[6].first*3+3+curHero->secSkills[6].second].bitmap, 18, 420, curBack);
-		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[6].second], 69, 423, GEOR13, zwykly, curBack);
+		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[6].first*3+3+curHero->secSkills[6].second-1].bitmap, 18, 420, curBack);
+		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[6].second-1], 69, 423, GEOR13, zwykly, curBack);
 		CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[6].first]->name, 69, 443, GEOR13, zwykly, curBack);
 	}
 	if(curHero->secSkills.size()>=8)
 	{
-		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[7].first*3+3+curHero->secSkills[7].second].bitmap, 161, 420, curBack);
-		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[7].second], 213, 423, GEOR13, zwykly, curBack);
+		blitAt(CGI->abilh->abils44->ourImages[curHero->secSkills[7].first*3+3+curHero->secSkills[7].second-1].bitmap, 161, 420, curBack);
+		CSDL_Ext::printAt(CGI->abilh->levels[curHero->secSkills[7].second-1], 213, 423, GEOR13, zwykly, curBack);
 		CSDL_Ext::printAt(CGI->abilh->abilities[curHero->secSkills[7].first]->name, 213, 443, GEOR13, zwykly, curBack);
 	}
 

+ 1 - 1
CPlayerInterface.cpp

@@ -259,7 +259,7 @@ void CGarrisonSlot::show()
 		char* buf = new char[15];
 		SDL_itoa(count,buf,10);
 		blitAt(graphics->bigImgs[creature->idNumber],pos);
-		printTo(buf,pos.x+56,pos.y+62,GEOR16,zwykly);
+		printToWR(buf,pos.x+56,pos.y+62,GEOR16,zwykly);
 		if(owner->highlighted==this)
 			blitAt(graphics->bigImgs[-1],pos);
 		//if(owner->update)

+ 5 - 4
SDL_Extensions.cpp

@@ -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)
+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)
 {
 	if(text.length()==0) return;
 	SDL_Surface * temp;
@@ -141,7 +141,8 @@ void CSDL_Ext::printAtMiddle(std::string text, int x, int y, TTF_Font * font, SD
 		break;
 	}
 	SDL_BlitSurface(temp,NULL,dst,&genRect(temp->h,temp->w,x-(temp->w/2),y-(temp->h/2)));
-	//SDL_UpdateRect(dst,x-(temp->w/2),y-(temp->h/2),temp->w,temp->h);
+	if(refresh)
+		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)
@@ -170,7 +171,7 @@ void CSDL_Ext::printAt(std::string text, int x, int y, TTF_Font * font, SDL_Colo
 		break;
 	}
 	SDL_BlitSurface(temp,NULL,dst,&genRect(temp->h,temp->w,x,y));
-	//SDL_UpdateRect(dst,x,y,temp->w,temp->h);
+	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)
@@ -199,7 +200,7 @@ void CSDL_Ext::printTo(std::string text, int x, int y, TTF_Font * font, SDL_Colo
 		break;
 	}
 	SDL_BlitSurface(temp,NULL,dst,&genRect(temp->h,temp->w,x-temp->w,y-temp->h));
-	//SDL_UpdateRect(dst,x-temp->w,y-temp->h,temp->w,temp->h);
+	SDL_UpdateRect(dst,x-temp->w,y-temp->h,temp->w,temp->h);
 	SDL_FreeSurface(temp);
 }
 

+ 1 - 1
SDL_Extensions.h

@@ -38,7 +38,7 @@ namespace CSDL_Ext
 	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); // quality: 0 - lowest, 1 - medium, 2 - highest
+	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

+ 44 - 9
client/CSpellWindow.cpp

@@ -460,6 +460,37 @@ void CSpellWindow::show(SDL_Surface *to)
 	}
 }
 
+class SpellbookSpellSorter
+{
+public:
+	bool operator()(const int & a, const int & b)
+	{
+		CSpell A = CGI->spellh->spells[a];
+		CSpell B = CGI->spellh->spells[b];
+		if(A.level<B.level)
+			return true;
+		if(A.level>B.level)
+			return false;
+		if(A.air && !B.air)
+			return true;
+		if(!A.air && B.air)
+			return false;
+		if(A.fire && !B.fire)
+			return true;
+		if(!A.fire && B.fire)
+			return false;
+		if(A.water && !B.water)
+			return true;
+		if(!A.water && B.water)
+			return false;
+		if(A.earth && !B.earth)
+			return true;
+		if(!A.earth && B.earth)
+			return false;
+		return A.name < B.name;
+	}
+} spellsorter;
+
 void CSpellWindow::computeSpellsPerArea()
 {
 	std::vector<ui32> spellsCurSite;
@@ -476,6 +507,7 @@ void CSpellWindow::computeSpellsPerArea()
 			spellsCurSite.push_back(*it);
 		}
 	}
+	std::sort(spellsCurSite.begin(), spellsCurSite.end(), spellsorter);
 	if(selectedTab == 4)
 	{
 		if(spellsCurSite.size() > 12)
@@ -587,7 +619,7 @@ void CSpellWindow::SpellArea::clickLeft(boost::logic::tribool down)
 
 void CSpellWindow::SpellArea::clickRight(boost::logic::tribool down)
 {
-	if(down)
+	if(down && mySpell != -1)
 	{
 		CInfoPopup *vinya = new CInfoPopup();
 		vinya->free = true;
@@ -605,15 +637,18 @@ void CSpellWindow::SpellArea::clickRight(boost::logic::tribool down)
 void CSpellWindow::SpellArea::hover(bool on)
 {
 	Hoverable::hover(on);
-	if(on)
-	{
-		std::stringstream ss;
-		ss<<CGI->spellh->spells[mySpell].name<<" ("<<CGI->generaltexth->allTexts[171+CGI->spellh->spells[mySpell].level]<<")";
-		owner->statusBar->print(ss.str());
-	}
-	else
+	if(mySpell != -1)
 	{
-		owner->statusBar->clear();
+		if(on)
+		{
+			std::stringstream ss;
+			ss<<CGI->spellh->spells[mySpell].name<<" ("<<CGI->generaltexth->allTexts[171+CGI->spellh->spells[mySpell].level]<<")";
+			owner->statusBar->print(ss.str());
+		}
+		else
+		{
+			owner->statusBar->clear();
+		}
 	}
 }