1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

Move road flag to placeObject() method

This commit is contained in:
Tomasz Zieliński
2023-07-07 20:17:20 +02:00
parent 3889193a48
commit 1cad64c470
7 changed files with 48 additions and 40 deletions

View File

@@ -240,7 +240,7 @@ void ConnectionsPlacer::selfSideDirectConnection(const rmg::ZoneConnection & con
{
rmg::Object monster(*monsterType);
monster.setPosition(guardPos);
manager.placeObject(monster, false, true);
manager.placeObject(monster, false, true, true);
//Place objects away from the monster in the other zone, too
otherZone->getModificator<ObjectManager>()->updateDistances(monster);
}
@@ -346,9 +346,8 @@ void ConnectionsPlacer::selfSideIndirectConnection(const rmg::ZoneConnection & c
zone.connectPath(path1);
otherZone->connectPath(path2);
//TODO: Check allowRoad
manager.placeObject(rmgGate1, guarded1, true);
managerOther.placeObject(rmgGate2, guarded2, true);
manager.placeObject(rmgGate1, guarded1, true, allowRoad);
managerOther.placeObject(rmgGate2, guarded2, true, allowRoad);
assert(otherZone->getModificator<ConnectionsPlacer>());
otherZone->getModificator<ConnectionsPlacer>()->otherSideConnection(connection);

View File

@@ -347,7 +347,7 @@ bool ObjectManager::createRequiredObjects()
}
zone.connectPath(path);
placeObject(rmgObject, guarded, true);
placeObject(rmgObject, guarded, true, objInfo.createRoad);
for(const auto & nearby : nearbyObjects)
{
@@ -364,7 +364,7 @@ bool ObjectManager::createRequiredObjects()
}
rmgNearObject.setPosition(*RandomGeneratorUtil::nextItem(possibleArea.getTiles(), zone.getRand()));
placeObject(rmgNearObject, false, false);
placeObject(rmgNearObject, false, false, nearby.createRoad);
}
}
@@ -430,7 +430,7 @@ bool ObjectManager::createRequiredObjects()
return true;
}
void ObjectManager::placeObject(rmg::Object & object, bool guarded, bool updateDistance, bool allowRoad/* = true*/)
void ObjectManager::placeObject(rmg::Object & object, bool guarded, bool updateDistance, bool createRoad/* = false*/)
{
object.finalize(map);
@@ -487,22 +487,22 @@ void ObjectManager::placeObject(rmg::Object & object, bool guarded, bool updateD
break;
}
}
if (allowRoad)
{
switch (object.instances().front()->object().ID)
{
case Obj::TOWN:
case Obj::RANDOM_TOWN:
case Obj::MONOLITH_TWO_WAY:
case Obj::MONOLITH_ONE_WAY_ENTRANCE:
case Obj::MONOLITH_ONE_WAY_EXIT:
case Obj::SUBTERRANEAN_GATE:
case Obj::SHIPYARD:
if (auto* m = zone.getModificator<RoadPlacer>())
m->addRoadNode(object.instances().front()->getVisitablePosition());
break;
if (createRoad)
{
if (auto* m = zone.getModificator<RoadPlacer>())
m->addRoadNode(object.instances().front()->getVisitablePosition());
}
//TODO: Add road node to these objects:
/*
case Obj::MONOLITH_ONE_WAY_ENTRANCE:
case Obj::RANDOM_TOWN:
case Obj::MONOLITH_ONE_WAY_EXIT:
*/
switch (object.instances().front()->object().ID)
{
case Obj::WATER_WHEEL:
if (auto* m = zone.getModificator<RiverPlacer>())
m->addRiverNode(object.instances().front()->getVisitablePosition());
@@ -510,7 +510,6 @@ void ObjectManager::placeObject(rmg::Object & object, bool guarded, bool updateD
default:
break;
}
}
}
@@ -617,14 +616,14 @@ RequiredObjectInfo::RequiredObjectInfo():
obj(nullptr),
nearbyTarget(nullptr),
guardStrength(0),
allowRoad(true)
createRoad(true)
{}
RequiredObjectInfo::RequiredObjectInfo(CGObjectInstance* obj, ui32 guardStrength, bool allowRoad, CGObjectInstance* nearbyTarget):
RequiredObjectInfo::RequiredObjectInfo(CGObjectInstance* obj, ui32 guardStrength, bool createRoad, CGObjectInstance* nearbyTarget):
obj(obj),
nearbyTarget(nearbyTarget),
guardStrength(guardStrength),
allowRoad(allowRoad)
createRoad(createRoad)
{}

View File

@@ -32,13 +32,13 @@ struct DistanceMaximizeFunctor
struct RequiredObjectInfo
{
RequiredObjectInfo();
RequiredObjectInfo(CGObjectInstance* obj, ui32 guardStrength = 0, bool allowRoad = true, CGObjectInstance* nearbyTarget = nullptr);
RequiredObjectInfo(CGObjectInstance* obj, ui32 guardStrength = 0, bool createRoad = false, CGObjectInstance* nearbyTarget = nullptr);
CGObjectInstance* obj;
CGObjectInstance* nearbyTarget;
int3 pos;
ui32 guardStrength;
bool allowRoad;
bool createRoad;
};
class ObjectManager: public Modificator
@@ -71,7 +71,7 @@ public:
CGCreature * chooseGuard(si32 strength, bool zoneGuard = false);
bool addGuard(rmg::Object & object, si32 strength, bool zoneGuard = false);
void placeObject(rmg::Object & object, bool guarded, bool updateDistance, bool allowRoad = true);
void placeObject(rmg::Object & object, bool guarded, bool updateDistance, bool createRoad = false);
void updateDistances(const rmg::Object & obj);
void updateDistances(const int3& pos);

View File

@@ -80,19 +80,20 @@ bool RoadPlacer::createRoad(const int3 & dst)
void RoadPlacer::drawRoads(bool secondary)
{
if((secondary && generator.getConfig().secondaryRoadType.empty())
|| (!secondary && generator.getConfig().defaultRoadType.empty()))
return;
//TODO: Check road type set in lobby. If no road, return.
//RecursiveLock lock(externalAccessMutex);
{
//FIXME: double lock - unsafe
//Clean space under roads even if they won't be eventually generated
Zone::Lock lock(zone.areaMutex);
zone.areaPossible().subtract(roads);
zone.freePaths().unite(roads);
}
if((secondary && generator.getConfig().secondaryRoadType.empty())
|| (!secondary && generator.getConfig().defaultRoadType.empty()))
return;
auto tiles = roads.getTilesVector();
std::string roadName = (secondary ? generator.getConfig().secondaryRoadType : generator.getConfig().defaultRoadType);

View File

@@ -152,7 +152,7 @@ int3 TownPlacer::placeMainTown(ObjectManager & manager, CGTownInstance & town)
}, ObjectManager::OptimizeType::WEIGHT);
}
rmgObject.setPosition(position + int3(2, 2, 0)); //place visitable tile in the exact center of a zone
manager.placeObject(rmgObject, false, true);
manager.placeObject(rmgObject, false, true, true);
cleanupBoundaries(rmgObject);
zone.setPos(rmgObject.getVisitablePosition()); //roads lead to main town
return position;
@@ -216,7 +216,9 @@ void TownPlacer::addNewTowns(int count, bool hasFort, const PlayerColor & player
placeMainTown(manager, *town);
}
else
manager.addRequiredObject(town);
{
manager.addRequiredObject(RequiredObjectInfo(town, 0, true));
}
totalTowns++;
}
}

