CTaskExecutorObject interface; some general task and CBrain cleanup

master
krzys-h 2015-08-10 13:46:39 +02:00
parent 73e0abc510
commit 3a5f618f65
20 changed files with 638 additions and 590 deletions

View File

@ -70,6 +70,9 @@ const int MAXTRACERECORD = 1000;
CBrain::CBrain(COldObject* object) CBrain::CBrain(COldObject* object)
{ {
m_object = object; m_object = object;
assert(object->Implements(ObjectInterfaceType::TaskExecutor));
m_taskExecutor = dynamic_cast<CTaskExecutorObject*>(m_object);
m_engine = Gfx::CEngine::GetInstancePointer(); m_engine = Gfx::CEngine::GetInstancePointer();
m_water = m_engine->GetWater(); m_water = m_engine->GetWater();
m_particle = m_engine->GetParticle(); m_particle = m_engine->GetParticle();
@ -80,13 +83,10 @@ CBrain::CBrain(COldObject* object)
m_sound = CApplication::GetInstancePointer()->GetSound(); m_sound = CApplication::GetInstancePointer()->GetSound();
m_physics = nullptr; m_physics = nullptr;
m_motion = nullptr; m_motion = nullptr;
m_primaryTask = nullptr;
m_secondaryTask = nullptr;
m_studio = nullptr; m_studio = nullptr;
m_program.clear(); m_program.clear();
m_currentProgram = nullptr; m_currentProgram = nullptr;
m_bActivity = true;
m_bBurn = false; m_bBurn = false;
m_bActiveVirus = false; m_bActiveVirus = false;
m_time = 0.0f; m_time = 0.0f;
@ -114,12 +114,6 @@ CBrain::~CBrain()
{ {
m_program.clear(); m_program.clear();
delete m_primaryTask;
m_primaryTask = nullptr;
delete m_secondaryTask;
m_secondaryTask = nullptr;
delete m_studio; delete m_studio;
m_studio = nullptr; m_studio = nullptr;
@ -165,7 +159,7 @@ bool CBrain::Write(CLevelParserLine* line)
if ( m_object->GetType() == OBJECT_MOBILErs ) if ( m_object->GetType() == OBJECT_MOBILErs )
{ {
line->AddParam("bShieldActive", MakeUnique<CLevelParserParam>(m_secondaryTask != nullptr)); line->AddParam("bShieldActive", MakeUnique<CLevelParserParam>(m_taskExecutor->IsBackgroundTask()));
} }
return true; return true;
@ -180,7 +174,7 @@ bool CBrain::Read(CLevelParserLine* line)
{ {
if( line->GetParam("bShieldActive")->AsBool(false) ) if( line->GetParam("bShieldActive")->AsBool(false) )
{ {
StartTaskShield(TSM_START); m_taskExecutor->StartTaskShield(TSM_START);
} }
} }
return true; return true;
@ -201,16 +195,6 @@ bool CBrain::EventProcess(const Event &event)
type = m_object->GetType(); type = m_object->GetType();
if ( m_primaryTask != 0 ) // current task?
{
m_primaryTask->EventProcess(event);
}
if ( m_secondaryTask != 0 ) // current task?
{
m_secondaryTask->EventProcess(event);
}
action = EVENT_NULL; action = EVENT_NULL;
bool isActionSlot = false; bool isActionSlot = false;
@ -376,7 +360,7 @@ bool CBrain::EventProcess(const Event &event)
if ( !m_object->GetSelect() && // robot pas sélectionné ? if ( !m_object->GetSelect() && // robot pas sélectionné ?
m_currentProgram == nullptr && m_currentProgram == nullptr &&
m_primaryTask == 0 ) !m_taskExecutor->IsForegroundTask() )
{ {
axeX = 0.0f; axeX = 0.0f;
axeY = 0.0f; axeY = 0.0f;
@ -425,14 +409,14 @@ bool CBrain::EventProcess(const Event &event)
return true; return true;
} }
if ( m_secondaryTask != 0 ) // current task? if ( m_taskExecutor->IsBackgroundTask() ) // current task?
{ {
if ( action == EVENT_OBJECT_ENDSHIELD ) if ( action == EVENT_OBJECT_ENDSHIELD )
{ {
m_secondaryTask->StartTaskShield(TSM_DOWN, 0.0f); m_taskExecutor->StartTaskShield(TSM_DOWN, 0.0f);
} }
} }
if ( m_primaryTask != 0 || // current task? if ( m_taskExecutor->IsForegroundTask() || // current task?
m_currentProgram != nullptr ) m_currentProgram != nullptr )
{ {
if ( action == EVENT_OBJECT_PROGRUN ) if ( action == EVENT_OBJECT_PROGRUN )
@ -447,7 +431,7 @@ bool CBrain::EventProcess(const Event &event)
} }
} }
if ( m_primaryTask == 0 || !m_primaryTask->IsPilot() ) return true; if ( !m_taskExecutor->IsForegroundTask() || !m_taskExecutor->GetForegroundTask()->IsPilot() ) return true;
} }
if ( m_currentProgram == nullptr ) if ( m_currentProgram == nullptr )
@ -620,7 +604,7 @@ bool CBrain::EventProcess(const Event &event)
{ {
if ( action == EVENT_OBJECT_HTAKE ) if ( action == EVENT_OBJECT_HTAKE )
{ {
err = StartTaskTake(); err = m_taskExecutor->StartTaskTake();
} }
if ( action == EVENT_OBJECT_MFRONT || if ( action == EVENT_OBJECT_MFRONT ||
@ -635,11 +619,11 @@ bool CBrain::EventProcess(const Event &event)
{ {
if ( m_manipStyle == EVENT_OBJECT_MFRONT ) if ( m_manipStyle == EVENT_OBJECT_MFRONT )
{ {
err = StartTaskManip(TMO_AUTO, TMA_FFRONT); err = m_taskExecutor->StartTaskManip(TMO_AUTO, TMA_FFRONT);
} }
if ( m_manipStyle == EVENT_OBJECT_MBACK ) if ( m_manipStyle == EVENT_OBJECT_MBACK )
{ {
err = StartTaskManip(TMO_AUTO, TMA_FBACK); err = m_taskExecutor->StartTaskManip(TMO_AUTO, TMA_FBACK);
if ( err == ERR_OK ) if ( err == ERR_OK )
{ {
m_manipStyle = EVENT_OBJECT_MFRONT; m_manipStyle = EVENT_OBJECT_MFRONT;
@ -648,7 +632,7 @@ bool CBrain::EventProcess(const Event &event)
} }
if ( m_manipStyle == EVENT_OBJECT_MPOWER ) if ( m_manipStyle == EVENT_OBJECT_MPOWER )
{ {
err = StartTaskManip(TMO_AUTO, TMA_POWER); err = m_taskExecutor->StartTaskManip(TMO_AUTO, TMA_POWER);
if ( err == ERR_OK ) if ( err == ERR_OK )
{ {
m_manipStyle = EVENT_OBJECT_MFRONT; m_manipStyle = EVENT_OBJECT_MFRONT;
@ -659,59 +643,59 @@ bool CBrain::EventProcess(const Event &event)
if ( action == EVENT_OBJECT_BDERRICK ) if ( action == EVENT_OBJECT_BDERRICK )
{ {
err = StartTaskBuild(OBJECT_DERRICK); err = m_taskExecutor->StartTaskBuild(OBJECT_DERRICK);
} }
if ( action == EVENT_OBJECT_BSTATION ) if ( action == EVENT_OBJECT_BSTATION )
{ {
err = StartTaskBuild(OBJECT_STATION); err = m_taskExecutor->StartTaskBuild(OBJECT_STATION);
} }
if ( action == EVENT_OBJECT_BFACTORY ) if ( action == EVENT_OBJECT_BFACTORY )
{ {
err = StartTaskBuild(OBJECT_FACTORY); err = m_taskExecutor->StartTaskBuild(OBJECT_FACTORY);
} }
if ( action == EVENT_OBJECT_BREPAIR ) if ( action == EVENT_OBJECT_BREPAIR )
{ {
err = StartTaskBuild(OBJECT_REPAIR); err = m_taskExecutor->StartTaskBuild(OBJECT_REPAIR);
} }
if ( action == EVENT_OBJECT_BCONVERT ) if ( action == EVENT_OBJECT_BCONVERT )
{ {
err = StartTaskBuild(OBJECT_CONVERT); err = m_taskExecutor->StartTaskBuild(OBJECT_CONVERT);
} }
if ( action == EVENT_OBJECT_BTOWER ) if ( action == EVENT_OBJECT_BTOWER )
{ {
err = StartTaskBuild(OBJECT_TOWER); err = m_taskExecutor->StartTaskBuild(OBJECT_TOWER);
} }
if ( action == EVENT_OBJECT_BRESEARCH ) if ( action == EVENT_OBJECT_BRESEARCH )
{ {
err = StartTaskBuild(OBJECT_RESEARCH); err = m_taskExecutor->StartTaskBuild(OBJECT_RESEARCH);
} }
if ( action == EVENT_OBJECT_BRADAR ) if ( action == EVENT_OBJECT_BRADAR )
{ {
err = StartTaskBuild(OBJECT_RADAR); err = m_taskExecutor->StartTaskBuild(OBJECT_RADAR);
} }
if ( action == EVENT_OBJECT_BENERGY ) if ( action == EVENT_OBJECT_BENERGY )
{ {
err = StartTaskBuild(OBJECT_ENERGY); err = m_taskExecutor->StartTaskBuild(OBJECT_ENERGY);
} }
if ( action == EVENT_OBJECT_BLABO ) if ( action == EVENT_OBJECT_BLABO )
{ {
err = StartTaskBuild(OBJECT_LABO); err = m_taskExecutor->StartTaskBuild(OBJECT_LABO);
} }
if ( action == EVENT_OBJECT_BNUCLEAR ) if ( action == EVENT_OBJECT_BNUCLEAR )
{ {
err = StartTaskBuild(OBJECT_NUCLEAR); err = m_taskExecutor->StartTaskBuild(OBJECT_NUCLEAR);
} }
if ( action == EVENT_OBJECT_BPARA ) if ( action == EVENT_OBJECT_BPARA )
{ {
err = StartTaskBuild(OBJECT_PARA); err = m_taskExecutor->StartTaskBuild(OBJECT_PARA);
} }
if ( action == EVENT_OBJECT_BINFO ) if ( action == EVENT_OBJECT_BINFO )
{ {
err = StartTaskBuild(OBJECT_INFO); err = m_taskExecutor->StartTaskBuild(OBJECT_INFO);
} }
if ( action == EVENT_OBJECT_BDESTROYER ) if ( action == EVENT_OBJECT_BDESTROYER )
{ {
err = StartTaskBuild(OBJECT_DESTROYER); err = m_taskExecutor->StartTaskBuild(OBJECT_DESTROYER);
} }
if ( action == EVENT_OBJECT_GFLAT ) if ( action == EVENT_OBJECT_GFLAT )
@ -720,11 +704,11 @@ bool CBrain::EventProcess(const Event &event)
} }
if ( action == EVENT_OBJECT_FCREATE ) if ( action == EVENT_OBJECT_FCREATE )
{ {
err = StartTaskFlag(TFL_CREATE, m_flagColor); err = m_taskExecutor->StartTaskFlag(TFL_CREATE, m_flagColor);
} }
if ( action == EVENT_OBJECT_FDELETE ) if ( action == EVENT_OBJECT_FDELETE )
{ {
err = StartTaskFlag(TFL_DELETE, m_flagColor); err = m_taskExecutor->StartTaskFlag(TFL_DELETE, m_flagColor);
} }
if ( action == EVENT_OBJECT_FCOLORb || if ( action == EVENT_OBJECT_FCOLORb ||
action == EVENT_OBJECT_FCOLORr || action == EVENT_OBJECT_FCOLORr ||
@ -737,27 +721,27 @@ bool CBrain::EventProcess(const Event &event)
if ( action == EVENT_OBJECT_SEARCH ) if ( action == EVENT_OBJECT_SEARCH )
{ {
err = StartTaskSearch(); err = m_taskExecutor->StartTaskSearch();
} }
if ( action == EVENT_OBJECT_DELSEARCH ) if ( action == EVENT_OBJECT_DELSEARCH )
{ {
err = StartTaskDeleteMark(); err = m_taskExecutor->StartTaskDeleteMark();
} }
if ( action == EVENT_OBJECT_TERRAFORM ) if ( action == EVENT_OBJECT_TERRAFORM )
{ {
err = StartTaskTerraform(); err = m_taskExecutor->StartTaskTerraform();
} }
if ( action == EVENT_OBJECT_RECOVER ) if ( action == EVENT_OBJECT_RECOVER )
{ {
err = StartTaskRecover(); err = m_taskExecutor->StartTaskRecover();
} }
if ( action == EVENT_OBJECT_BEGSHIELD ) if ( action == EVENT_OBJECT_BEGSHIELD )
{ {
err = StartTaskShield(TSM_UP); err = m_taskExecutor->StartTaskShield(TSM_UP);
} }
if ( action == EVENT_OBJECT_DIMSHIELD ) if ( action == EVENT_OBJECT_DIMSHIELD )
@ -773,64 +757,64 @@ bool CBrain::EventProcess(const Event &event)
} }
} }
if ( action == EVENT_OBJECT_FIRE && m_primaryTask == 0 && !m_object->GetTrainer()) if ( action == EVENT_OBJECT_FIRE && !m_taskExecutor->IsForegroundTask() && !m_object->GetTrainer())
{ {
if ( m_camera->GetType() != Gfx::CAM_TYPE_ONBOARD ) if ( m_camera->GetType() != Gfx::CAM_TYPE_ONBOARD )
{ {
m_camera->SetType(Gfx::CAM_TYPE_ONBOARD); m_camera->SetType(Gfx::CAM_TYPE_ONBOARD);
} }
err = StartTaskFire(0.0f); err = m_taskExecutor->StartTaskFire(0.0f);
} }
if ( action == EVENT_OBJECT_TARGET && !m_object->GetTrainer() ) if ( action == EVENT_OBJECT_TARGET && !m_object->GetTrainer() )
{ {
err = StartTaskGunGoal((event.mousePos.y-0.50f)*1.3f, (event.mousePos.x-0.50f)*2.0f); err = m_taskExecutor->StartTaskGunGoal((event.mousePos.y-0.50f)*1.3f, (event.mousePos.x-0.50f)*2.0f);
} }
if ( action == EVENT_OBJECT_FIREANT ) if ( action == EVENT_OBJECT_FIREANT )
{ {
//? err = StartTaskFireAnt(); //? err = m_taskExecutor->StartTaskFireAnt();
} }
if ( action == EVENT_OBJECT_SPIDEREXPLO && m_primaryTask == 0 ) if ( action == EVENT_OBJECT_SPIDEREXPLO && !m_taskExecutor->IsForegroundTask() )
{ {
err = StartTaskSpiderExplo(); err = m_taskExecutor->StartTaskSpiderExplo();
} }
if ( action == EVENT_OBJECT_PEN0 ) // up if ( action == EVENT_OBJECT_PEN0 ) // up
{ {
err = StartTaskPen(false); err = m_taskExecutor->StartTaskPen(false);
} }
if ( action == EVENT_OBJECT_PEN1 ) // black if ( action == EVENT_OBJECT_PEN1 ) // black
{ {
err = StartTaskPen(true, TraceColor::Black); err = m_taskExecutor->StartTaskPen(true, TraceColor::Black);
} }
if ( action == EVENT_OBJECT_PEN2 ) // yellow if ( action == EVENT_OBJECT_PEN2 ) // yellow
{ {
err = StartTaskPen(true, TraceColor::Yellow); err = m_taskExecutor->StartTaskPen(true, TraceColor::Yellow);
} }
if ( action == EVENT_OBJECT_PEN3 ) // orange if ( action == EVENT_OBJECT_PEN3 ) // orange
{ {
err = StartTaskPen(true, TraceColor::Orange); err = m_taskExecutor->StartTaskPen(true, TraceColor::Orange);
} }
if ( action == EVENT_OBJECT_PEN4 ) // red if ( action == EVENT_OBJECT_PEN4 ) // red
{ {
err = StartTaskPen(true, TraceColor::Red); err = m_taskExecutor->StartTaskPen(true, TraceColor::Red);
} }
if ( action == EVENT_OBJECT_PEN5 ) // violet if ( action == EVENT_OBJECT_PEN5 ) // violet
{ {
err = StartTaskPen(true, TraceColor::Purple); err = m_taskExecutor->StartTaskPen(true, TraceColor::Purple);
} }
if ( action == EVENT_OBJECT_PEN6 ) // blue if ( action == EVENT_OBJECT_PEN6 ) // blue
{ {
err = StartTaskPen(true, TraceColor::Blue); err = m_taskExecutor->StartTaskPen(true, TraceColor::Blue);
} }
if ( action == EVENT_OBJECT_PEN7 ) // green if ( action == EVENT_OBJECT_PEN7 ) // green
{ {
err = StartTaskPen(true, TraceColor::Green); err = m_taskExecutor->StartTaskPen(true, TraceColor::Green);
} }
if ( action == EVENT_OBJECT_PEN8 ) // brown if ( action == EVENT_OBJECT_PEN8 ) // brown
{ {
err = StartTaskPen(true, TraceColor::Brown); err = m_taskExecutor->StartTaskPen(true, TraceColor::Brown);
} }
if ( action == EVENT_OBJECT_REC ) // registered? if ( action == EVENT_OBJECT_REC ) // registered?
@ -932,12 +916,11 @@ bool CBrain::EventFrame(const Event &event)
UpdateInterface(event.rTime); UpdateInterface(event.rTime);
if ( m_engine->GetPause() ) return true; if ( m_engine->GetPause() ) return true;
if ( !m_bActivity ) return true; // expected if idle if ( !m_object->GetActivity() ) return true;
if ( EndedTask() == ERR_CONTINUE ) return true; // expected if not finished ...
if ( m_currentProgram != nullptr ) // current program? if ( m_currentProgram != nullptr ) // current program?
{ {
if ( m_currentProgram->script->Continue(event) ) if ( m_currentProgram->script->Continue() )
{ {
StopProgram(); StopProgram();
} }
@ -956,7 +939,7 @@ bool CBrain::EventFrame(const Event &event)
void CBrain::StopProgram() void CBrain::StopProgram()
{ {
StopTask(); m_taskExecutor->StopForegroundTask();
if ( m_object->GetType() == OBJECT_HUMAN || if ( m_object->GetType() == OBJECT_HUMAN ||
m_object->GetType() == OBJECT_TECH ) return; m_object->GetType() == OBJECT_TECH ) return;
@ -981,30 +964,6 @@ void CBrain::StopProgram()
m_object->CreateSelectParticle(); m_object->CreateSelectParticle();
} }
// Stops the current task.
void CBrain::StopTask()
{
if (m_primaryTask != nullptr)
{
m_primaryTask->Abort();
delete m_primaryTask; // stops the current task
m_primaryTask = nullptr;
}
}
// Stops the current secondary task.
void CBrain::StopSecondaryTask()
{
if (m_secondaryTask != nullptr)
{
m_secondaryTask->Abort();
delete m_secondaryTask; // stops the current secondary task
m_secondaryTask = nullptr;
}
}
// Introduces a virus into a program. // Introduces a virus into a program.
// Returns true if it was inserted. // Returns true if it was inserted.
@ -1046,7 +1005,6 @@ bool CBrain::GetActiveVirus()
return m_bActiveVirus; return m_bActiveVirus;
} }
// Start editing a program. // Start editing a program.
void CBrain::StartEditScript(Program* program, char* name) void CBrain::StartEditScript(Program* program, char* name)
@ -1072,221 +1030,6 @@ void CBrain::StopEditScript(bool bCancel)
} }
// Move the manipulator arm.
Error CBrain::StartTaskTake()
{
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskTake();
UpdateInterface();
return err;
}
// Move the manipulator arm.
Error CBrain::StartTaskManip(TaskManipOrder order, TaskManipArm arm)
{
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskManip(order, arm);
UpdateInterface();
return err;
}
// Puts or removes a flag.
Error CBrain::StartTaskFlag(TaskFlagOrder order, int rank)
{
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskFlag(order, rank);
UpdateInterface();
return err;
}
// Built a building.
Error CBrain::StartTaskBuild(ObjectType type)
{
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskBuild(type);
UpdateInterface();
return err;
}
// Probe the ground.
Error CBrain::StartTaskSearch()
{
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskSearch();
UpdateInterface();
return err;
}
// Delete mark on ground
Error CBrain::StartTaskDeleteMark()
{
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskDeleteMark();
UpdateInterface();
return err;
}
// Terraformed the ground.
Error CBrain::StartTaskTerraform()
{
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskTerraform();
UpdateInterface();
return err;
}
// Change pencil.
Error CBrain::StartTaskPen(bool down, TraceColor color)
{
auto motionVehicle = dynamic_cast<CMotionVehicle*>(m_motion);
assert(motionVehicle != nullptr);
if (color == TraceColor::Default)
color = motionVehicle->GetTraceColor();
motionVehicle->SetTraceDown(down);
motionVehicle->SetTraceColor(color);
m_physics->SetMotorSpeedX(0.0f);
m_physics->SetMotorSpeedY(0.0f);
m_physics->SetMotorSpeedZ(0.0f);
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskPen(down, color);
UpdateInterface();
return err;
}
// Recovers a ruin.
Error CBrain::StartTaskRecover()
{
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskRecover();
UpdateInterface();
return err;
}
// Deploys the shield.
Error CBrain::StartTaskShield(TaskShieldMode mode)
{
StopSecondaryTask();
m_secondaryTask = new CTaskManager(m_object);
Error err = m_secondaryTask->StartTaskShield(mode, 1000.0f);
UpdateInterface();
return err;
}
// Shoots.
Error CBrain::StartTaskFire(float delay)
{
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskFire(delay);
UpdateInterface();
return err;
}
// Explodes spider.
Error CBrain::StartTaskSpiderExplo()
{
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskSpiderExplo();
UpdateInterface();
return err;
}
// Shoots to the ant.
Error CBrain::StartTaskFireAnt(Math::Vector impact)
{
StopTask();
m_primaryTask = new CTaskManager(m_object);
Error err = m_primaryTask->StartTaskFireAnt(impact);
UpdateInterface();
return err;
}
// Adjusts upward.
Error CBrain::StartTaskGunGoal(float dirV, float dirH)
{
StopSecondaryTask();
m_secondaryTask = new CTaskManager(m_object);
Error err = m_secondaryTask->StartTaskGunGoal(dirV, dirH);
UpdateInterface();
return err;
}
// Completes the task when the time came.
Error CBrain::EndedTask()
{
if (m_secondaryTask != nullptr) // current task?
{
Error err = m_secondaryTask->IsEnded();
if ( err != ERR_CONTINUE ) // job ended?
{
delete m_secondaryTask;
m_secondaryTask = nullptr;
UpdateInterface();
}
}
if (m_primaryTask != nullptr) // current task?
{
Error err = m_primaryTask->IsEnded();
if ( err != ERR_CONTINUE ) // job ended?
{
delete m_primaryTask;
m_primaryTask = nullptr;
UpdateInterface();
}
return err;
}
return ERR_STOP;
}
// Shows flat areas in the field. // Shows flat areas in the field.
void CBrain::GroundFlat() void CBrain::GroundFlat()
@ -2281,9 +2024,9 @@ void CBrain::UpdateInterface()
type = m_object->GetType(); type = m_object->GetType();
bEnable = ( m_primaryTask == 0 && m_currentProgram == nullptr ) && m_main->CanPlayerInteract(); bEnable = ( !m_taskExecutor->IsForegroundTask() && m_currentProgram == nullptr ) && m_main->CanPlayerInteract();
EnableInterface(pw, EVENT_OBJECT_PROGEDIT, (m_primaryTask == 0 && !m_bTraceRecord) && m_selScript < m_program.size() && m_main->CanPlayerInteract()); EnableInterface(pw, EVENT_OBJECT_PROGEDIT, (!m_taskExecutor->IsForegroundTask() && !m_bTraceRecord) && m_selScript < m_program.size() && m_main->CanPlayerInteract());
EnableInterface(pw, EVENT_OBJECT_PROGLIST, bEnable && !m_bTraceRecord); EnableInterface(pw, EVENT_OBJECT_PROGLIST, bEnable && !m_bTraceRecord);
EnableInterface(pw, EVENT_OBJECT_PROGADD, m_currentProgram == nullptr && m_main->CanPlayerInteract()); EnableInterface(pw, EVENT_OBJECT_PROGADD, m_currentProgram == nullptr && m_main->CanPlayerInteract());
EnableInterface(pw, EVENT_OBJECT_PROGREMOVE, m_currentProgram == nullptr && m_selScript < m_program.size() && !m_program[m_selScript]->readOnly && m_main->CanPlayerInteract()); EnableInterface(pw, EVENT_OBJECT_PROGREMOVE, m_currentProgram == nullptr && m_selScript < m_program.size() && !m_program[m_selScript]->readOnly && m_main->CanPlayerInteract());
@ -2357,12 +2100,12 @@ void CBrain::UpdateInterface()
if ( type == OBJECT_MOBILErs ) // shield? if ( type == OBJECT_MOBILErs ) // shield?
{ {
if ( (m_secondaryTask == 0 || !m_secondaryTask->IsBusy()) && m_currentProgram == nullptr ) if ( (!m_taskExecutor->IsBackgroundTask() || !m_taskExecutor->GetBackgroundTask()->IsBusy()) && m_currentProgram == nullptr )
{ {
EnableInterface(pw, EVENT_OBJECT_BEGSHIELD, (m_secondaryTask == 0) && m_main->CanPlayerInteract()); EnableInterface(pw, EVENT_OBJECT_BEGSHIELD, !m_taskExecutor->IsBackgroundTask() && m_main->CanPlayerInteract());
EnableInterface(pw, EVENT_OBJECT_ENDSHIELD, (m_secondaryTask != 0) && m_main->CanPlayerInteract()); EnableInterface(pw, EVENT_OBJECT_ENDSHIELD, m_taskExecutor->IsBackgroundTask() && m_main->CanPlayerInteract());
DefaultEnter (pw, EVENT_OBJECT_BEGSHIELD, (m_secondaryTask == 0)); DefaultEnter (pw, EVENT_OBJECT_BEGSHIELD, !m_taskExecutor->IsBackgroundTask());
DefaultEnter (pw, EVENT_OBJECT_ENDSHIELD, (m_secondaryTask != 0)); DefaultEnter (pw, EVENT_OBJECT_ENDSHIELD, m_taskExecutor->IsBackgroundTask());
} }
else else
{ {
@ -2724,26 +2467,6 @@ void CBrain::DefaultEnter(Ui::CWindow *pw, EventType event, bool bState)
} }
} }
// Indicates whether the object is busy with a task.
bool CBrain::IsBusy()
{
return (m_primaryTask != 0);
}
// Management of the activity of an object.
void CBrain::SetActivity(bool bMode)
{
m_bActivity = bMode;
}
bool CBrain::GetActivity()
{
return m_bActivity;
}
// Indicates whether a program is running. // Indicates whether a program is running.
bool CBrain::IsProgram() bool CBrain::IsProgram()
@ -3094,7 +2817,7 @@ bool CBrain::TraceRecordPut(std::stringstream& buffer, TraceOper oper, float par
Program* CBrain::AddProgram() Program* CBrain::AddProgram()
{ {
auto program = MakeUnique<Program>(); auto program = MakeUnique<Program>();
program->script = MakeUnique<CScript>(m_object, &m_secondaryTask); program->script = MakeUnique<CScript>(m_object);
program->readOnly = false; program->readOnly = false;
program->runnable = true; program->runnable = true;

View File

@ -38,6 +38,7 @@
#include <memory> #include <memory>
class COldObject; class COldObject;
class CTaskExecutorObject;
class CPhysics; class CPhysics;
class CMotion; class CMotion;
class CTaskManager; class CTaskManager;
@ -106,15 +107,10 @@ public:
bool Write(CLevelParserLine* line); bool Write(CLevelParserLine* line);
bool Read(CLevelParserLine* line); bool Read(CLevelParserLine* line);
bool IsBusy();
void SetActivity(bool bMode);
bool GetActivity();
bool IsProgram(); bool IsProgram();
void RunProgram(Program* program); void RunProgram(Program* program);
int GetProgram(); int GetProgram();
void StopProgram(); void StopProgram();
void StopTask();
void StopSecondaryTask();
bool IntroduceVirus(); bool IntroduceVirus();
void SetActiveVirus(bool bActive); void SetActiveVirus(bool bActive);
@ -133,20 +129,6 @@ public:
bool WriteStack(FILE *file); bool WriteStack(FILE *file);
std::vector<std::unique_ptr<Program>>& GetPrograms(); std::vector<std::unique_ptr<Program>>& GetPrograms();
Error StartTaskTake();
Error StartTaskManip(TaskManipOrder order, TaskManipArm arm);
Error StartTaskFlag(TaskFlagOrder order, int rank);
Error StartTaskBuild(ObjectType type);
Error StartTaskSearch();
Error StartTaskDeleteMark();
Error StartTaskTerraform();
Error StartTaskRecover();
Error StartTaskShield(TaskShieldMode mode);
Error StartTaskFire(float delay);
Error StartTaskFireAnt(Math::Vector impact);
Error StartTaskSpiderExplo();
Error StartTaskGunGoal(float dirV, float dirH);
void UpdateInterface(float rTime); void UpdateInterface(float rTime);
void UpdateInterface(); void UpdateInterface();
@ -160,15 +142,11 @@ public:
int GetProgramIndex(Program* program); int GetProgramIndex(Program* program);
protected: protected:
Error StartTaskPen(bool down, TraceColor color = TraceColor::Default);
bool EventFrame(const Event &event); bool EventFrame(const Event &event);
void StartEditScript(Program* program, char* name); void StartEditScript(Program* program, char* name);
void StopEditScript(bool bCancel); void StopEditScript(bool bCancel);
Error EndedTask();
void GroundFlat(); void GroundFlat();
void ColorFlag(int color); void ColorFlag(int color);
@ -200,6 +178,7 @@ protected:
Gfx::CCamera* m_camera; Gfx::CCamera* m_camera;
Gfx::CParticle* m_particle; Gfx::CParticle* m_particle;
COldObject* m_object; COldObject* m_object;
CTaskExecutorObject* m_taskExecutor;
CPhysics* m_physics; CPhysics* m_physics;
CMotion* m_motion; CMotion* m_motion;
Ui::CInterface* m_interface; Ui::CInterface* m_interface;
@ -207,15 +186,11 @@ protected:
Ui::CStudio* m_studio; Ui::CStudio* m_studio;
CSoundInterface* m_sound; CSoundInterface* m_sound;
CTaskManager* m_primaryTask;
CTaskManager* m_secondaryTask;
std::vector<std::unique_ptr<Program>> m_program; std::vector<std::unique_ptr<Program>> m_program;
Program* m_currentProgram; Program* m_currentProgram;
unsigned int m_selScript; // rank of the selected script unsigned int m_selScript; // rank of the selected script
bool m_bActivity;
bool m_bBurn; bool m_bBurn;
bool m_bActiveVirus; bool m_bActiveVirus;

View File

@ -22,8 +22,6 @@
#include "object/object.h" #include "object/object.h"
#include "object/object_interface_type.h" #include "object/object_interface_type.h"
struct Event;
/** /**
* \class CCarrierObject * \class CCarrierObject
* \brief Interface for carrier objects * \brief Interface for carrier objects

View File

@ -23,8 +23,6 @@
#include "object/object_interface_type.h" #include "object/object_interface_type.h"
struct Event;
/** /**
* \class CJostleableObject * \class CJostleableObject
* \brief Interface for objects that can be jostled * \brief Interface for objects that can be jostled

View File

@ -0,0 +1,90 @@
/*
* This file is part of the Colobot: Gold Edition source code
* Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam
* http://epsiteс.ch; http://colobot.info; http://github.com/colobot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://gnu.org/licenses
*/
#pragma once
#include "object/object.h"
#include "object/object_interface_type.h"
#include "object/trace_color.h"
#include "object/task/taskflag.h"
#include "object/task/taskgoto.h"
#include "object/task/taskmanip.h"
#include "object/task/taskshield.h"
class CTaskManager;
/**
* \class CTaskExecutorObject
* \brief Interface for objects that can execute tasks
*/
class CTaskExecutorObject
{
public:
explicit CTaskExecutorObject(ObjectInterfaceTypes& types)
{
types[static_cast<int>(ObjectInterfaceType::TaskExecutor)] = true;
}
virtual ~CTaskExecutorObject()
{}
//! Start a foreground task
//@{
virtual Error StartTaskTake() = 0;
virtual Error StartTaskManip(TaskManipOrder order, TaskManipArm arm) = 0;
virtual Error StartTaskFlag(TaskFlagOrder order, int rank) = 0;
virtual Error StartTaskBuild(ObjectType type) = 0;
virtual Error StartTaskSearch() = 0;
virtual Error StartTaskDeleteMark() = 0;
virtual Error StartTaskTerraform() = 0;
virtual Error StartTaskRecover() = 0;
virtual Error StartTaskFire(float delay) = 0;
virtual Error StartTaskFireAnt(Math::Vector impact) = 0;
virtual Error StartTaskSpiderExplo() = 0;
virtual Error StartTaskPen(bool down, TraceColor color = TraceColor::Default) = 0;
//@}
//! Start a foreground task (scriptable tasks, not in UI)
//@{
virtual Error StartTaskWait(float time) = 0;
virtual Error StartTaskAdvance(float length) = 0;
virtual Error StartTaskTurn(float angle) = 0;
virtual Error StartTaskGoto(Math::Vector pos, float altitude, TaskGotoGoal goalMode, TaskGotoCrash crashMode) = 0;
virtual Error StartTaskInfo(const char *name, float value, float power, bool bSend) = 0;
//@}
//! Starts a background task
//@{
virtual Error StartTaskShield(TaskShieldMode mode, float delay = 1000.0f) = 0;
virtual Error StartTaskGunGoal(float dirV, float dirH) = 0;
//@}
//! Is executing foreground task?
virtual bool IsForegroundTask() = 0;
//! Is executing background task?
virtual bool IsBackgroundTask() = 0;
//! Return the foreground task
virtual CTaskManager* GetForegroundTask() = 0;
//! Return the background task
virtual CTaskManager* GetBackgroundTask() = 0;
//! Stop foreground task
virtual void StopForegroundTask() = 0;
//! Stop background task
virtual void StopBackgroundTask() = 0;
};

View File

@ -22,8 +22,6 @@
#include "object/object.h" #include "object/object.h"
#include "object/object_interface_type.h" #include "object/object_interface_type.h"
struct Event;
/** /**
* \class CTransportableObject * \class CTransportableObject
* \brief Interface for transportable objects * \brief Interface for transportable objects

View File

@ -51,7 +51,6 @@ CMotion::CMotion(COldObject* object)
m_object = object; m_object = object;
m_physics = 0; m_physics = 0;
m_brain = 0;
m_actionType = -1; m_actionType = -1;
m_actionTime = 0.0f; m_actionTime = 0.0f;
@ -73,11 +72,6 @@ void CMotion::SetPhysics(CPhysics* physics)
m_physics = physics; m_physics = physics;
} }
void CMotion::SetBrain(CBrain* brain)
{
m_brain = brain;
}
// Management of an event. // Management of an event.
bool CMotion::EventProcess(const Event &event) bool CMotion::EventProcess(const Event &event)
@ -219,4 +213,3 @@ Math::Vector CMotion::GetTilt()
{ {
return m_inclinaison; return m_inclinaison;
} }

View File

@ -53,7 +53,6 @@ public:
virtual ~CMotion(); virtual ~CMotion();
void SetPhysics(CPhysics* physics); void SetPhysics(CPhysics* physics);
void SetBrain(CBrain* brain);
virtual void DeleteObject(bool bAll=false) = 0; virtual void DeleteObject(bool bAll=false) = 0;
virtual void Create(Math::Vector pos, float angle, ObjectType type, float power, Gfx::COldModelManager* modelManager) = 0; virtual void Create(Math::Vector pos, float angle, ObjectType type, float power, Gfx::COldModelManager* modelManager) = 0;
@ -82,7 +81,6 @@ protected:
Gfx::CWater* m_water; Gfx::CWater* m_water;
Gfx::CCamera* m_camera; Gfx::CCamera* m_camera;
COldObject* m_object; COldObject* m_object;
CBrain* m_brain;
CPhysics* m_physics; CPhysics* m_physics;
CRobotMain* m_main; CRobotMain* m_main;
CSoundInterface* m_sound; CSoundInterface* m_sound;
@ -95,4 +93,3 @@ protected:
Math::Vector m_cirVibration; // circular vibration Math::Vector m_cirVibration; // circular vibration
Math::Vector m_inclinaison; // tilt Math::Vector m_inclinaison; // tilt
}; };

View File

@ -2651,9 +2651,7 @@ CObjectUPtr CObjectFactory::CreateVehicle(const ObjectCreateParams& params)
brain->SetMotion(motion.get()); brain->SetMotion(motion.get());
brain->SetPhysics(physics.get()); brain->SetPhysics(physics.get());
motion->SetBrain(brain.get());
motion->SetPhysics(physics.get()); motion->SetPhysics(physics.get());
physics->SetBrain(brain.get());
physics->SetMotion(motion.get()); physics->SetMotion(motion.get());
motion->Create(pos, angle, type, power, m_oldModelManager); motion->Create(pos, angle, type, power, m_oldModelManager);
@ -2704,11 +2702,9 @@ CObjectUPtr CObjectFactory::CreateInsect(const ObjectCreateParams& params)
} }
assert(motion != nullptr); assert(motion != nullptr);
physics->SetBrain(brain.get());
physics->SetMotion(motion.get()); physics->SetMotion(motion.get());
brain->SetMotion(motion.get()); brain->SetMotion(motion.get());
brain->SetPhysics(physics.get()); brain->SetPhysics(physics.get());
motion->SetBrain(brain.get());
motion->SetPhysics(physics.get()); motion->SetPhysics(physics.get());
motion->Create(pos, angle, type, 0.0f, m_oldModelManager); motion->Create(pos, angle, type, 0.0f, m_oldModelManager);

View File

@ -36,6 +36,7 @@ enum class ObjectInterfaceType
Interactive, //!< interactive objects can process events from event loop Interactive, //!< interactive objects can process events from event loop
Transportable, //!< objects that can be carried by robots or astronaut Transportable, //!< objects that can be carried by robots or astronaut
Programmable, //!< objects that can be programmed in CBOT Programmable, //!< objects that can be programmed in CBOT
TaskExecutor, //!< objects that can execute tasks (CTask classes)
Jostleable, //!< object that can be jostled Jostleable, //!< object that can be jostled
Carrier, //!< object that can carry other objects Carrier, //!< object that can carry other objects
Powered, //!< object powered with power cell Powered, //!< object powered with power cell

View File

@ -51,6 +51,8 @@
#include "object/motion/motion.h" #include "object/motion/motion.h"
#include "object/motion/motionvehicle.h" #include "object/motion/motionvehicle.h"
#include "object/task/taskmanager.h"
#include "physics/physics.h" #include "physics/physics.h"
#include "script/cbottoken.h" #include "script/cbottoken.h"
@ -86,6 +88,7 @@ COldObject::COldObject(int id)
: CObject(id, OBJECT_NULL) : CObject(id, OBJECT_NULL)
, CInteractiveObject(m_implementedInterfaces) , CInteractiveObject(m_implementedInterfaces)
, CTransportableObject(m_implementedInterfaces) , CTransportableObject(m_implementedInterfaces)
, CTaskExecutorObject(m_implementedInterfaces)
, CProgrammableObject(m_implementedInterfaces) , CProgrammableObject(m_implementedInterfaces)
, CJostleableObject(m_implementedInterfaces) , CJostleableObject(m_implementedInterfaces)
, CCarrierObject(m_implementedInterfaces) , CCarrierObject(m_implementedInterfaces)
@ -184,6 +187,8 @@ COldObject::COldObject(int id)
m_cmdLine.clear(); m_cmdLine.clear();
m_activity = true;
DeleteAllCrashSpheres(); DeleteAllCrashSpheres();
m_botVar = CScriptFunctions::CreateObjectVar(this); m_botVar = CScriptFunctions::CreateObjectVar(this);
@ -1819,6 +1824,16 @@ bool COldObject::EventProcess(const Event &event)
#endif #endif
} }
if ( m_foregroundTask != nullptr )
{
m_foregroundTask->EventProcess(event);
}
if ( m_backgroundTask != nullptr )
{
m_backgroundTask->EventProcess(event);
}
if ( m_physics != nullptr ) if ( m_physics != nullptr )
{ {
if ( !m_physics->EventProcess(event) ) // object destroyed? if ( !m_physics->EventProcess(event) ) // object destroyed?
@ -1835,6 +1850,11 @@ bool COldObject::EventProcess(const Event &event)
} }
} }
if ( m_brain.get() != nullptr )
{
m_brain->EventProcess(event);
}
if ( m_auto != nullptr ) if ( m_auto != nullptr )
{ {
m_auto->EventProcess(event); m_auto->EventProcess(event);
@ -1871,7 +1891,7 @@ bool COldObject::EventFrame(const Event &event)
return true; return true;
} }
if ( m_type != OBJECT_SHOW && m_engine->GetPause() ) return true; if ( m_engine->GetPause() && m_type != OBJECT_SHOW ) return true;
m_aTime += event.rTime; m_aTime += event.rTime;
m_shotTime += event.rTime; m_shotTime += event.rTime;
@ -1897,6 +1917,9 @@ bool COldObject::EventFrame(const Event &event)
} }
} }
// NOTE: This MUST be called AFTER CScriptFunctions::Process, otherwise weird stuff may happen to scripts
EndedTask();
return true; return true;
} }
@ -2449,9 +2472,9 @@ void COldObject::SetSelect(bool bMode, bool bDisplayError)
m_bSelect = bMode; m_bSelect = bMode;
if ( m_physics != nullptr ) if ( m_brain != nullptr )
{ {
m_physics->CreateInterface(m_bSelect); m_brain->CreateInterface(m_bSelect);
} }
if ( m_auto != nullptr ) if ( m_auto != nullptr )
@ -2506,26 +2529,6 @@ bool COldObject::GetSelectable()
} }
// Management of the activities of an object.
void COldObject::SetActivity(bool bMode)
{
if ( m_brain != nullptr )
{
m_brain->SetActivity(bMode);
}
}
bool COldObject::GetActivity()
{
if ( m_brain != nullptr )
{
return m_brain->GetActivity();
}
return false;
}
// Indicates if necessary to check the tokens of the object. // Indicates if necessary to check the tokens of the object.
void COldObject::SetCheckToken(bool bMode) void COldObject::SetCheckToken(bool bMode)
@ -3151,3 +3154,320 @@ void COldObject::SetScale(const Math::Vector& scale)
{ {
SetPartScale(0, scale); SetPartScale(0, scale);
} }
// Move the manipulator arm.
Error COldObject::StartTaskTake()
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskTake();
m_brain->UpdateInterface();
return err;
}
// Move the manipulator arm.
Error COldObject::StartTaskManip(TaskManipOrder order, TaskManipArm arm)
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskManip(order, arm);
m_brain->UpdateInterface();
return err;
}
// Puts or removes a flag.
Error COldObject::StartTaskFlag(TaskFlagOrder order, int rank)
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskFlag(order, rank);
m_brain->UpdateInterface();
return err;
}
// Built a building.
Error COldObject::StartTaskBuild(ObjectType type)
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskBuild(type);
m_brain->UpdateInterface();
return err;
}
// Probe the ground.
Error COldObject::StartTaskSearch()
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskSearch();
m_brain->UpdateInterface();
return err;
}
// Delete mark on ground
Error COldObject::StartTaskDeleteMark()
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskDeleteMark();
m_brain->UpdateInterface();
return err;
}
// Terraformed the ground.
Error COldObject::StartTaskTerraform()
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskTerraform();
m_brain->UpdateInterface();
return err;
}
// Change pencil.
Error COldObject::StartTaskPen(bool down, TraceColor color)
{
auto motionVehicle = dynamic_cast<CMotionVehicle*>(m_motion.get());
assert(motionVehicle != nullptr);
if (color == TraceColor::Default)
color = motionVehicle->GetTraceColor();
motionVehicle->SetTraceDown(down);
motionVehicle->SetTraceColor(color);
m_physics->SetMotorSpeedX(0.0f);
m_physics->SetMotorSpeedY(0.0f);
m_physics->SetMotorSpeedZ(0.0f);
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskPen(down, color);
m_brain->UpdateInterface();
return err;
}
// Recovers a ruin.
Error COldObject::StartTaskRecover()
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskRecover();
m_brain->UpdateInterface();
return err;
}
// Shoots.
Error COldObject::StartTaskFire(float delay)
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskFire(delay);
m_brain->UpdateInterface();
return err;
}
// Explodes spider.
Error COldObject::StartTaskSpiderExplo()
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskSpiderExplo();
m_brain->UpdateInterface();
return err;
}
// Shoots to the ant.
Error COldObject::StartTaskFireAnt(Math::Vector impact)
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskFireAnt(impact);
m_brain->UpdateInterface();
return err;
}
Error COldObject::StartTaskWait(float time)
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskWait(time);
m_brain->UpdateInterface();
return err;
}
Error COldObject::StartTaskAdvance(float length)
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskAdvance(length);
m_brain->UpdateInterface();
return err;
}
Error COldObject::StartTaskTurn(float angle)
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskTurn(angle);
m_brain->UpdateInterface();
return err;
}
Error COldObject::StartTaskGoto(Math::Vector pos, float altitude, TaskGotoGoal goalMode, TaskGotoCrash crashMode)
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskGoto(pos, altitude, goalMode, crashMode);
m_brain->UpdateInterface();
return err;
}
Error COldObject::StartTaskInfo(const char *name, float value, float power, bool bSend)
{
StopForegroundTask();
m_foregroundTask = MakeUnique<CTaskManager>(this);
Error err = m_foregroundTask->StartTaskInfo(name, value, power, bSend);
m_brain->UpdateInterface();
return err;
}
// Deploys the shield.
Error COldObject::StartTaskShield(TaskShieldMode mode, float delay)
{
if (m_backgroundTask == nullptr)
{
m_backgroundTask = MakeUnique<CTaskManager>(this);
}
Error err = m_backgroundTask->StartTaskShield(mode, delay);
m_brain->UpdateInterface();
return err;
}
// Adjusts upward.
Error COldObject::StartTaskGunGoal(float dirV, float dirH)
{
StopBackgroundTask();
m_backgroundTask = MakeUnique<CTaskManager>(this);
Error err = m_backgroundTask->StartTaskGunGoal(dirV, dirH);
m_brain->UpdateInterface();
return err;
}
// Indicates whether the object is busy with a task.
bool COldObject::IsForegroundTask()
{
return (m_foregroundTask.get() != nullptr);
}
bool COldObject::IsBackgroundTask()
{
return (m_backgroundTask.get() != nullptr);
}
CTaskManager* COldObject::GetForegroundTask()
{
return m_foregroundTask.get();
}
CTaskManager* COldObject::GetBackgroundTask()
{
return m_backgroundTask.get();
}
// Stops the current task.
void COldObject::StopForegroundTask()
{
if (m_foregroundTask != nullptr)
{
m_foregroundTask->Abort();
m_foregroundTask.reset();
}
}
// Stops the current secondary task.
void COldObject::StopBackgroundTask()
{
if (m_backgroundTask != nullptr)
{
m_backgroundTask->Abort();
m_backgroundTask.reset();
}
}
// Completes the task when the time came.
Error COldObject::EndedTask()
{
if (m_backgroundTask.get() != nullptr) // current task?
{
Error err = m_backgroundTask->IsEnded();
if ( err != ERR_CONTINUE ) // job ended?
{
m_backgroundTask.reset();
m_brain->UpdateInterface();
}
}
if (m_foregroundTask.get() != nullptr) // current task?
{
Error err = m_foregroundTask->IsEnded();
if ( err != ERR_CONTINUE ) // job ended?
{
m_foregroundTask.reset();
m_brain->UpdateInterface();
}
return err;
}
return ERR_STOP;
}
// Management of the activity of an object.
void COldObject::SetActivity(bool activity)
{
m_activity = activity;
}
bool COldObject::GetActivity()
{
return m_activity;
}

View File

@ -31,6 +31,7 @@
#include "object/interface/jostleable_object.h" #include "object/interface/jostleable_object.h"
#include "object/interface/powered_object.h" #include "object/interface/powered_object.h"
#include "object/interface/programmable_object.h" #include "object/interface/programmable_object.h"
#include "object/interface/task_executor_object.h"
#include "object/interface/transportable_object.h" #include "object/interface/transportable_object.h"
// The father of all parts must always be the part number zero! // The father of all parts must always be the part number zero!
@ -58,6 +59,7 @@ struct ObjectPart
class COldObject : public CObject, class COldObject : public CObject,
public CInteractiveObject, public CInteractiveObject,
public CTransportableObject, public CTransportableObject,
public CTaskExecutorObject,
public CProgrammableObject, public CProgrammableObject,
public CJostleableObject, public CJostleableObject,
public CCarrierObject, public CCarrierObject,
@ -218,8 +220,11 @@ public:
void SetSelectable(bool bMode); void SetSelectable(bool bMode);
bool GetSelectable() override; bool GetSelectable() override;
void SetActivity(bool bMode) override; //! Management of object "activity" (temporairly stops program execution, right now used only by Aliens in eggs)
bool GetActivity() override; //@{
void SetActivity(bool activity);
bool GetActivity();
//@}
void SetVisible(bool bVisible); void SetVisible(bool bVisible);
@ -295,6 +300,35 @@ public:
void SetScale(const Math::Vector& scale) override; void SetScale(const Math::Vector& scale) override;
Math::Vector GetScale() const override; Math::Vector GetScale() const override;
Error StartTaskTake() override;
Error StartTaskManip(TaskManipOrder order, TaskManipArm arm) override;
Error StartTaskFlag(TaskFlagOrder order, int rank) override;
Error StartTaskBuild(ObjectType type) override;
Error StartTaskSearch() override;
Error StartTaskDeleteMark() override;
Error StartTaskTerraform() override;
Error StartTaskRecover() override;
Error StartTaskFire(float delay) override;
Error StartTaskFireAnt(Math::Vector impact) override;
Error StartTaskSpiderExplo() override;
Error StartTaskPen(bool down, TraceColor color = TraceColor::Default) override;
Error StartTaskWait(float time) override;
Error StartTaskAdvance(float length) override;
Error StartTaskTurn(float angle) override;
Error StartTaskGoto(Math::Vector pos, float altitude, TaskGotoGoal goalMode, TaskGotoCrash crashMode) override;
Error StartTaskInfo(const char *name, float value, float power, bool bSend) override;
Error StartTaskShield(TaskShieldMode mode, float delay = 1000.0f) override;
Error StartTaskGunGoal(float dirV, float dirH) override;
bool IsForegroundTask() override;
bool IsBackgroundTask() override;
CTaskManager* GetForegroundTask() override;
CTaskManager* GetBackgroundTask() override;
void StopForegroundTask() override;
void StopBackgroundTask() override;
protected: protected:
bool EventFrame(const Event &event); bool EventFrame(const Event &event);
void VirusFrame(float rTime); void VirusFrame(float rTime);
@ -309,6 +343,8 @@ protected:
void TransformCrashSphere(Math::Sphere &crashSphere) override; void TransformCrashSphere(Math::Sphere &crashSphere) override;
void TransformCameraCollisionSphere(Math::Sphere& collisionSphere) override; void TransformCameraCollisionSphere(Math::Sphere& collisionSphere) override;
Error EndedTask();
protected: protected:
Gfx::CEngine* m_engine; Gfx::CEngine* m_engine;
Gfx::CLightManager* m_lightMan; Gfx::CLightManager* m_lightMan;
@ -391,4 +427,8 @@ protected:
float m_infoReturn; float m_infoReturn;
std::vector<float> m_cmdLine; std::vector<float> m_cmdLine;
bool m_activity;
std::unique_ptr<CTaskManager> m_foregroundTask;
std::unique_ptr<CTaskManager> m_backgroundTask;
}; };

View File

@ -4944,10 +4944,9 @@ bool CRobotMain::IsBusy()
for (CObject* obj : m_objMan->GetAllObjects()) for (CObject* obj : m_objMan->GetAllObjects())
{ {
if (! obj->Implements(ObjectInterfaceType::Programmable)) continue; if (! obj->Implements(ObjectInterfaceType::TaskExecutor)) continue;
CBrain* brain = dynamic_cast<CProgrammableObject*>(obj)->GetBrain(); if (dynamic_cast<CTaskExecutorObject*>(obj)->IsForegroundTask()) return true;
if (brain->IsBusy()) return true;
} }
return false; return false;
} }

View File

@ -376,16 +376,16 @@ bool CTaskTerraform::Terraform()
if ( type == OBJECT_ANT ) if ( type == OBJECT_ANT )
{ {
if (pObj->Implements(ObjectInterfaceType::Programmable)) assert(pObj->Implements(ObjectInterfaceType::TaskExecutor));
dynamic_cast<CProgrammableObject*>(pObj)->GetBrain()->StopTask(); dynamic_cast<CTaskExecutorObject*>(pObj)->StopForegroundTask();
motion->SetAction(MAS_BACK1, 0.8f+Math::Rand()*0.3f); motion->SetAction(MAS_BACK1, 0.8f+Math::Rand()*0.3f);
pObj->SetFixed(true); // not moving pObj->SetFixed(true); // not moving
} }
if ( type == OBJECT_SPIDER ) if ( type == OBJECT_SPIDER )
{ {
if (pObj->Implements(ObjectInterfaceType::Programmable)) assert(pObj->Implements(ObjectInterfaceType::TaskExecutor));
dynamic_cast<CProgrammableObject*>(pObj)->GetBrain()->StopTask(); dynamic_cast<CTaskExecutorObject*>(pObj)->StopForegroundTask();
motion->SetAction(MSS_BACK1, 0.8f+Math::Rand()*0.3f); motion->SetAction(MSS_BACK1, 0.8f+Math::Rand()*0.3f);
pObj->SetFixed(true); // not moving pObj->SetFixed(true); // not moving
@ -395,4 +395,3 @@ bool CTaskTerraform::Terraform()
return true; return true;
} }

View File

@ -75,7 +75,6 @@ CPhysics::CPhysics(COldObject* object)
m_terrain = CRobotMain::GetInstancePointer()->GetTerrain(); m_terrain = CRobotMain::GetInstancePointer()->GetTerrain();
m_camera = CRobotMain::GetInstancePointer()->GetCamera(); m_camera = CRobotMain::GetInstancePointer()->GetCamera();
m_sound = CApplication::GetInstancePointer()->GetSound(); m_sound = CApplication::GetInstancePointer()->GetSound();
m_brain = nullptr;
m_motion = nullptr; m_motion = nullptr;
m_type = TYPE_ROLLING; m_type = TYPE_ROLLING;
@ -150,10 +149,6 @@ void CPhysics::DeleteObject(bool bAll)
void CPhysics::SetBrain(CBrain* brain)
{
m_brain = brain;
}
void CPhysics::SetMotion(CMotion* motion) void CPhysics::SetMotion(CMotion* motion)
{ {
@ -767,11 +762,6 @@ bool CPhysics::EventProcess(const Event &event)
{ {
if ( !m_object->GetEnable() ) return true; if ( !m_object->GetEnable() ) return true;
if ( m_brain != 0 )
{
m_brain->EventProcess(event);
}
if ( event.type == EVENT_FRAME ) if ( event.type == EVENT_FRAME )
{ {
return EventFrame(event); return EventFrame(event);
@ -3822,17 +3812,6 @@ void CPhysics::WheelParticle(TraceColor color, float width)
} }
// Creates the interface.
void CPhysics::CreateInterface(bool bSelect)
{
if ( m_brain != 0 )
{
m_brain->CreateInterface(bSelect);
}
}
// Returns an error related to the general state. // Returns an error related to the general state.
Error CPhysics::GetError() Error CPhysics::GetError()
@ -3848,9 +3827,12 @@ Error CPhysics::GetError()
type == OBJECT_APOLLO2 || type == OBJECT_APOLLO2 ||
type == OBJECT_MOBILEdr ) return ERR_OK; type == OBJECT_MOBILEdr ) return ERR_OK;
if ( m_brain != 0 && m_brain->GetActiveVirus() ) if (m_object->Implements(ObjectInterfaceType::Programmable))
{ {
return ERR_VEH_VIRUS; if ( dynamic_cast<CProgrammableObject*>(m_object)->GetBrain()->GetActiveVirus() )
{
return ERR_VEH_VIRUS;
}
} }
if (m_object->Implements(ObjectInterfaceType::Powered)) if (m_object->Implements(ObjectInterfaceType::Powered))

View File

@ -171,7 +171,6 @@ public:
float GetMotorSpeedY(); float GetMotorSpeedY();
float GetMotorSpeedZ(); float GetMotorSpeedZ();
void CreateInterface(bool bSelect);
Error GetError(); Error GetError();
float GetFallingHeight(); float GetFallingHeight();

View File

@ -35,11 +35,10 @@
#include "object/old_object.h" #include "object/old_object.h"
#include "object/robotmain.h" #include "object/robotmain.h"
#include "object/task/taskmanager.h"
#include "script/cbottoken.h" #include "script/cbottoken.h"
#include "ui/displaytext.h" #include "ui/displaytext.h"
#include "ui/controls/edit.h" #include "ui/controls/edit.h"
#include "ui/controls/interface.h" #include "ui/controls/interface.h"
#include "ui/controls/list.h" #include "ui/controls/list.h"
@ -51,19 +50,20 @@ const int CBOT_IPF = 100; // CBOT: default number of instructions / frame
// Object's constructor. // Object's constructor.
CScript::CScript(COldObject* object, CTaskManager** secondaryTask) CScript::CScript(COldObject* object)
{ {
m_object = object;
assert(m_object->Implements(ObjectInterfaceType::TaskExecutor));
m_taskExecutor = dynamic_cast<CTaskExecutorObject*>(m_object);
m_engine = Gfx::CEngine::GetInstancePointer(); m_engine = Gfx::CEngine::GetInstancePointer();
m_main = CRobotMain::GetInstancePointer(); m_main = CRobotMain::GetInstancePointer();
m_terrain = m_main->GetTerrain(); m_terrain = m_main->GetTerrain();
m_water = m_engine->GetWater(); m_water = m_engine->GetWater();
m_botProg = nullptr; m_interface = m_main->GetInterface();
m_object = object; m_pause = CPauseManager::GetInstancePointer();
m_primaryTask = nullptr;
m_secondaryTask = secondaryTask;
m_interface = m_main->GetInterface(); m_botProg = nullptr;
m_pause = CPauseManager::GetInstancePointer();
m_ipf = CBOT_IPF; m_ipf = CBOT_IPF;
m_errMode = ERM_STOP; m_errMode = ERM_STOP;
@ -86,9 +86,6 @@ CScript::~CScript()
delete m_botProg; delete m_botProg;
m_botProg = nullptr; m_botProg = nullptr;
delete m_primaryTask;
m_primaryTask = nullptr;
delete[] m_script; delete[] m_script;
m_script = nullptr; m_script = nullptr;
@ -358,8 +355,7 @@ bool CScript::Run()
if ( m_bStepMode ) // step by step mode? if ( m_bStepMode ) // step by step mode?
{ {
Event newEvent; Step();
Step(newEvent);
} }
return true; return true;
@ -368,13 +364,11 @@ bool CScript::Run()
// Continues the execution of current program. // Continues the execution of current program.
// Returns true when execution is finished. // Returns true when execution is finished.
bool CScript::Continue(const Event &event) bool CScript::Continue()
{ {
if( m_botProg == 0 ) return true; if( m_botProg == 0 ) return true;
if ( !m_bRun ) return true; if ( !m_bRun ) return true;
m_event = event.Clone();
if ( m_bStepMode ) // step by step mode? if ( m_bStepMode ) // step by step mode?
{ {
if ( m_bContinue ) // instuction "move", "goto", etc. ? if ( m_bContinue ) // instuction "move", "goto", etc. ?
@ -442,7 +436,7 @@ bool CScript::Continue(const Event &event)
// Continues the execution of current program. // Continues the execution of current program.
// Returns true when execution is finished. // Returns true when execution is finished.
bool CScript::Step(const Event &event) bool CScript::Step()
{ {
if( m_botProg == 0 ) return true; if( m_botProg == 0 ) return true;
if ( !m_bRun ) return true; if ( !m_bRun ) return true;
@ -452,8 +446,6 @@ bool CScript::Step(const Event &event)
// TODO: m_app StepSimulation??? m_engine->StepSimulation(0.01f); // advance of 10ms // TODO: m_app StepSimulation??? m_engine->StepSimulation(0.01f); // advance of 10ms
// ??? m_engine->SetPause(true); // ??? m_engine->SetPause(true);
m_event = event.Clone();
if ( m_botProg->Run(m_object, 0) ) // step mode if ( m_botProg->Run(m_object, 0) ) // step mode
{ {
m_botProg->GetError(m_error, m_cursor1, m_cursor2); m_botProg->GetError(m_error, m_cursor1, m_cursor2);
@ -499,13 +491,6 @@ void CScript::Stop()
m_botProg->Stop(); m_botProg->Stop();
} }
if ( m_primaryTask != 0 )
{
m_primaryTask->Abort();
delete m_primaryTask;
m_primaryTask = 0;
}
m_bRun = false; m_bRun = false;
} }

View File

@ -32,7 +32,7 @@
class COldObject; class COldObject;
class CTaskManager; class CTaskExecutorObject;
class CRobotMain; class CRobotMain;
class CPauseManager; class CPauseManager;
class CScriptFunctions; class CScriptFunctions;
@ -60,7 +60,7 @@ class CScript
{ {
friend class CScriptFunctions; friend class CScriptFunctions;
public: public:
CScript(COldObject* object, CTaskManager** secondaryTask); CScript(COldObject* object);
~CScript(); ~CScript();
void PutScript(Ui::CEdit* edit, const char* name); void PutScript(Ui::CEdit* edit, const char* name);
@ -71,8 +71,8 @@ public:
void SetStepMode(bool bStep); void SetStepMode(bool bStep);
bool Run(); bool Run();
bool Continue(const Event &event); bool Continue();
bool Step(const Event &event); bool Step();
void Stop(); void Stop();
bool IsRunning(); bool IsRunning();
bool IsContinue(); bool IsContinue();
@ -101,15 +101,15 @@ protected:
bool Compile(); bool Compile();
protected: protected:
COldObject* m_object;
CTaskExecutorObject* m_taskExecutor;
Gfx::CEngine* m_engine; Gfx::CEngine* m_engine;
Ui::CInterface* m_interface; Ui::CInterface* m_interface;
CBotProgram* m_botProg; CBotProgram* m_botProg;
CRobotMain* m_main; CRobotMain* m_main;
Gfx::CTerrain* m_terrain; Gfx::CTerrain* m_terrain;
Gfx::CWater* m_water; Gfx::CWater* m_water;
CTaskManager* m_primaryTask;
CTaskManager** m_secondaryTask;
COldObject* m_object;
CPauseManager* m_pause; CPauseManager* m_pause;
int m_ipf; // number of instructions/second int m_ipf; // number of instructions/second
@ -130,4 +130,3 @@ protected:
Event m_event; Event m_event;
float m_returnValue; float m_returnValue;
}; };

View File

@ -45,6 +45,8 @@
#include "object/auto/autobase.h" #include "object/auto/autobase.h"
#include "object/auto/autofactory.h" #include "object/auto/autofactory.h"
#include "object/interface/task_executor_object.h"
#include "object/level/parser.h" #include "object/level/parser.h"
#include "object/motion/motionvehicle.h" #include "object/motion/motionvehicle.h"
@ -1201,11 +1203,10 @@ bool CScriptFunctions::Process(CScript* script, CBotVar* result, int &exception)
{ {
Error err; Error err;
err = script->m_primaryTask->IsEnded(); err = script->m_taskExecutor->GetForegroundTask()->IsEnded();
if ( err != ERR_CONTINUE ) // task terminated? if ( err != ERR_CONTINUE ) // task terminated?
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
script->m_bContinue = false; script->m_bContinue = false;
@ -1219,7 +1220,6 @@ bool CScriptFunctions::Process(CScript* script, CBotVar* result, int &exception)
return true; // it's all over return true; // it's all over
} }
script->m_primaryTask->EventProcess(script->m_event);
script->m_bContinue = true; script->m_bContinue = true;
return false; // not done return false; // not done
} }
@ -1265,7 +1265,7 @@ bool CScriptFunctions::rDetect(CBotVar* var, CBotVar* result, int& exception, vo
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
type = OBJECT_NULL; type = OBJECT_NULL;
array = 0; array = 0;
@ -1314,12 +1314,10 @@ bool CScriptFunctions::rDetect(CBotVar* var, CBotVar* result, int& exception, vo
script->m_returnValue = 1.0f; script->m_returnValue = 1.0f;
} }
script->m_primaryTask = new CTaskManager(script->m_object); err = script->m_taskExecutor->StartTaskWait(0.3f);
err = script->m_primaryTask->StartTaskWait(0.3f);
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -1441,20 +1439,15 @@ bool CScriptFunctions::rBuild(CBotVar* var, CBotVar* result, int& exception, voi
if (pThis->GetIgnoreBuildCheck()) if (pThis->GetIgnoreBuildCheck())
err = ERR_OK; err = ERR_OK;
if (err == ERR_OK && script->m_primaryTask == 0) // if we can build and no task is present if (err == ERR_OK && !script->m_taskExecutor->IsForegroundTask()) // if we can build
{ {
script->m_primaryTask = new CTaskManager(script->m_object); err = script->m_taskExecutor->StartTaskBuild(category);
err = script->m_primaryTask->StartTaskBuild(category);
if (err != ERR_OK) if (err != ERR_OK)
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
} }
} }
// When script is waiting for finishing this task, it sets ERR_OK, and continues executing Process
// without creating new task. I think, there was a problem with previous version in release configuration
// It did not init error variable in this situation, and code tried to use variable with trash inside
} }
if ( err != ERR_OK ) if ( err != ERR_OK )
@ -1893,15 +1886,13 @@ bool CScriptFunctions::rWait(CBotVar* var, CBotVar* result, int& exception, void
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object);
value = var->GetValFloat(); value = var->GetValFloat();
err = script->m_primaryTask->StartTaskWait(value); err = script->m_taskExecutor->StartTaskWait(value);
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -1924,15 +1915,13 @@ bool CScriptFunctions::rMove(CBotVar* var, CBotVar* result, int& exception, void
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object);
value = var->GetValFloat(); value = var->GetValFloat();
err = script->m_primaryTask->StartTaskAdvance(value*g_unit); err = script->m_taskExecutor->StartTaskAdvance(value*g_unit);
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -1955,15 +1944,13 @@ bool CScriptFunctions::rTurn(CBotVar* var, CBotVar* result, int& exception, void
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object);
value = var->GetValFloat(); value = var->GetValFloat();
err = script->m_primaryTask->StartTaskTurn(-value*Math::PI/180.0f); err = script->m_taskExecutor->StartTaskTurn(-value*Math::PI/180.0f);
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -2015,9 +2002,8 @@ bool CScriptFunctions::rGoto(CBotVar* var, CBotVar* result, int& exception, void
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object);
if ( !GetPoint(var, exception, pos) ) return true; if ( !GetPoint(var, exception, pos) ) return true;
goal = TGG_DEFAULT; goal = TGG_DEFAULT;
@ -2041,11 +2027,10 @@ bool CScriptFunctions::rGoto(CBotVar* var, CBotVar* result, int& exception, void
} }
} }
err = script->m_primaryTask->StartTaskGoto(pos, altitude, goal, crash); err = script->m_taskExecutor->StartTaskGoto(pos, altitude, goal, crash);
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -2081,9 +2066,8 @@ bool CScriptFunctions::rGrab(CBotVar* var, CBotVar* result, int& exception, void
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object);
if ( var == 0 ) if ( var == 0 )
{ {
type = TMA_FFRONT; type = TMA_FFRONT;
@ -2097,17 +2081,16 @@ bool CScriptFunctions::rGrab(CBotVar* var, CBotVar* result, int& exception, void
if ( oType == OBJECT_HUMAN || if ( oType == OBJECT_HUMAN ||
oType == OBJECT_TECH ) oType == OBJECT_TECH )
{ {
err = script->m_primaryTask->StartTaskTake(); err = script->m_taskExecutor->StartTaskTake();
} }
else else
{ {
err = script->m_primaryTask->StartTaskManip(TMO_GRAB, type); err = script->m_taskExecutor->StartTaskManip(TMO_GRAB, type);
} }
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -2132,9 +2115,8 @@ bool CScriptFunctions::rDrop(CBotVar* var, CBotVar* result, int& exception, void
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object);
if ( var == 0 ) type = TMA_FFRONT; if ( var == 0 ) type = TMA_FFRONT;
else type = static_cast<TaskManipArm>(var->GetValInt()); else type = static_cast<TaskManipArm>(var->GetValInt());
@ -2142,17 +2124,16 @@ bool CScriptFunctions::rDrop(CBotVar* var, CBotVar* result, int& exception, void
if ( oType == OBJECT_HUMAN || if ( oType == OBJECT_HUMAN ||
oType == OBJECT_TECH ) oType == OBJECT_TECH )
{ {
err = script->m_primaryTask->StartTaskTake(); err = script->m_taskExecutor->StartTaskTake();
} }
else else
{ {
err = script->m_primaryTask->StartTaskManip(TMO_DROP, type); err = script->m_taskExecutor->StartTaskManip(TMO_DROP, type);
} }
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -2174,14 +2155,12 @@ bool CScriptFunctions::rSniff(CBotVar* var, CBotVar* result, int& exception, voi
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object); err = script->m_taskExecutor->StartTaskSearch();
err = script->m_primaryTask->StartTaskSearch();
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -2223,10 +2202,8 @@ bool CScriptFunctions::rReceive(CBotVar* var, CBotVar* result, int& exception, v
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object);
cbs = var->GetValString(); cbs = var->GetValString();
p = cbs; p = cbs;
var = var->GetNext(); var = var->GetNext();
@ -2238,11 +2215,10 @@ bool CScriptFunctions::rReceive(CBotVar* var, CBotVar* result, int& exception, v
var = var->GetNext(); var = var->GetNext();
} }
err = script->m_primaryTask->StartTaskInfo(static_cast<const char*>(p), 0.0f, power, false); err = script->m_taskExecutor->StartTaskInfo(static_cast<const char*>(p), 0.0f, power, false);
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetInit(CBotVar::InitType::IS_NAN); result->SetInit(CBotVar::InitType::IS_NAN);
return true; return true;
} }
@ -2293,10 +2269,8 @@ bool CScriptFunctions::rSend(CBotVar* var, CBotVar* result, int& exception, void
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object);
cbs = var->GetValString(); cbs = var->GetValString();
p = cbs; p = cbs;
var = var->GetNext(); var = var->GetNext();
@ -2311,11 +2285,10 @@ bool CScriptFunctions::rSend(CBotVar* var, CBotVar* result, int& exception, void
var = var->GetNext(); var = var->GetNext();
} }
err = script->m_primaryTask->StartTaskInfo(static_cast<const char*>(p), value, power, true); err = script->m_taskExecutor->StartTaskInfo(static_cast<const char*>(p), value, power, true);
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -2440,14 +2413,12 @@ bool CScriptFunctions::rThump(CBotVar* var, CBotVar* result, int& exception, voi
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object); err = script->m_taskExecutor->StartTaskTerraform();
err = script->m_primaryTask->StartTaskTerraform();
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -2469,14 +2440,12 @@ bool CScriptFunctions::rRecycle(CBotVar* var, CBotVar* result, int& exception, v
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object); err = script->m_taskExecutor->StartTaskRecover();
err = script->m_primaryTask->StartTaskRecover();
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -2535,7 +2504,7 @@ bool CScriptFunctions::rShield(CBotVar* var, CBotVar* result, int& exception, vo
if ( radius > 25.0f ) radius = 25.0f; if ( radius > 25.0f ) radius = 25.0f;
radius = (radius-10.0f)/15.0f; radius = (radius-10.0f)/15.0f;
if ( *script->m_secondaryTask == 0 ) // shield folds? if ( !script->m_taskExecutor->IsBackgroundTask() ) // shield folds?
{ {
if ( oper == 0.0f ) // down? if ( oper == 0.0f ) // down?
{ {
@ -2544,12 +2513,10 @@ bool CScriptFunctions::rShield(CBotVar* var, CBotVar* result, int& exception, vo
else // up ? else // up ?
{ {
pThis->SetParam(radius); pThis->SetParam(radius);
*script->m_secondaryTask = new CTaskManager(script->m_object); err = script->m_taskExecutor->StartTaskShield(TSM_UP, 1000.0f);
err = (*script->m_secondaryTask)->StartTaskShield(TSM_UP, 1000.0f);
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete *script->m_secondaryTask; script->m_taskExecutor->StopBackgroundTask();
*script->m_secondaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
} }
} }
@ -2558,13 +2525,13 @@ bool CScriptFunctions::rShield(CBotVar* var, CBotVar* result, int& exception, vo
{ {
if ( oper == 0.0f ) // down? if ( oper == 0.0f ) // down?
{ {
(*script->m_secondaryTask)->StartTaskShield(TSM_DOWN, 0.0f); script->m_taskExecutor->StartTaskShield(TSM_DOWN, 0.0f);
} }
else // up? else // up?
{ {
//? result->SetValInt(1); // shows the error //? result->SetValInt(1); // shows the error
pThis->SetParam(radius); pThis->SetParam(radius);
(*script->m_secondaryTask)->StartTaskShield(TSM_UPDATE, 0.0f); script->m_taskExecutor->StartTaskShield(TSM_UPDATE, 0.0f);
} }
} }
@ -2616,10 +2583,8 @@ bool CScriptFunctions::rFire(CBotVar* var, CBotVar* result, int& exception, void
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object);
type = pThis->GetType(); type = pThis->GetType();
if ( type == OBJECT_ANT ) if ( type == OBJECT_ANT )
@ -2627,24 +2592,23 @@ bool CScriptFunctions::rFire(CBotVar* var, CBotVar* result, int& exception, void
if ( !GetPoint(var, exception, impact) ) return true; if ( !GetPoint(var, exception, impact) ) return true;
float waterLevel = Gfx::CEngine::GetInstancePointer()->GetWater()->GetLevel(); float waterLevel = Gfx::CEngine::GetInstancePointer()->GetWater()->GetLevel();
impact.y += waterLevel; impact.y += waterLevel;
err = script->m_primaryTask->StartTaskFireAnt(impact); err = script->m_taskExecutor->StartTaskFireAnt(impact);
} }
else if ( type == OBJECT_SPIDER ) else if ( type == OBJECT_SPIDER )
{ {
err = script->m_primaryTask->StartTaskSpiderExplo(); err = script->m_taskExecutor->StartTaskSpiderExplo();
} }
else else
{ {
if ( var == 0 ) delay = 0.0f; if ( var == 0 ) delay = 0.0f;
else delay = var->GetValFloat(); else delay = var->GetValFloat();
if ( delay < 0.0f ) delay = -delay; if ( delay < 0.0f ) delay = -delay;
err = script->m_primaryTask->StartTaskFire(delay); err = script->m_taskExecutor->StartTaskFire(delay);
} }
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
return true; return true;
} }
@ -2679,21 +2643,19 @@ bool CScriptFunctions::rAim(CBotVar* var, CBotVar* result, int& exception, void*
exception = 0; exception = 0;
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object);
x = var->GetValFloat(); x = var->GetValFloat();
var = var->GetNext(); var = var->GetNext();
var == 0 ? y=0.0f : y=var->GetValFloat(); var == 0 ? y=0.0f : y=var->GetValFloat();
err = script->m_primaryTask->StartTaskGunGoal(x*Math::PI/180.0f, y*Math::PI/180.0f); err = script->m_taskExecutor->StartTaskGunGoal(x*Math::PI/180.0f, y*Math::PI/180.0f);
if ( err == ERR_AIM_IMPOSSIBLE ) if ( err == ERR_AIM_IMPOSSIBLE )
{ {
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
} }
else if ( err != ERR_OK ) else if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
return true; return true;
} }
@ -2959,14 +2921,12 @@ bool CScriptFunctions::rPenDown(CBotVar* var, CBotVar* result, int& exception, v
if ( pThis->GetType() == OBJECT_MOBILEdr ) if ( pThis->GetType() == OBJECT_MOBILEdr )
{ {
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object); err = script->m_taskExecutor->StartTaskPen(motionVehicle->GetTraceDown(), motionVehicle->GetTraceColor());
err = script->m_primaryTask->StartTaskPen(motionVehicle->GetTraceDown(), motionVehicle->GetTraceColor());
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -3001,16 +2961,14 @@ bool CScriptFunctions::rPenUp(CBotVar* var, CBotVar* result, int& exception, voi
if ( pThis->GetType() == OBJECT_MOBILEdr ) if ( pThis->GetType() == OBJECT_MOBILEdr )
{ {
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
motionVehicle->SetTraceDown(false); motionVehicle->SetTraceDown(false);
script->m_primaryTask = new CTaskManager(script->m_object); err = script->m_taskExecutor->StartTaskPen(motionVehicle->GetTraceDown(), motionVehicle->GetTraceColor());
err = script->m_primaryTask->StartTaskPen(motionVehicle->GetTraceDown(), motionVehicle->GetTraceColor());
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {
@ -3049,14 +3007,12 @@ bool CScriptFunctions::rPenColor(CBotVar* var, CBotVar* result, int& exception,
if ( pThis->GetType() == OBJECT_MOBILEdr ) if ( pThis->GetType() == OBJECT_MOBILEdr )
{ {
if ( script->m_primaryTask == 0 ) // no task in progress? if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress?
{ {
script->m_primaryTask = new CTaskManager(script->m_object); err = script->m_taskExecutor->StartTaskPen(motionVehicle->GetTraceDown(), motionVehicle->GetTraceColor());
err = script->m_primaryTask->StartTaskPen(motionVehicle->GetTraceDown(), motionVehicle->GetTraceColor());
if ( err != ERR_OK ) if ( err != ERR_OK )
{ {
delete script->m_primaryTask; script->m_taskExecutor->StopForegroundTask();
script->m_primaryTask = 0;
result->SetValInt(err); // shows the error result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP ) if ( script->m_errMode == ERM_STOP )
{ {

View File

@ -236,7 +236,7 @@ bool CStudio::EventProcess(const Event &event)
if ( event.type == EVENT_STUDIO_STEP ) // step? if ( event.type == EVENT_STUDIO_STEP ) // step?
{ {
m_script->Step(event); m_script->Step();
} }
if ( event.type == EVENT_WINDOW3 ) // window is moved? if ( event.type == EVENT_WINDOW3 ) // window is moved?