Convert all Create(PyroType) to Create(unique_ptr<CPyro>) so pyro manager doesn't need to know the different types

pyro-refactor
immibis 2021-07-03 20:42:25 +02:00
parent 1202df22ae
commit 72e7c19cd3
28 changed files with 171 additions and 123 deletions

View File

@ -45,8 +45,10 @@ namespace Gfx
{ {
CPyro::CPyro() CPyro::CPyro(PyroType type, CObject *obj)
{ {
m_object = obj;
m_type = type;
m_engine = CEngine::GetInstancePointer(); m_engine = CEngine::GetInstancePointer();
m_main = CRobotMain::GetInstancePointer(); m_main = CRobotMain::GetInstancePointer();
m_terrain = m_main->GetTerrain(); m_terrain = m_main->GetTerrain();
@ -68,21 +70,17 @@ void CPyro::DeleteObject()
m_lightRank = -1; m_lightRank = -1;
} }
} }
bool CPyro::Create()
bool CPyro::Create(PyroType type, CObject* obj, float force)
{ {
m_object = obj; ObjectType oType = m_object->GetType();
m_force = force; int objRank = m_object->GetObjectRank(0);
ObjectType oType = obj->GetType();
int objRank = obj->GetObjectRank(0);
if (objRank == -1) return false; if (objRank == -1) return false;
Math::Vector min, max; Math::Vector min, max;
m_engine->GetObjectBBox(objRank, min, max); m_engine->GetObjectBBox(objRank, min, max);
Math::Vector pos = obj->GetPosition(); Math::Vector pos = m_object->GetPosition();
for (const auto& crashSphere : obj->GetAllCrashSpheres()) for (const auto& crashSphere : m_object->GetAllCrashSpheres())
{ {
m_crashSpheres.push_back(crashSphere.sphere); m_crashSpheres.push_back(crashSphere.sphere);
} }
@ -108,7 +106,6 @@ bool CPyro::Create(PyroType type, CObject* obj, float force)
} }
m_pos = pos+(min+max)/2.0f; m_pos = pos+(min+max)/2.0f;
m_type = type;
m_progress = 0.0f; m_progress = 0.0f;
m_speed = 1.0f/20.0f; m_time = 0.0f; m_speed = 1.0f/20.0f; m_time = 0.0f;
m_lastParticle = 0.0f; m_lastParticle = 0.0f;
@ -124,8 +121,8 @@ bool CPyro::Create(PyroType type, CObject* obj, float force)
// Seeking the position of the battery. // Seeking the position of the battery.
CObject* power = nullptr; CObject* power = nullptr;
if (obj->Implements(ObjectInterfaceType::Powered)) if (m_object->Implements(ObjectInterfaceType::Powered))
power = dynamic_cast<CPoweredObject&>(*obj).GetPower(); power = dynamic_cast<CPoweredObject&>(*m_object).GetPower();
if (power == nullptr) if (power == nullptr)
{ {
@ -136,7 +133,7 @@ bool CPyro::Create(PyroType type, CObject* obj, float force)
m_power = true; m_power = true;
pos = power->GetPosition(); pos = power->GetPosition();
pos.y += 1.0f; pos.y += 1.0f;
Math::Matrix* mat = obj->GetWorldMatrix(0); Math::Matrix* mat = m_object->GetWorldMatrix(0);
m_posPower = Math::Transform(*mat, pos); m_posPower = Math::Transform(*mat, pos);
} }
@ -154,14 +151,14 @@ bool CPyro::Create(PyroType type, CObject* obj, float force)
if ( oType == OBJECT_STATION ) if ( oType == OBJECT_STATION )
{ {
m_power = true; m_power = true;
Math::Matrix* mat = obj->GetWorldMatrix(0); Math::Matrix* mat = m_object->GetWorldMatrix(0);
m_posPower = Math::Transform(*mat, Math::Vector(-15.0f, 7.0f, 0.0f)); m_posPower = Math::Transform(*mat, Math::Vector(-15.0f, 7.0f, 0.0f));
m_pos = m_posPower; m_pos = m_posPower;
} }
if ( oType == OBJECT_ENERGY ) if ( oType == OBJECT_ENERGY )
{ {
m_power = true; m_power = true;
Math::Matrix* mat = obj->GetWorldMatrix(0); Math::Matrix* mat = m_object->GetWorldMatrix(0);
m_posPower = Math::Transform(*mat, Math::Vector(-7.0f, 6.0f, 0.0f)); m_posPower = Math::Transform(*mat, Math::Vector(-7.0f, 6.0f, 0.0f));
m_pos = m_posPower; m_pos = m_posPower;
} }

View File

