From b698c40abff328f30f8bf044d3c0e96cec679507 Mon Sep 17 00:00:00 2001 From: krzys-h Date: Mon, 10 Nov 2014 21:26:02 +0100 Subject: [PATCH] Fixed saving Shielder's shield (#365) --- src/object/brain.cpp | 13 +++++++++++- src/object/task/taskmanager.cpp | 8 ++------ src/object/task/taskshield.cpp | 36 +++++++++++++++++++++++++++++++++ src/object/task/taskshield.h | 1 + 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/object/brain.cpp b/src/object/brain.cpp index 0a723b09..7d51f1f0 100644 --- a/src/object/brain.cpp +++ b/src/object/brain.cpp @@ -174,6 +174,11 @@ void CBrain::SetMotion(CMotion* motion) bool CBrain::Write(CLevelParserLine* line) { line->AddParam("bVirusActive", new CLevelParserParam(m_bActiveVirus)); + + if ( m_object->GetType() == OBJECT_MOBILErs ) + { + line->AddParam("bShieldActive", new CLevelParserParam(m_secondaryTask != nullptr)); + } return true; } @@ -183,7 +188,13 @@ bool CBrain::Write(CLevelParserLine* line) bool CBrain::Read(CLevelParserLine* line) { m_bActiveVirus = line->GetParam("bVirusActive")->AsBool(false); - + if ( m_object->GetType() == OBJECT_MOBILErs ) + { + if( line->GetParam("bShieldActive")->AsBool(false) ) + { + StartTaskShield(TSM_START); + } + } return true; } diff --git a/src/object/task/taskmanager.cpp b/src/object/task/taskmanager.cpp index f34b4643..5270925d 100644 --- a/src/object/task/taskmanager.cpp +++ b/src/object/task/taskmanager.cpp @@ -169,16 +169,12 @@ Error CTaskManager::StartTaskRecover() Error CTaskManager::StartTaskShield(TaskShieldMode mode, float delay) { - if ( mode == TSM_UP ) + if ( mode == TSM_UP || mode == TSM_START ) { m_task = new CTaskShield(m_object); return (static_cast(m_task))->Start(mode, delay); } - if ( mode == TSM_DOWN && m_task != 0 ) - { - return (static_cast(m_task))->Start(mode, delay); - } - if ( mode == TSM_UPDATE && m_task != 0 ) + else if ( m_task != 0 ) { return (static_cast(m_task))->Start(mode, delay); } diff --git a/src/object/task/taskshield.cpp b/src/object/task/taskshield.cpp index bd74a4a2..254591cc 100644 --- a/src/object/task/taskshield.cpp +++ b/src/object/task/taskshield.cpp @@ -252,6 +252,42 @@ Error CTaskShield::Start(TaskShieldMode mode, float delay) return ERR_OK; } + if ( mode == TSM_START ) + { + Math::Point dim; + + m_object->SetShieldRadius(GetRadius()); + + mat = m_object->GetWorldMatrix(0); + pos = Math::Vector(7.0f, 15.0f, 0.0f); + pos = Transform(*mat, pos); // sphere position + m_shieldPos = pos; + + pos = m_shieldPos; + speed = Math::Vector(0.0f, 0.0f, 0.0f); + dim.x = GetRadius(); + dim.y = dim.x; + m_rankSphere = m_particle->CreateParticle(pos, speed, dim, Gfx::PARTISPHERE3, 2.0f, 0.0f, 0.0f); + + m_phase = TS_SHIELD; + m_progress = 0.0f; + m_speed = 1.0f/999.9f; + m_time = 0.0f; + m_delay = delay; + m_lastParticle = 0.0f; + m_lastRay = 0.0f; + m_lastIncrease = 0.0f; + m_energyUsed = 0.0f; + + m_bError = false; // ok + + if ( m_object->GetSelect() ) + { + m_brain->UpdateInterface(); + } + return ERR_OK; + } + type = m_object->GetType(); if ( type != OBJECT_MOBILErs ) return ERR_SHIELD_VEH; diff --git a/src/object/task/taskshield.h b/src/object/task/taskshield.h index beb7b56c..00706e17 100644 --- a/src/object/task/taskshield.h +++ b/src/object/task/taskshield.h @@ -46,6 +46,7 @@ enum TaskShieldMode TSM_UP = 1, // deploys shield TSM_DOWN = 2, // returns the shield TSM_UPDATE = 3, // radius change + TSM_START = 4, // start with shield up };