CTaskExecutorObject interface; some general task and CBrain cleanup
parent
73e0abc510
commit
3a5f618f65
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
};
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -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?
|
||||||
|
|
Loading…
Reference in New Issue