Преглед изворни кода

Placing towns according to template.

DjWarmonger пре 11 година
родитељ
комит
60df94a3f5
2 измењених фајлова са 88 додато и 4 уклоњено
  1. 1 1
      config/rmg.json
  2. 87 3
      lib/rmg/CRmgTemplateZone.cpp

+ 1 - 1
config/rmg.json

@@ -290,7 +290,7 @@
 			"5" :
 			{
 				"type" : "treasure", "size" : 40,
-				"neutralTowns" : { "towns" : 2 },
+				"neutralTowns" : { "castles" : 2 },
 				"terrainTypes" : [ "sand" ], "matchTerrainToTown" : false,
 				"monsters" : "strong",
 				"mines" : {"gold" : 4},

+ 87 - 3
lib/rmg/CRmgTemplateZone.cpp

@@ -710,28 +710,35 @@ bool CRmgTemplateZone::createTreasurePile (CMapGenerator* gen, int3 &pos)
 }
 void CRmgTemplateZone::initTownType (CMapGenerator* gen)
 {
+
+	//FIXME: handle case that this player is not present -> towns should be set to neutral
+	int totalTowns = 0;
+
 	if ((type == ETemplateZoneType::CPU_START) || (type == ETemplateZoneType::PLAYER_START))
 	{
+		//set zone types to player faction, generate main town
 		logGlobal->infoStream() << "Preparing playing zone";
 		int player_id = *owner - 1;
 		auto & playerInfo = gen->map->players[player_id];
 		if (playerInfo.canAnyonePlay())
 		{
 			PlayerColor player(player_id);
-			auto  town = new CGTownInstance();
-			town->ID = Obj::TOWN;
 			townType = gen->mapGenOptions->getPlayersSettings().find(player)->second.getStartingTown();
 
 			if(townType == CMapGenOptions::CPlayerSettings::RANDOM_TOWN)
 				townType = *RandomGeneratorUtil::nextItem(VLC->townh->getAllowedFactions(), gen->rand); // all possible towns, skip neutral
+			
+			auto  town = new CGTownInstance();
+			town->ID = Obj::TOWN;
 
 			town->subID = townType;
 			town->tempOwner = player;
 			town->builtBuildings.insert(BuildingID::FORT);
 			town->builtBuildings.insert(BuildingID::DEFAULT);
-			
 			placeObject(gen, town, getPos() + town->getVisitableOffset()); //towns are big objects and should be centered around visitable position
 
+			totalTowns++;
+
 			logGlobal->traceStream() << "Fill player info " << player_id;
 
 			// Update player info
@@ -741,6 +748,42 @@ void CRmgTemplateZone::initTownType (CMapGenerator* gen)
 			playerInfo.posOfMainTown = town->pos - int3(2, 0, 0);
 			playerInfo.generateHeroAtMainTown = true;
 
+			//now create actual towns
+			for (int i = 1; i < playerTowns.getCastleCount(); i++)
+			{
+				auto  town = new CGTownInstance();
+				town->ID = Obj::TOWN;
+
+				if (townsAreSameType)
+					town->subID = townType;
+				else
+					town->subID = *RandomGeneratorUtil::nextItem(VLC->townh->getAllowedFactions(), gen->rand); //TODO: check allowed town types for this zone
+
+				town->tempOwner = player;
+				town->builtBuildings.insert(BuildingID::FORT);
+				town->builtBuildings.insert(BuildingID::DEFAULT);
+
+				addRequiredObject (town);
+				totalTowns++;
+			}
+
+			for (int i = 0; i < playerTowns.getTownCount(); i++)
+			{
+				auto  town = new CGTownInstance();
+				town->ID = Obj::TOWN;
+
+				if (townsAreSameType)
+					town->subID = townType;
+				else
+					town->subID = *RandomGeneratorUtil::nextItem(VLC->townh->getAllowedFactions(), gen->rand); //TODO: check allowed town types for this zone
+
+				town->tempOwner = player;
+				town->builtBuildings.insert(BuildingID::DEFAULT);
+
+				addRequiredObject (town);
+				totalTowns++;
+			}
+
 			//requiredObjects.push_back(town);
 		}
 		else
@@ -754,6 +797,47 @@ void CRmgTemplateZone::initTownType (CMapGenerator* gen)
 	{
 		townType = *RandomGeneratorUtil::nextItem(VLC->townh->getAllowedFactions(), gen->rand);
 	}
+
+	for (int i = 0; i < neutralTowns.getCastleCount(); i++)
+	{
+		auto  town = new CGTownInstance();
+		town->ID = Obj::TOWN;
+
+		if (townsAreSameType || totalTowns == 0) //first town must match zone type
+			town->subID = townType;
+		else
+			town->subID = *RandomGeneratorUtil::nextItem(VLC->townh->getAllowedFactions(), gen->rand); //TODO: check allowed town types for this zone
+
+		town->tempOwner = PlayerColor::NEUTRAL;
+		town->builtBuildings.insert(BuildingID::FORT);
+		town->builtBuildings.insert(BuildingID::DEFAULT);
+
+		if (!totalTowns) //first town in zone goes in the middle
+			placeObject(gen, town, getPos() + town->getVisitableOffset());
+		else
+			addRequiredObject (town);
+		totalTowns++;
+	}
+
+	for (int i = 0; i < neutralTowns.getTownCount(); i++)
+	{
+		auto  town = new CGTownInstance();
+		town->ID = Obj::TOWN;
+
+		if (townsAreSameType || totalTowns == 0)
+			town->subID = townType;
+		else
+			town->subID = *RandomGeneratorUtil::nextItem(VLC->townh->getAllowedFactions(), gen->rand); //TODO: check allowed town types for this zone
+
+		town->tempOwner = PlayerColor::NEUTRAL;
+		town->builtBuildings.insert(BuildingID::DEFAULT);
+
+		if (!totalTowns)
+			placeObject(gen, town, getPos() + town->getVisitableOffset());
+		else
+			addRequiredObject (town);
+		totalTowns++;
+	}
 }
 
 void CRmgTemplateZone::initTerrainType (CMapGenerator* gen)