2011-12-13 21:23:17 +00:00
#pragma once
#include "../lib/int3.h"
2009-04-16 11:14:13 +00:00
2009-04-15 14:03:31 +00:00
/*
* mapHandler.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
2009-04-16 11:14:13 +00:00
*/
class CGObjectInstance ;
class CGHeroInstance ;
struct Mapa ;
class CGDefInfo ;
class CGObjectInstance ;
class CDefHandler ;
struct TerrainTile ;
struct SDL_Surface ;
struct SDL_Rect ;
2009-06-17 16:46:16 +00:00
class CDefEssential ;
2009-04-16 11:14:13 +00:00
struct TerrainTile2
{
2009-12-22 21:53:50 +00:00
SDL_Surface * terbitmap ; //bitmap of terrain
2009-04-16 11:14:13 +00:00
2009-06-06 19:10:38 +00:00
std :: vector < std :: pair < const CGObjectInstance * , SDL_Rect > > objects ; //pointers to objects being on this tile with rects to be easier to blit this tile on screen
2009-04-16 11:14:13 +00:00
TerrainTile2 ();
};
template < typename T > class PseudoV
{
public :
int offset ;
std :: vector < T > inver ;
PseudoV (){};
2009-06-12 03:26:41 +00:00
PseudoV ( std :: vector < T > & src , int rest , int before , int after , const T & fill )
2009-04-16 11:14:13 +00:00
{
2009-06-12 03:26:41 +00:00
inver . resize ( before + rest + after );
offset = before ;
for ( int i = 0 ; i < before ; i ++ )
2009-04-16 11:14:13 +00:00
inver [ i ] = fill ;
for ( int i = 0 ; i < src . size (); i ++ )
inver [ offset + i ] = src [ i ];
2009-06-12 03:26:41 +00:00
for ( int i = src . size (); i < src . size () + after ; i ++ )
2009-04-16 11:14:13 +00:00
inver [ offset + i ] = fill ;
}
inline T & operator []( const int & n )
{
return inver [ n + offset ];
}
inline const T & operator []( const int & n ) const
{
return inver [ n + offset ];
}
2009-06-12 03:26:41 +00:00
void resize ( int rest , int before , int after )
2009-04-16 11:14:13 +00:00
{
2009-06-12 03:26:41 +00:00
inver . resize ( before + rest + after );
offset = before ;
2009-04-16 11:14:13 +00:00
}
int size () const
{
return inver . size ();
}
};
2010-08-16 13:51:31 +00:00
2009-04-16 11:14:13 +00:00
class CMapHandler
{
public :
2009-05-07 17:20:41 +00:00
PseudoV < PseudoV < PseudoV < TerrainTile2 > > > ttiles ; //informations about map tiles
2009-06-12 03:26:41 +00:00
int3 sizes ; //map size (x = width, y = height, z = number of levels)
2010-08-16 13:51:31 +00:00
const Mapa * map ;
2009-06-14 07:02:06 +00:00
// Max number of tiles that will fit in the map screen. Tiles
// can be partial on each edges.
int tilesW ;
int tilesH ;
// size of each side of the frame around the whole map, in tiles
int frameH ;
int frameW ;
// Coord in pixels of the top left corner of the top left tile to
// draw. Values range is [-31..0]. A negative value
// implies that part of the tile won't be displayed.
int offsetX ;
int offsetY ;
2009-06-12 03:26:41 +00:00
2010-08-16 13:51:31 +00:00
//std::set<int> usedHeroes;
2009-04-16 11:14:13 +00:00
std :: vector < std :: vector < SDL_Surface *> > terrainGraphics ; // [terrain id] [view type] [rotation type]
2009-06-17 16:46:16 +00:00
std :: vector < CDefEssential *> roadDefs ;
std :: vector < CDefEssential *> staticRiverDefs ;
2009-04-16 11:14:13 +00:00
2011-12-13 21:23:17 +00:00
std :: vector < std :: vector < std :: vector < ui8 > > > hideBitmap ; //specifies number of graphic that should be used to fully hide a tile
static const bool MARK_BLOCKED_POSITIONS ;
static const bool MARK_VISITABLE_POSITIONS ;
2009-04-16 11:14:13 +00:00
2009-05-07 17:20:41 +00:00
CMapHandler (); //c-tor
~ CMapHandler (); //d-tor
2009-04-16 11:14:13 +00:00
2011-12-13 21:23:17 +00:00
std :: pair < SDL_Surface * , bool > getVisBitmap ( const int3 & pos , const std :: vector < std :: vector < std :: vector < ui8 > > > & visibilityMap ) const ; //returns appropriate bitmap and info if alpha blitting is necessary
2009-04-16 11:14:13 +00:00
std :: vector < std :: string > getObjDescriptions ( int3 pos ); //returns desriptions of objects blocking given position
2010-02-21 15:03:30 +00:00
void getTerrainDescr ( const int3 & pos , std :: string & out , bool terName ); //if tername == false => empty string when tile is clear
2009-04-16 11:14:13 +00:00
CGObjectInstance * createObject ( int id , int subid , int3 pos , int owner = 254 ); //creates a new object with a certain id and subid
bool printObject ( const CGObjectInstance * obj ); //puts appropriate things to ttiles, so obj will be visible on map
bool hideObject ( const CGObjectInstance * obj ); //removes appropriate things from ttiles, so obj will be no longer visible on map (but still will exist)
bool removeObject ( CGObjectInstance * obj ); //removes object from each place in VCMI (I hope)
2010-12-20 13:04:24 +00:00
void initHeroDef ( const CGHeroInstance * h );
2009-04-16 11:14:13 +00:00
void init ();
void calculateBlockedPos ();
void initObjectRects ();
void borderAndTerrainBitmapInit ();
void roadsRiverTerrainInit ();
void prepareFOWDefs ();
2011-12-13 21:23:17 +00:00
void terrainRect ( int3 top_tile , ui8 anim , const std :: vector < std :: vector < std :: vector < ui8 > > > * visibilityMap , bool otherHeroAnim , ui8 heroAnim , SDL_Surface * extSurf , const SDL_Rect * extRect , int moveX , int moveY , bool puzzleMode , int3 grailPosRel ) const ;
2009-04-16 11:14:13 +00:00
void updateWater ();
2011-12-13 21:23:17 +00:00
ui8 getHeroFrameNum ( ui8 dir , bool isMoving ) const ; //terrainRect helper function
2009-04-16 11:14:13 +00:00
void validateRectTerr ( SDL_Rect * val , const SDL_Rect * ext ); //terrainRect helper
2011-12-13 21:23:17 +00:00
static ui8 getDir ( const int3 & a , const int3 & b ); //returns direction number in range 0 - 7 (0 is left top, clockwise) [direction: form a to b]
2009-04-16 11:14:13 +00:00
};