1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-15 00:05:02 +02:00

Map objects now use shared_ptr (game)

This commit is contained in:
Ivan Savenko
2025-03-13 19:42:18 +00:00
parent 2ca1748e96
commit 0ada2a5ebd
49 changed files with 487 additions and 613 deletions

View File

@ -579,7 +579,7 @@ std::string CClearTerrainOperation::getLabel() const
return "Clear Terrain";
}
CInsertObjectOperation::CInsertObjectOperation(CMap* map, CGObjectInstance* obj)
CInsertObjectOperation::CInsertObjectOperation(CMap* map, std::shared_ptr<CGObjectInstance> obj)
: CMapOperation(map), obj(obj)
{
@ -591,7 +591,7 @@ void CInsertObjectOperation::execute()
do
{
map->setUniqueInstanceName(obj);
map->setUniqueInstanceName(obj->id);
} while(vstd::contains(map->instanceNames, obj->instanceName));
map->addNewObject(obj);
@ -599,7 +599,7 @@ void CInsertObjectOperation::execute()
void CInsertObjectOperation::undo()
{
map->removeObject(obj);
map->removeObject(obj->id);
}
void CInsertObjectOperation::redo()
@ -612,7 +612,7 @@ std::string CInsertObjectOperation::getLabel() const
return "Insert Object";
}
CMoveObjectOperation::CMoveObjectOperation(CMap* map, CGObjectInstance* obj, const int3& targetPosition)
CMoveObjectOperation::CMoveObjectOperation(CMap* map, CGObjectInstance * obj, const int3& targetPosition)
: CMapOperation(map),
obj(obj),
initialPos(obj->anchorPos()),
@ -622,12 +622,12 @@ CMoveObjectOperation::CMoveObjectOperation(CMap* map, CGObjectInstance* obj, con
void CMoveObjectOperation::execute()
{
map->moveObject(obj, targetPos);
map->moveObject(obj->id, targetPos);
}
void CMoveObjectOperation::undo()
{
map->moveObject(obj, initialPos);
map->moveObject(obj->id, initialPos);
}
void CMoveObjectOperation::redo()
@ -640,46 +640,23 @@ std::string CMoveObjectOperation::getLabel() const
return "Move Object";
}
CRemoveObjectOperation::CRemoveObjectOperation(CMap* map, CGObjectInstance* obj)
: CMapOperation(map), obj(obj)
CRemoveObjectOperation::CRemoveObjectOperation(CMap* map, CGObjectInstance * obj)
: CMapOperation(map), targetedObject(obj)
{
}
CRemoveObjectOperation::~CRemoveObjectOperation()
{
//when operation is destroyed and wasn't undone, the object is lost forever
if(!obj)
{
return;
}
//do not destroy an object that belongs to map
if(!vstd::contains(map->instanceNames, obj->instanceName))
{
delete obj;
obj = nullptr;
}
}
void CRemoveObjectOperation::execute()
{
map->removeObject(obj);
removedObject = map->removeObject(targetedObject->id);
}
void CRemoveObjectOperation::undo()
{
try
{
//set new id, but do not rename object
obj->id = ObjectInstanceID(static_cast<si32>(map->objects.size()));
map->addNewObject(obj);
}
catch(const std::exception& e)
{
logGlobal->error(e.what());
}
assert(removedObject != nullptr);
//set new id, but do not rename object
removedObject->id = ObjectInstanceID(static_cast<si32>(map->objects.size()));
map->addNewObject(removedObject);
}
void CRemoveObjectOperation::redo()