瀏覽代碼

Add RMG option "forcePortal"

Tomasz Zieliński 1 年之前
父節點
當前提交
f4f416eb16

+ 1 - 1
config/schemas/template.json

@@ -99,7 +99,7 @@
 				"type":
 				{
 					"type" : "string",
-					"enum" : ["wide", "fictive", "repulsive"]
+					"enum" : ["wide", "fictive", "repulsive", "forcePortal"]
 				}
 			}
 		},

+ 1 - 1
docs/modders/Random_Map_Template.md

@@ -38,7 +38,7 @@
 		{ "a" : "zoneA", "b" : "zoneB", "guard" : 5000, "road" : "false" },
 		{ "a" : "zoneA", "b" : "zoneC", "guard" : 5000, "road" : "random" },
 		{ "a" : "zoneB", "b" : "zoneC", "type" : "wide" }
-		//"type" can be "guarded" (default), "wide", "fictive" or "repulsive"
+		//"type" can be "guarded" (default), "wide", "fictive", "repulsive" or "forcePortal"
 		//"wide" connections have no border, or guard. "fictive" and "repulsive" connections are virtual -
 		//they do not create actual path, but only attract or repulse zones, respectively
 	]

+ 2 - 1
lib/rmg/CRmgTemplate.cpp

@@ -463,7 +463,8 @@ void ZoneConnection::serializeJson(JsonSerializeFormat & handler)
 		"guarded",
 		"fictive",
 		"repulsive",
-		"wide"
+		"wide",
+		"forcePortal"
 	};
 
 	static const std::vector<std::string> roadOptions =

+ 2 - 1
lib/rmg/CRmgTemplate.h

@@ -75,7 +75,8 @@ enum class EConnectionType
 	GUARDED = 0, //default
 	FICTIVE,
 	REPULSIVE,
-	WIDE
+	WIDE,
+	FORCE_PORTAL
 };
 
 enum class ERoadOption

+ 39 - 15
lib/rmg/modificators/ConnectionsPlacer.cpp

@@ -74,6 +74,11 @@ void ConnectionsPlacer::process()
 		}
 	};
 
+	diningPhilosophers([this](const rmg::ZoneConnection& c)
+	{
+		forcePortalConnection(c);
+	});
+
 	diningPhilosophers([this](const rmg::ZoneConnection& c)
 	{
 		selfSideDirectConnection(c);
@@ -115,6 +120,16 @@ void ConnectionsPlacer::otherSideConnection(const rmg::ZoneConnection & connecti
 	dCompleted.push_back(connection);
 }
 
+void ConnectionsPlacer::forcePortalConnection(const rmg::ZoneConnection & connection)
+{
+	// This should always succeed
+	if (connection.getConnectionType() == rmg::EConnectionType::FORCE_PORTAL)
+	{
+		placeMonolithConnection(connection);
+		dCompleted.push_back(connection);
+	}
+}
+
 void ConnectionsPlacer::selfSideDirectConnection(const rmg::ZoneConnection & connection)
 {
 	bool success = false;
@@ -410,23 +425,32 @@ void ConnectionsPlacer::selfSideIndirectConnection(const rmg::ZoneConnection & c
 	//4. place monoliths/portals
 	if(!success)
 	{
-		auto factory = VLC->objtypeh->getHandlerFor(Obj::MONOLITH_TWO_WAY, generator.getNextMonlithIndex());
-		auto * teleport1 = factory->create(map.mapInstance->cb, nullptr);
-		auto * teleport2 = factory->create(map.mapInstance->cb, nullptr);
-
-		RequiredObjectInfo obj1(teleport1, connection.getGuardStrength(), allowRoad);
-		RequiredObjectInfo obj2(teleport2, connection.getGuardStrength(), allowRoad);
-		zone.getModificator<ObjectManager>()->addRequiredObject(obj1);
-		otherZone->getModificator<ObjectManager>()->addRequiredObject(obj2);
-		
-		assert(otherZone->getModificator<ConnectionsPlacer>());
-		otherZone->getModificator<ConnectionsPlacer>()->otherSideConnection(connection);
-		
-		success = true;
+		placeMonolithConnection(connection);
 	}
-	
-	if(success)
+	else
+	{
 		dCompleted.push_back(connection);
+	}
+}
+
+void ConnectionsPlacer::placeMonolithConnection(const rmg::ZoneConnection & connection)
+{
+	auto otherZoneId = (connection.getZoneA() == zone.getId() ? connection.getZoneB() : connection.getZoneA());
+	auto & otherZone = map.getZones().at(otherZoneId);
+
+	bool allowRoad = shouldGenerateRoad(connection);
+
+	auto factory = VLC->objtypeh->getHandlerFor(Obj::MONOLITH_TWO_WAY, generator.getNextMonlithIndex());
+	auto * teleport1 = factory->create(map.mapInstance->cb, nullptr);
+	auto * teleport2 = factory->create(map.mapInstance->cb, nullptr);
+
+	RequiredObjectInfo obj1(teleport1, connection.getGuardStrength(), allowRoad);
+	RequiredObjectInfo obj2(teleport2, connection.getGuardStrength(), allowRoad);
+	zone.getModificator<ObjectManager>()->addRequiredObject(obj1);
+	otherZone->getModificator<ObjectManager>()->addRequiredObject(obj2);
+	
+	assert(otherZone->getModificator<ConnectionsPlacer>());
+	otherZone->getModificator<ConnectionsPlacer>()->otherSideConnection(connection);
 }
 
 void ConnectionsPlacer::collectNeighbourZones()

+ 2 - 1
lib/rmg/modificators/ConnectionsPlacer.h

@@ -23,7 +23,8 @@ public:
 	void init() override;
 	
 	void addConnection(const rmg::ZoneConnection& connection);
-	
+	void placeMonolithConnection(const rmg::ZoneConnection& connection);
+	void forcePortalConnection(const rmg::ZoneConnection & connection);
 	void selfSideDirectConnection(const rmg::ZoneConnection & connection);
 	void selfSideIndirectConnection(const rmg::ZoneConnection & connection);
 	void otherSideConnection(const rmg::ZoneConnection & connection);