summaryrefslogtreecommitdiffstats
path: root/src/object/brain.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/object/brain.cpp')
-rw-r--r--src/object/brain.cpp208
1 files changed, 70 insertions, 138 deletions
diff --git a/src/object/brain.cpp b/src/object/brain.cpp
index 4bd8742..f10faac 100644
--- a/src/object/brain.cpp
+++ b/src/object/brain.cpp
@@ -1,18 +1,21 @@
-// * This file is part of the COLOBOT source code
-// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
-// *
-// * 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://www.gnu.org/licenses/.
+/*
+ * 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
+ */
#include "object/brain.h"
@@ -812,11 +815,23 @@ void CBrain::StopProgram()
void CBrain::StopTask()
{
- if ( m_primaryTask != 0 )
+ if (m_primaryTask != nullptr)
{
m_primaryTask->Abort();
delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
+ 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;
}
}
@@ -900,16 +915,10 @@ void CBrain::StopEditScript(bool bCancel)
Error CBrain::StartTaskTake()
{
- Error err;
-
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskTake();
+ Error err = m_primaryTask->StartTaskTake();
UpdateInterface();
return err;
}
@@ -918,16 +927,10 @@ Error CBrain::StartTaskTake()
Error CBrain::StartTaskManip(TaskManipOrder order, TaskManipArm arm)
{
- Error err;
-
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskManip(order, arm);
+ Error err = m_primaryTask->StartTaskManip(order, arm);
UpdateInterface();
return err;
}
@@ -936,16 +939,10 @@ Error CBrain::StartTaskManip(TaskManipOrder order, TaskManipArm arm)
Error CBrain::StartTaskFlag(TaskFlagOrder order, int rank)
{
- Error err;
-
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskFlag(order, rank);
+ Error err = m_primaryTask->StartTaskFlag(order, rank);
UpdateInterface();
return err;
}
@@ -954,16 +951,10 @@ Error CBrain::StartTaskFlag(TaskFlagOrder order, int rank)
Error CBrain::StartTaskBuild(ObjectType type)
{
- Error err;
-
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskBuild(type);
+ Error err = m_primaryTask->StartTaskBuild(type);
UpdateInterface();
return err;
}
@@ -972,16 +963,10 @@ Error CBrain::StartTaskBuild(ObjectType type)
Error CBrain::StartTaskSearch()
{
- Error err;
-
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskSearch();
+ Error err = m_primaryTask->StartTaskSearch();
UpdateInterface();
return err;
}
@@ -990,38 +975,26 @@ Error CBrain::StartTaskSearch()
Error CBrain::StartTaskTerraform()
{
- Error err;
-
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskTerraform();
+ Error err = m_primaryTask->StartTaskTerraform();
UpdateInterface();
return err;
}
// Change pencil.
-Error CBrain::StartTaskPen(bool bDown, int color)
+Error CBrain::StartTaskPen(bool down, int color)
{
- Error err;
-
m_physics->SetMotorSpeedX(0.0f);
m_physics->SetMotorSpeedY(0.0f);
m_physics->SetMotorSpeedZ(0.0f);
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskPen(bDown, color);
+ Error err = m_primaryTask->StartTaskPen(down, color);
UpdateInterface();
return err;
}
@@ -1030,16 +1003,10 @@ Error CBrain::StartTaskPen(bool bDown, int color)
Error CBrain::StartTaskRecover()
{
- Error err;
-
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskRecover();
+ Error err = m_primaryTask->StartTaskRecover();
UpdateInterface();
return err;
}
@@ -1048,16 +1015,10 @@ Error CBrain::StartTaskRecover()
Error CBrain::StartTaskShield(TaskShieldMode mode)
{
- Error err;
-
- if ( m_secondaryTask != 0 )
- {
- delete m_secondaryTask; // stops the current task
- m_secondaryTask = 0;
- }
+ StopSecondaryTask();
m_secondaryTask = new CTaskManager(m_object);
- err = m_secondaryTask->StartTaskShield(mode, 1000.0f);
+ Error err = m_secondaryTask->StartTaskShield(mode, 1000.0f);
UpdateInterface();
return err;
}
@@ -1066,16 +1027,10 @@ Error CBrain::StartTaskShield(TaskShieldMode mode)
Error CBrain::StartTaskFire(float delay)
{
- Error err;
-
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskFire(delay);
+ Error err = m_primaryTask->StartTaskFire(delay);
UpdateInterface();
return err;
}
@@ -1084,16 +1039,10 @@ Error CBrain::StartTaskFire(float delay)
Error CBrain::StartTaskSpiderExplo()
{
- Error err;
-
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskSpiderExplo();
+ Error err = m_primaryTask->StartTaskSpiderExplo();
UpdateInterface();
return err;
}
@@ -1102,16 +1051,10 @@ Error CBrain::StartTaskSpiderExplo()
Error CBrain::StartTaskFireAnt(Math::Vector impact)
{
- Error err;
-
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskFireAnt(impact);
+ Error err = m_primaryTask->StartTaskFireAnt(impact);
UpdateInterface();
return err;
}
@@ -1120,16 +1063,10 @@ Error CBrain::StartTaskFireAnt(Math::Vector impact)
Error CBrain::StartTaskGunGoal(float dirV, float dirH)
{
- Error err;
-
- if ( m_secondaryTask != 0 )
- {
- delete m_secondaryTask; // stops the current task
- m_secondaryTask = 0;
- }
+ StopSecondaryTask();
m_secondaryTask = new CTaskManager(m_object);
- err = m_secondaryTask->StartTaskGunGoal(dirV, dirH);
+ Error err = m_secondaryTask->StartTaskGunGoal(dirV, dirH);
UpdateInterface();
return err;
}
@@ -1138,16 +1075,10 @@ Error CBrain::StartTaskGunGoal(float dirV, float dirH)
Error CBrain::StartTaskReset(Math::Vector goal, Math::Vector angle)
{
- Error err;
-
- if ( m_primaryTask != 0 )
- {
- delete m_primaryTask; // stops the current task
- m_primaryTask = 0;
- }
+ StopTask();
m_primaryTask = new CTaskManager(m_object);
- err = m_primaryTask->StartTaskReset(goal, angle);
+ Error err = m_primaryTask->StartTaskReset(goal, angle);
UpdateInterface();
return err;
}
@@ -1156,30 +1087,29 @@ Error CBrain::StartTaskReset(Math::Vector goal, Math::Vector angle)
Error CBrain::EndedTask()
{
- Error err;
-
- if ( m_secondaryTask != 0 ) // current task?
+ if (m_secondaryTask != nullptr) // current task?
{
- err = m_secondaryTask->IsEnded();
+ Error err = m_secondaryTask->IsEnded();
if ( err != ERR_CONTINUE ) // job ended?
{
delete m_secondaryTask;
- m_secondaryTask = 0;
+ m_secondaryTask = nullptr;
UpdateInterface();
}
}
- if ( m_primaryTask != 0 ) // current task?
+ if (m_primaryTask != nullptr) // current task?
{
- err = m_primaryTask->IsEnded();
+ Error err = m_primaryTask->IsEnded();
if ( err != ERR_CONTINUE ) // job ended?
{
delete m_primaryTask;
- m_primaryTask = 0;
+ m_primaryTask = nullptr;
UpdateInterface();
}
return err;
}
+
return ERR_STOP;
}
@@ -2616,6 +2546,8 @@ void CBrain::RunProgram(int rank)
BlinkScript(true); // blink
m_object->CreateSelectParticle();
m_main->UpdateShortcuts();
+ if(m_object->GetTrainer())
+ m_main->StartMissionTimer();
}
}