Browse Source

* printAtMiddle won't crash when called with an empty string
* removed unused code from CMT.cpp
* statusbar is working
* interaction between buttons and statusbar

Michał W. Urbańczyk 18 years ago
parent
commit
efcc7d08da
6 changed files with 53 additions and 152 deletions
  1. 38 5
      CAdvmapInterface.cpp
  2. 9 9
      CAdvmapInterface.h
  3. 4 0
      CGameInterface.cpp
  4. 1 0
      CGameInterface.h
  5. 0 138
      CMT.cpp
  6. 1 0
      SDL_Extensions.cpp

+ 38 - 5
CAdvmapInterface.cpp

@@ -1,6 +1,6 @@
 #include "stdafx.h"
 #include "CAdvmapInterface.h"
-
+extern TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX; //fonts
 CAdvMapInt::~CAdvMapInt()
 {
 	SDL_FreeSurface(bg);
@@ -22,6 +22,8 @@ AdventureMapButton::AdventureMapButton
 	active=false;
 	ourObj=NULL;
 	state=0;
+	name=Name;
+	helpBox=HelpBox;
 	int est = LOCPLINT->playerID;
 	CDefHandler * temp = CGI->spriteh->giveDef(defName); //todo: moze cieknac
 	for (int i=0;i<temp->ourImages.size();i++)
@@ -33,7 +35,7 @@ AdventureMapButton::AdventureMapButton
 	pos.x=x;
 	pos.y=y;
 	pos.w = imgs[0]->w;
-	pos.h = imgs[0]->h;
+	pos.h = imgs[0]->h  -1;
 	if (activ)
 		activate();
 }