@ -65,7 +65,7 @@ protected:
friend class CPyroManager; friend class CPyroManager;
//! Creates pyrotechnic effect //! Creates pyrotechnic effect
bool Create(PyroType type, CObject* obj, float force); bool Create();
//! Destroys the object //! Destroys the object
void DeleteObject(); void DeleteObject();
@ -74,7 +74,7 @@ protected:
virtual void AfterEnd(); virtual void AfterEnd();
public: public:
CPyro(); // should only be called by CPyroManager CPyro(PyroType type, CObject *obj);
virtual ~CPyro(); virtual ~CPyro();
//! Indicates whether the pyrotechnic effect is complete //! Indicates whether the pyrotechnic effect is complete
@ -116,7 +116,6 @@ protected:
Math::Vector m_posPower; // center of the battery Math::Vector m_posPower; // center of the battery
bool m_power = false; // battery exists? bool m_power = false; // battery exists?
PyroType m_type = PT_NULL; PyroType m_type = PT_NULL;
float m_force = 0.0f;
float m_size = 0.0f; float m_size = 0.0f;
float m_progress = 0.0f; float m_progress = 0.0f;
float m_speed = 0.0f; float m_speed = 0.0f;
@ -163,6 +162,7 @@ protected:
class CFlagCreatePyro : public CPyro class CFlagCreatePyro : public CPyro
{ {
public: public:
CFlagCreatePyro(CObject *pObj);
void AfterCreate() override; void AfterCreate() override;
void UpdateEffect() override; void UpdateEffect() override;
void AfterEnd() override; void AfterEnd() override;
@ -171,6 +171,7 @@ public:
class CFlagDeletePyro : public CPyro class CFlagDeletePyro : public CPyro
{ {
public: public:
CFlagDeletePyro(CObject *pObj);
void AfterCreate() override; void AfterCreate() override;
void UpdateEffect() override; void UpdateEffect() override;
void AfterEnd() override; void AfterEnd() override;
@ -179,6 +180,7 @@ public:
class CWaypointHitPyro : public CPyro class CWaypointHitPyro : public CPyro
{ {
public: public:
CWaypointHitPyro(CObject *obj);
void AfterCreate() override; void AfterCreate() override;
void UpdateEffect() override; void UpdateEffect() override;
void AfterEnd() override; void AfterEnd() override;
@ -187,6 +189,8 @@ public:
class CFallPyro : public CPyro class CFallPyro : public CPyro
{ {
public: public:
CFallPyro(CObject *obj);
//! Start of an object freight falling //! Start of an object freight falling
void AfterCreate() override; void AfterCreate() override;
//! Seeks an object to explode by the falling ball of bees //! Seeks an object to explode by the falling ball of bees
@ -202,6 +206,7 @@ public:
class CResetPyro : public CPyro class CResetPyro : public CPyro
{ {
public: public:
CResetPyro(CObject *obj);
void AfterCreate() override; void AfterCreate() override;
void UpdateEffect() override; void UpdateEffect() override;
void AfterEnd() override; void AfterEnd() override;
@ -210,6 +215,7 @@ public:
class CLostPyro : public CPyro class CLostPyro : public CPyro
{ {
public: public:
CLostPyro(CObject *obj);
Error IsEnded() override; Error IsEnded() override;
void UpdateEffect() override; void UpdateEffect() override;
}; };
@ -217,6 +223,7 @@ public:
class CWinPyro : public CPyro class CWinPyro : public CPyro
{ {
public: public:
CWinPyro(CObject *obj);
Error IsEnded() override; Error IsEnded() override;
void UpdateEffect() override; void UpdateEffect() override;
}; };
@ -224,6 +231,7 @@ public:
class CSpiderPyro : public CPyro class CSpiderPyro : public CPyro
{ {
public: public:
CSpiderPyro(CObject *obj);
Error IsEnded() override; Error IsEnded() override;
void AfterCreate() override; void AfterCreate() override;
}; };
@ -231,6 +239,7 @@ public:
class CEggPyro : public CPyro class CEggPyro : public CPyro
{ {
public: public:
CEggPyro(CObject *obj);
Error IsEnded() override; Error IsEnded() override;
void AfterCreate() override; void AfterCreate() override;
}; };
@ -238,18 +247,21 @@ public:
class CDeadGPyro : public CPyro class CDeadGPyro : public CPyro
{ {
public: public:
CDeadGPyro(CObject *obj);
void AfterCreate() override; void AfterCreate() override;
}; };
class CDeadWPyro : public CPyro class CDeadWPyro : public CPyro
{ {
public: public:
CDeadWPyro(CObject *obj);
void AfterCreate() override; void AfterCreate() override;
}; };
class CFindingPyro : public CPyro class CFindingPyro : public CPyro
{ {
public: public:
CFindingPyro(CObject *obj);
void AfterCreate() override; void AfterCreate() override;
void UpdateEffect() override; void UpdateEffect() override;
}; };
@ -257,6 +269,7 @@ public:
class CSquashPyro : public CPyro class CSquashPyro : public CPyro
{ {
public: public:
CSquashPyro(CObject *obj);
void AfterCreate() override; void AfterCreate() override;
void UpdateEffect() override; void UpdateEffect() override;
void AfterEnd() override; void AfterEnd() override;
@ -265,6 +278,7 @@ public:
class CFragVPyro : public CPyro class CFragVPyro : public CPyro
{ {
public: public:
CFragVPyro(CObject *obj);
Error IsEnded() override; Error IsEnded() override;
void AfterCreate() override; void AfterCreate() override;
}; };
@ -272,6 +286,7 @@ public:
class CBurnPyro : public CPyro class CBurnPyro : public CPyro
{ {
public: public:
CBurnPyro(PyroType type, CObject *obj);
void AfterCreate() override; void AfterCreate() override;
void UpdateEffect() override; void UpdateEffect() override;
@ -289,7 +304,9 @@ public:
class CFragExploOrShotPyro : public CPyro class CFragExploOrShotPyro : public CPyro
{ {
float m_force;
public: public:
CFragExploOrShotPyro(PyroType type, CObject *obj, float force = 1.0f);
void AfterCreate() override; void AfterCreate() override;
Error IsEnded() override; Error IsEnded() override;
void UpdateEffect() override; void UpdateEffect() override;

View File

@ -35,47 +35,9 @@ Gfx::CPyroManager::CPyroManager()
CPyroManager::~CPyroManager() CPyroManager::~CPyroManager()
{} {}
void Gfx::CPyroManager::Create(PyroType type, CObject* obj, float force) void Gfx::CPyroManager::Create(CPyroUPtr pyroUPtr)
{ {
std::unique_ptr<CPyro> pyroUPtr; pyroUPtr->Create();
switch (type)
{
case PT_FRAGT:
case PT_FRAGO:
case PT_FRAGW:
case PT_EXPLOT:
case PT_EXPLOO:
case PT_EXPLOW:
case PT_SHOTT:
case PT_SHOTH:
case PT_SHOTM:
case PT_SHOTW:
pyroUPtr = MakeUnique<CFragExploOrShotPyro>();
break;
case PT_BURNT:
case PT_BURNO:
pyroUPtr = MakeUnique<CBurnPyro>();
break;
case PT_FLCREATE: pyroUPtr = MakeUnique<CFlagCreatePyro>(); break;
case PT_FLDELETE: pyroUPtr = MakeUnique<CFlagDeletePyro>(); break;
case PT_WPCHECK: pyroUPtr = MakeUnique<CWaypointHitPyro>(); break;
case PT_FALL: pyroUPtr = MakeUnique<CFallPyro>(); break;
case PT_RESET: pyroUPtr = MakeUnique<CResetPyro>(); break;
case PT_LOST: pyroUPtr = MakeUnique<CLostPyro>(); break;
case PT_WIN: pyroUPtr = MakeUnique<CWinPyro>(); break;
case PT_SPIDER: pyroUPtr = MakeUnique<CSpiderPyro>(); break;
case PT_DEADG: pyroUPtr = MakeUnique<CDeadGPyro>(); break;
case PT_DEADW: pyroUPtr = MakeUnique<CDeadWPyro>(); break;
case PT_FINDING: pyroUPtr = MakeUnique<CFindingPyro>(); break;
case PT_SQUASH: pyroUPtr = MakeUnique<CSquashPyro>(); break;
case PT_FRAGV: pyroUPtr = MakeUnique<CFragVPyro>(); break;
default:
// shouldn't get here
assert(false);
pyroUPtr = MakeUnique<CPyro>();
break;
}
pyroUPtr->Create(type, obj, force);
m_pyros.insert(std::move(pyroUPtr)); m_pyros.insert(std::move(pyroUPtr));
} }

View File

@ -44,7 +44,7 @@ public:
CPyroManager(); CPyroManager();
~CPyroManager(); ~CPyroManager();
void Create(PyroType type, CObject* obj, float force=1.0f); void Create(CPyroUPtr pyroUPtr);
void DeleteAll(); void DeleteAll();
void CutObjectLink(CObject* obj); void CutObjectLink(CObject* obj);

View File

@ -52,18 +52,11 @@ enum PyroType
PT_BURNT = 14, //! < burning of technical object PT_BURNT = 14, //! < burning of technical object
PT_BURNO = 15, //! < burning of organic object PT_BURNO = 15, //! < burning of organic object
PT_SPIDER = 16, //! < spider explosion PT_SPIDER = 16, //! < spider explosion
PT_FALL = 17, //! < cargo falling
PT_WPCHECK = 18, //! < indicator reaches
PT_FLCREATE = 19, //! < flag create
PT_FLDELETE = 20, //! < flag destroy
PT_RESET = 21, //! < reset position of the object
PT_WIN = 22, //! < fireworks PT_WIN = 22, //! < fireworks
PT_LOST = 23, //! < black smoke PT_LOST = 23, //! < black smoke
PT_DEADG = 24, //! < shooting death
PT_DEADW = 25, //! < drowning death
PT_FINDING = 26, //! < object discovered
PT_FRAGV = 27, //! < fragmentation of plant object PT_FRAGV = 27, //! < fragmentation of plant object
PT_SQUASH = 28, //! < flattening plants
PT_OTHER = 100, //! < No special type code; behaviour is decided by subclass
}; };
} // namespace Gfx } // namespace Gfx

View File

@ -32,6 +32,10 @@
using namespace Gfx; using namespace Gfx;
CBurnPyro::CBurnPyro(PyroType type, CObject *obj)
: CPyro(type, obj)
{}
void CBurnPyro::AfterCreate() void CBurnPyro::AfterCreate()
{ {
assert( m_type == PT_BURNT || m_type == PT_BURNO ); assert( m_type == PT_BURNT || m_type == PT_BURNO );

View File

@ -34,6 +34,10 @@
using namespace Gfx; using namespace Gfx;
CDeadGPyro::CDeadGPyro(CObject *obj)
: CPyro(PT_OTHER, obj)
{}
void CDeadGPyro::AfterCreate() void CDeadGPyro::AfterCreate()
{ {
if (m_object->GetType() == OBJECT_HUMAN) if (m_object->GetType() == OBJECT_HUMAN)
@ -53,6 +57,10 @@ void CDeadGPyro::AfterCreate()
m_speed = 1.0f/10.0f; m_speed = 1.0f/10.0f;
} }
CDeadWPyro::CDeadWPyro(CObject *obj)
: CPyro(PT_OTHER, obj)
{}
void CDeadWPyro::AfterCreate() void CDeadWPyro::AfterCreate()
{ {
if (m_object->GetType() == OBJECT_HUMAN) if (m_object->GetType() == OBJECT_HUMAN)

View File

@ -27,6 +27,9 @@
using namespace Gfx; using namespace Gfx;
CEggPyro::CEggPyro(CObject *obj)
: CPyro(PT_EGG, obj)
{}
Error CEggPyro::IsEnded() { Error CEggPyro::IsEnded() {
// Destroys the object that exploded. // Destroys the object that exploded.

View File

@ -33,6 +33,9 @@
using namespace Gfx; using namespace Gfx;
CFallPyro::CFallPyro(CObject *obj)
: CPyro(PT_OTHER, obj)
{}
void CFallPyro::AfterCreate() void CFallPyro::AfterCreate()
{ {

View File

@ -29,6 +29,10 @@
using namespace Gfx; using namespace Gfx;
CFindingPyro::CFindingPyro(CObject *obj)
: CPyro(PT_OTHER, obj)
{}
void CFindingPyro::AfterCreate() void CFindingPyro::AfterCreate()
{ {
float limit = (m_size-1.0f)/4.0f; float limit = (m_size-1.0f)/4.0f;

View File

@ -29,6 +29,10 @@
using namespace Gfx; using namespace Gfx;
CFlagCreatePyro::CFlagCreatePyro(CObject *pObj)
: CPyro(PT_OTHER, pObj)
{}
void CFlagCreatePyro::AfterCreate() void CFlagCreatePyro::AfterCreate()
{ {
m_sound->Play(SOUND_WAYPOINT, m_pos); m_sound->Play(SOUND_WAYPOINT, m_pos);

View File

@ -29,6 +29,10 @@
using namespace Gfx; using namespace Gfx;
CFlagDeletePyro::CFlagDeletePyro(CObject *pObj)
: CPyro(PT_OTHER, pObj)
{}
void CFlagDeletePyro::AfterCreate() void CFlagDeletePyro::AfterCreate()
{ {
m_sound->Play(SOUND_WAYPOINT, m_pos); m_sound->Play(SOUND_WAYPOINT, m_pos);

View File

@ -32,6 +32,11 @@
using namespace Gfx; using namespace Gfx;
CFragExploOrShotPyro::CFragExploOrShotPyro(PyroType type, CObject *obj, float force)
: CPyro(type, obj),
m_force(force)
{}
void CFragExploOrShotPyro::AfterCreate() void CFragExploOrShotPyro::AfterCreate()
{ {
ObjectType oType = m_object->GetType(); ObjectType oType = m_object->GetType();

View File

@ -28,6 +28,10 @@
using namespace Gfx; using namespace Gfx;
CFragVPyro::CFragVPyro(CObject *obj)
: CPyro(PT_FRAGV, obj)
{}
Error CFragVPyro::IsEnded() { Error CFragVPyro::IsEnded() {
// Destroys the object that exploded. // Destroys the object that exploded.
//It should not be destroyed at the end of the Create, //It should not be destroyed at the end of the Create,

View File

@ -26,6 +26,10 @@
using namespace Gfx; using namespace Gfx;
CResetPyro::CResetPyro(CObject *obj)
: CPyro(PT_OTHER, obj)
{}
void CResetPyro::AfterCreate() void CResetPyro::AfterCreate()
{ {
m_speed = 1.0f/2.0f; m_speed = 1.0f/2.0f;

View File

@ -33,6 +33,10 @@
using namespace Gfx; using namespace Gfx;
CSpiderPyro::CSpiderPyro(CObject *obj)
: CPyro(PT_SPIDER, obj)
{}
Error CSpiderPyro::IsEnded() { Error CSpiderPyro::IsEnded() {
// Destroys the object that exploded. // Destroys the object that exploded.
//It should not be destroyed at the end of the Create, //It should not be destroyed at the end of the Create,
@ -99,5 +103,5 @@ void CSpiderPyro::AfterCreate()
2.0f+Math::Rand()*2.0f, 10.0f, 2.0f, 0.6f); 2.0f+Math::Rand()*2.0f, 10.0f, 2.0f, 0.6f);
} }
m_camera->StartEffect(CAM_EFFECT_EXPLO, m_pos, m_force); m_camera->StartEffect(CAM_EFFECT_EXPLO, m_pos, 1.0f);
} }

View File

@ -26,6 +26,10 @@
using namespace Gfx; using namespace Gfx;
CSquashPyro::CSquashPyro(CObject *obj)
: CPyro(PT_OTHER, obj)
{}
void CSquashPyro::AfterCreate() void CSquashPyro::AfterCreate()
{ {
m_speed = 1.0f/2.0f; m_speed = 1.0f/2.0f;

View File

@ -28,6 +28,10 @@
using namespace Gfx; using namespace Gfx;
CWaypointHitPyro::CWaypointHitPyro(CObject *obj)
: CPyro(PT_OTHER, obj)
{}
void CWaypointHitPyro::AfterCreate() void CWaypointHitPyro::AfterCreate()
{ {
m_sound->Play(SOUND_WAYPOINT, m_pos); m_sound->Play(SOUND_WAYPOINT, m_pos);

View File

@ -28,6 +28,14 @@
using namespace Gfx; using namespace Gfx;
CWinPyro::CWinPyro(CObject *obj)
: CPyro(PT_OTHER, obj)
{}
CLostPyro::CLostPyro(CObject *obj)
: CPyro(PT_OTHER, obj)
{}
void CWinPyro::UpdateEffect() void CWinPyro::UpdateEffect()
{ {
if ( m_object == nullptr ) if ( m_object == nullptr )

View File

@ -51,6 +51,7 @@
#include "graphics/model/model_manager.h" #include "graphics/model/model_manager.h"
#include "graphics/pyro/pyro.h"
#include "graphics/pyro/pyro_manager.h" #include "graphics/pyro/pyro_manager.h"
#include "level/mainmovie.h" #include "level/mainmovie.h"
@ -2045,7 +2046,7 @@ bool CRobotMain::DestroySelectedObject()
if (obj == nullptr) return false; if (obj == nullptr) return false;
assert(obj->Implements(ObjectInterfaceType::Controllable)); assert(obj->Implements(ObjectInterfaceType::Controllable));
m_engine->GetPyroManager()->Create(Gfx::PT_FRAGT, obj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_FRAGT, obj));
NotifyObjectDestroyed(obj); NotifyObjectDestroyed(obj);
dynamic_cast<CControllableObject&>(*obj).SetSelect(false); // deselects the object dynamic_cast<CControllableObject&>(*obj).SetSelect(false); // deselects the object
@ -2404,7 +2405,7 @@ bool CRobotMain::EventFrame(const Event &event)
obj->SetProxyActivate(false); obj->SetProxyActivate(false);
CreateShortcuts(); CreateShortcuts();
m_sound->Play(SOUND_FINDING); m_sound->Play(SOUND_FINDING);
m_engine->GetPyroManager()->Create(Gfx::PT_FINDING, obj, 0.0f); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFindingPyro>(obj));
DisplayError(INFO_FINDING, obj); DisplayError(INFO_FINDING, obj);
} }
} }
@ -5042,7 +5043,7 @@ void CRobotMain::ResetCreate()
{ {
if (obj->GetAnimateOnReset()) if (obj->GetAnimateOnReset())
{ {
m_engine->GetPyroManager()->Create(Gfx::PT_RESET, obj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CResetPyro>(obj));
} }
} }
} }

View File

@ -22,6 +22,7 @@
#include "common/make_unique.h" #include "common/make_unique.h"
#include "graphics/pyro/pyro.h"
#include "graphics/pyro/pyro_manager.h" #include "graphics/pyro/pyro_manager.h"
#include "level/parser/parserline.h" #include "level/parser/parserline.h"
@ -249,7 +250,7 @@ Error CAutoEgg::IsEnded()
{ {
if ( m_progress < 1.0f ) return ERR_CONTINUE; if ( m_progress < 1.0f ) return ERR_CONTINUE;
m_engine->GetPyroManager()->Create(Gfx::PT_EGG, m_object); // exploding egg m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CEggPyro>(m_object)); // exploding egg
alien->SetScale(1.0f); // this is a big boy now alien->SetScale(1.0f); // this is a big boy now

View File

@ -32,6 +32,7 @@
#include "graphics/engine/particle.h" #include "graphics/engine/particle.h"
#include "graphics/engine/terrain.h" #include "graphics/engine/terrain.h"
#include "graphics/pyro/pyro.h"
#include "graphics/pyro/pyro_manager.h" #include "graphics/pyro/pyro_manager.h"
#include "level/robotmain.h" #include "level/robotmain.h"
@ -451,15 +452,15 @@ bool COldObject::DamageObject(DamageType type, float force, CObject* killer)
if ( m_type == OBJECT_HUMAN ) if ( m_type == OBJECT_HUMAN )
{ {
m_engine->GetPyroManager()->Create(Gfx::PT_SHOTH, this, loss); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_SHOTH, this, loss));
} }
else if ( m_type == OBJECT_MOTHER ) else if ( m_type == OBJECT_MOTHER )
{ {
m_engine->GetPyroManager()->Create(Gfx::PT_SHOTM, this, loss); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_SHOTM, this, loss));
} }
else else
{ {
m_engine->GetPyroManager()->Create(Gfx::PT_SHOTT, this, loss); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_SHOTT, this, loss));
} }
return false; return false;
} }
@ -479,7 +480,6 @@ void COldObject::DestroyObject(DestructionType type, CObject* killer)
SetDamaging(false); SetDamaging(false);
} }
Gfx::PyroType pyroType = Gfx::PT_NULL;
if ( type == DestructionType::Explosion ) // explosion? if ( type == DestructionType::Explosion ) // explosion?
{ {
if ( m_type == OBJECT_ANT || if ( m_type == OBJECT_ANT ||
@ -487,17 +487,20 @@ void COldObject::DestroyObject(DestructionType type, CObject* killer)
m_type == OBJECT_BEE || m_type == OBJECT_BEE ||
m_type == OBJECT_WORM ) m_type == OBJECT_WORM )
{ {
pyroType = Gfx::PT_EXPLOO; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_EXPLOO, this, 1.0f));
m_main->NotifyObjectDestroyed(this);
} }
else if ( m_type == OBJECT_MOTHER || else if ( m_type == OBJECT_MOTHER ||
m_type == OBJECT_NEST || m_type == OBJECT_NEST ||
m_type == OBJECT_BULLET ) m_type == OBJECT_BULLET )
{ {
pyroType = Gfx::PT_FRAGO; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_FRAGO, this, 1.0f));
SetDying(DeathType::Exploding);
m_main->NotifyObjectDestroyed(this);
} }
else if ( m_type == OBJECT_HUMAN ) else if ( m_type == OBJECT_HUMAN )
{ {
pyroType = Gfx::PT_DEADG; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CDeadGPyro>(this));
} }
else if ( m_type == OBJECT_BASE || else if ( m_type == OBJECT_BASE ||
m_type == OBJECT_DERRICK || m_type == OBJECT_DERRICK ||
@ -525,20 +528,27 @@ void COldObject::DestroyObject(DestructionType type, CObject* killer)
m_type == OBJECT_RUINradar || m_type == OBJECT_RUINradar ||
m_type == OBJECT_RUINconvert ) // building? m_type == OBJECT_RUINconvert ) // building?
{ {
pyroType = Gfx::PT_FRAGT; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_FRAGT, this, 1.0f));
SetDying(DeathType::Exploding);
m_main->NotifyObjectDestroyed(this);
} }
else if ( m_type == OBJECT_MOBILEtg ) else if ( m_type == OBJECT_MOBILEtg )
{ {
pyroType = Gfx::PT_FRAGT; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_FRAGT, this, 1.0f));
SetDying(DeathType::Exploding);
m_main->NotifyObjectDestroyed(this);
} }
else else
{ {
pyroType = Gfx::PT_EXPLOT; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_EXPLOT, this, 1.0f));
m_main->NotifyObjectDestroyed(this);
} }
} }
else if ( type == DestructionType::ExplosionWater ) else if ( type == DestructionType::ExplosionWater )
{ {
pyroType = Gfx::PT_FRAGW; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_FRAGW, this, 1.0f));
SetDying(DeathType::Exploding);
m_main->NotifyObjectDestroyed(this);
} }
else if ( type == DestructionType::Burn ) // burning? else if ( type == DestructionType::Burn ) // burning?
{ {
@ -549,51 +559,39 @@ void COldObject::DestroyObject(DestructionType type, CObject* killer)
m_type == OBJECT_WORM || m_type == OBJECT_WORM ||
m_type == OBJECT_BULLET ) m_type == OBJECT_BULLET )
{ {
pyroType = Gfx::PT_BURNO; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CBurnPyro>(Gfx::PT_BURNO, this));
SetDying(DeathType::Burning); SetDying(DeathType::Burning);
m_main->NotifyObjectDestroyed(this);
} }
else if ( m_type == OBJECT_HUMAN ) else if ( m_type == OBJECT_HUMAN )
{ {
pyroType = Gfx::PT_DEADG; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CDeadGPyro>(this));
} }
else else
{ {
pyroType = Gfx::PT_BURNT; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CBurnPyro>(Gfx::PT_BURNT, this));
SetDying(DeathType::Burning); SetDying(DeathType::Burning);
m_main->NotifyObjectDestroyed(this);
} }
SetVirusMode(false); SetVirusMode(false);
} }
else if ( type == DestructionType::Drowned ) else if ( type == DestructionType::Drowned )
{ {
pyroType = Gfx::PT_DEADW; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CDeadWPyro>(this));
} }
else if ( type == DestructionType::Win ) else if ( type == DestructionType::Win )
{ {
pyroType = Gfx::PT_WPCHECK; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CWaypointHitPyro>(this));
} }
else if ( type == DestructionType::Squash ) else if ( type == DestructionType::Squash )
{ {
pyroType = Gfx::PT_SQUASH; m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CSquashPyro>(this));
DeleteAllCrashSpheres(); DeleteAllCrashSpheres();
} }
assert(pyroType != Gfx::PT_NULL); else
if (pyroType == Gfx::PT_FRAGT ||
pyroType == Gfx::PT_FRAGO ||
pyroType == Gfx::PT_FRAGW)
{ {
SetDying(DeathType::Exploding); // should be unreachable
} assert(false);
m_engine->GetPyroManager()->Create(pyroType, this);
if ( pyroType == Gfx::PT_FRAGT ||
pyroType == Gfx::PT_FRAGO ||
pyroType == Gfx::PT_FRAGW ||
pyroType == Gfx::PT_EXPLOT ||
pyroType == Gfx::PT_EXPLOO ||
pyroType == Gfx::PT_EXPLOW ||
pyroType == Gfx::PT_BURNT ||
pyroType == Gfx::PT_BURNO )
{
m_main->NotifyObjectDestroyed(this);
} }
if ( Implements(ObjectInterfaceType::Programmable) ) if ( Implements(ObjectInterfaceType::Programmable) )
@ -1166,8 +1164,18 @@ void COldObject::Read(CLevelParserLine* line)
SetCameraType(line->GetParam("camera")->AsCameraType()); SetCameraType(line->GetParam("camera")->AsCameraType());
SetCameraLock(line->GetParam("cameraLock")->AsBool(false)); SetCameraLock(line->GetParam("cameraLock")->AsBool(false));
if (line->GetParam("pyro")->IsDefined()) if (line->GetParam("pyro")->IsDefined()) {
m_engine->GetPyroManager()->Create(line->GetParam("pyro")->AsPyroType(), this); switch(line->GetParam("pyro")->AsPyroType()) {
case Gfx::PT_WIN:
m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CWinPyro>(this));
break;
case Gfx::PT_LOST:
m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CLostPyro>(this));
break;
default:
assert(false); // unreachable
}
}
SetBulletWall(line->GetParam("bulletWall")->AsBool(IsBulletWallByDefault(m_type))); SetBulletWall(line->GetParam("bulletWall")->AsBool(IsBulletWallByDefault(m_type)));

