mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-24 13:43:43 +00:00
Use unique_ptr to manage AiPackage lifetime
This commit is contained in:
parent
09b1aca9bd
commit
595c2e0a8e
@ -52,8 +52,8 @@ namespace MWMechanics
|
||||
|
||||
ESM::AiSequence::AiPackageContainer package;
|
||||
package.mType = ESM::AiSequence::Ai_Activate;
|
||||
package.mPackage = activate.release();
|
||||
sequence.mPackages.push_back(package);
|
||||
package.mPackage = std::move(activate);
|
||||
sequence.mPackages.push_back(std::move(package));
|
||||
}
|
||||
|
||||
AiActivate::AiActivate(const ESM::AiSequence::AiActivate *activate)
|
||||
|
@ -460,8 +460,8 @@ namespace MWMechanics
|
||||
|
||||
ESM::AiSequence::AiPackageContainer package;
|
||||
package.mType = ESM::AiSequence::Ai_Combat;
|
||||
package.mPackage = combat.release();
|
||||
sequence.mPackages.push_back(package);
|
||||
package.mPackage = std::move(combat);
|
||||
sequence.mPackages.push_back(std::move(package));
|
||||
}
|
||||
|
||||
void AiCombatStorage::startCombatMove(bool isDistantCombat, float distToTarget, float rangeAttack, const MWWorld::Ptr& actor, const MWWorld::Ptr& target)
|
||||
|
@ -109,8 +109,8 @@ namespace MWMechanics
|
||||
|
||||
ESM::AiSequence::AiPackageContainer package;
|
||||
package.mType = ESM::AiSequence::Ai_Escort;
|
||||
package.mPackage = escort.release();
|
||||
sequence.mPackages.push_back(package);
|
||||
package.mPackage = std::move(escort);
|
||||
sequence.mPackages.push_back(std::move(package));
|
||||
}
|
||||
|
||||
void AiEscort::fastForward(const MWWorld::Ptr& actor, AiState &state)
|
||||
|
@ -217,8 +217,8 @@ void AiFollow::writeState(ESM::AiSequence::AiSequence &sequence) const
|
||||
|
||||
ESM::AiSequence::AiPackageContainer package;
|
||||
package.mType = ESM::AiSequence::Ai_Follow;
|
||||
package.mPackage = follow.release();
|
||||
sequence.mPackages.push_back(package);
|
||||
package.mPackage = std::move(follow);
|
||||
sequence.mPackages.push_back(std::move(package));
|
||||
}
|
||||
|
||||
int AiFollow::getFollowIndex() const
|
||||
|
@ -81,8 +81,8 @@ void AiPursue::writeState(ESM::AiSequence::AiSequence &sequence) const
|
||||
|
||||
ESM::AiSequence::AiPackageContainer package;
|
||||
package.mType = ESM::AiSequence::Ai_Pursue;
|
||||
package.mPackage = pursue.release();
|
||||
sequence.mPackages.push_back(package);
|
||||
package.mPackage = std::move(pursue);
|
||||
sequence.mPackages.push_back(std::move(package));
|
||||
}
|
||||
|
||||
} // namespace MWMechanics
|
||||
|
@ -498,41 +498,41 @@ void AiSequence::readState(const ESM::AiSequence::AiSequence &sequence)
|
||||
{
|
||||
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;
|
||||
}
|
||||
case ESM::AiSequence::Ai_Travel:
|
||||
{
|
||||
const auto source = static_cast<const ESM::AiSequence::AiTravel*>(container.mPackage);
|
||||
if (source->mHidden)
|
||||
package.reset(new AiInternalTravel(source));
|
||||
const ESM::AiSequence::AiTravel& source = static_cast<const ESM::AiSequence::AiTravel&>(*container.mPackage);
|
||||
if (source.mHidden)
|
||||
package.reset(new AiInternalTravel(&source));
|
||||
else
|
||||
package.reset(new AiTravel(source));
|
||||
package.reset(new AiTravel(&source));
|
||||
break;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
default:
|
||||
|
@ -129,8 +129,8 @@ namespace MWMechanics
|
||||
|
||||
ESM::AiSequence::AiPackageContainer package;
|
||||
package.mType = ESM::AiSequence::Ai_Travel;
|
||||
package.mPackage = travel.release();
|
||||
sequence.mPackages.push_back(package);
|
||||
package.mPackage = std::move(travel);
|
||||
sequence.mPackages.push_back(std::move(package));
|
||||
}
|
||||
|
||||
AiInternalTravel::AiInternalTravel(float x, float y, float z)
|
||||
|
@ -888,8 +888,8 @@ namespace MWMechanics
|
||||
|
||||
ESM::AiSequence::AiPackageContainer package;
|
||||
package.mType = ESM::AiSequence::Ai_Wander;
|
||||
package.mPackage = wander.release();
|
||||
sequence.mPackages.push_back(package);
|
||||
package.mPackage = std::move(wander);
|
||||
sequence.mPackages.push_back(std::move(package));
|
||||
}
|
||||
|
||||
AiWander::AiWander (const ESM::AiSequence::AiWander* wander)
|
||||
|
@ -152,12 +152,6 @@ namespace AiSequence
|
||||
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
|
||||
{
|
||||
for (std::vector<AiPackageContainer>::const_iterator it = mPackages.begin(); it != mPackages.end(); ++it)
|
||||
@ -166,25 +160,25 @@ namespace AiSequence
|
||||
switch (it->mType)
|
||||
{
|
||||
case Ai_Wander:
|
||||
static_cast<const AiWander*>(it->mPackage)->save(esm);
|
||||
static_cast<const AiWander&>(*it->mPackage).save(esm);
|
||||
break;
|
||||
case Ai_Travel:
|
||||
static_cast<const AiTravel*>(it->mPackage)->save(esm);
|
||||
static_cast<const AiTravel&>(*it->mPackage).save(esm);
|
||||
break;
|
||||
case Ai_Escort:
|
||||
static_cast<const AiEscort*>(it->mPackage)->save(esm);
|
||||
static_cast<const AiEscort&>(*it->mPackage).save(esm);
|
||||
break;
|
||||
case Ai_Follow:
|
||||
static_cast<const AiFollow*>(it->mPackage)->save(esm);
|
||||
static_cast<const AiFollow&>(*it->mPackage).save(esm);
|
||||
break;
|
||||
case Ai_Activate:
|
||||
static_cast<const AiActivate*>(it->mPackage)->save(esm);
|
||||
static_cast<const AiActivate&>(*it->mPackage).save(esm);
|
||||
break;
|
||||
case Ai_Combat:
|
||||
static_cast<const AiCombat*>(it->mPackage)->save(esm);
|
||||
static_cast<const AiCombat&>(*it->mPackage).save(esm);
|
||||
break;
|
||||
case Ai_Pursue:
|
||||
static_cast<const AiPursue*>(it->mPackage)->save(esm);
|
||||
static_cast<const AiPursue&>(*it->mPackage).save(esm);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -212,7 +206,7 @@ namespace AiSequence
|
||||
{
|
||||
std::unique_ptr<AiWander> ptr = std::make_unique<AiWander>();
|
||||
ptr->load(esm);
|
||||
mPackages.back().mPackage = ptr.release();
|
||||
mPackages.back().mPackage = std::move(ptr);
|
||||
++count;
|
||||
break;
|
||||
}
|
||||
@ -220,7 +214,7 @@ namespace AiSequence
|
||||
{
|
||||
std::unique_ptr<AiTravel> ptr = std::make_unique<AiTravel>();
|
||||
ptr->load(esm);
|
||||
mPackages.back().mPackage = ptr.release();
|
||||
mPackages.back().mPackage = std::move(ptr);
|
||||
++count;
|
||||
break;
|
||||
}
|
||||
@ -228,7 +222,7 @@ namespace AiSequence
|
||||
{
|
||||
std::unique_ptr<AiEscort> ptr = std::make_unique<AiEscort>();
|
||||
ptr->load(esm);
|
||||
mPackages.back().mPackage = ptr.release();
|
||||
mPackages.back().mPackage = std::move(ptr);
|
||||
++count;
|
||||
break;
|
||||
}
|
||||
@ -236,7 +230,7 @@ namespace AiSequence
|
||||
{
|
||||
std::unique_ptr<AiFollow> ptr = std::make_unique<AiFollow>();
|
||||
ptr->load(esm);
|
||||
mPackages.back().mPackage = ptr.release();
|
||||
mPackages.back().mPackage = std::move(ptr);
|
||||
++count;
|
||||
break;
|
||||
}
|
||||
@ -244,7 +238,7 @@ namespace AiSequence
|
||||
{
|
||||
std::unique_ptr<AiActivate> ptr = std::make_unique<AiActivate>();
|
||||
ptr->load(esm);
|
||||
mPackages.back().mPackage = ptr.release();
|
||||
mPackages.back().mPackage = std::move(ptr);
|
||||
++count;
|
||||
break;
|
||||
}
|
||||
@ -252,14 +246,14 @@ namespace AiSequence
|
||||
{
|
||||
std::unique_ptr<AiCombat> ptr = std::make_unique<AiCombat>();
|
||||
ptr->load(esm);
|
||||
mPackages.back().mPackage = ptr.release();
|
||||
mPackages.back().mPackage = std::move(ptr);
|
||||
break;
|
||||
}
|
||||
case Ai_Pursue:
|
||||
{
|
||||
std::unique_ptr<AiPursue> ptr = std::make_unique<AiPursue>();
|
||||
ptr->load(esm);
|
||||
mPackages.back().mPackage = ptr.release();
|
||||
mPackages.back().mPackage = std::move(ptr);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@ -274,15 +268,15 @@ namespace AiSequence
|
||||
for(auto& pkg : mPackages)
|
||||
{
|
||||
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)
|
||||
static_cast<AiTravel*>(pkg.mPackage)->mRepeat = true;
|
||||
static_cast<AiTravel&>(*pkg.mPackage).mRepeat = true;
|
||||
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)
|
||||
static_cast<AiFollow*>(pkg.mPackage)->mRepeat = true;
|
||||
static_cast<AiFollow&>(*pkg.mPackage).mRepeat = true;
|
||||
else if(pkg.mType == Ai_Activate)
|
||||
static_cast<AiActivate*>(pkg.mPackage)->mRepeat = true;
|
||||
static_cast<AiActivate&>(*pkg.mPackage).mRepeat = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <memory>
|
||||
|
||||
#include "components/esm/defs.hpp"
|
||||
|
||||
@ -149,7 +150,7 @@ namespace ESM
|
||||
{
|
||||
int mType;
|
||||
|
||||
AiPackage* mPackage;
|
||||
std::unique_ptr<AiPackage> mPackage;
|
||||
};
|
||||
|
||||
struct AiSequence
|
||||
@ -158,7 +159,6 @@ namespace ESM
|
||||
{
|
||||
mLastAiPackage = -1;
|
||||
}
|
||||
~AiSequence();
|
||||
|
||||
std::vector<AiPackageContainer> mPackages;
|
||||
int mLastAiPackage;
|
||||
|
Loading…
x
Reference in New Issue
Block a user