2007-06-25 14:55:45 +00:00
# ifndef MAPHANDLER_H
# define MAPHANDLER_H
2008-07-02 08:39:56 +00:00
# include "global.h"
# include <SDL.h>
2007-10-24 19:54:35 +00:00
# include <list>
2008-07-02 08:39:56 +00:00
# include <set>
2007-10-13 18:49:43 +00:00
const int Woff = 12 ; //width of map's frame
const int Hoff = 8 ;
2007-07-02 19:44:30 +00:00
2008-07-02 08:39:56 +00:00
class CGObjectInstance ;
class CGHeroInstance ;
struct Mapa ;
class CGDefInfo ;
2008-07-25 17:28:28 +00:00
class CGObjectInstance ;
class CDefHandler ;
2008-07-29 09:53:27 +00:00
struct TerrainTile ;
2007-08-08 19:28:56 +00:00
struct TerrainTile2
{
2008-07-29 09:53:27 +00:00
int3 pos ;
const TerrainTile * tileInfo ;
2007-08-11 14:58:07 +00:00
std : : vector < SDL_Surface * > terbitmap ; //frames of terrain animation
std : : vector < SDL_Surface * > rivbitmap ; //frames of river animation
std : : vector < SDL_Surface * > roadbitmap ; //frames of road animation
2007-08-08 19:28:56 +00:00
2008-07-29 09:53:27 +00:00
std : : vector < std : : pair < const CGObjectInstance * , SDL_Rect > > objects ; //poiters to objects being on this tile with rects to be easier to blit this tile on screen
2007-08-08 19:28:56 +00:00
} ;
//pathfinder
// map<int,int> iDTerenu=>koszt_pola
// map<int,int> IDdrogi=>koszt_drogi
2007-08-17 17:42:21 +00:00
template < typename T > class PseudoV
{
public :
int offset ;
std : : vector < T > inver ;
2008-06-30 00:06:41 +00:00
PseudoV ( ) { } ;
PseudoV ( std : : vector < T > & src , int offset , const T & fill )
{
inver . resize ( Offset * 2 + rest ) ;
offset = Offset ;
for ( int i = 0 ; i < offset ; i + + )
inver [ i ] = fill ;
for ( int i = 0 ; i < src . size ( ) ; i + + )
inver [ offset + i ] = src [ i ] ;
for ( int i = src . size ( ) ; i < src . size ( ) + offset ; i + + )
inver [ offset + i ] = fill ;
}
2007-08-17 17:42:21 +00:00
inline T & operator [ ] ( int n )
{
return inver [ n + offset ] ;
}
void resize ( int rest , int Offset )
{
inver . resize ( Offset * 2 + rest ) ;
offset = Offset ;
}
2007-10-16 17:46:01 +00:00
int size ( ) const
2007-08-17 17:42:21 +00:00
{
return inver . size ( ) ;
}
} ;
2007-06-25 14:55:45 +00:00
class CMapHandler
2007-06-06 16:12:12 +00:00
{
public :
2007-08-17 17:42:21 +00:00
PseudoV < PseudoV < PseudoV < TerrainTile2 > > > ttiles ;
2007-08-19 21:12:55 +00:00
int3 sizes ;
2008-06-11 01:53:57 +00:00
Mapa * map ;
2008-02-10 09:35:52 +00:00
std : : set < int > usedHeroes ;
2007-07-11 12:08:42 +00:00
CDefHandler * fullHide ;
2007-07-30 12:49:38 +00:00
CDefHandler * partialHide ;
2007-06-25 14:55:45 +00:00
2007-07-31 13:09:34 +00:00
std : : vector < CDefHandler * > roadDefs ;
std : : vector < CDefHandler * > staticRiverDefs ;
2008-06-07 17:16:52 +00:00
std : : vector < CDefHandler * > defs ;
2007-08-19 21:12:55 +00:00
2007-11-03 16:46:08 +00:00
std : : map < std : : string , CDefHandler * > loadedDefs ; //pointers to loaded defs (key is filename, uppercase)
2008-06-30 00:06:41 +00:00
std : : vector < std : : vector < std : : vector < unsigned char > > > hideBitmap ; //specifies number of graphic that should be used to fully hide a tile
2007-08-19 21:12:55 +00:00
2008-06-07 17:16:52 +00:00
void loadDefs ( ) ;
2008-06-30 00:06:41 +00:00
SDL_Surface * getVisBitmap ( int x , int y , std : : vector < std : : vector < std : : vector < unsigned char > > > & visibilityMap , int lvl ) ;
2007-08-12 17:48:05 +00:00
2007-10-27 19:38:48 +00:00
int getCost ( int3 & a , int3 & b , const CGHeroInstance * hero ) ;
2007-10-05 18:10:33 +00:00
std : : vector < std : : string > getObjDescriptions ( int3 pos ) ; //returns desriptions of objects blocking given position
2008-07-29 09:53:27 +00:00
//std::vector< CGObjectInstance * > getVisitableObjs(int3 pos); //returns vector of visitable objects at certain position
2008-02-07 18:45:22 +00:00
CGObjectInstance * createObject ( int id , int subid , int3 pos , int owner = 254 ) ; //creates a new object with a certain id and subid
2007-11-03 16:46:08 +00:00
std : : string getDefName ( int id , int subid ) ; //returns name of def for object with given id and subid
bool printObject ( CGObjectInstance * obj ) ; //puts appropriate things to ttiles, so obj will be visible on map
bool hideObject ( CGObjectInstance * obj ) ; //removes appropriate things from ttiles, so obj will be no longer visible on map (but still will exist)
2007-11-24 18:54:34 +00:00
bool removeObject ( CGObjectInstance * obj ) ; //removes object from each place in VCMI (I hope)
2007-11-25 18:32:11 +00:00
bool recalculateHideVisPos ( int3 & pos ) ; //recalculates position for hidden / visitable positions
2007-11-29 18:45:47 +00:00
bool recalculateHideVisPosUnderObj ( CGObjectInstance * obj , bool withBorder = false ) ; //recalculates position for hidden / visitable positions under given object
2007-06-06 16:12:12 +00:00
void init ( ) ;
2007-12-22 21:06:49 +00:00
void calculateBlockedPos ( ) ;
void initObjectRects ( ) ;
void borderAndTerrainBitmapInit ( ) ;
void roadsRiverTerrainInit ( ) ;
void prepareFOWDefs ( ) ;
2008-07-02 08:39:56 +00:00
SDL_Surface * terrainRect ( int x , int y , int dx , int dy , int level = 0 , unsigned char anim = 0 , std : : vector < std : : vector < std : : vector < unsigned char > > > * visibilityMap = NULL , bool otherHeroAnim = false , unsigned char heroAnim = 0 , SDL_Surface * extSurf = NULL , SDL_Rect * extRect = NULL ) ; //if extSurf is specified, blit to it
2008-02-09 14:44:32 +00:00
unsigned char getHeroFrameNum ( const unsigned char & dir , const bool & isMoving ) const ; //terrainRect helper function
2008-02-11 18:40:10 +00:00
void validateRectTerr ( SDL_Rect * val , const SDL_Rect * ext ) ; //terrainRect helper
2008-02-17 19:04:27 +00:00
static unsigned char getDir ( const int3 & a , const int3 & b ) ; //returns direction number in range 0 - 7 (0 is left top, clockwise) [direction: form a to b]
2007-08-19 21:12:55 +00:00
2007-06-25 14:55:45 +00:00
} ;
# endif //MAPHANDLER_H