/* ** Command & Conquer Generals(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ //////////////////////////////////////////////////////////////////////////////// // // // (c) 2001-2003 Electronic Arts Inc. // // // //////////////////////////////////////////////////////////////////////////////// // FILE: MapUtil.h ///////////////////////////////////////////////////////// // Author: Matt Campbell, December 2001 // Description: Map utility/convenience routines //////////////////////////////////////////////////////////////////////////// #pragma once #ifndef __MAPUTIL_H__ #define __MAPUTIL_H__ #include "Common/AsciiString.h" #include "Common/UnicodeString.h" #include "Common/STLTypedefs.h" class GameWindow; class AsciiString; struct Coord3D; struct FileInfo; class Image; class DataChunkInput; struct DataChunkInfo; // This matches the windows timestamp. enum { SUPPLY_TECH_SIZE = 15}; typedef std::list ICoord2DList; class TechAndSupplyImages { public: ICoord2DList m_techPosList; ICoord2DList m_supplyPosList; }; struct WinTimeStamp { UnsignedInt m_lowTimeStamp; UnsignedInt m_highTimeStamp; }; class WaypointMap : public std::map { public: void update( void ); ///< returns the number of multiplayer start spots found Int m_numStartSpots; }; typedef std::list Coord3DList; class MapMetaData { public: UnicodeString m_displayName; Region3D m_extent; Int m_numPlayers; Bool m_isMultiplayer; Bool m_isOfficial; UnsignedInt m_filesize; UnsignedInt m_CRC; WinTimeStamp m_timestamp; WaypointMap m_waypoints; Coord3DList m_supplyPositions; Coord3DList m_techPositions; AsciiString m_fileName; }; class MapCache : public std::map { public: MapCache() {} void updateCache( void ); AsciiString getMapDir() const; AsciiString getUserMapDir() const; AsciiString getMapExtension() const; const MapMetaData *findMap(AsciiString mapName); // allow us to create a set of shippable maps to be in mapcache.ini. For use with -buildMapCache. void addShippingMap(AsciiString mapName) { mapName.toLower(); m_allowedMaps.insert(mapName); } private: Bool clearUnseenMaps( AsciiString dirName ); void loadStandardMaps(void); Bool loadUserMaps(void); // returns true if we needed to (re)parse a map // Bool addMap( AsciiString dirName, AsciiString fname, WinTimeStamp timestamp, // UnsignedInt filesize, Bool isOfficial ); ///< returns true if it had to (re)parse the map Bool addMap( AsciiString dirName, AsciiString fname, FileInfo *fileInfo, Bool isOfficial); ///< returns true if it had to (re)parse the map void writeCacheINI( Bool userDir ); static const char * m_mapCacheName; std::map m_seen; std::set m_allowedMaps; }; extern MapCache *TheMapCache; extern TechAndSupplyImages TheSupplyAndTechImageLocations; Int populateMapListbox( GameWindow *listbox, Bool useSystemMaps, Bool isMultiplayer, AsciiString mapToSelect = AsciiString::TheEmptyString ); /// Read a list of maps from the run directory and fill in the listbox. Return the selected index Int populateMapListboxNoReset( GameWindow *listbox, Bool useSystemMaps, Bool isMultiplayer, AsciiString mapToSelect = AsciiString::TheEmptyString ); /// Read a list of maps from the run directory and fill in the listbox. Return the selected index Bool isValidMap( AsciiString mapName, Bool isMultiplayer ); /// Validate a map Image *getMapPreviewImage( AsciiString mapName ); AsciiString getDefaultMap( Bool isMultiplayer ); /// Find a valid map Bool parseMapPreviewChunk(DataChunkInput &file, DataChunkInfo *info, void *userData); void findDrawPositions( Int startX, Int startY, Int width, Int height, Region3D extent, ICoord2D *ul, ICoord2D *lr ); Bool WouldMapTransfer( const AsciiString& mapName ); #endif // __MAPUTIL_H__