mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
Add RMG option "forcePortal"
This commit is contained in:
parent
dbcd7677ac
commit
f4f416eb16
@ -99,7 +99,7 @@
|
||||
"type":
|
||||
{
|
||||
"type" : "string",
|
||||
"enum" : ["wide", "fictive", "repulsive"]
|
||||
"enum" : ["wide", "fictive", "repulsive", "forcePortal"]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -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
|
||||
]
|
||||
|
@ -463,7 +463,8 @@ void ZoneConnection::serializeJson(JsonSerializeFormat & handler)
|
||||
"guarded",
|
||||
"fictive",
|
||||
"repulsive",
|
||||
"wide"
|
||||
"wide",
|
||||
"forcePortal"
|
||||
};
|
||||
|
||||
static const std::vector<std::string> roadOptions =
|
||||
|
@ -75,7 +75,8 @@ enum class EConnectionType
|
||||
GUARDED = 0, //default
|
||||
FICTIVE,
|
||||
REPULSIVE,
|
||||
WIDE
|
||||
WIDE,
|
||||
FORCE_PORTAL
|
||||
};
|
||||
|
||||
enum class ERoadOption
|
||||
|
@ -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()
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user