Browse Source

* fixed memory leak in battles
* blitting creature animatoins to rects (not tested!)
* a few minor improvements

mateuszb 17 years ago
parent
commit
9674343453

+ 4 - 4
AdventureMapButton.h

@@ -233,7 +233,7 @@ void CTownList<T>::mouseMoved (SDL_MouseMotionEvent & sEvent)
 	int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
 	hx-=pos.x;
 	hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
-	float ny = (float)hy/(float)32;
+	int ny = hy/32;
 	if ((ny>SIZE || ny<0) || (from+ny>=items.size()))
 	{
 		LOCPLINT->statusbar->clear();
@@ -263,10 +263,10 @@ void CTownList<T>::clickLeft(tribool down)
 		int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
 		hx-=pos.x;
 		hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
-		float ny = (float)hy/(float)32;
+		int ny = hy/32;
 		if (ny>SIZE || ny<0)
 			return;
-		if (SIZE==5 && ((int)(ny+from))==selected && (LOCPLINT->adventureInt->selection.type == TOWNI_TYPE))
+		if (SIZE==5 && (ny+from)==selected && (LOCPLINT->adventureInt->selection.type == TOWNI_TYPE))
 			LOCPLINT->openTownWindow(items[selected]);//print town screen
 		else
 			select(ny+from);
@@ -322,7 +322,7 @@ void CTownList<T>::clickRight(tribool down)
 		int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
 		hx-=pos.x;
 		hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
-		float ny = (float)hy/(float)32;
+		int ny = hy/32;
 		if ((ny>5 || ny<0) || (from+ny>=items.size()))
 		{
 			return;

+ 1 - 1
CAdvmapInterface.h

@@ -8,7 +8,7 @@
 #include "AdventureMapButton.h"
 class CDefHandler;
 class CCallback;
-class CPath; 
+struct CPath; 
 class CAdvMapInt;
 class CGHeroInstance;
 class CGTownInstance;

+ 10 - 6
CBattleInterface.cpp

@@ -54,7 +54,7 @@ CBattleInterface::CBattleInterface(CCreatureSet * army1, CCreatureSet * army2, C
 		}
 	}
 
-	//blitting menu background and terrain
+	////blitting menu background and terrain
 	blitAt(background, 0, 0);
 	blitAt(menu, 0, 556);
 	CSDL_Ext::update();
@@ -98,9 +98,9 @@ CBattleInterface::CBattleInterface(CCreatureSet * army1, CCreatureSet * army2, C
 
 	//preparing cells and hexes
 	cellBorder = CGI->bitmaph->loadBitmap("CCELLGRD.BMP");
-	cellBorder = CSDL_Ext::alphaTransform(cellBorder);
+	CSDL_Ext::alphaTransform(cellBorder);
 	cellShade = CGI->bitmaph->loadBitmap("CCELLSHD.BMP");
-	cellShade = CSDL_Ext::alphaTransform(cellShade);
+	CSDL_Ext::alphaTransform(cellShade);
 	for(int h=0; h<187; ++h)
 	{
 		bfield[h].myNumber = h;
@@ -142,8 +142,8 @@ CBattleInterface::~CBattleInterface()
 	SDL_FreeSurface(cellBorder);
 	SDL_FreeSurface(cellShade);
 
-	for(int g=0; g<creAnims.size(); ++g)
-		delete creAnims[g];
+	for(std::map< int, CCreatureAnimation * >::iterator g=creAnims.begin(); g!=creAnims.end(); ++g)
+		delete g->second;
 }
 
 void CBattleInterface::activate()
@@ -531,7 +531,11 @@ CBattleHero::CBattleHero(std::string defName, int phaseG, int imageG, bool flipG
 	for(int i=0; i<dh->ourImages.size(); ++i) //transforming images
 	{
 		if(flip)
-			dh->ourImages[i].bitmap = CSDL_Ext::rotate01(dh->ourImages[i].bitmap); 
+		{
+			SDL_Surface * hlp = CSDL_Ext::rotate01(dh->ourImages[i].bitmap);
+			SDL_FreeSurface(dh->ourImages[i].bitmap); 
+			dh->ourImages[i].bitmap = hlp;
+		}
 		dh->ourImages[i].bitmap = CSDL_Ext::alphaTransform(dh->ourImages[i].bitmap);
 	}
 	dh->alphaTransformed = true;

+ 1 - 1
CCallback.h

@@ -6,7 +6,7 @@
 #include "CGameState.h"
 
 class CGameState;
-class CPath;
+struct CPath;
 class CGObjectInstance;
 class SComponent;
 class IChosen;

+ 1 - 1
CCursorHandler.h

@@ -2,7 +2,7 @@
 #define CCURSORHANDLER_H
 
 struct SDL_Thread;
-struct CDefHandler;
+class CDefHandler;
 struct SDL_Surface;
 
 class CCursorHandler //handles cursor

+ 0 - 3
CMT.cpp

@@ -327,11 +327,8 @@ int _tmain(int argc, _TCHAR* argv[])
 	THC tmh.getDif();
 	timeHandler pomtime;pomtime.getDif();
 	int xx=0, yy=0, zz=0;
-	SDL_Event sEvent;
 	srand ( time(NULL) );
-	SDL_Surface *temp;
 	std::vector<SDL_Surface*> Sprites;
-	float i;
 	if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO/*|SDL_INIT_EVENTTHREAD*/)==0)
 	{
 		screen = SDL_SetVideoMode(800,600,24,SDL_SWSURFACE|SDL_DOUBLEBUF/*|SDL_FULLSCREEN*/);

+ 5 - 5
CPlayerInterface.cpp

@@ -1962,7 +1962,7 @@ void CPlayerInterface::buildChanged(const CGTownInstance *town, int buildingID,
 }
 
 void CPlayerInterface::battleStart(CCreatureSet * army1, CCreatureSet * army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, tribool side) //called by engine when battle starts; side=0 - left, side=1 - right
- {
+{
 	curint->deactivate();
 	curint = new CBattleInterface(army1,army2,hero1,hero2);
 	curint->activate();
@@ -2232,10 +2232,10 @@ void CHeroList::clickLeft(tribool down)
 		int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
 		hx-=pos.x;
 		hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
-		float ny = (float)hy/(float)32;
+		int ny = hy/32;
 		if (ny>=5 || ny<0)
 			return;
-		if (((int)(ny+from))==selected && (LOCPLINT->adventureInt->selection.type == HEROI_TYPE))
+		if ( (ny+from)==selected && (LOCPLINT->adventureInt->selection.type == HEROI_TYPE))
 			LOCPLINT->openHeroWindow(items[selected].first);//print hero screen
 		select(ny+from);
 	}
@@ -2294,7 +2294,7 @@ void CHeroList::mouseMoved (SDL_MouseMotionEvent & sEvent)
 	int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
 	hx-=pos.x;
 	hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
-	float ny = (float)hy/(float)32;
+	int ny = hy/32;
 	if ((ny>5 || ny<0) || (from+ny>=items.size()))
 	{
 		LOCPLINT->adventureInt->statusbar.clear();
@@ -2323,7 +2323,7 @@ void CHeroList::clickRight(tribool down)
 		int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y;
 		hx-=pos.x;
 		hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h;
-		float ny = (float)hy/(float)32;
+		int ny = hy/32;
 		if ((ny>5 || ny<0) || (from+ny>=items.size()))
 		{
 			return;

+ 1 - 1
CPlayerInterface.h

@@ -17,7 +17,7 @@ class CStack;
 class SComponent;
 class CCreature;
 struct SDL_Surface;
-class CPath;
+struct CPath;
 class CCreatureAnimation;
 class CSelectableComponent;
 class CCreatureSet;

+ 0 - 1
SDL_Extensions.cpp

@@ -478,7 +478,6 @@ SDL_Surface * CSDL_Ext::alphaTransform(SDL_Surface *src)
 			}
 		}
 	}
-	SDL_UpdateRect(src, 0, 0, src->w, src->h);
 	return src;
 }
 

+ 8 - 6
hch/CCreatureHandler.cpp

@@ -781,11 +781,11 @@ int CCreatureAnimation::readNormalNr (int pos, int bytCon, unsigned char * str,
 	}
 	return ret;
 }
