2007-06-25 17:55:45 +03:00
# ifndef MAPHANDLER_H
# define MAPHANDLER_H
2008-07-16 21:26:15 +03:00
# include "hch/CAmbarCendamo.h"
# include "hch/CSemiDefHandler.h"
2007-06-25 17:55:45 +03:00
# include "CGameInfo.h"
2008-07-16 21:26:15 +03:00
# include "hch/CDefHandler.h"
2007-08-08 22:28:56 +03:00
# include <boost/logic/tribool.hpp>
2008-07-16 21:26:15 +03:00
# include "hch/CObjectHandler.h"
2007-10-24 22:54:35 +03:00
# include <list>
2007-10-13 21:49:43 +03:00
const int Woff = 12 ; //width of map's frame
2008-07-16 21:26:15 +03:00
const int Hoff = 8 ;
2007-07-02 22:44:30 +03:00
2007-08-08 22:28:56 +03:00
struct TerrainTile2
{
2007-08-11 17:58:07 +03:00
int3 pos ; //this tile's position
EterrainType terType ; //type of terrain tile
2007-08-08 22:28:56 +03:00
2007-08-11 17:58:07 +03:00
Eroad malle ; //type of road
unsigned char roaddir ; //type of road tile
2007-08-08 22:28:56 +03:00
2007-08-11 17:58:07 +03:00
Eriver nuine ; //type of river
unsigned char rivdir ; //type of river tile
2007-08-08 22:28:56 +03:00
2007-08-11 17:58:07 +03: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 22:28:56 +03:00
2007-08-11 17:58:07 +03:00
bool visitable ; //false = not visitable; true = visitable
bool blocked ; //false = free; true = blocked;
2007-08-08 22:28:56 +03:00
2008-02-10 19:44:51 +02: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 22:38:48 +03:00
std : : vector < CGObjectInstance * > visitableObjects ; //pointers to objects hero is visiting being on this tile
2007-08-08 22:28:56 +03:00
} ;
//pathfinder
// map<int,int> iDTerenu=>koszt_pola
// map<int,int> IDdrogi=>koszt_drogi
2007-08-17 20:42:21 +03: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 20:46:01 +03:00
int size ( ) const
2007-08-17 20:42:21 +03:00
{
return inver . size ( ) ;
}
} ;
2007-06-25 17:55:45 +03:00
class CMapHandler
2007-06-06 19:12:12 +03:00
{
public :
2007-08-17 20:42:21 +03:00
PseudoV < PseudoV < PseudoV < TerrainTile2 > > > ttiles ;
2007-08-20 00:12:55 +03:00
int3 sizes ;
2007-06-06 19:12:12 +03:00
CAmbarCendamo * reader ;
2008-02-10 11:35:52 +02:00
std : : set < int > usedHeroes ;
2007-07-11 15:08:42 +03:00
CDefHandler * fullHide ;
2007-07-30 15:49:38 +03:00
CDefHandler * partialHide ;
2007-06-25 17:55:45 +03:00
2007-10-18 23:14:26 +03:00
PseudoV < PseudoV < PseudoV < unsigned char > > > visibility ; //true means that pointed place is visible //not used now
2007-10-16 20:46:01 +03:00
//std::vector< std::vector<char> > undVisibility; //true means that pointed place is visible
2007-07-31 16:09:34 +03:00
std : : vector < CDefHandler * > roadDefs ;
std : : vector < CDefHandler * > staticRiverDefs ;
2007-08-20 00:12:55 +03:00
2007-11-03 18:46:08 +02:00
std : : map < std : : string , CDefHandler * > loadedDefs ; //pointers to loaded defs (key is filename, uppercase)
2008-02-05 05:56:45 +02:00
std : : map < int , CGDefInfo * > villages , forts , capitols ;
2008-02-26 20:01:26 +02:00
std : : vector < std : : vector < std : : string > > battleBacks ; //battleBacks[terType] - vector of possible names for certain terrain type
2008-03-03 21:41:10 +02:00
std : : vector < std : : string > battleHeroes ; //battleHeroes[hero type] - name of def that has hero animation for battle
2007-11-03 18:46:08 +02:00
2007-12-11 20:49:24 +02:00
PseudoV < PseudoV < PseudoV < unsigned char > > > hideBitmap ; //specifies number of graphic that should be used to fully hide a tile
2007-08-20 00:12:55 +03:00
2007-06-26 15:38:58 +03:00
char & visAccess ( int x , int y ) ;
char & undVisAccess ( int x , int y ) ;
2007-06-25 17:55:45 +03:00
SDL_Surface mirrorImage ( SDL_Surface * src ) ; //what is this??
2007-10-17 23:05:49 +03:00
SDL_Surface * getVisBitmap ( int x , int y , PseudoV < PseudoV < PseudoV < unsigned char > > > & visibilityMap , int lvl ) ;
2007-08-12 20:48:05 +03:00
2007-10-27 22:38:48 +03:00
int getCost ( int3 & a , int3 & b , const CGHeroInstance * hero ) ;
2007-10-05 21:10:33 +03:00
std : : vector < std : : string > getObjDescriptions ( int3 pos ) ; //returns desriptions of objects blocking given position
2007-10-27 22:38:48 +03:00
std : : vector < CGObjectInstance * > getVisitableObjs ( int3 pos ) ; //returns vector of visitable objects at certain position
2008-02-07 20:45:22 +02: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 18:46:08 +02: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 20:54:34 +02:00
bool removeObject ( CGObjectInstance * obj ) ; //removes object from each place in VCMI (I hope)
2007-11-25 20:32:11 +02:00
bool recalculateHideVisPos ( int3 & pos ) ; //recalculates position for hidden / visitable positions
2007-11-29 20:45:47 +02:00
bool recalculateHideVisPosUnderObj ( CGObjectInstance * obj , bool withBorder = false ) ; //recalculates position for hidden / visitable positions under given object
2007-06-06 19:12:12 +03:00
void init ( ) ;
2008-02-10 11:35:52 +02:00
int pickHero ( int owner ) ;
2008-02-05 05:56:45 +02:00
std : : pair < int , int > pickObject ( CGObjectInstance * obj ) ;
void randomizeObject ( CGObjectInstance * cur ) ;
2007-12-22 23:06:49 +02:00
void calculateBlockedPos ( ) ;
void initObjectRects ( ) ;
void borderAndTerrainBitmapInit ( ) ;
void roadsRiverTerrainInit ( ) ;
void prepareFOWDefs ( ) ;
void randomizeObjects ( ) ;
2008-02-11 20:40:10 +02: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-20 00:12:55 +03:00
SDL_Surface * terrBitmap ( int x , int y ) ;
SDL_Surface * undTerrBitmap ( int x , int y ) ;
2007-11-20 19:52:22 +02:00
std : : string getRandomizedDefName ( CGDefInfo * di , CGObjectInstance * obj = NULL ) ; //objinstance needed only for heroes and towns
2008-02-09 16:44:32 +02:00
unsigned char getHeroFrameNum ( const unsigned char & dir , const bool & isMoving ) const ; //terrainRect helper function
2008-02-11 20:40:10 +02:00
void validateRectTerr ( SDL_Rect * val , const SDL_Rect * ext ) ; //terrainRect helper
2008-02-17 21:04:27 +02: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-20 00:12:55 +03:00
2007-06-25 17:55:45 +03:00
} ;
2008-07-16 21:26:15 +03:00
# endif //MAPHANDLER_H