// // MinimapManager.h // // Handles all minimap-related functions. // Written by Matthew Fisher // const UINT MinimapGridSize = 32; const float MinimapGridSizeInv = 1.0f / float(MinimapGridSize); extern const RGBColor MinimapResourceColor; struct MinimapCell { MinimapCell() { LastExploreTime = -1.0; AllyNearby = false; EnemyNearby = false; } double LastExploreTime; bool AllyNearby; bool EnemyNearby; }; struct MinimapPixelHistory { float ObservationFrequency; }; class MinimapManager : public Manager { public: void Init(); void ResetNewGame(); void EndFrame(); bool MinimapCaptureNeeded() const; void MakeExplorationBitmap(Bitmap &Result) const; void MakeArmyBitmap(Bitmap &Result) const; bool MinimapIsCovered() const; void ReportMinimapCapture(); float MinimapCoordDistToBase(const Vec2f &MinimapCoord) const; Vec2f FindNearestEnemyCoord(const Vec2f &MinimapCoord) const; __forceinline Bitmap& Minimap() { return _Minimap; } __forceinline const Vector& SelfPixelCoordinates() const { return _SelfPixelCoordinates; } __forceinline const Grid& Cells() const { return _Cells; } __forceinline double ArmySize() const { return _ArmySize; } __forceinline double ArmyScatter() const { return _ArmyScatter; } __forceinline const Vec2f& ArmyLocation() const { return _ArmyLocation; } __forceinline bool Conflicted() const { return _Conflicted; } __forceinline static Vec2i CellCoordFromMinimapCoord(const Vec2f &MinimapCoord) { Vec2i Result; Result.x = Utility::Bound(int(MinimapCoord.x * MinimapGridSize), 0, int(MinimapGridSize) - 1); Result.y = Utility::Bound(int(MinimapCoord.y * MinimapGridSize), 0, int(MinimapGridSize) - 1); return Result; } __forceinline static Vec2f MinimapCoordFromCellCoord(const Vec2i &CellCoord) { Vec2f Result; Result.x = (CellCoord.x + 0.5f) * MinimapGridSizeInv; Result.y = (CellCoord.y + 0.5f) * MinimapGridSizeInv; return Result; } private: void UpdateCells(); void UpdateHistory(); void UpdateArmyStats(); Grid _PixelHistory; Grid _Cells; Vector _SelfPixelCoordinates; Vector _EnemyPixelCoordinates; Bitmap _Minimap; double _LastSuccessfulMinimapCapture; double _LastMinimapCapture; double _ArmySize; double _ArmyScatter; Vec2f _ArmyLocation; bool _Conflicted; };