1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-04-02 16:20:23 +00:00

Merge branch 'esm3_ai_package' into 'master'

Use unique_ptr to manage AiPackage lifetime

See merge request OpenMW/openmw!1691
This commit is contained in:
Alexei Kotov 2022-02-23 05:55:49 +00:00
commit 4a3d7a1ff7
10 changed files with 45 additions and 51 deletions

View File

@ -52,8 +52,8 @@ namespace MWMechanics
ESM::AiSequence::AiPackageContainer package; ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Activate; package.mType = ESM::AiSequence::Ai_Activate;
package.mPackage = activate.release(); package.mPackage = std::move(activate);
sequence.mPackages.push_back(package); sequence.mPackages.push_back(std::move(package));
} }
AiActivate::AiActivate(const ESM::AiSequence::AiActivate *activate) AiActivate::AiActivate(const ESM::AiSequence::AiActivate *activate)

View File

@ -460,8 +460,8 @@ namespace MWMechanics
ESM::AiSequence::AiPackageContainer package; ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Combat; package.mType = ESM::AiSequence::Ai_Combat;
package.mPackage = combat.release(); package.mPackage = std::move(combat);
sequence.mPackages.push_back(package); sequence.mPackages.push_back(std::move(package));
} }
void AiCombatStorage::startCombatMove(bool isDistantCombat, float distToTarget, float rangeAttack, const MWWorld::Ptr& actor, const MWWorld::Ptr& target) void AiCombatStorage::startCombatMove(bool isDistantCombat, float distToTarget, float rangeAttack, const MWWorld::Ptr& actor, const MWWorld::Ptr& target)

View File

@ -109,8 +109,8 @@ namespace MWMechanics
ESM::AiSequence::AiPackageContainer package; ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Escort; package.mType = ESM::AiSequence::Ai_Escort;
package.mPackage = escort.release(); package.mPackage = std::move(escort);
sequence.mPackages.push_back(package); sequence.mPackages.push_back(std::move(package));
} }
void AiEscort::fastForward(const MWWorld::Ptr& actor, AiState &state) void AiEscort::fastForward(const MWWorld::Ptr& actor, AiState &state)

View File

@ -217,8 +217,8 @@ void AiFollow::writeState(ESM::AiSequence::AiSequence &sequence) const
ESM::AiSequence::AiPackageContainer package; ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Follow; package.mType = ESM::AiSequence::Ai_Follow;
package.mPackage = follow.release(); package.mPackage = std::move(follow);
sequence.mPackages.push_back(package); sequence.mPackages.push_back(std::move(package));
} }
int AiFollow::getFollowIndex() const int AiFollow::getFollowIndex() const

View File

@ -81,8 +81,8 @@ void AiPursue::writeState(ESM::AiSequence::AiSequence &sequence) const
ESM::AiSequence::AiPackageContainer package; ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Pursue; package.mType = ESM::AiSequence::Ai_Pursue;
package.mPackage = pursue.release(); package.mPackage = std::move(pursue);
sequence.mPackages.push_back(package); sequence.mPackages.push_back(std::move(package));
} }
} // namespace MWMechanics } // namespace MWMechanics

View File

@ -498,41 +498,41 @@ void AiSequence::readState(const ESM::AiSequence::AiSequence &sequence)
{ {
case ESM::AiSequence::Ai_Wander: case ESM::AiSequence::Ai_Wander:
{ {
package.reset(new AiWander(static_cast<ESM::AiSequence::AiWander*>(container.mPackage))); package.reset(new AiWander(&static_cast<const ESM::AiSequence::AiWander&>(*container.mPackage)));
break; break;
} }
case ESM::AiSequence::Ai_Travel: case ESM::AiSequence::Ai_Travel:
{ {
const auto source = static_cast<const ESM::AiSequence::AiTravel*>(container.mPackage); const ESM::AiSequence::AiTravel& source = static_cast<const ESM::AiSequence::AiTravel&>(*container.mPackage);
if (source->mHidden) if (source.mHidden)
package.reset(new AiInternalTravel(source)); package.reset(new AiInternalTravel(&source));
else else
package.reset(new AiTravel(source)); package.reset(new AiTravel(&source));
break; break;
} }
case ESM::AiSequence::Ai_Escort: case ESM::AiSequence::Ai_Escort:
{ {
package.reset(new AiEscort(static_cast<ESM::AiSequence::AiEscort*>(container.mPackage))); package.reset(new AiEscort(&static_cast<const ESM::AiSequence::AiEscort&>(*container.mPackage)));
break; break;
} }
case ESM::AiSequence::Ai_Follow: case ESM::AiSequence::Ai_Follow:
{ {
package.reset(new AiFollow(static_cast<ESM::AiSequence::AiFollow*>(container.mPackage))); package.reset(new AiFollow(&static_cast<const ESM::AiSequence::AiFollow&>(*container.mPackage)));
break; break;
} }
case ESM::AiSequence::Ai_Activate: case ESM::AiSequence::Ai_Activate:
{ {
package.reset(new AiActivate(static_cast<ESM::AiSequence::AiActivate*>(container.mPackage))); package.reset(new AiActivate(&static_cast<const ESM::AiSequence::AiActivate&>(*container.mPackage)));
break; break;
} }
case ESM::AiSequence::Ai_Combat: case ESM::AiSequence::Ai_Combat:
{ {
package.reset(new AiCombat(static_cast<ESM::AiSequence::AiCombat*>(container.mPackage))); package.reset(new AiCombat(&static_cast<const ESM::AiSequence::AiCombat&>(*container.mPackage)));
break; break;
} }
case ESM::AiSequence::Ai_Pursue: case ESM::AiSequence::Ai_Pursue:
{ {
package.reset(new AiPursue(static_cast<ESM::AiSequence::AiPursue*>(container.mPackage))); package.reset(new AiPursue(&static_cast<const ESM::AiSequence::AiPursue&>(*container.mPackage)));
break; break;
} }
default: default:

View File

@ -129,8 +129,8 @@ namespace MWMechanics
ESM::AiSequence::AiPackageContainer package; ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Travel; package.mType = ESM::AiSequence::Ai_Travel;
package.mPackage = travel.release(); package.mPackage = std::move(travel);
sequence.mPackages.push_back(package); sequence.mPackages.push_back(std::move(package));
} }
AiInternalTravel::AiInternalTravel(float x, float y, float z) AiInternalTravel::AiInternalTravel(float x, float y, float z)