View File

@ -25,6 +25,7 @@
#include "graphics/engine/particle.h" #include "graphics/engine/particle.h"
#include "graphics/engine/terrain.h" #include "graphics/engine/terrain.h"
#include "graphics/pyro/pyro.h"
#include "graphics/pyro/pyro_manager.h" #include "graphics/pyro/pyro_manager.h"
#include "level/robotmain.h" #include "level/robotmain.h"
@ -90,6 +91,6 @@ void CTaskDeleteMark::DeleteMark()
if (obj != nullptr) if (obj != nullptr)
{ {
m_engine->GetPyroManager()->Create(Gfx::PT_WPCHECK, obj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CWaypointHitPyro>(obj));
} }
} }

View File

@ -22,6 +22,7 @@
#include "graphics/engine/particle.h" #include "graphics/engine/particle.h"
#include "graphics/engine/water.h" #include "graphics/engine/water.h"
#include "graphics/pyro/pyro.h"
#include "graphics/pyro/pyro_manager.h" #include "graphics/pyro/pyro_manager.h"
#include "math/geometry.h" #include "math/geometry.h"
@ -284,7 +285,7 @@ Error CTaskFlag::CreateFlag(int rank)
//pNew->SetScale(0.0f); //pNew->SetScale(0.0f);
m_sound->Play(SOUND_WAYPOINT, pos); m_sound->Play(SOUND_WAYPOINT, pos);
m_engine->GetPyroManager()->Create(Gfx::PT_FLCREATE, pNew); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFlagCreatePyro>(pNew));
return ERR_OK; return ERR_OK;
} }
@ -322,7 +323,7 @@ Error CTaskFlag::DeleteFlag()
m_sound->Play(SOUND_WAYPOINT, iPos); m_sound->Play(SOUND_WAYPOINT, iPos);
m_engine->GetPyroManager()->Create(Gfx::PT_FLDELETE, pObj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFlagDeletePyro>(pObj));
return ERR_OK; return ERR_OK;
} }

