From 7485ed790caeaa76efab0e9df48224cf1943ec27 Mon Sep 17 00:00:00 2001 From: Oleg Kosmakov Date: Fri, 21 Mar 2014 13:08:36 +0200 Subject: Fixes #295 When cannon cannot turn at specified angle, it will still reach the edge angle, but return the error code --- src/common/global.h | 1 + src/object/task/taskgungoal.cpp | 24 ++++++++++++++++++++++-- src/object/task/taskgungoal.h | 2 ++ src/script/script.cpp | 23 +++++++++++++++++++++-- src/script/script.h | 3 +++ 5 files changed, 49 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/common/global.h b/src/common/global.h index 5f85ce3..8b72774 100644 --- a/src/common/global.h +++ b/src/common/global.h @@ -123,6 +123,7 @@ enum Error ERR_TOOMANY = 702, //! < too many objects ERR_OBLIGATORYTOKEN = 800, //! < compulsory instruction missing ERR_PROHIBITEDTOKEN = 801, //! < instruction prohibited + ERR_AIM_IMPOSSIBLE = 900, //! < cannot aim at specified angle(s) INFO_FIRST = 10000, //! < first information INFO_BUILD = 10001, //! < construction builded diff --git a/src/object/task/taskgungoal.cpp b/src/object/task/taskgungoal.cpp index 3373610..c9c8d30 100644 --- a/src/object/task/taskgungoal.cpp +++ b/src/object/task/taskgungoal.cpp @@ -26,6 +26,7 @@ CTaskGunGoal::CTaskGunGoal(CObject* object) : CTask(object) { + m_aimImpossible = false; } // Object's destructor. @@ -116,6 +117,12 @@ Error CTaskGunGoal::Start(float dirV, float dirH) m_progress = 0.0f; + // direction was constrainted, hence resulting in impossible move + if (dirV != m_finalDirV || dirH != m_finalDirH) + { + m_aimImpossible = true; + } + return ERR_OK; } @@ -126,12 +133,25 @@ Error CTaskGunGoal::IsEnded() if ( m_engine->GetPause() ) return ERR_CONTINUE; if ( m_initialDirV == m_finalDirV && - m_initialDirH == m_finalDirH ) return ERR_STOP; - if ( m_progress < 1.0f ) return ERR_CONTINUE; + m_initialDirH == m_finalDirH ) + { + if ( m_aimImpossible ) + return ERR_AIM_IMPOSSIBLE; + else + return ERR_STOP; + } + + if ( m_progress < 1.0f ) return ERR_CONTINUE; m_object->SetGunGoalV(m_finalDirV); m_object->SetGunGoalH(m_finalDirH); Abort(); + + if ( m_aimImpossible ) + { + return ERR_AIM_IMPOSSIBLE; + } + return ERR_STOP; } diff --git a/src/object/task/taskgungoal.h b/src/object/task/taskgungoal.h index c6f010b..9fc509d 100644 --- a/src/object/task/taskgungoal.h +++ b/src/object/task/taskgungoal.h @@ -44,5 +44,7 @@ protected: float m_finalDirV; // direction to reach float m_initialDirH; // initial direction float m_finalDirH; // direction to reach + + bool m_aimImpossible; // set to true if impossible aim was set }; diff --git a/src/script/script.cpp b/src/script/script.cpp index 3a4d2d1..d55c4d1 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -1393,7 +1393,7 @@ bool CScript::Process(CScript* script, CBotVar* result, int &exception) if ( err == ERR_STOP ) err = ERR_OK; result->SetValInt(err); // indicates the error or ok - if ( err != ERR_OK && script->m_errMode == ERM_STOP ) + if ( ShouldExecutionStop(err, script->m_errMode) ) { exception = err; return false; @@ -1407,6 +1407,21 @@ bool CScript::Process(CScript* script, CBotVar* result, int &exception) } +// Returns true if error code means rela error and exception must be thrown + +bool CScript::ShouldExecutionStop(Error err, int errMode) +{ + // aim impossible - not a real error + if (err == ERR_AIM_IMPOSSIBLE) + return false; + + if (err != ERR_OK && errMode == ERM_STOP) + return true; + + return false; +} + + // Compilation of the instruction "detect(type)". CBotTypResult CScript::cDetect(CBotVar* &var, void* user) @@ -2954,7 +2969,11 @@ bool CScript::rAim(CBotVar* var, CBotVar* result, int& exception, void* user) var = var->GetNext(); var == 0 ? y=0.0f : y=var->GetValFloat(); err = script->m_primaryTask->StartTaskGunGoal(x*Math::PI/180.0f, y*Math::PI/180.0f); - if ( err != ERR_OK ) + if (err == ERR_AIM_IMPOSSIBLE) + { + result->SetValInt(err); // shows the error + } + else if ( err != ERR_OK ) { delete script->m_primaryTask; script->m_primaryTask = 0; diff --git a/src/script/script.h b/src/script/script.h index afb89c8..694228a 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -24,6 +24,8 @@ #include "common/event.h" +#include "common/global.h" + #include "app/pausemanager.h" #include "CBot/CBotDll.h" @@ -209,6 +211,7 @@ public: private: static bool Process(CScript* script, CBotVar* result, int &exception); + static bool ShouldExecutionStop(Error err, int errMode); static CObject* SearchInfo(CScript* script, CObject* object, float power); protected: -- cgit v1.2.3-1-g7c22