-int CCreatureAnimation::nextFrameMiddle(SDL_Surface *dest, int x, int y, bool attacker, bool incrementFrame, bool yellowBorder)
+int CCreatureAnimation::nextFrameMiddle(SDL_Surface *dest, int x, int y, bool attacker, bool incrementFrame, bool yellowBorder, SDL_Rect * destRect)
 {
-	return nextFrame(dest,x-fullWidth/2,y-fullHeight/2,attacker,incrementFrame,yellowBorder);
+	return nextFrame(dest,x-fullWidth/2,y-fullHeight/2,attacker,incrementFrame,yellowBorder,destRect);
 }
-int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker, bool incrementFrame, bool yellowBorder)
+int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker, bool incrementFrame, bool yellowBorder, SDL_Rect * destRect)
 {
 	if(dest->format->BytesPerPixel<3)
 		return -1; //not enough depth
@@ -829,7 +829,7 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
 		LeftMargin, RightMargin, TopMargin,BottomMargin,
 		i, add, FullHeight,FullWidth,
 		TotalRowLength, // length of read segment
-		NextSpriteOffset, RowAdd;
+		RowAdd;
 	unsigned char SegmentType, SegmentLength;
 	
 	i=BaseOffset=SEntries[SIndex].offset;
@@ -884,7 +884,8 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
 						int yB = ftcp/(FullWidth+add) + y;
 						if(xB>=0 && yB>=0 && xB<dest->w && yB<dest->h)
 						{
-							putPixel(dest, xB + yB*dest->w, palette[FDef[BaseOffset+k]], FDef[BaseOffset+k], yellowBorder);
+							if(!destRect || (destRect->x <= xB && destRect->x + destRect->w > xB && destRect->y <= yB && destRect->y + destRect->h > yB))
+								putPixel(dest, xB + yB*dest->w, palette[FDef[BaseOffset+k]], FDef[BaseOffset+k], yellowBorder);
 						}
 						ftcp++; //increment pos
 						if ((TotalRowLength+k+1)>=SpriteWidth)
@@ -901,7 +902,8 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
 						int yB = ftcp/(FullWidth+add) + y;
 						if(xB>=0 && yB>=0 && xB<dest->w && yB<dest->h)
 						{
-							putPixel(dest, xB + yB*dest->w, palette[SegmentType], SegmentType, yellowBorder);
+							if(!destRect || (destRect->x <= xB && destRect->x + destRect->w > xB && destRect->y <= yB && destRect->y + destRect->h > yB))
+								putPixel(dest, xB + yB*dest->w, palette[SegmentType], SegmentType, yellowBorder);
 						}
 						ftcp++; //increment pos
 					}

+ 2 - 2
hch/CCreatureHandler.h

@@ -103,8 +103,8 @@ public:
 	void setType(int type); //sets type of animation and cleares framecount
 	int getType() const; //returns type of animation
 
-	int nextFrame(SDL_Surface * dest, int x, int y, bool attacker, bool incrementFrame = true, bool yellowBorder = false); //0 - success, any other - error //print next 
-	int nextFrameMiddle(SDL_Surface * dest, int x, int y, bool attacker, bool incrementFrame = true, bool yellowBorder = false); //0 - success, any other - error //print next 
+	int nextFrame(SDL_Surface * dest, int x, int y, bool attacker, bool incrementFrame = true, bool yellowBorder = false, SDL_Rect * destRect = NULL); //0 - success, any other - error //print next 
+	int nextFrameMiddle(SDL_Surface * dest, int x, int y, bool attacker, bool incrementFrame = true, bool yellowBorder = false, SDL_Rect * destRect = NULL); //0 - success, any other - error //print next 
 
 	int framesInGroup(int group) const; //retirns number of fromes in given group
 };