View File

@ -22,6 +22,7 @@
#include "graphics/engine/terrain.h" #include "graphics/engine/terrain.h"
#include "graphics/pyro/pyro.h"
#include "graphics/pyro/pyro_manager.h" #include "graphics/pyro/pyro_manager.h"
#include "level/robotmain.h" #include "level/robotmain.h"
@ -324,7 +325,7 @@ Error CTaskManip::Start(TaskManipOrder order, TaskManipArm arm)
pos.y += 2.0f; pos.y += 2.0f;
m_object->SetPosition(pos); // against the top of jump m_object->SetPosition(pos); // against the top of jump
m_engine->GetPyroManager()->Create(Gfx::PT_FALL, other); // the ball falls m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFallPyro>(other)); // the ball falls
} }
m_bBee = true; m_bBee = true;

View File

@ -22,6 +22,7 @@
#include "graphics/engine/engine.h" #include "graphics/engine/engine.h"
#include "graphics/pyro/pyro.h"
#include "graphics/pyro/pyro_manager.h" #include "graphics/pyro/pyro_manager.h"
#include "level/robotmain.h" #include "level/robotmain.h"
@ -100,7 +101,7 @@ Error CTaskSpiderExplo::IsEnded()
if ( m_time < 1.0f ) return ERR_CONTINUE; if ( m_time < 1.0f ) return ERR_CONTINUE;
m_engine->GetPyroManager()->Create(Gfx::PT_SPIDER, m_object); // the spider explodes (suicide) m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CSpiderPyro>(m_object)); // the spider explodes (suicide)
m_main->NotifyObjectDestroyed(m_object); m_main->NotifyObjectDestroyed(m_object);
Abort(); Abort();

