Files
ZombieGame-Rawr/project/WorldExplorationGrid.h
Bram verhulst f9a11385fe Fianlly
2025-06-02 21:29:29 +02:00

81 lines
2.6 KiB
C++

#pragma once
#include "stdafx.h"
#define NOMINMAX
#include <unordered_map>
#include <vector>
#include <utility>
#include <Exam_HelperStructs.h>
#include <IExamInterface.h>
class WorldExplorationGrid {
public:
WorldExplorationGrid(float cellSize = 35);
void Update(const AgentInfo& agentInfo, const std::vector<HouseInfo>& visibleHouses);
Elite::Vector2 FindNearestUnexplored(const Elite::Vector2& fromPosition);
Elite::Vector2 FindUnexploredInHouse(const Elite::Vector2& fromPosition, const HouseInfo& house) const;
bool IsExplored(const Elite::Vector2& position) const;
float GetExploredPercentage() const;
float GetHouseExploredPercentage(const HouseInfo& house) const;
void Reset();
void SetCellSize(float newCellSize);
float GetCellSize() const { return m_CellSize; }
void SetWorldInfo(const WorldInfo& info);
void SetInterfacePtr(IExamInterface* pInterface) { m_pRenderer = pInterface; }
void RenderDebug();
private:
IExamInterface* m_pRenderer{ nullptr };
float m_CellSize;
WorldInfo m_WorldInfo{};
int m_MaxSearchRadius = 100;
struct GridCoords {
int x, y;
bool operator==(const GridCoords& other) const {
return x == other.x && y == other.y;
}
};
struct GridHash {
size_t operator()(const GridCoords& coords) const {
return static_cast<size_t>(coords.x) << 32 | coords.y;
}
};
struct GridCoordsHash {
size_t operator()(const GridCoords& coords) const {
return std::hash<int>()(coords.x) ^ (std::hash<int>()(coords.y) << 1);
}
};
WorldExplorationGrid::GridCoords ClampToWorldBounds(const GridCoords& coords) const {
int gridWidth = static_cast<int>(std::ceil(m_WorldInfo.Dimensions.x / m_CellSize));
int gridHeight = static_cast<int>(std::ceil(m_WorldInfo.Dimensions.y / m_CellSize));
return {
std::clamp(coords.x, 0, gridWidth - 1),
std::clamp(coords.y, 0, gridHeight - 1)
};
}
std::unordered_map<GridCoords, bool, GridHash> m_ExploredGrid;
GridCoords WorldToGrid(const Elite::Vector2& pos) const;
Elite::Vector2 GridToWorld(const GridCoords& gridCoords) const;
void MarkExplored(const std::vector<GridCoords>& cells);
std::vector<GridCoords> GetCellsInRadius(const Elite::Vector2& center, float radius) const;
std::vector<GridCoords> GetCellsInRect(const Elite::Vector2& center, const Elite::Vector2& size) const;
int CountExploredNeighbors(const GridCoords& coords) const;
GridCoords m_LastUnexploredCell = { 0,0 };
};