View File

@@ -126,6 +126,7 @@ void WaterProxy::collectLakes()
RouteInfo WaterProxy::waterRoute(Zone & dst)
{
RouteInfo result;
result.createRoad = false;
auto * adopter = dst.getModificator<WaterAdopter>();
if(!adopter)
@@ -162,7 +163,13 @@ RouteInfo WaterProxy::waterRoute(Zone & dst)
int zoneTowns = 0;
if(auto * m = dst.getModificator<TownPlacer>())
zoneTowns = m->getTotalTowns();
if (vstd::contains(lake.keepRoads, zone.getId()))
{
result.createRoad = true;
}
//FIXME: Why are Shipyards not allowed in zones with no towns?
if(dst.getType() == ETemplateZoneType::PLAYER_START || dst.getType() == ETemplateZoneType::CPU_START || zoneTowns)
{
if(placeShipyard(dst, lake, generator.getConfig().shipyardGuard, result))
@@ -284,7 +291,7 @@ bool WaterProxy::placeBoat(Zone & land, const Lake & lake, RouteInfo & info)
zone.connectPath(path);
land.connectPath(landPath);
manager->placeObject(rmgObject, false, true);
manager->placeObject(rmgObject, false, true, info.createRoad);
land.getModificator<ObjectManager>()->updateDistances(rmgObject); //Keep land objects away from the boat
break;
}
@@ -374,9 +381,7 @@ bool WaterProxy::placeShipyard(Zone & land, const Lake & lake, si32 guard, Route
info.boarding = boardingPosition;
info.water = shipPositions;
//TODO: Check connection properties
bool allowRoad = true;
manager->placeObject(rmgObject, guarded, true, allowRoad);
manager->placeObject(rmgObject, guarded, true, info.createRoad);
zone.areaPossible().subtract(shipyardOutToBlock);
for(const auto & i : shipyardOutToBlock.getTilesVector())

View File

@@ -19,6 +19,7 @@ struct RouteInfo
int3 visitable;
int3 boarding;
rmg::Area water;
bool createRoad; //Road to Shipyard or Boat
};
class WaterProxy: public Modificator
@@ -34,6 +35,7 @@ public:
std::map<int, rmg::Tileset> reverseDistanceMap;
std::map<TRmgTemplateZoneId, rmg::Area> neighbourZones; //zones boardered. Area - part of land
std::set<TRmgTemplateZoneId> keepConnections;
std::set<TRmgTemplateZoneId> keepRoads;
};
bool waterKeepConnection(TRmgTemplateZoneId zoneA, TRmgTemplateZoneId zoneB);