View File

@ -22,6 +22,7 @@
#include "graphics/engine/particle.h" #include "graphics/engine/particle.h"
#include "graphics/engine/terrain.h" #include "graphics/engine/terrain.h"
#include "graphics/pyro/pyro.h"
#include "graphics/pyro/pyro_manager.h" #include "graphics/pyro/pyro_manager.h"
#include "level/robotmain.h" #include "level/robotmain.h"
@ -420,14 +421,14 @@ bool CTaskTerraform::Terraform()
type == OBJECT_EGG ) // Alien Organic? type == OBJECT_EGG ) // Alien Organic?
{ {
if ( dist > 5.0f ) continue; if ( dist > 5.0f ) continue;
m_engine->GetPyroManager()->Create(Gfx::PT_FRAGO, pObj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_FRAGO, pObj, 1.0f));
m_main->NotifyObjectDestroyed(pObj); m_main->NotifyObjectDestroyed(pObj);
} }
else if ( type == OBJECT_TNT || else if ( type == OBJECT_TNT ||
type == OBJECT_BOMB ) // Explosives? type == OBJECT_BOMB ) // Explosives?
{ {
if ( dist > 5.0f ) continue; if ( dist > 5.0f ) continue;
m_engine->GetPyroManager()->Create(Gfx::PT_EXPLOT, pObj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_EXPLOT, pObj, 1.0f));
m_main->NotifyObjectDestroyed(pObj); m_main->NotifyObjectDestroyed(pObj);
dynamic_cast<CDamageableObject&>(*m_object).DamageObject(DamageType::Explosive, 0.9f); dynamic_cast<CDamageableObject&>(*m_object).DamageObject(DamageType::Explosive, 0.9f);
} }
@ -446,13 +447,13 @@ bool CTaskTerraform::Terraform()
type == OBJECT_PLANT19 ) // Plants? type == OBJECT_PLANT19 ) // Plants?
{ {
if ( dist > 7.5f ) continue; if ( dist > 7.5f ) continue;
m_engine->GetPyroManager()->Create(Gfx::PT_FRAGV, pObj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragVPyro>(pObj));
} }
else // Other? else // Other?
{ {
if ( dist > 5.0f ) continue; if ( dist > 5.0f ) continue;
m_engine->GetPyroManager()->Create(Gfx::PT_FRAGT, pObj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_FRAGT, pObj, 1.0f));
m_main->NotifyObjectDestroyed(pObj); m_main->NotifyObjectDestroyed(pObj);
} }
} }
@ -476,12 +477,12 @@ bool CTaskTerraform::Terraform()
dynamic_cast<CBaseAlien&>(*pObj).SetFixed(true); // not moving dynamic_cast<CBaseAlien&>(*pObj).SetFixed(true); // not moving
if ( dist > 5.0f ) continue; if ( dist > 5.0f ) continue;
m_engine->GetPyroManager()->Create(Gfx::PT_EXPLOO, pObj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_EXPLOO, pObj, 1.0f));
} }
else if ( type == OBJECT_BEE || type == OBJECT_WORM ) else if ( type == OBJECT_BEE || type == OBJECT_WORM )
{ {
if ( dist > 5.0f ) continue; if ( dist > 5.0f ) continue;
m_engine->GetPyroManager()->Create(Gfx::PT_EXPLOO, pObj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CFragExploOrShotPyro>(Gfx::PT_EXPLOO, pObj, 1.0f));
} }
} }
} }

