Separate the destruction message from the explosion effect. Note: Spiders now give death messages when they explode.

pyro-refactor
immibis 2020-07-25 19:14:40 +02:00
parent fabbdda964
commit b7edd9c195
7 changed files with 100 additions and 93 deletions

View File

@ -84,8 +84,6 @@ bool CPyro::Create(PyroType type, CObject* obj, float force)
m_engine->GetObjectBBox(objRank, min, max);
Math::Vector pos = obj->GetPosition();
DisplayError(type, obj); // displays eventual messages
for (const auto& crashSphere : obj->GetAllCrashSpheres())
{
m_crashSpheres.push_back(crashSphere.sphere);
@ -1262,93 +1260,6 @@ void CPyro::CutObjectLink(CObject* obj)
m_object = nullptr;
}
void CPyro::DisplayError(PyroType type, CObject* obj)
{
ObjectType oType = obj->GetType();
if ( type == PT_FRAGT ||
type == PT_FRAGO ||
type == PT_FRAGW ||
type == PT_EXPLOT ||
type == PT_EXPLOO ||
type == PT_EXPLOW ||
type == PT_BURNT ||
type == PT_BURNO )
{
Error err = ERR_OK;
if ( oType == OBJECT_MOTHER ) err = INFO_DELETEMOTHER;
if ( oType == OBJECT_ANT ) err = INFO_DELETEANT;
if ( oType == OBJECT_BEE ) err = INFO_DELETEBEE;
if ( oType == OBJECT_WORM ) err = INFO_DELETEWORM;
if ( oType == OBJECT_SPIDER ) err = INFO_DELETESPIDER;
if ( oType == OBJECT_MOBILEwa ||
oType == OBJECT_MOBILEta ||
oType == OBJECT_MOBILEfa ||
oType == OBJECT_MOBILEia ||
oType == OBJECT_MOBILEwb ||
oType == OBJECT_MOBILEtb ||
oType == OBJECT_MOBILEfb ||
oType == OBJECT_MOBILEib ||
oType == OBJECT_MOBILEwc ||
oType == OBJECT_MOBILEtc ||
oType == OBJECT_MOBILEfc ||
oType == OBJECT_MOBILEic ||
oType == OBJECT_MOBILEwi ||
oType == OBJECT_MOBILEti ||
oType == OBJECT_MOBILEfi ||
oType == OBJECT_MOBILEii ||
oType == OBJECT_MOBILEws ||
oType == OBJECT_MOBILEts ||
oType == OBJECT_MOBILEfs ||
oType == OBJECT_MOBILEis ||
oType == OBJECT_MOBILErt ||
oType == OBJECT_MOBILErc ||
oType == OBJECT_MOBILErr ||
oType == OBJECT_MOBILErs ||
oType == OBJECT_MOBILEsa ||
oType == OBJECT_MOBILEwt ||
oType == OBJECT_MOBILEtt ||
oType == OBJECT_MOBILEft ||
oType == OBJECT_MOBILEit ||
oType == OBJECT_MOBILErp ||
oType == OBJECT_MOBILEst ||
oType == OBJECT_MOBILEdr )
{
err = ERR_DELETEMOBILE;
}
if ( oType == OBJECT_DERRICK ||
oType == OBJECT_FACTORY ||
oType == OBJECT_STATION ||
oType == OBJECT_CONVERT ||
oType == OBJECT_REPAIR ||
oType == OBJECT_DESTROYER||
oType == OBJECT_TOWER ||
oType == OBJECT_RESEARCH ||
oType == OBJECT_RADAR ||
oType == OBJECT_INFO ||
oType == OBJECT_ENERGY ||
oType == OBJECT_LABO ||
oType == OBJECT_NUCLEAR ||
oType == OBJECT_PARA ||
oType == OBJECT_SAFE ||
oType == OBJECT_HUSTON ||
oType == OBJECT_START ||
oType == OBJECT_END )
{
err = ERR_DELETEBUILDING;
m_main->DisplayError(err, obj->GetPosition(), 5.0f);
return;
}
if ( err != ERR_OK )
{
m_main->DisplayError(err, obj);
}
}
}
void CPyro::CreateLight(Math::Vector pos, float height)
{
if (!m_engine->GetLightMode()) return;

View File

@ -83,10 +83,6 @@ public:
bool EventProcess(const Event& event);
protected:
//! Displays the error or eventual information
//! Information can be linked to the destruction of an insect, a vehicle or building
void DisplayError(PyroType type, CObject* obj);
//! Creates light to accompany a pyrotechnic effect
void CreateLight(Math::Vector pos, float height);
//! Removes the binding to a pyrotechnic effect

View File

@ -2045,6 +2045,7 @@ bool CRobotMain::DestroySelectedObject()
assert(obj->Implements(ObjectInterfaceType::Controllable));
m_engine->GetPyroManager()->Create(Gfx::PT_FRAGT, obj);
NotifyObjectDestroyed(obj);
dynamic_cast<CControllableObject&>(*obj).SetSelect(false); // deselects the object
m_camera->SetType(Gfx::CAM_TYPE_EXPLO);
@ -5671,6 +5672,86 @@ void CRobotMain::ClearInterface()
m_tooltipName.clear(); // really removes the tooltip
}
void CRobotMain::NotifyObjectDestroyed(CObject* pObj)
{
switch (pObj->GetType())
{
case OBJECT_MOTHER:
DisplayError(INFO_DELETEMOTHER, pObj);
break;
case OBJECT_ANT:
DisplayError(INFO_DELETEANT, pObj);
break;
case OBJECT_BEE:
DisplayError(INFO_DELETEBEE, pObj);
break;
case OBJECT_WORM:
DisplayError(INFO_DELETEWORM, pObj);
break;
case OBJECT_SPIDER:
DisplayError(INFO_DELETESPIDER, pObj);
break;
case OBJECT_MOBILEwa:
case OBJECT_MOBILEta:
case OBJECT_MOBILEfa:
case OBJECT_MOBILEia:
case OBJECT_MOBILEwb:
case OBJECT_MOBILEtb:
case OBJECT_MOBILEfb:
case OBJECT_MOBILEib:
case OBJECT_MOBILEwc:
case OBJECT_MOBILEtc:
case OBJECT_MOBILEfc:
case OBJECT_MOBILEic:
case OBJECT_MOBILEwi:
case OBJECT_MOBILEti:
case OBJECT_MOBILEfi:
case OBJECT_MOBILEii:
case OBJECT_MOBILEws:
case OBJECT_MOBILEts:
case OBJECT_MOBILEfs:
case OBJECT_MOBILEis:
case OBJECT_MOBILErt:
case OBJECT_MOBILErc:
case OBJECT_MOBILErr:
case OBJECT_MOBILErs:
case OBJECT_MOBILEsa:
case OBJECT_MOBILEwt:
case OBJECT_MOBILEtt:
case OBJECT_MOBILEft:
case OBJECT_MOBILEit:
case OBJECT_MOBILErp:
case OBJECT_MOBILEst:
case OBJECT_MOBILEdr:
DisplayError(ERR_DELETEMOBILE, pObj);
break;
case OBJECT_DERRICK:
case OBJECT_FACTORY:
case OBJECT_STATION:
case OBJECT_REPAIR:
case OBJECT_DESTROYER:
case OBJECT_TOWER:
case OBJECT_RESEARCH:
case OBJECT_RADAR:
case OBJECT_INFO:
case OBJECT_ENERGY:
case OBJECT_LABO:
case OBJECT_NUCLEAR:
case OBJECT_PARA:
case OBJECT_SAFE:
case OBJECT_HUSTON:
case OBJECT_START:
case OBJECT_END:
DisplayError(ERR_DELETEBUILDING, pObj);
break;
default:
break;
}
}
void CRobotMain::DisplayError(Error err, CObject* pObj, float time)
{
m_displayText->DisplayError(err, pObj, time);

View File

@ -341,6 +341,8 @@ public:
//! Find the currently selected object
CObject* GetSelect();
//! Display an appropriate message banner for an object's destruction ("Bot destroyed" / "Building destroyed")
void NotifyObjectDestroyed(CObject* pObj);
void DisplayError(Error err, CObject* pObj, float time=10.0f);
void DisplayError(Error err, Math::Vector goal, float height=15.0f, float dist=60.0f, float time=10.0f);

View File

@ -583,6 +583,17 @@ void COldObject::DestroyObject(DestructionType type, CObject* killer)
SetDying(DeathType::Exploding);
}
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) )
{

View File

@ -20,6 +20,8 @@
#include "object/task/taskspiderexplo.h"
#include "level/robotmain.h"
#include "graphics/engine/engine.h"
#include "graphics/engine/pyro_manager.h"
@ -98,6 +100,7 @@ Error CTaskSpiderExplo::IsEnded()
if ( m_time < 1.0f ) return ERR_CONTINUE;
m_engine->GetPyroManager()->Create(Gfx::PT_SPIDER, m_object); // the spider explodes (suicide)
m_main->NotifyObjectDestroyed(m_object);
Abort();
return ERR_STOP;

View File

@ -420,12 +420,14 @@ bool CTaskTerraform::Terraform()
{
if ( dist > 5.0f ) continue;
m_engine->GetPyroManager()->Create(Gfx::PT_FRAGO, pObj);
m_main->NotifyObjectDestroyed(pObj);
}
else if ( type == OBJECT_TNT ||
type == OBJECT_BOMB ) // Explosives?
{
if ( dist > 5.0f ) continue;
m_engine->GetPyroManager()->Create(Gfx::PT_EXPLOT, pObj);
m_main->NotifyObjectDestroyed(pObj);
dynamic_cast<CDamageableObject&>(*m_object).DamageObject(DamageType::Explosive, 0.9f);
}
else if ( type == OBJECT_PLANT0 ||
@ -450,6 +452,7 @@ bool CTaskTerraform::Terraform()
{
if ( dist > 5.0f ) continue;
m_engine->GetPyroManager()->Create(Gfx::PT_FRAGT, pObj);
m_main->NotifyObjectDestroyed(pObj);
}
}
else