Sfoglia il codice sorgente

Experiments with object distance.

DjWarmonger 11 anni fa
parent
commit
67d8a24f0b

+ 2 - 2
lib/rmg/CMapGenerator.cpp

@@ -440,7 +440,7 @@ CTileInfo CMapGenerator::getTile(const int3&  tile) const
 	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))
 		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);
 }
 
-int CMapGenerator::getNearestObjectDistance(const int3 &tile) const
+float CMapGenerator::getNearestObjectDistance(const int3 &tile) const
 {
 	if (!map->isInTheMap(tile))
 		throw rmgException(boost::to_string(boost::format("Tile %s is outside the map") % tile));

+ 2 - 2
lib/rmg/CMapGenerator.h

@@ -74,8 +74,8 @@ public:
 	void setOccupied(const int3 &tile, ETileType::ETileType state);
 	CTileInfo getTile(const int3 & tile) const;
 
-	int getNearestObjectDistance(const int3 &tile) const; 
-	void setNearestObjectDistance(int3 &tile, int value);
+	float getNearestObjectDistance(const int3 &tile) const; 
+	void setNearestObjectDistance(int3 &tile, float value);
 
 	int getNextMonlithIndex();
 	int getPrisonsRemaning() const;

+ 9 - 8
lib/rmg/CRmgTemplateZone.cpp

@@ -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
 }
 
-int CTileInfo::getNearestObjectDistance() const
+float CTileInfo::getNearestObjectDistance() const
 {
 	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
 {
@@ -1077,7 +1077,8 @@ bool CRmgTemplateZone::createRequiredObjects(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 {
 		
@@ -1088,7 +1089,7 @@ void CRmgTemplateZone::createTreasures(CMapGenerator* gen)
 		});
 
 		int3 pos;
-		if ( ! findPlaceForTreasurePile(gen,  minDistance, pos))		
+		if ( ! findPlaceForTreasurePile(gen, minDistance, pos))		
 		{
 			break;
 		}
@@ -1197,10 +1198,10 @@ bool CRmgTemplateZone::fill(CMapGenerator* gen)
 	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);
-	int best_distance = 0;
+	float best_distance = 0;
 	bool result = false;
 
 	//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
 		{		
 			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)));
 		}
 	}
 }

+ 4 - 4
lib/rmg/CRmgTemplateZone.h

@@ -40,8 +40,8 @@ public:
 
 	CTileInfo();
 
-	int getNearestObjectDistance() const;
-	void setNearestObjectDistance(int value);
+	float getNearestObjectDistance() const;
+	void setNearestObjectDistance(float value);
 	bool isBlocked() const;
 	bool shouldBeBlocked() const;
 	bool isPossible() const;
@@ -52,7 +52,7 @@ public:
 	void setTerrainType(ETerrainType value);
 
 private:
-	int nearestObjectDistance;
+	float nearestObjectDistance;
 	ETileType::ETileType occupied;
 	ETerrainType terrain;
 };
@@ -215,7 +215,7 @@ private:
 	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 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);
 	void checkAndPlaceObject(CMapGenerator* gen, CGObjectInstance* object, const int3 &pos);
 	void placeObject(CMapGenerator* gen, CGObjectInstance* object, const int3 &pos, bool updateDistance = true);