View File

@ -32,6 +32,7 @@
#include "graphics/engine/terrain.h" #include "graphics/engine/terrain.h"
#include "graphics/engine/water.h" #include "graphics/engine/water.h"
#include "graphics/pyro/pyro.h"
#include "graphics/pyro/pyro_manager.h" #include "graphics/pyro/pyro_manager.h"
#include "level/robotmain.h" #include "level/robotmain.h"
@ -2546,7 +2547,7 @@ int CPhysics::ObjectAdapt(const Math::Vector &pos, const Math::Vector &angle)
if ( distance < 4.0f ) if ( distance < 4.0f )
{ {
m_sound->Play(SOUND_WAYPOINT, m_object->GetPosition()); m_sound->Play(SOUND_WAYPOINT, m_object->GetPosition());
m_engine->GetPyroManager()->Create(Gfx::PT_WPCHECK, pObj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CWaypointHitPyro>(pObj));
} }
} }
@ -2557,7 +2558,7 @@ int CPhysics::ObjectAdapt(const Math::Vector &pos, const Math::Vector &angle)
if ( distance < 10.0f*1.5f ) if ( distance < 10.0f*1.5f )
{ {
m_sound->Play(SOUND_WAYPOINT, m_object->GetPosition()); m_sound->Play(SOUND_WAYPOINT, m_object->GetPosition());
m_engine->GetPyroManager()->Create(Gfx::PT_WPCHECK, pObj); m_engine->GetPyroManager()->Create(MakeUnique<Gfx::CWaypointHitPyro>(pObj));
} }
} }