2007-06-25 14:55:45 +00:00
# ifndef MAPHANDLER_H
# define MAPHANDLER_H
2007-08-30 10:11:53 +00:00
# include "hch\CAmbarCendamo.h"
# include "hch\CSemiDefHandler.h"
2007-06-25 14:55:45 +00:00
# include "CGameInfo.h"
2007-08-30 10:11:53 +00:00
# include "hch\CDefHandler.h"
2007-08-08 19:28:56 +00:00
# include <boost/logic/tribool.hpp>
2007-08-30 10:11:53 +00:00
# include "hch\CObjectHandler.h"
2007-10-24 19:54:35 +00:00
# include <list>
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
2007-08-08 19:28:56 +00:00
struct TerrainTile2
{
2007-08-11 14:58:07 +00:00
int3 pos ; //this tile's position
EterrainType terType ; //type of terrain tile
2007-08-08 19:28:56 +00:00
2007-08-11 14:58:07 +00:00
Eroad malle ; //type of road
unsigned char roaddir ; //type of road tile
2007-08-08 19:28:56 +00:00
2007-08-11 14:58:07 +00:00
Eriver nuine ; //type of river
unsigned char rivdir ; //type of river tile
2007-08-08 19:28:56 +00:00
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
2007-08-11 14:58:07 +00:00
bool visitable ; //false = not visitable; true = visitable
bool blocked ; //false = free; true = blocked;
2007-08-08 19:28:56 +00:00
2008-02-10 17:44:51 +00:00
std : : vector < std : : pair < CGObjectInstance * , SDL_Rect > > objects ; //poiters to objects being on this tile with rects to be easier to blit this tile on screen
2007-10-27 19:38:48 +00:00
std : : vector < CGObjectInstance * > visitableObjects ; //pointers to objects hero is visiting being on this tile
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 ;
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 ;
2007-06-06 16:12:12 +00:00
CAmbarCendamo * reader ;
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-10-18 20:14:26 +00:00
PseudoV < PseudoV < PseudoV < unsigned char > > > visibility ; //true means that pointed place is visible //not used now
2007-10-16 17:46:01 +00:00
//std::vector< std::vector<char> > undVisibility; //true means that pointed place is visible
2007-07-31 13:09:34 +00:00
std : : vector < CDefHandler * > roadDefs ;
std : : vector < CDefHandler * > staticRiverDefs ;
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-02-05 03:56:45 +00:00
std : : map < int , CGDefInfo * > villages , forts , capitols ;
2008-02-26 18:01:26 +00:00
std : : vector < std : : vector < std : : string > > battleBacks ; //battleBacks[terType] - vector of possible names for certain terrain type
2008-03-03 19:41:10 +00:00
std : : vector < std : : string > battleHeroes ; //battleHeroes[hero type] - name of def that has hero animation for battle
2007-11-03 16:46:08 +00:00
2007-12-11 18:49:24 +00:00
PseudoV < PseudoV < PseudoV < unsigned char > > > hideBitmap ; //specifies number of graphic that should be used to fully hide a tile
2007-08-19 21:12:55 +00:00
2007-06-26 12:38:58 +00:00
char & visAccess ( int x , int y ) ;
char & undVisAccess ( int x , int y ) ;
2007-06-25 14:55:45 +00:00
SDL_Surface mirrorImage ( SDL_Surface * src ) ; //what is this??
2007-10-17 20:05:49 +00:00
SDL_Surface * getVisBitmap ( int x , int y , PseudoV < PseudoV < PseudoV < 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
2007-10-27 19:38:48 +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 ( ) ;
2008-02-10 09:35:52 +00:00
int pickHero ( int owner ) ;
2008-02-05 03:56:45 +00:00
std : : pair < int , int > pickObject ( CGObjectInstance * obj ) ;
void randomizeObject ( CGObjectInstance * cur ) ;
2007-12-22 21:06:49 +00:00
void calculateBlockedPos ( ) ;
void initObjectRects ( ) ;
void borderAndTerrainBitmapInit ( ) ;
void roadsRiverTerrainInit ( ) ;
void prepareFOWDefs ( ) ;
void randomizeObjects ( ) ;
2008-02-11 18:40:10 +00:00
SDL_Surface * terrainRect ( int x , int y , int dx , int dy , int level = 0 , unsigned char anim = 0 , PseudoV < PseudoV < PseudoV < unsigned char > > > & visibilityMap = CGI - > mh - > visibility , bool otherHeroAnim = false , unsigned char heroAnim = 0 , SDL_Surface * extSurf = NULL , SDL_Rect * extRect = NULL ) ; //if extSurf is specified, blit to it
2007-08-19 21:12:55 +00:00
SDL_Surface * terrBitmap ( int x , int y ) ;
SDL_Surface * undTerrBitmap ( int x , int y ) ;
2007-11-20 17:52:22 +00:00
std : : string getRandomizedDefName ( CGDefInfo * di , CGObjectInstance * obj = NULL ) ; //objinstance needed only for heroes and towns
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