mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
Fix RMG to place special dwellings like elemental conflux
This commit is contained in:
parent
73906d5a97
commit
8b11b42aaf
@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
brew update
|
||||
brew pin python@3.9
|
||||
#brew pin python@3.9
|
||||
brew install smpeg2 libpng freetype qt5 ffmpeg@4 ninja boost tbb luajit
|
||||
brew install sdl2 sdl2_ttf sdl2_image sdl2_mixer
|
||||
|
||||
|
@ -1401,8 +1401,11 @@ bool CRmgTemplateZone::createRequiredObjects()
|
||||
auto tilesBlockedByObject = obj.first->getBlockedOffsets();
|
||||
|
||||
bool finished = false;
|
||||
while (!finished)
|
||||
bool attempt = true;
|
||||
while (!finished && attempt)
|
||||
{
|
||||
attempt = false;
|
||||
|
||||
std::vector<int3> tiles(possibleTiles.begin(), possibleTiles.end());
|
||||
//new tiles vector after each object has been placed, OR misplaced area has been sealed off
|
||||
|
||||
@ -1433,12 +1436,13 @@ bool CRmgTemplateZone::createRequiredObjects()
|
||||
for (auto tile : tiles)
|
||||
{
|
||||
//code partially adapted from findPlaceForObject()
|
||||
|
||||
if(areAllTilesAvailable(obj.first, tile, tilesBlockedByObject))
|
||||
gen->setOccupied(pos, ETileType::BLOCKED); //why?
|
||||
else
|
||||
continue;
|
||||
|
||||
attempt = true;
|
||||
|
||||
EObjectPlacingResult::EObjectPlacingResult result = tryToPlaceObjectAndConnectToPath(obj.first, tile);
|
||||
if (result == EObjectPlacingResult::SUCCESS)
|
||||
{
|
||||
@ -2243,17 +2247,23 @@ void CRmgTemplateZone::addAllPossibleObjects()
|
||||
oi.maxPerZone = std::numeric_limits<ui32>().max();
|
||||
|
||||
//dwellings
|
||||
auto dwellingTypes = {Obj::CREATURE_GENERATOR1, Obj::CREATURE_GENERATOR4};
|
||||
|
||||
auto subObjects = VLC->objtypeh->knownSubObjects(Obj::CREATURE_GENERATOR1);
|
||||
for(auto dwellingType : dwellingTypes)
|
||||
{
|
||||
auto subObjects = VLC->objtypeh->knownSubObjects(dwellingType);
|
||||
|
||||
if(dwellingType == Obj::CREATURE_GENERATOR1)
|
||||
{
|
||||
//don't spawn original "neutral" dwellings that got replaced by Conflux dwellings in AB
|
||||
static int elementalConfluxROE[] = {7, 13, 16, 47};
|
||||
for(int i = 0; i < 4; i++)
|
||||
vstd::erase_if_present(subObjects, elementalConfluxROE[i]);
|
||||
}
|
||||
|
||||
for(auto secondaryID : subObjects)
|
||||
{
|
||||
auto dwellingHandler = dynamic_cast<const CDwellingInstanceConstructor*>(VLC->objtypeh->getHandlerFor(Obj::CREATURE_GENERATOR1, secondaryID).get());
|
||||
auto dwellingHandler = dynamic_cast<const CDwellingInstanceConstructor *>(VLC->objtypeh->getHandlerFor(dwellingType, secondaryID).get());
|
||||
auto creatures = dwellingHandler->getProducedCreatures();
|
||||
if(creatures.empty())
|
||||
continue;
|
||||
@ -2265,23 +2275,24 @@ void CRmgTemplateZone::addAllPossibleObjects()
|
||||
oi.value = static_cast<ui32>(cre->AIValue * cre->growth * (1 + (nativeZonesCount / gen->getTotalZoneCount()) + (nativeZonesCount / 2)));
|
||||
oi.probability = 40;
|
||||
|
||||
for (auto temp : dwellingHandler->getTemplates())
|
||||
for(auto tmplate : dwellingHandler->getTemplates())
|
||||
{
|
||||
if (temp.canBePlacedAt(terrainType))
|
||||
if(tmplate.canBePlacedAt(terrainType))
|
||||
{
|
||||
oi.generateObject = [temp, secondaryID]() -> CGObjectInstance *
|
||||
oi.generateObject = [tmplate, secondaryID, dwellingType]() -> CGObjectInstance *
|
||||
{
|
||||
auto obj = VLC->objtypeh->getHandlerFor(Obj::CREATURE_GENERATOR1, secondaryID)->create(temp);
|
||||
auto obj = VLC->objtypeh->getHandlerFor(dwellingType, secondaryID)->create(tmplate);
|
||||
obj->tempOwner = PlayerColor::NEUTRAL;
|
||||
return obj;
|
||||
};
|
||||
|
||||
oi.templ = temp;
|
||||
oi.templ = tmplate;
|
||||
possibleObjects.push_back(oi);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static const int scrollValues[] = { 500, 2000, 3000, 4000, 5000 };
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user