@@ -59,7 +61,11 @@ void AdventureMapButton::clickRight (tribool down)
 }
 void AdventureMapButton::hover (bool on)
 {
-	//TODO: print info in statusbar
+	Hoverable::hover(on);
+	if (on)
+		LOCPLINT->adventureInt->statusbar.print(name);
+	else if (LOCPLINT->adventureInt->statusbar.current==name)
+		LOCPLINT->adventureInt->statusbar.clear();
 }
 void AdventureMapButton::activate()
 {
@@ -99,12 +105,36 @@ void CList::deactivate()
 void CList::clickLeft(tribool down)
 {
 };
+CStatusBar::CStatusBar(int x, int y)
+{
+	bg=CGI->bitmaph->loadBitmap("ADROLLVR.bmp");
+	SDL_SetColorKey(bg,SDL_SRCCOLORKEY,SDL_MapRGB(bg->format,0,255,255));
+	pos.x=x;
+	pos.y=y;
+	pos.w=bg->w;
+	pos.h=bg->h;
+	middlex=(bg->w/2)+x;
+	middley=(bg->h/2)+y;
+}
+CStatusBar::~CStatusBar()
+{
+	SDL_FreeSurface(bg);
+}
+void CStatusBar::clear()
+{
+	current="";
+	blitAtWR(bg,pos.x,pos.y);
+}
 void CStatusBar::print(std::string text)
 {
-
+	current=text;
+	blitAtWR(bg,pos.x,pos.y);
+	printAtMiddle(current,middlex,middley,GEOR13,zwykly);
 }
 void CStatusBar::show()
 {
+	blitAtWR(bg,pos.x,pos.y);
+	printAtMiddle(current,middlex,middley,GEOR13,zwykly);
 }
 void CTerrainRect::activate()
 {
@@ -135,7 +165,7 @@ void CTerrainRect::show()
 
 CAdvMapInt::CAdvMapInt(int Player)
 :player(Player),
-statusbar(8,556),
+statusbar(7,556),
 kingOverview(CGI->preth->advKingdomOverview.first,CGI->preth->advKingdomOverview.second,
 			 &CAdvMapInt::fshowOverview, 679, 196, "IAM002.DEF"),
 
@@ -243,6 +273,9 @@ void CAdvMapInt::show()
 	nextHero.activate();
 	endTurn.show();
 	endTurn.activate();
+
+	statusbar.show();
+
 	SDL_Flip(ekran);
 }
 void CAdvMapInt::update()

+ 9 - 9
CAdvmapInterface.h

@@ -74,15 +74,15 @@ class CStatusBar
 	: public CIntObject
 {
 public:
-	SDL_Surface * bg;
-	SDL_Surface * temp;
-	int tx, ty;
-	std::string current;
-
-	CStatusBar(int x, int y)
-		{bg=CGI->bitmaph->loadBitmap("ADROLLVR.bmp");pos.x=x;pos.y=y;pos.w=bg->w;pos.h=bg->h;temp=NULL;}
-	void print(std::string text);
-	void show();
+	SDL_Surface * bg; //background
+	int middlex, middley; //middle of statusbar
+	std::string current; //text currently printed
+
+	CStatusBar(int x, int y); //c-tor
+	~CStatusBar(); //d-tor
+	void print(std::string text); //prints text and refreshes statusbar
+	void clear();//clears statusbar and refreshes
+	void show(); //shows statusbar (with current text)
 };
 class CMinimap
 	: public ClickableL, public ClickableR, public Hoverable, public CIntObject

+ 4 - 0
CGameInterface.cpp

@@ -52,6 +52,10 @@ void Hoverable::deactivate()
 {
 	LOCPLINT->hoverable.erase(std::find(LOCPLINT->hoverable.begin(),LOCPLINT->hoverable.end(),this));
 }
+void Hoverable::hover(bool on)
+{
+	hovered=on;
+}
 void KeyInterested::activate()
 {
 	LOCPLINT->keyinterested.push_back(this);

+ 1 - 0
CGameInterface.h

@@ -48,6 +48,7 @@ public:
 class Hoverable  : public virtual CIntObject
 {
 public:
+	Hoverable(){hovered=false;}
 	bool hovered;
 	virtual void hover (bool on)=0;
 	virtual void activate()=0;

+ 0 - 138
CMT.cpp

@@ -56,144 +56,6 @@ const char * NAME = "VCMI 0.3";
    an error reading or writing the files. */
 SDL_Surface * ekran;
 TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX;
-int def(FILE *source, FILE *dest, int level, int winBits=15, int memLevel =8)
-{
-	int ret, flush;
-	unsigned have;
-	z_stream strm;
-	unsigned char in[CHUNK];
-	unsigned char out[CHUNK];
-
-	/* allocate deflate state */
-	strm.zalloc = Z_NULL;
-	strm.zfree = Z_NULL;
-	strm.opaque = Z_NULL;
-	ret = deflateInit2(&strm, level,Z_DEFLATED,winBits,memLevel,0);//8-15, 1-9, 0-2
-	if (ret != Z_OK)
-		return ret;
-
-	/* compress until end of file */
-	do {
-		strm.avail_in = fread(in, 1, CHUNK, source);
-		if (ferror(source)) {
-			(void)deflateEnd(&strm);
-			return Z_ERRNO;
-		}
-		flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
-		strm.next_in = in;
-
-		/* run deflate() on input until output buffer not full, finish
-		   compression if all of source has been read in */
-		do {
-			strm.avail_out = CHUNK;
-			strm.next_out = out;
-			ret = deflate(&strm, flush);	/* no bad return value */
-			assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
-			have = CHUNK - strm.avail_out;
-			if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
-				(void)deflateEnd(&strm);
-				return Z_ERRNO;
-			}
-		} while (strm.avail_out == 0);
-		assert(strm.avail_in == 0);	 /* all input will be used */
-
-		/* done when last data in file processed */
-	} while (flush != Z_FINISH);
-	assert(ret == Z_STREAM_END);		/* stream will be complete */
-
-	/* clean up and return */
-	(void)deflateEnd(&strm);
-	return Z_OK;
-}
-
-/* Decompress from file source to file dest until stream ends or EOF.
-   inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
-   allocated for processing, Z_DATA_ERROR if the deflate data is
-   invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
-   the version of the library linked do not match, or Z_ERRNO if there
-   is an error reading or writing the files. */
-//int inf(FILE *source, FILE *dest, int wBits = 15)
-//{
-//	int ret;
-//	unsigned have;
-//	z_stream strm;
-//	unsigned char in[CHUNK];
-//	unsigned char out[CHUNK];
-//
-//	/* allocate inflate state */
-//	strm.zalloc = Z_NULL;
-//	strm.zfree = Z_NULL;
-//	strm.opaque = Z_NULL;
-//	strm.avail_in = 0;
-//	strm.next_in = Z_NULL;
-//	ret = inflateInit2(&strm, wBits);
-//	if (ret != Z_OK)
-//		return ret;
-//
-//	/* decompress until deflate stream ends or end of file */
-//	do {
-//		strm.avail_in = fread(in, 1, CHUNK, source);
-//		if (ferror(source)) {
-//			(void)inflateEnd(&strm);
-//			return Z_ERRNO;
-//		}
-//		if (strm.avail_in == 0)
-//			break;
-//		strm.next_in = in;
-//
-//		/* run inflate() on input until output buffer not full */
-//		do {
-//			strm.avail_out = CHUNK;
-//			strm.next_out = out;
-//			ret = inflate(&strm, Z_NO_FLUSH);
-//			assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
-//			switch (ret) {
-//			case Z_NEED_DICT:
-//				ret = Z_DATA_ERROR;	 /* and fall through */
-//			case Z_DATA_ERROR:
-//			case Z_MEM_ERROR:
-//				(void)inflateEnd(&strm);
-//				return ret;
-//			}
-//			have = CHUNK - strm.avail_out;
-//			if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
-//				(void)inflateEnd(&strm);
-//				return Z_ERRNO;
-//			}
-//		} while (strm.avail_out == 0);
-//
-//		/* done when inflate() says it's done */
-//	} while (ret != Z_STREAM_END);
-//
-//	/* clean up and return */
-//	(void)inflateEnd(&strm);
-//	return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
-//}
-
-/* report a zlib or i/o error */
-void zerr(int ret)
-{
-	fputs("zpipe: ", stderr);
-	switch (ret) {
-	case Z_ERRNO:
-		if (ferror(stdin))
-			fputs("error reading stdin\n", stderr);
-		if (ferror(stdout))
-			fputs("error writing stdout\n", stderr);
-		break;
-	case Z_STREAM_ERROR:
-		fputs("invalid compression level\n", stderr);
-		break;
-	case Z_DATA_ERROR:
-		fputs("invalid or incomplete deflate data\n", stderr);
-		break;
-	case Z_MEM_ERROR:
-		fputs("out of memory\n", stderr);
-		break;
-	case Z_VERSION_ERROR:
-		fputs("zlib version mismatch!\n", stderr);
-	}
-}
 
 int _tmain(int argc, _TCHAR* argv[])
 { 

+ 1 - 0
SDL_Extensions.cpp

@@ -48,6 +48,7 @@ void updateRect (SDL_Rect * rect, SDL_Surface * scr)
 }
 void CSDL_Ext::printAtMiddle(std::string text, int x, int y, TTF_Font * font, SDL_Color kolor, SDL_Surface * dst, unsigned char quality)
 {
+	if(text.length()==0) return;
 	SDL_Surface * temp;
 	switch (quality)
 	{