Separate the destruction message from the explosion effect. Note: Spiders now give death messages when they explode.
parent
fabbdda964
commit
b7edd9c195
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) )
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue