From 856c5baa0e3ca04534faf1347d12eef7faaa1e6b Mon Sep 17 00:00:00 2001 From: krzys-h Date: Sat, 15 Aug 2015 20:29:59 +0200 Subject: [PATCH] Removed CTaskManager --- src/CMakeLists.txt | 1 - src/level/robotmain.cpp | 1 - src/object/auto/auto.h | 2 - src/object/auto/autobase.h | 3 - src/object/auto/autoconvert.h | 3 - src/object/auto/autoderrick.h | 3 - src/object/auto/autodestroyer.h | 3 - src/object/auto/autoegg.h | 3 - src/object/auto/autofactory.h | 2 - src/object/auto/autoflag.h | 3 - src/object/auto/autohouston.h | 3 - src/object/auto/autojostle.h | 3 - src/object/auto/autolabo.h | 2 - src/object/auto/automush.h | 3 - src/object/auto/autonest.h | 3 - src/object/auto/autonuclearplant.h | 3 - src/object/auto/autoportico.h | 3 - src/object/auto/autopowercaptor.h | 3 - src/object/auto/autopowerplant.h | 3 - src/object/auto/autopowerstation.h | 3 - src/object/auto/autoradar.h | 3 - src/object/auto/autorepair.h | 3 - src/object/auto/autoresearch.h | 2 - src/object/auto/autoroot.h | 3 - src/object/auto/autotower.h | 3 - src/object/auto/autovault.h | 3 - .../implementation/task_executor_impl.cpp | 164 ++++++++++- .../implementation/task_executor_impl.h | 53 ++-- src/object/interface/task_executor_object.h | 6 +- src/object/motion/motion.h | 2 - src/object/motion/motionant.h | 2 - src/object/motion/motionbee.h | 2 - src/object/motion/motionhuman.h | 3 - src/object/motion/motionlevelcontroller.h | 3 - src/object/motion/motionqueen.h | 2 - src/object/motion/motionspider.h | 2 - src/object/motion/motiontoto.h | 3 - src/object/motion/motionworm.h | 3 - src/object/old_object.cpp | 235 ---------------- src/object/old_object.h | 22 -- src/object/task/task.h | 26 +- src/object/task/taskadvance.cpp | 3 +- src/object/task/taskadvance.h | 5 +- src/object/task/taskbuild.cpp | 2 +- src/object/task/taskbuild.h | 5 +- src/object/task/taskdeletemark.cpp | 2 +- src/object/task/taskdeletemark.h | 4 +- src/object/task/taskfire.cpp | 7 +- src/object/task/taskfire.h | 6 +- src/object/task/taskfireant.cpp | 3 +- src/object/task/taskfireant.h | 5 +- src/object/task/taskflag.cpp | 2 +- src/object/task/taskflag.h | 4 +- src/object/task/taskgoto.cpp | 2 +- src/object/task/taskgoto.h | 5 +- src/object/task/taskgungoal.cpp | 3 +- src/object/task/taskgungoal.h | 5 +- src/object/task/taskinfo.cpp | 2 +- src/object/task/taskinfo.h | 5 +- src/object/task/taskmanager.cpp | 263 ------------------ src/object/task/taskmanager.h | 75 ----- src/object/task/taskmanip.cpp | 2 +- src/object/task/taskmanip.h | 5 +- src/object/task/taskpen.cpp | 14 +- src/object/task/taskpen.h | 4 +- src/object/task/taskrecover.cpp | 2 +- src/object/task/taskrecover.h | 5 +- src/object/task/tasksearch.cpp | 2 +- src/object/task/tasksearch.h | 5 +- src/object/task/taskshield.cpp | 2 +- src/object/task/taskshield.h | 5 +- src/object/task/taskspiderexplo.cpp | 3 +- src/object/task/taskspiderexplo.h | 5 +- src/object/task/tasktake.cpp | 2 +- src/object/task/tasktake.h | 5 +- src/object/task/taskterraform.cpp | 2 +- src/object/task/taskterraform.h | 5 +- src/object/task/taskturn.cpp | 2 +- src/object/task/taskturn.h | 5 +- src/object/task/taskwait.cpp | 3 +- src/object/task/taskwait.h | 5 +- src/script/scriptfunc.cpp | 77 +++-- src/script/scriptfunc.h | 5 +- src/sound/oalsound/check.h | 2 - src/ui/controls/button.h | 3 - src/ui/controls/check.h | 3 - src/ui/controls/color.h | 3 - src/ui/controls/control.h | 3 - src/ui/controls/editvalue.h | 3 - src/ui/controls/gauge.h | 3 - src/ui/controls/group.h | 3 - src/ui/controls/image.h | 3 - src/ui/controls/interface.h | 2 - src/ui/controls/label.h | 3 - src/ui/controls/list.h | 3 - src/ui/controls/map.h | 3 - src/ui/controls/scroll.h | 3 - src/ui/controls/shortcut.h | 3 - src/ui/controls/slider.h | 2 - src/ui/controls/target.h | 2 - src/ui/controls/window.h | 2 - src/ui/displayinfo.h | 3 - src/ui/displaytext.h | 2 - src/ui/mainmap.h | 2 - src/ui/mainshort.h | 2 - src/ui/object_interface.cpp | 2 - src/ui/studio.h | 2 - 107 files changed, 324 insertions(+), 909 deletions(-) delete mode 100644 src/object/task/taskmanager.cpp delete mode 100644 src/object/task/taskmanager.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5fede92a..9527a688 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -188,7 +188,6 @@ set(BASE_SOURCES object/task/taskgoto.cpp object/task/taskgungoal.cpp object/task/taskinfo.cpp - object/task/taskmanager.cpp object/task/taskmanip.cpp object/task/taskpen.cpp object/task/taskrecover.cpp diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp index 3105c121..44594da3 100644 --- a/src/level/robotmain.cpp +++ b/src/level/robotmain.cpp @@ -75,7 +75,6 @@ #include "object/task/task.h" #include "object/task/taskbuild.h" -#include "object/task/taskmanager.h" #include "object/task/taskmanip.h" #include "physics/physics.h" diff --git a/src/object/auto/auto.h b/src/object/auto/auto.h index 4cd15070..d4017499 100644 --- a/src/object/auto/auto.h +++ b/src/object/auto/auto.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// auto.h - #pragma once diff --git a/src/object/auto/autobase.h b/src/object/auto/autobase.h index ce974ce6..57731bfc 100644 --- a/src/object/auto/autobase.h +++ b/src/object/auto/autobase.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autobase.h - #pragma once @@ -119,4 +117,3 @@ protected: Gfx::Color m_bgCloudDown; std::set m_cargoObjects; }; - diff --git a/src/object/auto/autoconvert.h b/src/object/auto/autoconvert.h index bfb1c164..24ac7ad6 100644 --- a/src/object/auto/autoconvert.h +++ b/src/object/auto/autoconvert.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autoconvert.h - #pragma once @@ -70,4 +68,3 @@ protected: bool m_bSoundClose = false; int m_soundChannel = 0; }; - diff --git a/src/object/auto/autoderrick.h b/src/object/auto/autoderrick.h index c5f77241..1b22c6c7 100644 --- a/src/object/auto/autoderrick.h +++ b/src/object/auto/autoderrick.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autoderrick.h - #pragma once @@ -72,4 +70,3 @@ protected: int m_soundChannel = 0; bool m_bSoundFall = false; }; - diff --git a/src/object/auto/autodestroyer.h b/src/object/auto/autodestroyer.h index 1d16e7e2..ec7bc558 100644 --- a/src/object/auto/autodestroyer.h +++ b/src/object/auto/autodestroyer.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autodestroyer.h - #pragma once @@ -69,4 +67,3 @@ protected: float m_lastParticle = 0.0f; bool m_bExplo = false; }; - diff --git a/src/object/auto/autoegg.h b/src/object/auto/autoegg.h index db8ac0de..87ef7681 100644 --- a/src/object/auto/autoegg.h +++ b/src/object/auto/autoegg.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autoegg.h - #pragma once @@ -73,4 +71,3 @@ protected: float m_progress = 0.0f; float m_speed = 0.0f; }; - diff --git a/src/object/auto/autofactory.h b/src/object/auto/autofactory.h index cba88926..82566bfd 100644 --- a/src/object/auto/autofactory.h +++ b/src/object/auto/autofactory.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autofactory.h - #pragma once diff --git a/src/object/auto/autoflag.h b/src/object/auto/autoflag.h index 9d621d9a..3eced516 100644 --- a/src/object/auto/autoflag.h +++ b/src/object/auto/autoflag.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autoflag.h - #pragma once @@ -44,4 +42,3 @@ protected: int m_param = 0; float m_progress = 0.0f; }; - diff --git a/src/object/auto/autohouston.h b/src/object/auto/autohouston.h index 65770d5a..2f95228e 100644 --- a/src/object/auto/autohouston.h +++ b/src/object/auto/autohouston.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autohouston.h - #pragma once @@ -64,4 +62,3 @@ protected: HustonLens m_lens[HUSTONMAXLENS]; int m_lensTotal = 0; }; - diff --git a/src/object/auto/autojostle.h b/src/object/auto/autojostle.h index 7f4c8431..b2f86aba 100644 --- a/src/object/auto/autojostle.h +++ b/src/object/auto/autojostle.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autojostle.h - #pragma once @@ -50,4 +48,3 @@ protected: float m_lastParticle = 0.0f; Error m_error = ERR_OK; }; - diff --git a/src/object/auto/autolabo.h b/src/object/auto/autolabo.h index 48942a23..8bf63c9e 100644 --- a/src/object/auto/autolabo.h +++ b/src/object/auto/autolabo.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autolabo.h - #pragma once diff --git a/src/object/auto/automush.h b/src/object/auto/automush.h index 86bcc212..f0e2840f 100644 --- a/src/object/auto/automush.h +++ b/src/object/auto/automush.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// automush.h - #pragma once @@ -61,4 +59,3 @@ protected: float m_speed = 0.0f; float m_lastParticle = 0.0f; }; - diff --git a/src/object/auto/autonest.h b/src/object/auto/autonest.h index 3e251aaf..fc61d741 100644 --- a/src/object/auto/autonest.h +++ b/src/object/auto/autonest.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autonest.h - #pragma once @@ -62,4 +60,3 @@ protected: float m_lastParticle = 0.0f; Math::Vector m_cargoPos; }; - diff --git a/src/object/auto/autonuclearplant.h b/src/object/auto/autonuclearplant.h index 15708f13..50a5ac00 100644 --- a/src/object/auto/autonuclearplant.h +++ b/src/object/auto/autonuclearplant.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autonuclearplant.h - #pragma once @@ -69,4 +67,3 @@ protected: Math::Vector m_pos; int m_channelSound = 0; }; - diff --git a/src/object/auto/autoportico.h b/src/object/auto/autoportico.h index 4662109b..f101cdd5 100644 --- a/src/object/auto/autoportico.h +++ b/src/object/auto/autoportico.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autoportico.h - #pragma once @@ -69,4 +67,3 @@ protected: int m_param = 0; int m_soundChannel = 0; }; - diff --git a/src/object/auto/autopowercaptor.h b/src/object/auto/autopowercaptor.h index 69104da9..4991e830 100644 --- a/src/object/auto/autopowercaptor.h +++ b/src/object/auto/autopowercaptor.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autopowercaptor.h - #pragma once @@ -65,4 +63,3 @@ protected: Math::Vector m_pos; int m_channelSound = 0; }; - diff --git a/src/object/auto/autopowerplant.h b/src/object/auto/autopowerplant.h index 6ff8ddf0..a85684eb 100644 --- a/src/object/auto/autopowerplant.h +++ b/src/object/auto/autopowerplant.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autopowerplant.h - #pragma once @@ -73,4 +71,3 @@ protected: float m_lastParticle = 0.0f; int m_partiSphere = 0; }; - diff --git a/src/object/auto/autopowerstation.h b/src/object/auto/autopowerstation.h index 26c57d3d..999f95d8 100644 --- a/src/object/auto/autopowerstation.h +++ b/src/object/auto/autopowerstation.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autopowerstation.h - #pragma once @@ -57,4 +55,3 @@ protected: bool m_bLastVirus = false; float m_energyVirus = 0.0f; }; - diff --git a/src/object/auto/autoradar.h b/src/object/auto/autoradar.h index 3a0f9405..f7505770 100644 --- a/src/object/auto/autoradar.h +++ b/src/object/auto/autoradar.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autoradar.h - #pragma once @@ -64,4 +62,3 @@ protected: float m_start = 0.0f; int m_totalDetect = 0; }; - diff --git a/src/object/auto/autorepair.h b/src/object/auto/autorepair.h index 64bbeaed..acaceecc 100644 --- a/src/object/auto/autorepair.h +++ b/src/object/auto/autorepair.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autorepair.h - #pragma once @@ -65,4 +63,3 @@ protected: float m_timeVirus = 0.0f; float m_lastParticle = 0.0f; }; - diff --git a/src/object/auto/autoresearch.h b/src/object/auto/autoresearch.h index ea38c71e..b29704b4 100644 --- a/src/object/auto/autoresearch.h +++ b/src/object/auto/autoresearch.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autoresearch.h - #pragma once diff --git a/src/object/auto/autoroot.h b/src/object/auto/autoroot.h index 167074a4..4421acbd 100644 --- a/src/object/auto/autoroot.h +++ b/src/object/auto/autoroot.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autoroot.h - #pragma once @@ -44,4 +42,3 @@ protected: float m_lastParticle = 0.0f; Math::Vector m_center; }; - diff --git a/src/object/auto/autotower.h b/src/object/auto/autotower.h index e150de8c..2ee3a569 100644 --- a/src/object/auto/autotower.h +++ b/src/object/auto/autotower.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autotower.h - #pragma once @@ -75,4 +73,3 @@ protected: float m_angleZfinal = 0.0f; int m_partiStop[4] = {}; }; - diff --git a/src/object/auto/autovault.h b/src/object/auto/autovault.h index b9c61113..28f1e02b 100644 --- a/src/object/auto/autovault.h +++ b/src/object/auto/autovault.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// autovault.h - #pragma once @@ -75,4 +73,3 @@ protected: Math::Vector m_keyPos[4]; int m_keyParti[4] = {}; }; - diff --git a/src/object/implementation/task_executor_impl.cpp b/src/object/implementation/task_executor_impl.cpp index 11d3a2d5..f89b2f39 100644 --- a/src/object/implementation/task_executor_impl.cpp +++ b/src/object/implementation/task_executor_impl.cpp @@ -20,8 +20,23 @@ #include "object/implementation/task_executor_impl.h" #include "object/object.h" +#include "object/old_object.h" -#include "object/task/taskmanager.h" +#include "object/task/taskadvance.h" +#include "object/task/taskbuild.h" +#include "object/task/taskdeletemark.h" +#include "object/task/taskfire.h" +#include "object/task/taskfireant.h" +#include "object/task/taskgungoal.h" +#include "object/task/taskinfo.h" +#include "object/task/taskpen.h" +#include "object/task/taskrecover.h" +#include "object/task/tasksearch.h" +#include "object/task/taskspiderexplo.h" +#include "object/task/tasktake.h" +#include "object/task/taskterraform.h" +#include "object/task/taskturn.h" +#include "object/task/taskwait.h" CTaskExecutorObjectImpl::CTaskExecutorObjectImpl(ObjectInterfaceTypes& types, CObject* object) : CTaskExecutorObject(types) @@ -33,7 +48,7 @@ CTaskExecutorObjectImpl::~CTaskExecutorObjectImpl() bool CTaskExecutorObjectImpl::EventProcess(const Event &event) { - // NOTE: This function CAN'T BE CALLED BETWEEN CTaskManager::EventProcess AND CScriptFunctions::Process, otherwise weird stuff may happen to scripts (they'll be stuck executing the same task over and over again) + // NOTE: This function CAN'T BE CALLED BETWEEN CTask::EventProcess AND CScriptFunctions::Process, otherwise weird stuff may happen to scripts (they'll be stuck executing the same task over and over again) EndedTask(); if ( m_foregroundTask != nullptr ) @@ -59,12 +74,12 @@ bool CTaskExecutorObjectImpl::IsBackgroundTask() return m_backgroundTask != nullptr; } -CTaskManager* CTaskExecutorObjectImpl::GetForegroundTask() +CForegroundTask* CTaskExecutorObjectImpl::GetForegroundTask() { return m_foregroundTask.get(); } -CTaskManager* CTaskExecutorObjectImpl::GetBackgroundTask() +CBackgroundTask* CTaskExecutorObjectImpl::GetBackgroundTask() { return m_backgroundTask.get(); } @@ -118,3 +133,144 @@ Error CTaskExecutorObjectImpl::EndedTask() return ERR_STOP; } + +template +Error CTaskExecutorObjectImpl::StartForegroundTask(Args&&... args) +{ + static_assert(std::is_base_of::value, "not a foreground task"); + + StopForegroundTask(); + + assert(m_object->Implements(ObjectInterfaceType::Old)); //TODO + std::unique_ptr task = MakeUnique(dynamic_cast(m_object)); + Error err = task->Start(std::forward(args)...); + if (err == ERR_OK) + m_foregroundTask = std::move(task); + m_object->UpdateInterface(); + return err; +} + +template +Error CTaskExecutorObjectImpl::StartBackgroundTask(Args&&... args) +{ + static_assert(std::is_base_of::value, "not a background task"); + + Error err; + TaskType* task = dynamic_cast(m_backgroundTask.get()); + if (task != nullptr) + { + err = task->Start(std::forward(args)...); + if (err != ERR_OK) + m_backgroundTask.reset(); + return err; + } + else + { + m_backgroundTask.reset(); // In case the old task was of a different type + + assert(m_object->Implements(ObjectInterfaceType::Old)); //TODO + std::unique_ptr newTask = MakeUnique(dynamic_cast(m_object)); + err = newTask->Start(std::forward(args)...); + if (err == ERR_OK) + m_backgroundTask = std::move(newTask); + } + m_object->UpdateInterface(); + return err; +} + +Error CTaskExecutorObjectImpl::StartTaskTake() +{ + return StartForegroundTask(); +} + +Error CTaskExecutorObjectImpl::StartTaskManip(TaskManipOrder order, TaskManipArm arm) +{ + return StartForegroundTask(order, arm); +} + +Error CTaskExecutorObjectImpl::StartTaskFlag(TaskFlagOrder order, int rank) +{ + return StartForegroundTask(order, rank); +} + +Error CTaskExecutorObjectImpl::StartTaskBuild(ObjectType type) +{ + return StartForegroundTask(type); +} + +Error CTaskExecutorObjectImpl::StartTaskSearch() +{ + return StartForegroundTask(); +} + +Error CTaskExecutorObjectImpl::StartTaskDeleteMark() +{ + return StartForegroundTask(); +} + +Error CTaskExecutorObjectImpl::StartTaskTerraform() +{ + return StartForegroundTask(); +} + +Error CTaskExecutorObjectImpl::StartTaskRecover() +{ + return StartForegroundTask(); +} + +Error CTaskExecutorObjectImpl::StartTaskFire(float delay) +{ + return StartForegroundTask(delay); +} + +Error CTaskExecutorObjectImpl::StartTaskFireAnt(Math::Vector impact) +{ + return StartForegroundTask(impact); +} + +Error CTaskExecutorObjectImpl::StartTaskSpiderExplo() +{ + return StartForegroundTask(); +} + +Error CTaskExecutorObjectImpl::StartTaskPen(bool down, TraceColor color) +{ + return StartForegroundTask(down, color); +} + + +Error CTaskExecutorObjectImpl::StartTaskWait(float time) +{ + return StartForegroundTask(time); +} + +Error CTaskExecutorObjectImpl::StartTaskAdvance(float length) +{ + return StartForegroundTask(length); +} + +Error CTaskExecutorObjectImpl::StartTaskTurn(float angle) +{ + return StartForegroundTask(angle); +} + +Error CTaskExecutorObjectImpl::StartTaskGoto(Math::Vector pos, float altitude, TaskGotoGoal goalMode, TaskGotoCrash crashMode) +{ + return StartForegroundTask(pos, altitude, goalMode, crashMode); +} + +Error CTaskExecutorObjectImpl::StartTaskInfo(const char *name, float value, float power, bool bSend) +{ + return StartForegroundTask(name, value, power, bSend); +} + + +Error CTaskExecutorObjectImpl::StartTaskShield(TaskShieldMode mode, float delay) +{ + return StartBackgroundTask(mode, delay); +} + +Error CTaskExecutorObjectImpl::StartTaskGunGoal(float dirV, float dirH) +{ + return StartBackgroundTask(dirV, dirH); +} diff --git a/src/object/implementation/task_executor_impl.h b/src/object/implementation/task_executor_impl.h index 2c206c94..ba2f7888 100644 --- a/src/object/implementation/task_executor_impl.h +++ b/src/object/implementation/task_executor_impl.h @@ -24,7 +24,6 @@ #include class CObject; -class CTaskManager; class CTaskExecutorObjectImpl : public CTaskExecutorObject { @@ -37,40 +36,46 @@ public: bool IsForegroundTask() override; bool IsBackgroundTask() override; - CTaskManager* GetForegroundTask() override; - CTaskManager* GetBackgroundTask() override; + CForegroundTask* GetForegroundTask() override; + CBackgroundTask* GetBackgroundTask() override; void StopForegroundTask() override; void StopBackgroundTask() override; - Error StartTaskTake() { return ERR_WRONG_BOT; } - Error StartTaskManip(TaskManipOrder order, TaskManipArm arm) { return ERR_WRONG_BOT; } - Error StartTaskFlag(TaskFlagOrder order, int rank) { return ERR_WRONG_BOT; } - Error StartTaskBuild(ObjectType type) { return ERR_WRONG_BOT; } - Error StartTaskSearch() { return ERR_WRONG_BOT; } - Error StartTaskDeleteMark() { return ERR_WRONG_BOT; } - Error StartTaskTerraform() { return ERR_WRONG_BOT; } - Error StartTaskRecover() { return ERR_WRONG_BOT; } - Error StartTaskFire(float delay) { return ERR_WRONG_BOT; } - Error StartTaskFireAnt(Math::Vector impact) { return ERR_WRONG_BOT; } - Error StartTaskSpiderExplo() { return ERR_WRONG_BOT; } - Error StartTaskPen(bool down, TraceColor color = TraceColor::Default) { return ERR_WRONG_BOT; } + 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) { return ERR_UNKNOWN; } - Error StartTaskAdvance(float length) { return ERR_UNKNOWN; } - Error StartTaskTurn(float angle) { return ERR_UNKNOWN; } - Error StartTaskGoto(Math::Vector pos, float altitude, TaskGotoGoal goalMode, TaskGotoCrash crashMode) { return ERR_UNKNOWN; } - Error StartTaskInfo(const char *name, float value, float power, bool bSend) { return ERR_UNKNOWN; } + 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) { return ERR_WRONG_BOT; } - Error StartTaskGunGoal(float dirV, float dirH) { return ERR_WRONG_BOT; } + Error StartTaskShield(TaskShieldMode mode, float delay = 1000.0f) override; + Error StartTaskGunGoal(float dirV, float dirH) override; private: Error EndedTask(); + template + Error StartForegroundTask(Args&&... args); + + template + Error StartBackgroundTask(Args&&... args); + protected: - std::unique_ptr m_foregroundTask; - std::unique_ptr m_backgroundTask; + std::unique_ptr m_foregroundTask; + std::unique_ptr m_backgroundTask; private: CObject* m_object; diff --git a/src/object/interface/task_executor_object.h b/src/object/interface/task_executor_object.h index 49c92290..eaeaf705 100644 --- a/src/object/interface/task_executor_object.h +++ b/src/object/interface/task_executor_object.h @@ -29,7 +29,7 @@ #include "object/task/taskmanip.h" #include "object/task/taskshield.h" -class CTaskManager; +class CTask; /** * \class CTaskExecutorObject @@ -80,9 +80,9 @@ public: virtual bool IsBackgroundTask() = 0; //! Return the foreground task - virtual CTaskManager* GetForegroundTask() = 0; + virtual CForegroundTask* GetForegroundTask() = 0; //! Return the background task - virtual CTaskManager* GetBackgroundTask() = 0; + virtual CBackgroundTask* GetBackgroundTask() = 0; //! Stop foreground task virtual void StopForegroundTask() = 0; diff --git a/src/object/motion/motion.h b/src/object/motion/motion.h index cb512cd6..8d3c861a 100644 --- a/src/object/motion/motion.h +++ b/src/object/motion/motion.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// motion.h - #pragma once diff --git a/src/object/motion/motionant.h b/src/object/motion/motionant.h index 27ab507a..3fe8940e 100644 --- a/src/object/motion/motionant.h +++ b/src/object/motion/motionant.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// motionant.h - #pragma once diff --git a/src/object/motion/motionbee.h b/src/object/motion/motionbee.h index ebc84494..6ecb9b7d 100644 --- a/src/object/motion/motionbee.h +++ b/src/object/motion/motionbee.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// motionbee.h - #pragma once diff --git a/src/object/motion/motionhuman.h b/src/object/motion/motionhuman.h index c5c669f8..57f62919 100644 --- a/src/object/motion/motionhuman.h +++ b/src/object/motion/motionhuman.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// motionhuman.h - #pragma once @@ -94,4 +92,3 @@ protected: float m_tired; bool m_bDisplayPerso; }; - diff --git a/src/object/motion/motionlevelcontroller.h b/src/object/motion/motionlevelcontroller.h index dec4e7d9..1dc70a58 100644 --- a/src/object/motion/motionlevelcontroller.h +++ b/src/object/motion/motionlevelcontroller.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// motionlevelcontroller.h - #pragma once @@ -33,4 +31,3 @@ public: void DeleteObject(bool bAll=false); void Create(Math::Vector pos, float angle, ObjectType type, float power, Gfx::COldModelManager* modelManager); }; - diff --git a/src/object/motion/motionqueen.h b/src/object/motion/motionqueen.h index 27ba6883..a1f707ba 100644 --- a/src/object/motion/motionqueen.h +++ b/src/object/motion/motionqueen.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// motionqueen.h - #pragma once diff --git a/src/object/motion/motionspider.h b/src/object/motion/motionspider.h index 5439f5d5..9bc963ff 100644 --- a/src/object/motion/motionspider.h +++ b/src/object/motion/motionspider.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// motionspider.h - #pragma once diff --git a/src/object/motion/motiontoto.h b/src/object/motion/motiontoto.h index b7860373..d64dd767 100644 --- a/src/object/motion/motiontoto.h +++ b/src/object/motion/motiontoto.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// motiontoto.h - #pragma once @@ -70,4 +68,3 @@ protected: ObjectType m_type; Math::Point m_mousePos; }; - diff --git a/src/object/motion/motionworm.h b/src/object/motion/motionworm.h index 4661a9d0..86e1e9c8 100644 --- a/src/object/motion/motionworm.h +++ b/src/object/motion/motionworm.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// motionworm.h - #pragma once @@ -62,4 +60,3 @@ protected: bool m_bArmStop; float m_lastParticle; }; - diff --git a/src/object/old_object.cpp b/src/object/old_object.cpp index 9c0780fd..1c5ea202 100644 --- a/src/object/old_object.cpp +++ b/src/object/old_object.cpp @@ -53,8 +53,6 @@ #include "object/subclass/exchange_post.h" -#include "object/task/taskmanager.h" - #include "physics/physics.h" #include "script/cbottoken.h" @@ -3208,239 +3206,6 @@ void COldObject::SetScale(const Math::Vector& scale) SetPartScale(0, scale); } -// Move the manipulator arm. - -Error COldObject::StartTaskTake() -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskTake(); - UpdateInterface(); - return err; -} - -// Move the manipulator arm. - -Error COldObject::StartTaskManip(TaskManipOrder order, TaskManipArm arm) -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskManip(order, arm); - UpdateInterface(); - return err; -} - -// Puts or removes a flag. - -Error COldObject::StartTaskFlag(TaskFlagOrder order, int rank) -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskFlag(order, rank); - UpdateInterface(); - return err; -} - -// Built a building. - -Error COldObject::StartTaskBuild(ObjectType type) -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskBuild(type); - UpdateInterface(); - return err; -} - -// Probe the ground. - -Error COldObject::StartTaskSearch() -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskSearch(); - UpdateInterface(); - return err; -} - -// Delete mark on ground - -Error COldObject::StartTaskDeleteMark() -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskDeleteMark(); - UpdateInterface(); - return err; -} - - -// Terraformed the ground. - -Error COldObject::StartTaskTerraform() -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskTerraform(); - UpdateInterface(); - return err; -} - -// Change pencil. - -Error COldObject::StartTaskPen(bool down, TraceColor color) -{ - auto motionVehicle = dynamic_cast(m_motion.get()); - assert(motionVehicle != nullptr); - - if (color == TraceColor::Default) - color = GetTraceColor(); - - SetTraceDown(down); - SetTraceColor(color); - - m_physics->SetMotorSpeedX(0.0f); - m_physics->SetMotorSpeedY(0.0f); - m_physics->SetMotorSpeedZ(0.0f); - - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskPen(down, color); - UpdateInterface(); - return err; -} - -// Recovers a ruin. - -Error COldObject::StartTaskRecover() -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskRecover(); - UpdateInterface(); - return err; -} - -// Shoots. - -Error COldObject::StartTaskFire(float delay) -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskFire(delay); - UpdateInterface(); - return err; -} - -// Explodes spider. - -Error COldObject::StartTaskSpiderExplo() -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskSpiderExplo(); - UpdateInterface(); - return err; -} - -// Shoots to the ant. - -Error COldObject::StartTaskFireAnt(Math::Vector impact) -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskFireAnt(impact); - UpdateInterface(); - return err; -} - -Error COldObject::StartTaskWait(float time) -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskWait(time); - UpdateInterface(); - return err; -} - -Error COldObject::StartTaskAdvance(float length) -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskAdvance(length); - UpdateInterface(); - return err; -} - -Error COldObject::StartTaskTurn(float angle) -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskTurn(angle); - UpdateInterface(); - return err; -} - -Error COldObject::StartTaskGoto(Math::Vector pos, float altitude, TaskGotoGoal goalMode, TaskGotoCrash crashMode) -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskGoto(pos, altitude, goalMode, crashMode); - UpdateInterface(); - return err; -} - -Error COldObject::StartTaskInfo(const char *name, float value, float power, bool bSend) -{ - StopForegroundTask(); - - m_foregroundTask = MakeUnique(this); - Error err = m_foregroundTask->StartTaskInfo(name, value, power, bSend); - UpdateInterface(); - return err; -} - -// Deploys the shield. - -Error COldObject::StartTaskShield(TaskShieldMode mode, float delay) -{ - if (m_backgroundTask == nullptr) - { - m_backgroundTask = MakeUnique(this); - } - Error err = m_backgroundTask->StartTaskShield(mode, delay); - UpdateInterface(); - return err; -} - -// Adjusts upward. - -Error COldObject::StartTaskGunGoal(float dirV, float dirH) -{ - StopBackgroundTask(); - - m_backgroundTask = MakeUnique(this); - Error err = m_backgroundTask->StartTaskGunGoal(dirV, dirH); - UpdateInterface(); - return err; -} - void COldObject::UpdateInterface() { if (m_objectInterface != nullptr && GetSelect()) diff --git a/src/object/old_object.h b/src/object/old_object.h index 244ac126..a1ebd514 100644 --- a/src/object/old_object.h +++ b/src/object/old_object.h @@ -287,28 +287,6 @@ public: void SetScale(const Math::Vector& scale) 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; - void UpdateInterface() override; void StopProgram() override; diff --git a/src/object/task/task.h b/src/object/task/task.h index f79be9fb..252ba7df 100644 --- a/src/object/task/task.h +++ b/src/object/task/task.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// task.h - #pragma once @@ -73,6 +71,12 @@ public: virtual bool IsBusy(); virtual bool Abort(); + //! Returns true if you can control the robot while the task is executing + virtual bool IsPilot() = 0; + + //! Returns true if this task is meant to be run as a background task + virtual bool IsBackground() = 0; + protected: Gfx::CEngine* m_engine = nullptr; Gfx::CLightManager* m_lightMan = nullptr; @@ -88,3 +92,21 @@ protected: CMotion* m_motion = nullptr; CPhysics* m_physics = nullptr; }; + +class CForegroundTask : public CTask +{ +public: + CForegroundTask(COldObject* object) : CTask(object) {} + + bool IsBackground() final { return false; } + virtual bool IsPilot() { return false; } +}; + +class CBackgroundTask : public CTask +{ +public: + CBackgroundTask(COldObject* object) : CTask(object) {} + + bool IsBackground() final { return true; } + bool IsPilot() final { return true; } +}; diff --git a/src/object/task/taskadvance.cpp b/src/object/task/taskadvance.cpp index d6abf127..201fffe5 100644 --- a/src/object/task/taskadvance.cpp +++ b/src/object/task/taskadvance.cpp @@ -35,7 +35,7 @@ // Object's constructor. -CTaskAdvance::CTaskAdvance(COldObject* object) : CTask(object) +CTaskAdvance::CTaskAdvance(COldObject* object) : CForegroundTask(object) { } @@ -147,4 +147,3 @@ Error CTaskAdvance::IsEnded() } return ERR_CONTINUE; } - diff --git a/src/object/task/taskadvance.h b/src/object/task/taskadvance.h index a2309bdf..50437bae 100644 --- a/src/object/task/taskadvance.h +++ b/src/object/task/taskadvance.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskadvance.h - #pragma once @@ -28,7 +26,7 @@ -class CTaskAdvance : public CTask +class CTaskAdvance : public CForegroundTask { public: CTaskAdvance(COldObject* object); @@ -49,4 +47,3 @@ protected: float m_fixTime = 0.0f; bool m_bError = false; }; - diff --git a/src/object/task/taskbuild.cpp b/src/object/task/taskbuild.cpp index 77bad80a..e11e886c 100644 --- a/src/object/task/taskbuild.cpp +++ b/src/object/task/taskbuild.cpp @@ -47,7 +47,7 @@ // Object's constructor. -CTaskBuild::CTaskBuild(COldObject* object) : CTask(object) +CTaskBuild::CTaskBuild(COldObject* object) : CForegroundTask(object) { int i; diff --git a/src/object/task/taskbuild.h b/src/object/task/taskbuild.h index ea0059a5..81a07378 100644 --- a/src/object/task/taskbuild.h +++ b/src/object/task/taskbuild.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskbuild.h - #pragma once @@ -49,7 +47,7 @@ enum TaskBuildPhase -class CTaskBuild : public CTask +class CTaskBuild : public CForegroundTask { public: CTaskBuild(COldObject* object); @@ -89,4 +87,3 @@ protected: int m_lightRank[TBMAXLIGHT] = {}; // lights for the effects int m_soundChannel = 0; }; - diff --git a/src/object/task/taskdeletemark.cpp b/src/object/task/taskdeletemark.cpp index ec17a274..5749545f 100644 --- a/src/object/task/taskdeletemark.cpp +++ b/src/object/task/taskdeletemark.cpp @@ -35,7 +35,7 @@ #include "physics/physics.h" -CTaskDeleteMark::CTaskDeleteMark(COldObject* object) : CTask(object) +CTaskDeleteMark::CTaskDeleteMark(COldObject* object) : CForegroundTask(object) { m_bExecuted = false; } diff --git a/src/object/task/taskdeletemark.h b/src/object/task/taskdeletemark.h index 590a2296..06036307 100644 --- a/src/object/task/taskdeletemark.h +++ b/src/object/task/taskdeletemark.h @@ -17,15 +17,13 @@ * along with this program. If not, see http://gnu.org/licenses */ -// tasksearch.h - #pragma once #include "object/task/task.h" -class CTaskDeleteMark : public CTask +class CTaskDeleteMark : public CForegroundTask { public: CTaskDeleteMark(COldObject* object); diff --git a/src/object/task/taskfire.cpp b/src/object/task/taskfire.cpp index 58fc5a9e..63587d98 100644 --- a/src/object/task/taskfire.cpp +++ b/src/object/task/taskfire.cpp @@ -38,7 +38,7 @@ const float ENERGY_FIREi = (0.10f/2.5f); // energy consumed/organic // Object's constructor. -CTaskFire::CTaskFire(COldObject* object) : CTask(object) +CTaskFire::CTaskFire(COldObject* object) : CForegroundTask(object) { m_soundChannel = -1; @@ -387,3 +387,8 @@ bool CTaskFire::Abort() //? m_camera->StopCentering(m_object, 1.0f); return true; } + +bool CTaskFire::IsPilot() +{ + return true; +} diff --git a/src/object/task/taskfire.h b/src/object/task/taskfire.h index d2013a21..3feb5e4b 100644 --- a/src/object/task/taskfire.h +++ b/src/object/task/taskfire.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskfire.h - #pragma once @@ -26,7 +24,7 @@ -class CTaskFire : public CTask +class CTaskFire : public CForegroundTask { public: CTaskFire(COldObject* object); @@ -37,6 +35,7 @@ public: Error Start(float delay); Error IsEnded(); bool Abort(); + bool IsPilot(); protected: float m_delay = 0.0f; @@ -50,4 +49,3 @@ protected: float m_lastSound = 0.0f; int m_soundChannel = 0; }; - diff --git a/src/object/task/taskfireant.cpp b/src/object/task/taskfireant.cpp index a52064e0..483649b9 100644 --- a/src/object/task/taskfireant.cpp +++ b/src/object/task/taskfireant.cpp @@ -35,7 +35,7 @@ // Object's constructor. -CTaskFireAnt::CTaskFireAnt(COldObject* object) : CTask(object) +CTaskFireAnt::CTaskFireAnt(COldObject* object) : CForegroundTask(object) { m_phase = TFA_NULL; } @@ -212,4 +212,3 @@ bool CTaskFireAnt::Abort() m_motion->SetAction(-1); return true; } - diff --git a/src/object/task/taskfireant.h b/src/object/task/taskfireant.h index b4749523..6ed8f4e0 100644 --- a/src/object/task/taskfireant.h +++ b/src/object/task/taskfireant.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskfireant.h - #pragma once @@ -38,7 +36,7 @@ enum TaskFireAnt -class CTaskFireAnt : public CTask +class CTaskFireAnt : public CForegroundTask { public: CTaskFireAnt(COldObject* object); @@ -63,4 +61,3 @@ protected: float m_time = 0.0f; float m_lastParticle = 0.0f; }; - diff --git a/src/object/task/taskflag.cpp b/src/object/task/taskflag.cpp index 37935e55..1d0f6914 100644 --- a/src/object/task/taskflag.cpp +++ b/src/object/task/taskflag.cpp @@ -40,7 +40,7 @@ // Object's constructor. -CTaskFlag::CTaskFlag(COldObject* object) : CTask(object) +CTaskFlag::CTaskFlag(COldObject* object) : CForegroundTask(object) { } diff --git a/src/object/task/taskflag.h b/src/object/task/taskflag.h index 77fe180d..d69f92b8 100644 --- a/src/object/task/taskflag.h +++ b/src/object/task/taskflag.h @@ -16,7 +16,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see http://gnu.org/licenses */ -// taskflag.h #pragma once @@ -37,7 +36,7 @@ enum TaskFlagOrder -class CTaskFlag : public CTask +class CTaskFlag : public CForegroundTask { public: CTaskFlag(COldObject* object); @@ -60,4 +59,3 @@ protected: float m_time = 0.0f; bool m_bError = false; }; - diff --git a/src/object/task/taskgoto.cpp b/src/object/task/taskgoto.cpp index ee06621c..ef7ac2b9 100644 --- a/src/object/task/taskgoto.cpp +++ b/src/object/task/taskgoto.cpp @@ -53,7 +53,7 @@ const float SAFETY_MARGIN = 0.5f; // Smallest distance between two objects // Object's constructor. -CTaskGoto::CTaskGoto(COldObject* object) : CTask(object) +CTaskGoto::CTaskGoto(COldObject* object) : CForegroundTask(object) { m_bmArray = 0; } diff --git a/src/object/task/taskgoto.h b/src/object/task/taskgoto.h index b4dbca89..db3fcb46 100644 --- a/src/object/task/taskgoto.h +++ b/src/object/task/taskgoto.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskgoto.h - #pragma once @@ -75,7 +73,7 @@ enum TaskGotoPhase -class CTaskGoto : public CTask +class CTaskGoto : public CForegroundTask { public: CTaskGoto(COldObject* object); @@ -160,4 +158,3 @@ protected: float m_leakTime = 0.0f; bool m_bLeakRecede = false; }; - diff --git a/src/object/task/taskgungoal.cpp b/src/object/task/taskgungoal.cpp index a0f6e91d..7a11c619 100644 --- a/src/object/task/taskgungoal.cpp +++ b/src/object/task/taskgungoal.cpp @@ -27,7 +27,7 @@ // Object's constructor. -CTaskGunGoal::CTaskGunGoal(COldObject* object) : CTask(object) +CTaskGunGoal::CTaskGunGoal(COldObject* object) : CBackgroundTask(object) { m_aimImpossible = false; } @@ -164,4 +164,3 @@ bool CTaskGunGoal::Abort() { return true; } - diff --git a/src/object/task/taskgungoal.h b/src/object/task/taskgungoal.h index eb312a91..224c3b06 100644 --- a/src/object/task/taskgungoal.h +++ b/src/object/task/taskgungoal.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskgungoal.h - #pragma once @@ -26,7 +24,7 @@ -class CTaskGunGoal : public CTask +class CTaskGunGoal : public CBackgroundTask { public: CTaskGunGoal(COldObject* object); @@ -48,4 +46,3 @@ protected: bool m_aimImpossible = false; // set to true if impossible aim was set }; - diff --git a/src/object/task/taskinfo.cpp b/src/object/task/taskinfo.cpp index 798e3d73..251aff80 100644 --- a/src/object/task/taskinfo.cpp +++ b/src/object/task/taskinfo.cpp @@ -34,7 +34,7 @@ // Object's constructor. -CTaskInfo::CTaskInfo(COldObject* object) : CTask(object) +CTaskInfo::CTaskInfo(COldObject* object) : CForegroundTask(object) , m_progress(0.0f) , m_speed(0.0f) , m_time(0.0f) diff --git a/src/object/task/taskinfo.h b/src/object/task/taskinfo.h index 9968200e..08bb9f7f 100644 --- a/src/object/task/taskinfo.h +++ b/src/object/task/taskinfo.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskinfo.h - #pragma once @@ -26,7 +24,7 @@ class CExchangePost; -class CTaskInfo : public CTask +class CTaskInfo : public CForegroundTask { public: CTaskInfo(COldObject* object); @@ -47,4 +45,3 @@ protected: float m_time = 0.0f; bool m_error = false; }; - diff --git a/src/object/task/taskmanager.cpp b/src/object/task/taskmanager.cpp deleted file mode 100644 index 583538ee..00000000 --- a/src/object/task/taskmanager.cpp +++ /dev/null @@ -1,263 +0,0 @@ -/* - * 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/task/taskmanager.h" - -#include "common/make_unique.h" - -#include "object/old_object.h" - -#include "object/task/taskadvance.h" -#include "object/task/taskbuild.h" -#include "object/task/taskdeletemark.h" -#include "object/task/taskfire.h" -#include "object/task/taskfireant.h" -#include "object/task/taskgungoal.h" -#include "object/task/taskinfo.h" -#include "object/task/taskpen.h" -#include "object/task/taskrecover.h" -#include "object/task/tasksearch.h" -#include "object/task/taskspiderexplo.h" -#include "object/task/tasktake.h" -#include "object/task/taskterraform.h" -#include "object/task/taskturn.h" -#include "object/task/taskwait.h" - - -// Object's constructor. - -CTaskManager::CTaskManager(COldObject* object) - : m_object(object), - m_bPilot(false) -{ -} - -// Object's destructor. - -CTaskManager::~CTaskManager() -{ -} - -template -Error CTaskManager::StartTask(Args&&... args) -{ - auto task = MakeUnique(m_object); - auto* taskPtr = task.get(); - m_task = std::move(task); - return taskPtr->Start(std::forward(args)...); -} - - -// Waits for a while. - -Error CTaskManager::StartTaskWait(float time) -{ - return StartTask(time); -} - -// Advance straight ahead a certain distance. - -Error CTaskManager::StartTaskAdvance(float length) -{ - return StartTask(length); -} - -// Turns through an certain angle. - -Error CTaskManager::StartTaskTurn(float angle) -{ - return StartTask(angle); -} - -// Reaches a given position. - -Error CTaskManager::StartTaskGoto(Math::Vector pos, float altitude, TaskGotoGoal goalMode, TaskGotoCrash crashMode) -{ - return StartTask(pos, altitude, goalMode, crashMode); -} - -// Move the manipulator arm. - -Error CTaskManager::StartTaskTake() -{ - return StartTask(); -} - -// Move the manipulator arm. - -Error CTaskManager::StartTaskManip(TaskManipOrder order, TaskManipArm arm) -{ - return StartTask(order, arm); -} - -// Puts or removes a flag. - -Error CTaskManager::StartTaskFlag(TaskFlagOrder order, int rank) -{ - return StartTask(order, rank); -} - -// Builds a building. - -Error CTaskManager::StartTaskBuild(ObjectType type) -{ - return StartTask(type); -} - -// Probe the ground. - -Error CTaskManager::StartTaskSearch() -{ - return StartTask(); -} - -// Delete mark on ground - -Error CTaskManager::StartTaskDeleteMark() -{ - return StartTask(); -} - - -// Reads an information terminal. - -Error CTaskManager::StartTaskInfo(const char *name, float value, float power, bool bSend) -{ - return StartTask(name, value, power, bSend); -} - -// Terraforms the ground. - -Error CTaskManager::StartTaskTerraform() -{ - return StartTask(); -} - -// Changes the pencil. - -Error CTaskManager::StartTaskPen(bool bDown, TraceColor color) -{ - return StartTask(bDown, color); -} - -// Recovers a ruin. - -Error CTaskManager::StartTaskRecover() -{ - return StartTask(); -} - -// Deploys the shield. - -Error CTaskManager::StartTaskShield(TaskShieldMode mode, float delay) -{ - if (mode == TSM_UP || mode == TSM_START) - { - return StartTask(mode, delay); - } - else if (m_task != nullptr) - { - // TODO: is this static_cast really safe? - return (static_cast(m_task.get()))->Start(mode, delay); - } - return ERR_UNKNOWN; -} - -// Shoots. - -Error CTaskManager::StartTaskFire(float delay) -{ - m_bPilot = true; - return StartTask(delay); -} - -// Shoots with the ant. - -Error CTaskManager::StartTaskFireAnt(Math::Vector impact) -{ - return StartTask(impact); -} - -// Adjusts higher. - -Error CTaskManager::StartTaskGunGoal(float dirV, float dirH) -{ - return StartTask(dirV, dirH); -} - -// Suicide of the spider. - -Error CTaskManager::StartTaskSpiderExplo() -{ - return StartTask(); -} - - -// Management of an event. - -bool CTaskManager::EventProcess(const Event &event) -{ - if (m_task == nullptr) - return false; - - return m_task->EventProcess(event); -} - - -// Indicates whether the action is finished. - -Error CTaskManager::IsEnded() -{ - if (m_task == nullptr) - return ERR_UNKNOWN; - - return m_task->IsEnded(); -} - - -// Indicates whether the action is pending. - -bool CTaskManager::IsBusy() -{ - if (m_task == nullptr) - return false; - - return m_task->IsBusy(); -} - - -// Indicates whether it is possible to control the robot -// during the execution of the current task. - -bool CTaskManager::IsPilot() -{ - return m_bPilot; -} - - -// Suddenly ends the current action. - -bool CTaskManager::Abort() -{ - if (m_task == nullptr) - return false; - - return m_task->Abort(); -} diff --git a/src/object/task/taskmanager.h b/src/object/task/taskmanager.h deleted file mode 100644 index 07290e2e..00000000 --- a/src/object/task/taskmanager.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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 - */ - -// taskmanager.h - -#pragma once - -#include "object/interface/trace_drawing_object.h" - -#include "object/task/task.h" -#include "object/task/taskflag.h" -#include "object/task/taskgoto.h" -#include "object/task/taskmanip.h" -#include "object/task/taskshield.h" - -#include - - -class CTaskManager -{ -public: - CTaskManager(COldObject* object); - ~CTaskManager(); - - Error StartTaskWait(float time); - Error StartTaskAdvance(float length); - Error StartTaskTurn(float angle); - Error StartTaskGoto(Math::Vector pos, float altitude, TaskGotoGoal goalMode, TaskGotoCrash crashMode); - Error StartTaskTake(); - Error StartTaskManip(TaskManipOrder order, TaskManipArm arm); - Error StartTaskFlag(TaskFlagOrder order, int rank); - Error StartTaskBuild(ObjectType type); - Error StartTaskSearch(); - Error StartTaskDeleteMark(); - Error StartTaskInfo(const char *name, float value, float power, bool bSend); - Error StartTaskTerraform(); - Error StartTaskPen(bool bDown, TraceColor color); - Error StartTaskRecover(); - Error StartTaskShield(TaskShieldMode mode, float delay); - Error StartTaskFire(float delay); - Error StartTaskFireAnt(Math::Vector impact); - Error StartTaskGunGoal(float dirV, float dirH); - Error StartTaskSpiderExplo(); - - bool EventProcess(const Event &event); - Error IsEnded(); - bool IsBusy(); - bool IsPilot(); - bool Abort(); - -protected: - template - Error StartTask(Args&&... args); - -protected: - std::unique_ptr m_task; - COldObject* m_object = nullptr; - bool m_bPilot = false; -}; diff --git a/src/object/task/taskmanip.cpp b/src/object/task/taskmanip.cpp index 949ddb60..d55f0fb3 100644 --- a/src/object/task/taskmanip.cpp +++ b/src/object/task/taskmanip.cpp @@ -51,7 +51,7 @@ const float MARGIN_BEE = 5.0f; //OK 1.9 // Object's constructor. -CTaskManip::CTaskManip(COldObject* object) : CTask(object) +CTaskManip::CTaskManip(COldObject* object) : CForegroundTask(object) { m_arm = TMA_NEUTRAL; m_hand = TMH_OPEN; diff --git a/src/object/task/taskmanip.h b/src/object/task/taskmanip.h index 6e2729ab..40280123 100644 --- a/src/object/task/taskmanip.h +++ b/src/object/task/taskmanip.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskmanip.h - #pragma once @@ -58,7 +56,7 @@ enum TaskManipHand -class CTaskManip : public CTask +class CTaskManip : public CForegroundTask { public: CTaskManip(COldObject* object); @@ -103,4 +101,3 @@ protected: float m_timeLimit = 0.0f; ObjectType m_cargoType = OBJECT_NULL; }; - diff --git a/src/object/task/taskpen.cpp b/src/object/task/taskpen.cpp index 7e9311b8..c837e56a 100644 --- a/src/object/task/taskpen.cpp +++ b/src/object/task/taskpen.cpp @@ -25,12 +25,14 @@ #include "object/old_object.h" +#include "physics/physics.h" + #include "sound/sound.h" // Object's constructor. -CTaskPen::CTaskPen(COldObject* object) : CTask(object) +CTaskPen::CTaskPen(COldObject* object) : CForegroundTask(object) { } @@ -136,6 +138,16 @@ Error CTaskPen::Start(bool bDown, TraceColor color) ObjectType type; int i; + if (color == TraceColor::Default) + color = m_object->GetTraceColor(); + + m_object->SetTraceDown(bDown); + m_object->SetTraceColor(color); + + m_physics->SetMotorSpeedX(0.0f); + m_physics->SetMotorSpeedY(0.0f); + m_physics->SetMotorSpeedZ(0.0f); + m_bError = true; // operation impossible type = m_object->GetType(); diff --git a/src/object/task/taskpen.h b/src/object/task/taskpen.h index 95adc635..d2a0fcd0 100644 --- a/src/object/task/taskpen.h +++ b/src/object/task/taskpen.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskpen.h - #pragma once @@ -38,7 +36,7 @@ enum TaskPenPhase -class CTaskPen : public CTask +class CTaskPen : public CForegroundTask { public: CTaskPen(COldObject* object); diff --git a/src/object/task/taskrecover.cpp b/src/object/task/taskrecover.cpp index 4c453ffb..02d4c505 100644 --- a/src/object/task/taskrecover.cpp +++ b/src/object/task/taskrecover.cpp @@ -43,7 +43,7 @@ const float RECOVER_DIST = 11.8f; // Object's constructor. -CTaskRecover::CTaskRecover(COldObject* object) : CTask(object) +CTaskRecover::CTaskRecover(COldObject* object) : CForegroundTask(object) { m_ruin = 0; m_soundChannel = -1; diff --git a/src/object/task/taskrecover.h b/src/object/task/taskrecover.h index 3a7d5f14..79024491 100644 --- a/src/object/task/taskrecover.h +++ b/src/object/task/taskrecover.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskrecover.h - #pragma once @@ -39,7 +37,7 @@ enum TaskRecoverPhase -class CTaskRecover : public CTask +class CTaskRecover : public CForegroundTask { public: CTaskRecover(COldObject* object); @@ -67,4 +65,3 @@ protected: Math::Vector m_recoverPos; int m_soundChannel = 0; }; - diff --git a/src/object/task/tasksearch.cpp b/src/object/task/tasksearch.cpp index e9b6c2f5..3a23e761 100644 --- a/src/object/task/tasksearch.cpp +++ b/src/object/task/tasksearch.cpp @@ -35,7 +35,7 @@ // Object's constructor. -CTaskSearch::CTaskSearch(COldObject* object) : CTask(object) +CTaskSearch::CTaskSearch(COldObject* object) : CForegroundTask(object) { m_hand = TSH_UP; } diff --git a/src/object/task/tasksearch.h b/src/object/task/tasksearch.h index 47833c1b..4cf15b7e 100644 --- a/src/object/task/tasksearch.h +++ b/src/object/task/tasksearch.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// tasksearch.h - #pragma once @@ -43,7 +41,7 @@ enum TaskSearchPhase -class CTaskSearch : public CTask +class CTaskSearch : public CForegroundTask { public: CTaskSearch(COldObject* object); @@ -71,4 +69,3 @@ protected: float m_finalAngle[3] = {}; bool m_bError = false; }; - diff --git a/src/object/task/taskshield.cpp b/src/object/task/taskshield.cpp index 4a9f426d..91e59f18 100644 --- a/src/object/task/taskshield.cpp +++ b/src/object/task/taskshield.cpp @@ -44,7 +44,7 @@ const float ENERGY_TIME = 20.0f; // maximum duration if full battery // Object's constructor. -CTaskShield::CTaskShield(COldObject* object) : CTask(object) +CTaskShield::CTaskShield(COldObject* object) : CBackgroundTask(object) { m_rankSphere = -1; m_soundChannel = -1; diff --git a/src/object/task/taskshield.h b/src/object/task/taskshield.h index b8c6f4db..e62a3194 100644 --- a/src/object/task/taskshield.h +++ b/src/object/task/taskshield.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskshield.h - #pragma once @@ -51,7 +49,7 @@ enum TaskShieldMode -class CTaskShield : public CTask +class CTaskShield : public CBackgroundTask { public: CTaskShield(COldObject* object); @@ -86,4 +84,3 @@ protected: int m_soundChannel = 0; int m_effectLight = 0; }; - diff --git a/src/object/task/taskspiderexplo.cpp b/src/object/task/taskspiderexplo.cpp index eadf44a7..87966b0a 100644 --- a/src/object/task/taskspiderexplo.cpp +++ b/src/object/task/taskspiderexplo.cpp @@ -34,7 +34,7 @@ // Object's constructor. -CTaskSpiderExplo::CTaskSpiderExplo(COldObject* object) : CTask(object) +CTaskSpiderExplo::CTaskSpiderExplo(COldObject* object) : CForegroundTask(object) { m_time = 0.0f; m_bError = false; @@ -107,4 +107,3 @@ bool CTaskSpiderExplo::Abort() { return true; } - diff --git a/src/object/task/taskspiderexplo.h b/src/object/task/taskspiderexplo.h index 58b12954..4ece92d6 100644 --- a/src/object/task/taskspiderexplo.h +++ b/src/object/task/taskspiderexplo.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskspiderexplo.h - #pragma once @@ -26,7 +24,7 @@ -class CTaskSpiderExplo : public CTask +class CTaskSpiderExplo : public CForegroundTask { public: CTaskSpiderExplo(COldObject* object); @@ -42,4 +40,3 @@ protected: float m_time = 0.0f; bool m_bError = false; }; - diff --git a/src/object/task/tasktake.cpp b/src/object/task/tasktake.cpp index 7d3ba9c3..4993bfdf 100644 --- a/src/object/task/tasktake.cpp +++ b/src/object/task/tasktake.cpp @@ -43,7 +43,7 @@ // Object's constructor. -CTaskTake::CTaskTake(COldObject* object) : CTask(object) +CTaskTake::CTaskTake(COldObject* object) : CForegroundTask(object) { m_arm = TTA_NEUTRAL; diff --git a/src/object/task/tasktake.h b/src/object/task/tasktake.h index fa99012b..19d78a33 100644 --- a/src/object/task/tasktake.h +++ b/src/object/task/tasktake.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// tasktake.h - #pragma once @@ -44,7 +42,7 @@ enum TaskTakeArm -class CTaskTake : public CTask +class CTaskTake : public CForegroundTask { public: CTaskTake(COldObject* object); @@ -75,4 +73,3 @@ protected: float m_angle = 0.0f; ObjectType m_cargoType = OBJECT_NULL; }; - diff --git a/src/object/task/taskterraform.cpp b/src/object/task/taskterraform.cpp index d00b0254..e4c53979 100644 --- a/src/object/task/taskterraform.cpp +++ b/src/object/task/taskterraform.cpp @@ -45,7 +45,7 @@ const float ACTION_RADIUS = 400.0f; // Object's constructor. -CTaskTerraform::CTaskTerraform(COldObject* object) : CTask(object) +CTaskTerraform::CTaskTerraform(COldObject* object) : CForegroundTask(object) { m_lastParticle = 0.0f; m_soundChannel = -1; diff --git a/src/object/task/taskterraform.h b/src/object/task/taskterraform.h index 1197e699..5fb4e754 100644 --- a/src/object/task/taskterraform.h +++ b/src/object/task/taskterraform.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskterraform.h - #pragma once @@ -37,7 +35,7 @@ enum TaskTerraPhase -class CTaskTerraform : public CTask +class CTaskTerraform : public CForegroundTask { public: CTaskTerraform(COldObject* object); @@ -62,4 +60,3 @@ protected: bool m_bError = false; Math::Vector m_terraPos; }; - diff --git a/src/object/task/taskturn.cpp b/src/object/task/taskturn.cpp index 8769e5c8..53507015 100644 --- a/src/object/task/taskturn.cpp +++ b/src/object/task/taskturn.cpp @@ -31,7 +31,7 @@ // Object's constructor. -CTaskTurn::CTaskTurn(COldObject* object) : CTask(object) +CTaskTurn::CTaskTurn(COldObject* object) : CForegroundTask(object) { } diff --git a/src/object/task/taskturn.h b/src/object/task/taskturn.h index 1314fd96..ae402c67 100644 --- a/src/object/task/taskturn.h +++ b/src/object/task/taskturn.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskturn.h - #pragma once @@ -26,7 +24,7 @@ -class CTaskTurn : public CTask +class CTaskTurn : public CForegroundTask { public: CTaskTurn(COldObject* object); @@ -44,4 +42,3 @@ protected: bool m_bLeft = false; bool m_bError = false; }; - diff --git a/src/object/task/taskwait.cpp b/src/object/task/taskwait.cpp index 56eb5662..e3d0651d 100644 --- a/src/object/task/taskwait.cpp +++ b/src/object/task/taskwait.cpp @@ -26,7 +26,7 @@ // Object's constructor. -CTaskWait::CTaskWait(COldObject* object) : CTask(object) +CTaskWait::CTaskWait(COldObject* object) : CForegroundTask(object) { } @@ -68,4 +68,3 @@ Error CTaskWait::IsEnded() if ( m_bEnded ) return ERR_STOP; return ERR_CONTINUE; } - diff --git a/src/object/task/taskwait.h b/src/object/task/taskwait.h index 8665dd85..259e62af 100644 --- a/src/object/task/taskwait.h +++ b/src/object/task/taskwait.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// taskwait.h - #pragma once @@ -26,7 +24,7 @@ -class CTaskWait : public CTask +class CTaskWait : public CForegroundTask { public: CTaskWait(COldObject* object); @@ -42,4 +40,3 @@ protected: float m_passTime = 0.0f; bool m_bEnded = false; }; - diff --git a/src/script/scriptfunc.cpp b/src/script/scriptfunc.cpp index f8aa6141..69e048be 100644 --- a/src/script/scriptfunc.cpp +++ b/src/script/scriptfunc.cpp @@ -54,8 +54,6 @@ #include "object/subclass/exchange_post.h" -#include "object/task/taskmanager.h" - #include "physics/physics.h" #include "script/cbottoken.h" @@ -1174,11 +1172,10 @@ bool CScriptFunctions::rRadar(CBotVar* var, CBotVar* result, int& exception, voi // Monitoring a task. -bool CScriptFunctions::Process(CScript* script, CBotVar* result, int &exception) +bool CScriptFunctions::WaitForForegroundTask(CScript* script, CBotVar* result, int &exception) { - Error err; - - err = script->m_taskExecutor->GetForegroundTask()->IsEnded(); + assert(script->m_taskExecutor->IsForegroundTask()); + Error err = script->m_taskExecutor->GetForegroundTask()->IsEnded(); if ( err != ERR_CONTINUE ) // task terminated? { script->m_taskExecutor->StopForegroundTask(); @@ -1187,7 +1184,31 @@ bool CScriptFunctions::Process(CScript* script, CBotVar* result, int &exception) if ( err == ERR_STOP ) err = ERR_OK; result->SetValInt(err); // indicates the error or ok - if ( ShouldProcessStop(err, script->m_errMode) ) + if ( ShouldTaskStop(err, script->m_errMode) ) + { + exception = err; + return false; + } + return true; // it's all over + } + + script->m_bContinue = true; + return false; // not done +} + +bool CScriptFunctions::WaitForBackgroundTask(CScript* script, CBotVar* result, int &exception) +{ + assert(script->m_taskExecutor->IsBackgroundTask()); + Error err = script->m_taskExecutor->GetBackgroundTask()->IsEnded(); + if ( err != ERR_CONTINUE ) // task terminated? + { + script->m_taskExecutor->StopBackgroundTask(); + + script->m_bContinue = false; + + if ( err == ERR_STOP ) err = ERR_OK; + result->SetValInt(err); // indicates the error or ok + if ( ShouldTaskStop(err, script->m_errMode) ) { exception = err; return false; @@ -1202,7 +1223,7 @@ bool CScriptFunctions::Process(CScript* script, CBotVar* result, int &exception) // Returns true if error code means real error and exception must be thrown -bool CScriptFunctions::ShouldProcessStop(Error err, int errMode) +bool CScriptFunctions::ShouldTaskStop(Error err, int errMode) { // aim impossible - not a real error if ( err == ERR_AIM_IMPOSSIBLE ) @@ -1305,7 +1326,7 @@ bool CScriptFunctions::rDetect(CBotVar* var, CBotVar* result, int& exception, vo return true; } } - if ( !Process(script, result, exception) ) return false; // not finished + if ( !WaitForForegroundTask(script, result, exception) ) return false; // not finished result->SetValFloat(script->m_returnValue); return true; } @@ -1436,7 +1457,7 @@ bool CScriptFunctions::rBuild(CBotVar* var, CBotVar* result, int& exception, voi return true; } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } @@ -1880,7 +1901,7 @@ bool CScriptFunctions::rWait(CBotVar* var, CBotVar* result, int& exception, void return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } // Instruction "move(dist)". @@ -1909,7 +1930,7 @@ bool CScriptFunctions::rMove(CBotVar* var, CBotVar* result, int& exception, void return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } // Instruction "turn(angle)". @@ -1938,7 +1959,7 @@ bool CScriptFunctions::rTurn(CBotVar* var, CBotVar* result, int& exception, void return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } // Compilation of the instruction "goto(pos, altitude, crash, goal)". @@ -2018,7 +2039,7 @@ bool CScriptFunctions::rGoto(CBotVar* var, CBotVar* result, int& exception, void return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } // Compilation "grab/drop(oper)". @@ -2078,7 +2099,7 @@ bool CScriptFunctions::rGrab(CBotVar* var, CBotVar* result, int& exception, void return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } // Instruction "drop(oper)". @@ -2121,7 +2142,7 @@ bool CScriptFunctions::rDrop(CBotVar* var, CBotVar* result, int& exception, void return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } // Instruction "sniff()". @@ -2148,7 +2169,7 @@ bool CScriptFunctions::rSniff(CBotVar* var, CBotVar* result, int& exception, voi return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } // Compilation of the instruction "receive(nom, power)". @@ -2201,7 +2222,7 @@ bool CScriptFunctions::rReceive(CBotVar* var, CBotVar* result, int& exception, v return true; } } - if ( !Process(script, result, exception) ) return false; // not finished + if ( !WaitForForegroundTask(script, result, exception) ) return false; // not finished value = pThis->GetInfoReturn(); if ( std::isnan(value) ) @@ -2276,7 +2297,7 @@ bool CScriptFunctions::rSend(CBotVar* var, CBotVar* result, int& exception, void return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } // Seeks the nearest information terminal. @@ -2406,7 +2427,7 @@ bool CScriptFunctions::rThump(CBotVar* var, CBotVar* result, int& exception, voi return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } // Instruction "recycle()". @@ -2433,7 +2454,7 @@ bool CScriptFunctions::rRecycle(CBotVar* var, CBotVar* result, int& exception, v return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } // Compilation "shield(oper, radius)". @@ -2591,7 +2612,7 @@ bool CScriptFunctions::rFire(CBotVar* var, CBotVar* result, int& exception, void return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } // Compilation of the instruction "aim(x, y)". @@ -2621,7 +2642,7 @@ bool CScriptFunctions::rAim(CBotVar* var, CBotVar* result, int& exception, void* exception = 0; - if ( !script->m_taskExecutor->IsForegroundTask() ) // no task in progress? + if ( !script->m_taskExecutor->IsBackgroundTask() ) // no task in progress? { x = var->GetValFloat(); var = var->GetNext(); @@ -2633,12 +2654,12 @@ bool CScriptFunctions::rAim(CBotVar* var, CBotVar* result, int& exception, void* } else if ( err != ERR_OK ) { - script->m_taskExecutor->StopForegroundTask(); + script->m_taskExecutor->StopBackgroundTask(); result->SetValInt(err); // shows the error return true; } } - return Process(script, result, exception); + return WaitForBackgroundTask(script, result, exception); } // Compilation of the instruction "motor(left, right)". @@ -2926,7 +2947,7 @@ bool CScriptFunctions::rPenDown(CBotVar* var, CBotVar* result, int& exception, v return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } else { @@ -2975,7 +2996,7 @@ bool CScriptFunctions::rPenUp(CBotVar* var, CBotVar* result, int& exception, voi return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } else { @@ -3029,7 +3050,7 @@ bool CScriptFunctions::rPenColor(CBotVar* var, CBotVar* result, int& exception, return true; } } - return Process(script, result, exception); + return WaitForForegroundTask(script, result, exception); } else { diff --git a/src/script/scriptfunc.h b/src/script/scriptfunc.h index 8bab4647..c6b989de 100644 --- a/src/script/scriptfunc.h +++ b/src/script/scriptfunc.h @@ -190,8 +190,9 @@ public: static int m_numberOfOpenFiles; private: - static bool Process(CScript* script, CBotVar* result, int &exception); - static bool ShouldProcessStop(Error err, int errMode); + static bool WaitForForegroundTask(CScript* script, CBotVar* result, int &exception); + static bool WaitForBackgroundTask(CScript* script, CBotVar* result, int &exception); + static bool ShouldTaskStop(Error err, int errMode); static CExchangePost* FindExchangePost(CObject* object, float power); static bool FileClassOpenFile(CBotVar* pThis, CBotVar* pVar, CBotVar* pResult, int& Exception); diff --git a/src/sound/oalsound/check.h b/src/sound/oalsound/check.h index 949712ed..a9398d0c 100644 --- a/src/sound/oalsound/check.h +++ b/src/sound/oalsound/check.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// check.h - #pragma once #include "common/logger.h" diff --git a/src/ui/controls/button.h b/src/ui/controls/button.h index a5ab09cd..dd0af5dc 100644 --- a/src/ui/controls/button.h +++ b/src/ui/controls/button.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// button.h - #pragma once #include "ui/controls/control.h" @@ -54,4 +52,3 @@ protected: }; } - diff --git a/src/ui/controls/check.h b/src/ui/controls/check.h index dca652ac..c0aa3667 100644 --- a/src/ui/controls/check.h +++ b/src/ui/controls/check.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// check.h - #pragma once #include "ui/controls/control.h" @@ -46,4 +44,3 @@ public: }; } - diff --git a/src/ui/controls/color.h b/src/ui/controls/color.h index 9588e88e..9cc0169d 100644 --- a/src/ui/controls/color.h +++ b/src/ui/controls/color.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// color.h - #pragma once #include "ui/controls/control.h" @@ -58,4 +56,3 @@ protected: }; } - diff --git a/src/ui/controls/control.h b/src/ui/controls/control.h index 14dddccc..99dc3612 100644 --- a/src/ui/controls/control.h +++ b/src/ui/controls/control.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// control.h - #pragma once #include "common/event.h" @@ -145,4 +143,3 @@ protected: }; } // namespace Ui - diff --git a/src/ui/controls/editvalue.h b/src/ui/controls/editvalue.h index 8a16b3b8..3d60ecb1 100644 --- a/src/ui/controls/editvalue.h +++ b/src/ui/controls/editvalue.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// editvalue.h - #pragma once @@ -94,4 +92,3 @@ protected: } - diff --git a/src/ui/controls/gauge.h b/src/ui/controls/gauge.h index ebe85d08..5f840cdc 100644 --- a/src/ui/controls/gauge.h +++ b/src/ui/controls/gauge.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// gauge.h - #pragma once #include "ui/controls/control.h" @@ -47,4 +45,3 @@ protected: } - diff --git a/src/ui/controls/group.h b/src/ui/controls/group.h index 11e47627..be0a4d84 100644 --- a/src/ui/controls/group.h +++ b/src/ui/controls/group.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// group.h - #pragma once @@ -51,4 +49,3 @@ protected: } - diff --git a/src/ui/controls/image.h b/src/ui/controls/image.h index c87282da..1cca2d4b 100644 --- a/src/ui/controls/image.h +++ b/src/ui/controls/image.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// image.h - #pragma once @@ -53,4 +51,3 @@ protected: } - diff --git a/src/ui/controls/interface.h b/src/ui/controls/interface.h index daaecf11..ee262c8d 100644 --- a/src/ui/controls/interface.h +++ b/src/ui/controls/interface.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// interface.h - #pragma once #include "common/event.h" diff --git a/src/ui/controls/label.h b/src/ui/controls/label.h index d6507599..e6409c0f 100644 --- a/src/ui/controls/label.h +++ b/src/ui/controls/label.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// label.h - #pragma once @@ -44,4 +42,3 @@ public: } - diff --git a/src/ui/controls/list.h b/src/ui/controls/list.h index 9ed53fb8..d3d43460 100644 --- a/src/ui/controls/list.h +++ b/src/ui/controls/list.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// list.h - #pragma once @@ -129,4 +127,3 @@ protected: } // namespace Ui - diff --git a/src/ui/controls/map.h b/src/ui/controls/map.h index 6a000638..52072d16 100644 --- a/src/ui/controls/map.h +++ b/src/ui/controls/map.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// map.h - #pragma once #include "ui/controls/control.h" @@ -145,4 +143,3 @@ protected: } - diff --git a/src/ui/controls/scroll.h b/src/ui/controls/scroll.h index ac0ed59b..08493df3 100644 --- a/src/ui/controls/scroll.h +++ b/src/ui/controls/scroll.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// scroll.h - #pragma once @@ -84,4 +82,3 @@ protected: } // namespace Ui - diff --git a/src/ui/controls/shortcut.h b/src/ui/controls/shortcut.h index b860b6a6..ccb73482 100644 --- a/src/ui/controls/shortcut.h +++ b/src/ui/controls/shortcut.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// shortcut.h - #pragma once #include "ui/controls/control.h" @@ -49,4 +47,3 @@ protected: } - diff --git a/src/ui/controls/slider.h b/src/ui/controls/slider.h index c64254fa..2c45bb93 100644 --- a/src/ui/controls/slider.h +++ b/src/ui/controls/slider.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// slider.h - #pragma once #include "ui/controls/control.h" diff --git a/src/ui/controls/target.h b/src/ui/controls/target.h index 0a377fb8..d03aca9f 100644 --- a/src/ui/controls/target.h +++ b/src/ui/controls/target.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// target.h - #pragma once #include "common/event.h" diff --git a/src/ui/controls/window.h b/src/ui/controls/window.h index 1cacb912..e9ac902e 100644 --- a/src/ui/controls/window.h +++ b/src/ui/controls/window.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// window.h - #pragma once #include "ui/controls/control.h" diff --git a/src/ui/displayinfo.h b/src/ui/displayinfo.h index 7712640b..ddf8d8b7 100644 --- a/src/ui/displayinfo.h +++ b/src/ui/displayinfo.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// displayinfo.h - #pragma once #include "app/pausemanager.h" @@ -101,4 +99,3 @@ protected: } // namespace Ui - diff --git a/src/ui/displaytext.h b/src/ui/displaytext.h index b38d9ce3..5292f8bd 100644 --- a/src/ui/displaytext.h +++ b/src/ui/displaytext.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// displaytext.h - #pragma once #include "common/event.h" diff --git a/src/ui/mainmap.h b/src/ui/mainmap.h index d1dc2902..c28fc9b2 100644 --- a/src/ui/mainmap.h +++ b/src/ui/mainmap.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// mainmap.h - #pragma once #include "common/event.h" diff --git a/src/ui/mainshort.h b/src/ui/mainshort.h index 24fa4b84..a517a2cb 100644 --- a/src/ui/mainshort.h +++ b/src/ui/mainshort.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// mainshort.h - #pragma once #include "common/event.h" diff --git a/src/ui/object_interface.cpp b/src/ui/object_interface.cpp index 51f807f6..f45dd2e1 100644 --- a/src/ui/object_interface.cpp +++ b/src/ui/object_interface.cpp @@ -42,8 +42,6 @@ #include "object/motion/motion.h" #include "object/motion/motionvehicle.h" -#include "object/task/taskmanager.h" - #include "physics/physics.h" #include "script/script.h" diff --git a/src/ui/studio.h b/src/ui/studio.h index 6d148cbc..90c6f172 100644 --- a/src/ui/studio.h +++ b/src/ui/studio.h @@ -17,8 +17,6 @@ * along with this program. If not, see http://gnu.org/licenses */ -// studio.h - #pragma once #include "app/pausemanager.h"