mirror of
https://github.com/vcmi/vcmi.git
synced 2025-11-29 23:07:48 +02:00
Experiments with object distance.
This commit is contained in:
@@ -440,7 +440,7 @@ CTileInfo CMapGenerator::getTile(const int3& tile) const
|
|||||||
return tiles[tile.x][tile.y][tile.z];
|
return tiles[tile.x][tile.y][tile.z];
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapGenerator::setNearestObjectDistance(int3 &tile, int value)
|
void CMapGenerator::setNearestObjectDistance(int3 &tile, float value)
|
||||||
{
|
{
|
||||||
if (!map->isInTheMap(tile))
|
if (!map->isInTheMap(tile))
|
||||||
throw rmgException(boost::to_string(boost::format("Tile %s is outside the map") % tile));
|
throw rmgException(boost::to_string(boost::format("Tile %s is outside the map") % tile));
|
||||||
@@ -448,7 +448,7 @@ void CMapGenerator::setNearestObjectDistance(int3 &tile, int value)
|
|||||||
tiles[tile.x][tile.y][tile.z].setNearestObjectDistance(value);
|
tiles[tile.x][tile.y][tile.z].setNearestObjectDistance(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
int CMapGenerator::getNearestObjectDistance(const int3 &tile) const
|
float CMapGenerator::getNearestObjectDistance(const int3 &tile) const
|
||||||
{
|
{
|
||||||
if (!map->isInTheMap(tile))
|
if (!map->isInTheMap(tile))
|
||||||
throw rmgException(boost::to_string(boost::format("Tile %s is outside the map") % tile));
|
throw rmgException(boost::to_string(boost::format("Tile %s is outside the map") % tile));
|
||||||
|
|||||||
@@ -74,8 +74,8 @@ public:
|
|||||||
void setOccupied(const int3 &tile, ETileType::ETileType state);
|
void setOccupied(const int3 &tile, ETileType::ETileType state);
|
||||||
CTileInfo getTile(const int3 & tile) const;
|
CTileInfo getTile(const int3 & tile) const;
|
||||||
|
|
||||||
int getNearestObjectDistance(const int3 &tile) const;
|
float getNearestObjectDistance(const int3 &tile) const;
|
||||||
void setNearestObjectDistance(int3 &tile, int value);
|
void setNearestObjectDistance(int3 &tile, float value);
|
||||||
|
|
||||||
int getNextMonlithIndex();
|
int getNextMonlithIndex();
|
||||||
int getPrisonsRemaning() const;
|
int getPrisonsRemaning() const;
|
||||||
|
|||||||
@@ -86,14 +86,14 @@ CTileInfo::CTileInfo():nearestObjectDistance(INT_MAX), terrain(ETerrainType::WRO
|
|||||||
occupied = ETileType::POSSIBLE; //all tiles are initially possible to place objects or passages
|
occupied = ETileType::POSSIBLE; //all tiles are initially possible to place objects or passages
|
||||||
}
|
}
|
||||||
|
|
||||||
int CTileInfo::getNearestObjectDistance() const
|
float CTileInfo::getNearestObjectDistance() const
|
||||||
{
|
{
|
||||||
return nearestObjectDistance;
|
return nearestObjectDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTileInfo::setNearestObjectDistance(int value)
|
void CTileInfo::setNearestObjectDistance(float value)
|
||||||
{
|
{
|
||||||
nearestObjectDistance = std::max(0, value); //never negative (or unitialized)
|
nearestObjectDistance = std::max<float>(0, value); //never negative (or unitialized)
|
||||||
}
|
}
|
||||||
bool CTileInfo::shouldBeBlocked() const
|
bool CTileInfo::shouldBeBlocked() const
|
||||||
{
|
{
|
||||||
@@ -1077,7 +1077,8 @@ bool CRmgTemplateZone::createRequiredObjects(CMapGenerator* gen)
|
|||||||
|
|
||||||
void CRmgTemplateZone::createTreasures(CMapGenerator* gen)
|
void CRmgTemplateZone::createTreasures(CMapGenerator* gen)
|
||||||
{
|
{
|
||||||
const double minDistance = 3;
|
const double minDistance = std::max<float>(15.0f / sqrt(totalDensity), 2);
|
||||||
|
//distance lower than 2 causes objects to overlap and crash
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
@@ -1088,7 +1089,7 @@ void CRmgTemplateZone::createTreasures(CMapGenerator* gen)
|
|||||||
});
|
});
|
||||||
|
|
||||||
int3 pos;
|
int3 pos;
|
||||||
if ( ! findPlaceForTreasurePile(gen, minDistance, pos))
|
if ( ! findPlaceForTreasurePile(gen, minDistance, pos))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1197,10 +1198,10 @@ bool CRmgTemplateZone::fill(CMapGenerator* gen)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CRmgTemplateZone::findPlaceForTreasurePile(CMapGenerator* gen, si32 min_dist, int3 &pos)
|
bool CRmgTemplateZone::findPlaceForTreasurePile(CMapGenerator* gen, float min_dist, int3 &pos)
|
||||||
{
|
{
|
||||||
//si32 min_dist = sqrt(tileinfo.size()/density);
|
//si32 min_dist = sqrt(tileinfo.size()/density);
|
||||||
int best_distance = 0;
|
float best_distance = 0;
|
||||||
bool result = false;
|
bool result = false;
|
||||||
|
|
||||||
//logGlobal->infoStream() << boost::format("Min dist for density %f is %d") % density % min_dist;
|
//logGlobal->infoStream() << boost::format("Min dist for density %f is %d") % density % min_dist;
|
||||||
@@ -1385,7 +1386,7 @@ void CRmgTemplateZone::placeObject(CMapGenerator* gen, CGObjectInstance* object,
|
|||||||
for(auto tile : possibleTiles) //don't need to mark distance for not possible tiles
|
for(auto tile : possibleTiles) //don't need to mark distance for not possible tiles
|
||||||
{
|
{
|
||||||
si32 d = pos.dist2dSQ(tile); //optimization, only relative distance is interesting
|
si32 d = pos.dist2dSQ(tile); //optimization, only relative distance is interesting
|
||||||
gen->setNearestObjectDistance(tile, std::min(d, gen->getNearestObjectDistance(tile)));
|
gen->setNearestObjectDistance(tile, std::min<float>(d, gen->getNearestObjectDistance(tile)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ public:
|
|||||||
|
|
||||||
CTileInfo();
|
CTileInfo();
|
||||||
|
|
||||||
int getNearestObjectDistance() const;
|
float getNearestObjectDistance() const;
|
||||||
void setNearestObjectDistance(int value);
|
void setNearestObjectDistance(float value);
|
||||||
bool isBlocked() const;
|
bool isBlocked() const;
|
||||||
bool shouldBeBlocked() const;
|
bool shouldBeBlocked() const;
|
||||||
bool isPossible() const;
|
bool isPossible() const;
|
||||||
@@ -52,7 +52,7 @@ public:
|
|||||||
void setTerrainType(ETerrainType value);
|
void setTerrainType(ETerrainType value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int nearestObjectDistance;
|
float nearestObjectDistance;
|
||||||
ETileType::ETileType occupied;
|
ETileType::ETileType occupied;
|
||||||
ETerrainType terrain;
|
ETerrainType terrain;
|
||||||
};
|
};
|
||||||
@@ -215,7 +215,7 @@ private:
|
|||||||
void addAllPossibleObjects (CMapGenerator* gen); //add objects, including zone-specific, to possibleObjects
|
void addAllPossibleObjects (CMapGenerator* gen); //add objects, including zone-specific, to possibleObjects
|
||||||
bool isAccessibleFromAnywhere (CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile, const std::set<int3> &tilesBlockedByObject) const;
|
bool isAccessibleFromAnywhere (CMapGenerator* gen, ObjectTemplate &appearance, int3 &tile, const std::set<int3> &tilesBlockedByObject) const;
|
||||||
bool findPlaceForObject(CMapGenerator* gen, CGObjectInstance* obj, si32 min_dist, int3 &pos);
|
bool findPlaceForObject(CMapGenerator* gen, CGObjectInstance* obj, si32 min_dist, int3 &pos);
|
||||||
bool findPlaceForTreasurePile(CMapGenerator* gen, si32 min_dist, int3 &pos);
|
bool findPlaceForTreasurePile(CMapGenerator* gen, float min_dist, int3 &pos);
|
||||||
bool canObstacleBePlacedHere(CMapGenerator* gen, ObjectTemplate &temp, int3 &pos);
|
bool canObstacleBePlacedHere(CMapGenerator* gen, ObjectTemplate &temp, int3 &pos);
|
||||||
void checkAndPlaceObject(CMapGenerator* gen, CGObjectInstance* object, const int3 &pos);
|
void checkAndPlaceObject(CMapGenerator* gen, CGObjectInstance* object, const int3 &pos);
|
||||||
void placeObject(CMapGenerator* gen, CGObjectInstance* object, const int3 &pos, bool updateDistance = true);
|
void placeObject(CMapGenerator* gen, CGObjectInstance* object, const int3 &pos, bool updateDistance = true);
|
||||||
|
|||||||
Reference in New Issue
Block a user