View File

@ -888,8 +888,8 @@ namespace MWMechanics
ESM::AiSequence::AiPackageContainer package; ESM::AiSequence::AiPackageContainer package;
package.mType = ESM::AiSequence::Ai_Wander; package.mType = ESM::AiSequence::Ai_Wander;
package.mPackage = wander.release(); package.mPackage = std::move(wander);
sequence.mPackages.push_back(package); sequence.mPackages.push_back(std::move(package));
} }
AiWander::AiWander (const ESM::AiSequence::AiWander* wander) AiWander::AiWander (const ESM::AiSequence::AiWander* wander)

View File

@ -152,12 +152,6 @@ namespace AiSequence
esm.writeHNT ("TARG", mTargetActorId); esm.writeHNT ("TARG", mTargetActorId);
} }
AiSequence::~AiSequence()
{
for (std::vector<AiPackageContainer>::iterator it = mPackages.begin(); it != mPackages.end(); ++it)
delete it->mPackage;
}
void AiSequence::save(ESMWriter &esm) const void AiSequence::save(ESMWriter &esm) const
{ {
for (std::vector<AiPackageContainer>::const_iterator it = mPackages.begin(); it != mPackages.end(); ++it) for (std::vector<AiPackageContainer>::const_iterator it = mPackages.begin(); it != mPackages.end(); ++it)
@ -166,25 +160,25 @@ namespace AiSequence
switch (it->mType) switch (it->mType)
{ {
case Ai_Wander: case Ai_Wander:
static_cast<const AiWander*>(it->mPackage)->save(esm); static_cast<const AiWander&>(*it->mPackage).save(esm);
break; break;
case Ai_Travel: case Ai_Travel:
static_cast<const AiTravel*>(it->mPackage)->save(esm); static_cast<const AiTravel&>(*it->mPackage).save(esm);
break; break;
case Ai_Escort: case Ai_Escort:
static_cast<const AiEscort*>(it->mPackage)->save(esm); static_cast<const AiEscort&>(*it->mPackage).save(esm);
break; break;
case Ai_Follow: case Ai_Follow:
static_cast<const AiFollow*>(it->mPackage)->save(esm); static_cast<const AiFollow&>(*it->mPackage).save(esm);
break; break;
case Ai_Activate: case Ai_Activate:
static_cast<const AiActivate*>(it->mPackage)->save(esm); static_cast<const AiActivate&>(*it->mPackage).save(esm);
break; break;
case Ai_Combat: case Ai_Combat:
static_cast<const AiCombat*>(it->mPackage)->save(esm); static_cast<const AiCombat&>(*it->mPackage).save(esm);
break; break;
case Ai_Pursue: case Ai_Pursue:
static_cast<const AiPursue*>(it->mPackage)->save(esm); static_cast<const AiPursue&>(*it->mPackage).save(esm);
break; break;
default: default:
@ -212,7 +206,7 @@ namespace AiSequence
{ {
std::unique_ptr<AiWander> ptr = std::make_unique<AiWander>(); std::unique_ptr<AiWander> ptr = std::make_unique<AiWander>();
ptr->load(esm); ptr->load(esm);
mPackages.back().mPackage = ptr.release(); mPackages.back().mPackage = std::move(ptr);
++count; ++count;
break; break;
} }
@ -220,7 +214,7 @@ namespace AiSequence
{ {
std::unique_ptr<AiTravel> ptr = std::make_unique<AiTravel>(); std::unique_ptr<AiTravel> ptr = std::make_unique<AiTravel>();
ptr->load(esm); ptr->load(esm);
mPackages.back().mPackage = ptr.release(); mPackages.back().mPackage = std::move(ptr);
++count; ++count;
break; break;
} }
@ -228,7 +222,7 @@ namespace AiSequence
{ {
std::unique_ptr<AiEscort> ptr = std::make_unique<AiEscort>(); std::unique_ptr<AiEscort> ptr = std::make_unique<AiEscort>();
ptr->load(esm); ptr->load(esm);
mPackages.back().mPackage = ptr.release(); mPackages.back().mPackage = std::move(ptr);
++count; ++count;
break; break;
} }
@ -236,7 +230,7 @@ namespace AiSequence
{ {
std::unique_ptr<AiFollow> ptr = std::make_unique<AiFollow>(); std::unique_ptr<AiFollow> ptr = std::make_unique<AiFollow>();
ptr->load(esm); ptr->load(esm);
mPackages.back().mPackage = ptr.release(); mPackages.back().mPackage = std::move(ptr);
++count; ++count;
break; break;
} }
@ -244,7 +238,7 @@ namespace AiSequence
{ {
std::unique_ptr<AiActivate> ptr = std::make_unique<AiActivate>(); std::unique_ptr<AiActivate> ptr = std::make_unique<AiActivate>();
ptr->load(esm); ptr->load(esm);
mPackages.back().mPackage = ptr.release(); mPackages.back().mPackage = std::move(ptr);
++count; ++count;
break; break;
} }
@ -252,14 +246,14 @@ namespace AiSequence
{ {
std::unique_ptr<AiCombat> ptr = std::make_unique<AiCombat>(); std::unique_ptr<AiCombat> ptr = std::make_unique<AiCombat>();
ptr->load(esm); ptr->load(esm);
mPackages.back().mPackage = ptr.release(); mPackages.back().mPackage = std::move(ptr);
break; break;
} }
case Ai_Pursue: case Ai_Pursue:
{ {
std::unique_ptr<AiPursue> ptr = std::make_unique<AiPursue>(); std::unique_ptr<AiPursue> ptr = std::make_unique<AiPursue>();
ptr->load(esm); ptr->load(esm);
mPackages.back().mPackage = ptr.release(); mPackages.back().mPackage = std::move(ptr);
break; break;
} }
default: default:
@ -274,15 +268,15 @@ namespace AiSequence
for(auto& pkg : mPackages) for(auto& pkg : mPackages)
{ {
if(pkg.mType == Ai_Wander) if(pkg.mType == Ai_Wander)
static_cast<AiWander*>(pkg.mPackage)->mData.mShouldRepeat = true; static_cast<AiWander&>(*pkg.mPackage).mData.mShouldRepeat = true;
else if(pkg.mType == Ai_Travel) else if(pkg.mType == Ai_Travel)
static_cast<AiTravel*>(pkg.mPackage)->mRepeat = true; static_cast<AiTravel&>(*pkg.mPackage).mRepeat = true;
else if(pkg.mType == Ai_Escort) else if(pkg.mType == Ai_Escort)
static_cast<AiEscort*>(pkg.mPackage)->mRepeat = true; static_cast<AiEscort&>(*pkg.mPackage).mRepeat = true;
else if(pkg.mType == Ai_Follow) else if(pkg.mType == Ai_Follow)
static_cast<AiFollow*>(pkg.mPackage)->mRepeat = true; static_cast<AiFollow&>(*pkg.mPackage).mRepeat = true;
else if(pkg.mType == Ai_Activate) else if(pkg.mType == Ai_Activate)
static_cast<AiActivate*>(pkg.mPackage)->mRepeat = true; static_cast<AiActivate&>(*pkg.mPackage).mRepeat = true;
} }
} }
} }

View File

@ -3,6 +3,7 @@
#include <vector> #include <vector>
#include <string> #include <string>
#include <memory>
#include "components/esm/defs.hpp" #include "components/esm/defs.hpp"
@ -149,7 +150,7 @@ namespace ESM
{ {
int mType; int mType;
AiPackage* mPackage; std::unique_ptr<AiPackage> mPackage;
}; };
struct AiSequence struct AiSequence
@ -158,7 +159,6 @@ namespace ESM
{ {
mLastAiPackage = -1; mLastAiPackage = -1;
} }
~AiSequence();
std::vector<AiPackageContainer> mPackages; std::vector<AiPackageContainer> mPackages;
int mLastAiPackage; int mLastAiPackage;