2011-12-14 00:23:17 +03:00
# pragma once
# include "../lib/int3.h"
2012-12-01 09:30:52 +03:00
# include "SDL.h"
2009-04-16 14:14:13 +03:00
2009-04-15 17:03:31 +03: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 14:14:13 +03:00
*/
class CGObjectInstance ;
class CGHeroInstance ;
2012-11-03 22:31:16 +03:00
class CMap ;
2009-04-16 14:14:13 +03:00
class CGDefInfo ;
class CGObjectInstance ;
class CDefHandler ;
struct TerrainTile ;
struct SDL_Surface ;
2012-12-01 09:30:52 +03:00
//struct SDL_Rect;
2009-06-17 19:46:16 +03:00
class CDefEssential ;
2009-04-16 14:14:13 +03:00
struct TerrainTile2
{
2009-12-22 23:53:50 +02:00
SDL_Surface * terbitmap ; //bitmap of terrain
2009-04-16 14:14:13 +03:00
2009-06-06 22:10:38 +03: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 14:14:13 +03:00
TerrainTile2 ( ) ;
} ;
template < typename T > class PseudoV
{
public :
2013-12-20 16:07:58 +03:00
PseudoV ( ) : offset ( 0 ) { }
PseudoV ( std : : vector < T > & src , int rest , int before , int after , const T & fill ) : offset ( before )
2009-04-16 14:14:13 +03:00
{
2009-06-12 06:26:41 +03:00
inver . resize ( before + rest + after ) ;
for ( int i = 0 ; i < before ; i + + )
2009-04-16 14:14:13 +03:00
inver [ i ] = fill ;
for ( int i = 0 ; i < src . size ( ) ; i + + )
inver [ offset + i ] = src [ i ] ;
2009-06-12 06:26:41 +03:00
for ( int i = src . size ( ) ; i < src . size ( ) + after ; i + + )
2009-04-16 14:14:13 +03: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 06:26:41 +03:00
void resize ( int rest , int before , int after )
2009-04-16 14:14:13 +03:00
{
2009-06-12 06:26:41 +03:00
inver . resize ( before + rest + after ) ;
offset = before ;
2009-04-16 14:14:13 +03:00
}
int size ( ) const
{
return inver . size ( ) ;
}
2013-12-20 16:07:58 +03:00
private :
int offset ;
std : : vector < T > inver ;
2009-04-16 14:14:13 +03:00
} ;
2010-08-16 16:51:31 +03:00
2009-04-16 14:14:13 +03:00
class CMapHandler
{
public :
2009-05-07 20:20:41 +03:00
PseudoV < PseudoV < PseudoV < TerrainTile2 > > > ttiles ; //informations about map tiles
2009-06-12 06:26:41 +03:00
int3 sizes ; //map size (x = width, y = height, z = number of levels)
2012-10-26 20:51:05 +03:00
const CMap * map ;
2009-06-14 10:02:06 +03: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 06:26:41 +03:00
2010-08-16 16:51:31 +03:00
//std::set<int> usedHeroes;
2009-04-16 14:14:13 +03:00
std : : vector < std : : vector < SDL_Surface * > > terrainGraphics ; // [terrain id] [view type] [rotation type]
2009-06-17 19:46:16 +03:00
std : : vector < CDefEssential * > roadDefs ;
std : : vector < CDefEssential * > staticRiverDefs ;
2009-04-16 14:14:13 +03:00
2011-12-14 00:23:17 +03:00
std : : vector < std : : vector < std : : vector < ui8 > > > hideBitmap ; //specifies number of graphic that should be used to fully hide a tile
2013-02-19 01:37:22 +03:00
mutable std : : map < const CGObjectInstance * , ui8 > animationPhase ;
2009-05-07 20:20:41 +03:00
CMapHandler ( ) ; //c-tor
~ CMapHandler ( ) ; //d-tor
2009-04-16 14:14:13 +03:00
2011-12-14 00:23:17 +03: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
2013-02-19 01:37:22 +03:00
ui8 getPhaseShift ( const CGObjectInstance * object ) const ;
2009-04-16 14:14:13 +03:00
std : : vector < std : : string > getObjDescriptions ( int3 pos ) ; //returns desriptions of objects blocking given position
2010-02-21 17:03:30 +02:00
void getTerrainDescr ( const int3 & pos , std : : string & out , bool terName ) ; //if tername == false => empty string when tile is clear
2009-04-16 14:14:13 +03: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)
void init ( ) ;
void calculateBlockedPos ( ) ;
void initObjectRects ( ) ;
void borderAndTerrainBitmapInit ( ) ;
void roadsRiverTerrainInit ( ) ;
void prepareFOWDefs ( ) ;
2011-12-14 00:23:17 +03: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 14:14:13 +03:00
void updateWater ( ) ;
2011-12-14 00:23:17 +03:00
ui8 getHeroFrameNum ( ui8 dir , bool isMoving ) const ; //terrainRect helper function
2009-04-16 14:14:13 +03:00
void validateRectTerr ( SDL_Rect * val , const SDL_Rect * ext ) ; //terrainRect helper
2011-12-14 00:23:17 +03: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 14:14:13 +03:00
} ;