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

Map objects now use shared_ptr (rmg)

This commit is contained in:
Ivan Savenko
2025-03-13 20:13:27 +00:00
parent dda5c9f13a
commit 84cf7b052d
19 changed files with 145 additions and 145 deletions

View File

@@ -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;