1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-11 11:31:52 +02:00

- Added faction-specific dwellings

- Fixed generation of terrain-specific objects
This commit is contained in:
DjWarmonger 2014-07-06 22:14:37 +02:00
parent f3ccdc8a21
commit f65239b51f
3 changed files with 51 additions and 3 deletions

View File

@ -218,6 +218,17 @@ bool CDwellingInstanceConstructor::producesCreature(const CCreature * crea) cons
return false;
}
std::vector<const CCreature *> CDwellingInstanceConstructor::getProducedCreatures() const
{
std::vector<const CCreature *> creatures; //no idea why it's 2D, to be honest
for (auto & entry : availableCreatures)
{
for (const CCreature * cre : entry)
creatures.push_back(cre);
}
return creatures;
}
CBankInstanceConstructor::CBankInstanceConstructor()
{
}

View File

@ -13,6 +13,7 @@
*
*/
class CGObjectInstance;
class CGTownInstance;
class CGHeroInstance;
class CGDwelling;
@ -123,6 +124,7 @@ public:
void configureObject(CGObjectInstance * object, CRandomGenerator & rng) const;
bool producesCreature(const CCreature * crea) const;
std::vector<const CCreature *> getProducedCreatures() const;
template <typename Handler> void serialize(Handler &h, const int version)
{

View File

@ -19,12 +19,14 @@
#include "../CCreatureHandler.h"
#include "../CSpellHandler.h" //for choosing random spells
#include "../mapObjects/CObjectClassesHandler.h"
#include "../mapObjects/CommonConstructors.h"
#include "../mapObjects/MapObjects.h" //needed to resolve templates for CommonConstructors.h
#include "../mapObjects/CGPandoraBox.h"
#include "../mapObjects/CRewardableObject.h"
class CMap;
class CMapEditManager;
//class CGObjectInstance;
CRmgTemplateZone::CTownInfo::CTownInfo() : townCount(0), castleCount(0), townDensity(0), castleDensity(0)
{
@ -1049,9 +1051,9 @@ void CRmgTemplateZone::createObstacles(CMapGenerator* gen)
bool CRmgTemplateZone::fill(CMapGenerator* gen)
{
addAllPossibleObjects (gen);
initTownType(gen);
initTerrainType(gen);
addAllPossibleObjects (gen);
placeMines(gen);
createRequiredObjects(gen);
fractalize(gen); //after required objects are created and linked with their own paths
@ -1404,7 +1406,40 @@ void CRmgTemplateZone::addAllPossibleObjects (CMapGenerator* gen)
}
}
}
}
}
//dwellings
for (auto secondaryID : VLC->objtypeh->knownSubObjects(Obj::CREATURE_GENERATOR1))
{
auto dwellingHandler = dynamic_cast<const CDwellingInstanceConstructor*>(VLC->objtypeh->getHandlerFor(Obj::CREATURE_GENERATOR1, secondaryID).get());
auto creatures = dwellingHandler->getProducedCreatures();
if (creatures.empty())
continue;
auto cre = creatures.front();
if (cre->faction == townType)
{
oi.value = cre->AIValue * cre->growth * (1 + 0.5f); //TODO: include town count in formula
oi.probability = 40;
for (auto temp : dwellingHandler->getTemplates())
{
if (temp.canBePlacedAt(terrainType))
{
oi.generateObject = [gen, temp, secondaryID, dwellingHandler]() -> CGObjectInstance *
{
auto obj = VLC->objtypeh->getHandlerFor(Obj::CREATURE_GENERATOR1, secondaryID)->create(temp);
//dwellingHandler->configureObject(obj, gen->rand);
obj->tempOwner = PlayerColor::NEUTRAL;
return obj;
};
possibleObjects.push_back (oi);
}
}
}
}
static const int scrollValues[] = {500, 2000, 3000, 4000, 5000};