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:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user