瀏覽代碼

Respect GUI settings for roads. By default, all road types are enabled.

Tomasz Zieliński 2 年之前
父節點
當前提交
730b36612c

+ 2 - 3
client/lobby/RandomMapTab.cpp

@@ -119,12 +119,11 @@ RandomMapTab::RandomMapTab():
 		std::string cbRoadType = "selectRoad_" + road->getJsonKey();
 		addCallback(cbRoadType, [&, road](bool on)
 		{
-			mapGenOptions->setRoadEnabled(road->getJsonKey(), on);
+			mapGenOptions->setRoadEnabled(road->getId(), on);
 			updateMapInfoByHost();
 		});
 	}
 	
-	
 	build(config);
 	
 	updateMapInfoByHost();
@@ -313,7 +312,7 @@ void RandomMapTab::setMapGenOptions(std::shared_ptr<CMapGenOptions> opts)
 	{
 		if(auto w = widget<CToggleButton>(r->getJsonKey()))
 		{
-			w->setSelected(opts->isRoadEnabled(r->getJsonKey()));
+			w->setSelected(opts->isRoadEnabled(r->getId()));
 		}
 	}
 }

+ 19 - 6
lib/rmg/CMapGenOptions.cpp

@@ -1,3 +1,4 @@
+#include "CMapGenOptions.h"
 /*
  * CMapGenOptions.cpp, part of VCMI engine
  *
@@ -26,6 +27,9 @@ CMapGenOptions::CMapGenOptions()
 	waterContent(EWaterContent::RANDOM), monsterStrength(EMonsterStrength::RANDOM), mapTemplate(nullptr)
 {
 	resetPlayersMap();
+	setRoadEnabled(RoadId(Road::DIRT_ROAD), true);
+	setRoadEnabled(RoadId(Road::GRAVEL_ROAD), true);
+	setRoadEnabled(RoadId(Road::COBBLESTONE_ROAD), true);
 }
 
 si32 CMapGenOptions::getWidth() const
@@ -233,17 +237,26 @@ void CMapGenOptions::setMapTemplate(const std::string & name)
 		setMapTemplate(VLC->tplh->getTemplate(name));
 }
 
-void CMapGenOptions::setRoadEnabled(const std::string & roadName, bool enable)
+void CMapGenOptions::setRoadEnabled(const RoadId & roadType, bool enable)
 {
-	if(enable)
-		disabledRoads.erase(roadName);
+	if (enable)
+	{
+		enabledRoads.insert(roadType);
+	}
 	else
-		disabledRoads.insert(roadName);
+	{
+		enabledRoads.erase(roadType);
+	}	
+}
+
+bool CMapGenOptions::isRoadEnabled(const RoadId & roadType) const
+{
+	return enabledRoads.count(roadType);
 }
 
-bool CMapGenOptions::isRoadEnabled(const std::string & roadName) const
+bool CMapGenOptions::isRoadEnabled() const
 {
-	return !disabledRoads.count(roadName);
+	return !enabledRoads.empty();
 }
 
 void CMapGenOptions::setPlayerTeam(const PlayerColor & color, const TeamID & team)

+ 5 - 4
lib/rmg/CMapGenOptions.h

@@ -110,8 +110,9 @@ public:
 	EMonsterStrength::EMonsterStrength getMonsterStrength() const;
 	void setMonsterStrength(EMonsterStrength::EMonsterStrength value);
 	
-	bool isRoadEnabled(const std::string & roadName) const;
-	void setRoadEnabled(const std::string & roadName, bool enable);
+	bool isRoadEnabled(const RoadId & roadType) const;
+	bool isRoadEnabled() const;
+	void setRoadEnabled(const RoadId & roadType, bool enable);
 
 	/// The first player colors belong to standard players and the last player colors belong to comp only players.
 	/// All standard players are by default of type EPlayerType::AI.
@@ -156,7 +157,7 @@ private:
 	EWaterContent::EWaterContent waterContent;
 	EMonsterStrength::EMonsterStrength monsterStrength;
 	std::map<PlayerColor, CPlayerSettings> players;
-	std::set<std::string> disabledRoads;
+	std::set<RoadId> enabledRoads;
 	
 	const CRmgTemplate * mapTemplate;
 
@@ -187,7 +188,7 @@ public:
 				setMapTemplate(templateName);
 			}
 			
-			h & disabledRoads;
+			h & enabledRoads;
 		}
 	}
 };

+ 2 - 0
lib/rmg/CMapGenerator.cpp

@@ -80,11 +80,13 @@ void CMapGenerator::loadConfig()
 	config.pandoraMultiplierSpells = randomMapJson["pandoras"]["valueMultiplierSpells"].Integer();
 	config.pandoraSpellSchool = randomMapJson["pandoras"]["valueSpellSchool"].Integer();
 	config.pandoraSpell60 = randomMapJson["pandoras"]["valueSpell60"].Integer();
+	/*
 	//override config with game options
 	if(!mapGenOptions.isRoadEnabled(config.secondaryRoadType))
 		config.secondaryRoadType = "";
 	if(!mapGenOptions.isRoadEnabled(config.defaultRoadType))
 		config.defaultRoadType = config.secondaryRoadType;
+	*/
 	config.singleThread = randomMapJson["singleThread"].Bool();
 }
 

+ 19 - 4
lib/rmg/modificators/RoadPlacer.cpp

@@ -79,9 +79,7 @@ bool RoadPlacer::createRoad(const int3 & dst)
 }
 
 void RoadPlacer::drawRoads(bool secondary)
-{
-	//TODO: Check road type set in lobby. If no road, return.
-	
+{	
 	{
 		//Clean space under roads even if they won't be eventually generated
 		Zone::Lock lock(zone.areaMutex);
@@ -90,15 +88,32 @@ void RoadPlacer::drawRoads(bool secondary)
 		zone.freePaths().unite(roads);
 	}
 
+	if (!generator.getMapGenOptions().isRoadEnabled())
+	{
+		return;
+	}
+
 	if((secondary && generator.getConfig().secondaryRoadType.empty())
 		|| (!secondary && generator.getConfig().defaultRoadType.empty()))
 		return;
 
+	//TODO: Allow custom road type for object
+	//TODO: Remove these default types
+
 	auto tiles = roads.getTilesVector();
 
 	std::string roadName = (secondary ? generator.getConfig().secondaryRoadType : generator.getConfig().defaultRoadType);
 	RoadId roadType(*VLC->modh->identifiers.getIdentifier(CModHandler::scopeGame(), "road", roadName));
-	mapProxy->drawRoads(zone.getRand(), tiles, roadType);
+
+	//If our road type is not enabled, choose highest below it
+	for (int8_t bestRoad = roadType.getNum(); bestRoad > RoadId(Road::NO_ROAD).getNum(); bestRoad--)
+	{
+		if (generator.getMapGenOptions().isRoadEnabled(RoadId(bestRoad)))
+		{
+			mapProxy->drawRoads(zone.getRand(), tiles, RoadId(bestRoad));
+			return;
+		}
+	}
 }
 
 void RoadPlacer::addRoadNode(const int3& node)