00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef __MAP_H__
00030 #define __MAP_H__
00031
00033
00034
00035
00036
00037
00118
00119
00120
00121
00122 #include <string>
00123 #include <vector>
00124 #include "patch_manager.h"
00125
00126
00127
00128
00129
00130 class CGraphic;
00131 class CPlayer;
00132 class CFile;
00133 class CUnit;
00134 class CUnitType;
00135
00136
00137
00138
00139
00140 #define MaxMapWidth 256
00141 #define MaxMapHeight 256
00142
00143
00144
00145
00146
00148 class CMapField
00149 {
00150 public:
00151 CMapField() : Flags(0), Cost(0)
00152 {
00153 memset(Visible, 0, sizeof(Visible));
00154 memset(Radar, 0, sizeof(Radar));
00155 memset(RadarJammer, 0, sizeof(RadarJammer));
00156 }
00157
00158 unsigned short Flags;
00159 unsigned char Cost;
00160
00161 unsigned short Visible[PlayerMax];
00162 unsigned char Radar[PlayerMax];
00163 unsigned char RadarJammer[PlayerMax];
00164 };
00165
00166 #define MapFieldSpeedMask 0x0007
00167
00168 #define MapFieldLandAllowed 0x0010
00169 #define MapFieldCoastAllowed 0x0020
00170 #define MapFieldWaterAllowed 0x0040
00171 #define MapFieldNoBuilding 0x0080
00172
00173 #define MapFieldUnpassable 0x0100
00174 #define MapFieldTransparent 0x0200
00175
00176 #define MapFieldLandUnit 0x1000
00177 #define MapFieldAirUnit 0x2000
00178 #define MapFieldSeaUnit 0x4000
00179 #define MapFieldBuilding 0x8000
00180
00181
00182
00183
00184
00188 class CMapInfo
00189 {
00190 public:
00191 std::string Description;
00192 std::string Filename;
00193 int MapWidth;
00194 int MapHeight;
00195 int PlayerType[PlayerMax];
00196 int PlayerSide[PlayerMax];
00197 unsigned int MapUID;
00198 };
00199
00200
00201
00202
00203
00205 class CMap
00206 {
00207 public:
00208
00210 void Create();
00212 void Init();
00214 void Clean();
00216 void CleanFogOfWar();
00217
00219 unsigned short IsTileVisible(const CPlayer *player, int x, int y) const;
00220
00222 bool IsFieldExplored(const CPlayer *player, int x, int y) const
00223 {
00224 return IsTileVisible(player, x, y) > 0;
00225 }
00227 bool IsFieldVisible(const CPlayer *player, int x, int y) const
00228 {
00229 return IsTileVisible(player, x, y) > 1;
00230 }
00231
00233 void Reveal(void);
00235 void Save(CFile *file) const;
00236
00238 inline CMapField *Field(int x, int y) const {
00239 return &this->Fields[x + y * this->Info.MapWidth];
00240 }
00241
00242
00243
00244
00246 bool WaterOnMap(int x, int y) const;
00248 bool CoastOnMap(int x, int y) const;
00249
00250
00251 private:
00253 void InitFogOfWar(void);
00254
00255 public:
00256 CMapField *Fields;
00257 unsigned *Visible[PlayerMax];
00258
00259 bool NoFogOfWar;
00260
00261 static CGraphic *FogGraphic;
00262
00263 CPatchManager PatchManager;
00264
00265 CMapInfo Info;
00266 };
00267
00268
00269
00270
00271
00272 extern CMap Map;
00273 extern char CurrentMapPath[1024];
00274
00276 extern unsigned char *VisionTable[3];
00278 extern int *VisionLookup;
00279
00281 extern int FlagRevealMap;
00283 extern int ReplayRevealMap;
00284
00285 extern int TileSizeX;
00286 extern int TileSizeY;
00287
00288
00289
00290
00291
00292
00293
00294
00296 typedef void MapMarkerFunc(const CPlayer *player, int x, int y);
00297
00299 extern int MapFogFilterFlags(CPlayer *player, int x, int y, int mask);
00301 extern MapMarkerFunc MapMarkTileSight;
00303 extern MapMarkerFunc MapUnmarkTileSight;
00304
00306 extern void MapSight(const CPlayer *player, int x, int y, int w,
00307 int h, int range, MapMarkerFunc *marker);
00309 extern void MapUpdateFogOfWar(int x, int y);
00311 extern void UpdateFogOfWarChange(void);
00312
00314 extern void InitVisionTable(void);
00316 extern void FreeVisionTable(void);
00317
00318
00319
00320
00321
00323 extern bool UnitVisibleOnRadar(const CPlayer *pradar, const CUnit *punit);
00325 extern unsigned char IsTileRadarVisible(const CPlayer *pradar, const CPlayer *punit, int x, int y);
00327 extern void MapMarkTileRadar(const CPlayer *player, int x, int y);
00329 extern void MapUnmarkTileRadar(const CPlayer *player, int x, int y);
00331 extern void MapMarkTileRadarJammer(const CPlayer *player, int x, int y);
00333 extern void MapUnmarkTileRadarJammer(const CPlayer *player, int x, int y);
00334
00335
00336
00337
00339 extern void MapCclRegister(void);
00340
00341
00342
00343
00345 extern int SaveStratagusMap(const std::string &filename, CMap *map);
00346
00347
00349 extern void LoadStratagusMapInfo(const std::string &mapname);
00351 extern void FreeMapInfo(CMapInfo *info);
00352
00354 extern bool CheckedCanMoveToMask(int x, int y, int mask);
00356 extern bool UnitTypeCanBeAt(const CUnitType *type, int x, int y);
00358 extern bool UnitCanBeAt(const CUnit *unit, int x, int y);
00359
00360
00361
00363 void MapMarkUnitSight(CUnit *unit);
00365 void MapUnmarkUnitSight(CUnit *unit);
00366
00367
00368
00369
00370
00372 inline bool CanMoveToMask(int x, int y, int mask) {
00373 return !(Map.Field(x, y)->Flags & mask);
00374 }
00375
00376 inline void MapMarkSight(const CPlayer *player, int x, int y, int w, int h, int range) {
00377 MapSight(player, x, y, w, h, range, MapMarkTileSight);
00378 }
00379 inline void MapUnmarkSight(const CPlayer *player, int x, int y, int w, int h, int range) {
00380 MapSight(player, x, y, w, h, range, MapUnmarkTileSight);
00381 }
00382
00384 inline void MapMarkRadar(const CPlayer *player, int x, int y, int w, int h, int range) {
00385 MapSight(player, x, y, w, h, range, MapMarkTileRadar);
00386 }
00387 inline void MapUnmarkRadar(const CPlayer *player, int x, int y, int w, int h, int range) {
00388 MapSight(player, x, y, w, h, range, MapUnmarkTileRadar);
00389 }
00391 inline void MapMarkRadarJammer(const CPlayer *player, int x, int y, int w, int h, int range) {
00392 MapSight(player, x, y, w, h, range, MapMarkTileRadarJammer);
00393 }
00394 inline void MapUnmarkRadarJammer(const CPlayer *player, int x, int y, int w, int h, int range) {
00395 MapSight(player, x, y, w, h, range, MapUnmarkTileRadarJammer);
00396 }
00397
00399
00400 #endif // !__MAP_H__