|
@@ -138,7 +138,7 @@ void TreasurePlacer::addCommonObjects()
|
|
|
|
|
|
void TreasurePlacer::setBasicProperties(ObjectInfo & oi, CompoundMapObjectID objid) const
|
|
|
{
|
|
|
- oi.generateObject = [this, objid]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [this, objid]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
return LIBRARY->objtypeh->getHandlerFor(objid)->create(map.mapInstance->cb, nullptr);
|
|
|
};
|
|
@@ -176,11 +176,11 @@ void TreasurePlacer::addPrisons()
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- oi.generateObject = [i, this, prisonHeroPlacer]() -> CGObjectInstance*
|
|
|
+ oi.generateObject = [i, this, prisonHeroPlacer]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
HeroTypeID hid = prisonHeroPlacer->drawRandomHero();
|
|
|
auto factory = LIBRARY->objtypeh->getHandlerFor(Obj::PRISON, 0);
|
|
|
- auto* obj = dynamic_cast<CGHeroInstance*>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
+ auto obj = std::dynamic_pointer_cast<CGHeroInstance>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
|
|
|
obj->setHeroType(hid); //will be initialized later
|
|
|
obj->exp = generator.getConfig().prisonExperience[i];
|
|
@@ -188,11 +188,11 @@ void TreasurePlacer::addPrisons()
|
|
|
|
|
|
return obj;
|
|
|
};
|
|
|
- oi.destroyObject = [prisonHeroPlacer](CGObjectInstance* obj)
|
|
|
+ oi.destroyObject = [prisonHeroPlacer](CGObjectInstance& obj)
|
|
|
{
|
|
|
// Hero can be used again
|
|
|
- auto* hero = dynamic_cast<CGHeroInstance*>(obj);
|
|
|
- prisonHeroPlacer->restoreDrawnHero(hero->getHeroTypeID());
|
|
|
+ auto & hero = dynamic_cast<CGHeroInstance&>(obj);
|
|
|
+ prisonHeroPlacer->restoreDrawnHero(hero.getHeroTypeID());
|
|
|
};
|
|
|
|
|
|
oi.setTemplates(Obj::PRISON, 0, zone.getTerrainType());
|
|
@@ -245,9 +245,9 @@ void TreasurePlacer::addDwellings()
|
|
|
oi.value = static_cast<ui32>(cre->getAIValue() * cre->getGrowth() * (1 + (nativeZonesCount / map.getTotalZoneCount()) + (nativeZonesCount / 2)));
|
|
|
oi.probability = 40;
|
|
|
|
|
|
- oi.generateObject = [this, secondaryID, dwellingType]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [this, secondaryID, dwellingType]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
- auto * obj = LIBRARY->objtypeh->getHandlerFor(dwellingType, secondaryID)->create(map.mapInstance->cb, nullptr);
|
|
|
+ auto obj = LIBRARY->objtypeh->getHandlerFor(dwellingType, secondaryID)->create(map.mapInstance->cb, nullptr);
|
|
|
obj->tempOwner = PlayerColor::NEUTRAL;
|
|
|
return obj;
|
|
|
};
|
|
@@ -267,10 +267,10 @@ void TreasurePlacer::addScrolls()
|
|
|
|
|
|
for(int i = 0; i < generator.getConfig().scrollValues.size(); i++)
|
|
|
{
|
|
|
- oi.generateObject = [i, this]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [i, this]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
auto factory = LIBRARY->objtypeh->getHandlerFor(Obj::SPELL_SCROLL, 0);
|
|
|
- auto * obj = dynamic_cast<CGArtifact *>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
+ auto obj = std::dynamic_pointer_cast<CGArtifact>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
std::vector<SpellID> out;
|
|
|
|
|
|
for(auto spellID : LIBRARY->spellh->getDefaultAllowed())
|
|
@@ -307,10 +307,10 @@ void TreasurePlacer::addPandoraBoxesWithGold()
|
|
|
ObjectInfo oi(Obj::PANDORAS_BOX, 0);
|
|
|
for(int i = 1; i < 5; i++)
|
|
|
{
|
|
|
- oi.generateObject = [this, i]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [this, i]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
auto factory = LIBRARY->objtypeh->getHandlerFor(Obj::PANDORAS_BOX, 0);
|
|
|
- auto * obj = dynamic_cast<CGPandoraBox *>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
+ auto obj = std::dynamic_pointer_cast<CGPandoraBox>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
|
|
|
Rewardable::VisitInfo reward;
|
|
|
reward.reward.resources[EGameResID::GOLD] = i * 5000;
|
|
@@ -332,10 +332,10 @@ void TreasurePlacer::addPandoraBoxesWithExperience()
|
|
|
ObjectInfo oi(Obj::PANDORAS_BOX, 0);
|
|
|
for(int i = 1; i < 5; i++)
|
|
|
{
|
|
|
- oi.generateObject = [this, i]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [this, i]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
auto factory = LIBRARY->objtypeh->getHandlerFor(Obj::PANDORAS_BOX, 0);
|
|
|
- auto * obj = dynamic_cast<CGPandoraBox *>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
+ auto obj = std::dynamic_pointer_cast<CGPandoraBox>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
|
|
|
Rewardable::VisitInfo reward;
|
|
|
reward.reward.heroExperience = i * 5000;
|
|
@@ -362,10 +362,10 @@ void TreasurePlacer::addPandoraBoxesWithCreatures()
|
|
|
|
|
|
ObjectInfo oi(Obj::PANDORAS_BOX, 0);
|
|
|
|
|
|
- oi.generateObject = [this, creature, creaturesAmount]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [this, creature, creaturesAmount]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
auto factory = LIBRARY->objtypeh->getHandlerFor(Obj::PANDORAS_BOX, 0);
|
|
|
- auto * obj = dynamic_cast<CGPandoraBox *>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
+ auto obj = std::dynamic_pointer_cast<CGPandoraBox>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
|
|
|
Rewardable::VisitInfo reward;
|
|
|
reward.reward.creatures.emplace_back(creature, creaturesAmount);
|
|
@@ -388,10 +388,10 @@ void TreasurePlacer::addPandoraBoxesWithSpells()
|
|
|
//Pandora with 12 spells of certain level
|
|
|
for(int i = 1; i <= GameConstants::SPELL_LEVELS; i++)
|
|
|
{
|
|
|
- oi.generateObject = [i, this]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [i, this]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
auto factory = LIBRARY->objtypeh->getHandlerFor(Obj::PANDORAS_BOX, 0);
|
|
|
- auto * obj = dynamic_cast<CGPandoraBox *>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
+ auto obj = std::dynamic_pointer_cast<CGPandoraBox>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
|
|
|
std::vector <const CSpell *> spells;
|
|
|
for(auto spellID : LIBRARY->spellh->getDefaultAllowed())
|
|
@@ -421,10 +421,10 @@ void TreasurePlacer::addPandoraBoxesWithSpells()
|
|
|
//Pandora with 15 spells of certain school
|
|
|
for(int i = 0; i < 4; i++)
|
|
|
{
|
|
|
- oi.generateObject = [i, this]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [i, this]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
auto factory = LIBRARY->objtypeh->getHandlerFor(Obj::PANDORAS_BOX, 0);
|
|
|
- auto * obj = dynamic_cast<CGPandoraBox *>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
+ auto obj = std::dynamic_pointer_cast<CGPandoraBox>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
|
|
|
std::vector <const CSpell *> spells;
|
|
|
for(auto spellID : LIBRARY->spellh->getDefaultAllowed())
|
|
@@ -453,10 +453,10 @@ void TreasurePlacer::addPandoraBoxesWithSpells()
|
|
|
|
|
|
// Pandora box with 60 random spells
|
|
|
|
|
|
- oi.generateObject = [this]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [this]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
auto factory = LIBRARY->objtypeh->getHandlerFor(Obj::PANDORAS_BOX, 0);
|
|
|
- auto * obj = dynamic_cast<CGPandoraBox *>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
+ auto obj = std::dynamic_pointer_cast<CGPandoraBox>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
|
|
|
std::vector <const CSpell *> spells;
|
|
|
for(auto spellID : LIBRARY->spellh->getDefaultAllowed())
|
|
@@ -518,11 +518,11 @@ void TreasurePlacer::addSeerHuts()
|
|
|
obj->quest->mission.artifacts.push_back(artid);
|
|
|
qap->addQuestArtifact(artid);
|
|
|
};
|
|
|
- auto destroyObject = [qap](CGObjectInstance * obj)
|
|
|
+ auto destroyObject = [qap](CGObjectInstance & obj)
|
|
|
{
|
|
|
- auto * seer = dynamic_cast<CGSeerHut *>(obj);
|
|
|
+ auto & seer = dynamic_cast<CGSeerHut &>(obj);
|
|
|
// Artifact can be used again
|
|
|
- ArtifactID artid = seer->getQuest()->mission.artifacts.front();
|
|
|
+ ArtifactID artid = seer.getQuest()->mission.artifacts.front();
|
|
|
qap->addRandomArtifact(artid);
|
|
|
qap->removeQuestArtifact(artid);
|
|
|
};
|
|
@@ -538,17 +538,16 @@ void TreasurePlacer::addSeerHuts()
|
|
|
int randomAppearance = chooseRandomAppearance(zone.getRand(), Obj::SEER_HUT, zone.getTerrainType());
|
|
|
|
|
|
// FIXME: Remove duplicated code for gold, exp and creaure reward
|
|
|
- oi.generateObject = [cb=map.mapInstance->cb, creature, creaturesAmount, randomAppearance, setRandomArtifact]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [cb=map.mapInstance->cb, creature, creaturesAmount, randomAppearance, setRandomArtifact]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
auto factory = LIBRARY->objtypeh->getHandlerFor(Obj::SEER_HUT, randomAppearance);
|
|
|
- auto * obj = dynamic_cast<CGSeerHut *>(factory->create(cb, nullptr));
|
|
|
+ auto obj = std::dynamic_pointer_cast<CGSeerHut>(factory->create(cb, nullptr));
|
|
|
|
|
|
Rewardable::VisitInfo reward;
|
|
|
reward.reward.creatures.emplace_back(creature->getId(), creaturesAmount);
|
|
|
reward.visitType = Rewardable::EEventType::EVENT_FIRST_VISIT;
|
|
|
obj->configuration.info.push_back(reward);
|
|
|
-
|
|
|
- setRandomArtifact(obj);
|
|
|
+ setRandomArtifact(obj.get());
|
|
|
|
|
|
return obj;
|
|
|
};
|
|
@@ -583,17 +582,16 @@ void TreasurePlacer::addSeerHuts()
|
|
|
oi.probability = 10;
|
|
|
oi.maxPerZone = 1;
|
|
|
|
|
|
- oi.generateObject = [i, randomAppearance, this, setRandomArtifact]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [i, randomAppearance, this, setRandomArtifact]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
auto factory = LIBRARY->objtypeh->getHandlerFor(Obj::SEER_HUT, randomAppearance);
|
|
|
- auto * obj = dynamic_cast<CGSeerHut *>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
+ auto obj = std::dynamic_pointer_cast<CGSeerHut>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
|
|
|
Rewardable::VisitInfo reward;
|
|
|
reward.reward.heroExperience = generator.getConfig().questRewardValues[i];
|
|
|
reward.visitType = Rewardable::EEventType::EVENT_FIRST_VISIT;
|
|
|
obj->configuration.info.push_back(reward);
|
|
|
-
|
|
|
- setRandomArtifact(obj);
|
|
|
+ setRandomArtifact(obj.get());
|
|
|
|
|
|
return obj;
|
|
|
};
|
|
@@ -602,17 +600,17 @@ void TreasurePlacer::addSeerHuts()
|
|
|
if(!oi.templates.empty())
|
|
|
possibleSeerHuts.push_back(oi);
|
|
|
|
|
|
- oi.generateObject = [i, randomAppearance, this, setRandomArtifact]() -> CGObjectInstance *
|
|
|
+ oi.generateObject = [i, randomAppearance, this, setRandomArtifact]() -> std::shared_ptr<CGObjectInstance>
|
|
|
{
|
|
|
auto factory = LIBRARY->objtypeh->getHandlerFor(Obj::SEER_HUT, randomAppearance);
|
|
|
- auto * obj = dynamic_cast<CGSeerHut *>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
+ auto obj = std::dynamic_pointer_cast<CGSeerHut>(factory->create(map.mapInstance->cb, nullptr));
|
|
|
|
|
|
Rewardable::VisitInfo reward;
|
|
|
reward.reward.resources[EGameResID::GOLD] = generator.getConfig().questRewardValues[i];
|
|
|
reward.visitType = Rewardable::EEventType::EVENT_FIRST_VISIT;
|
|
|
obj->configuration.info.push_back(reward);
|
|
|
|
|
|
- setRandomArtifact(obj);
|
|
|
+ setRandomArtifact(obj.get());
|
|
|
|
|
|
return obj;
|
|
|
};
|
|
@@ -748,15 +746,14 @@ rmg::Object TreasurePlacer::constructTreasurePile(const std::vector<ObjectInfo*>
|
|
|
accessibleArea.add(int3());
|
|
|
}
|
|
|
|
|
|
- CGObjectInstance * object = nullptr;
|
|
|
+ std::shared_ptr<CGObjectInstance> object = nullptr;
|
|
|
if (oi->generateObject)
|
|
|
{
|
|
|
object = oi->generateObject();
|
|
|
if(oi->templates.empty())
|
|
|
{
|
|
|
logGlobal->warn("Deleting randomized object with no templates: %s", object->getObjectName());
|
|
|
- oi->destroyObject(object);
|
|
|
- delete object;
|
|
|
+ oi->destroyObject(*object);
|
|
|
continue;
|
|
|
}
|
|
|
}
|
|
@@ -785,7 +782,7 @@ rmg::Object TreasurePlacer::constructTreasurePile(const std::vector<ObjectInfo*>
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- auto & instance = rmgObject.addInstance(*object);
|
|
|
+ auto & instance = rmgObject.addInstance(object);
|
|
|
rmgObject.setValue(rmgObject.getValue() + oi->value);
|
|
|
instance.onCleared = oi->destroyObject;
|
|
|
|