summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/common/global.h261
-rw-r--r--src/object/task/taskgungoal.cpp24
-rw-r--r--src/object/task/taskgungoal.h2
-rw-r--r--src/script/script.cpp23
-rw-r--r--src/script/script.h3
5 files changed, 179 insertions, 134 deletions
diff --git a/src/common/global.h b/src/common/global.h
index da62bac..79206af 100644
--- a/src/common/global.h
+++ b/src/common/global.h
@@ -28,137 +28,138 @@
*/
enum Error
{
- ERR_OK = 0, //! < ok
- ERR_GENERIC = 1, //! < any error
- ERR_CONTINUE = 2, //! < continues
- ERR_STOP = 3, //! < stops
- ERR_CMD = 4, //! < unknown command
- ERR_MANIP_VEH = 100, //! < inappropriate vehicle
- ERR_MANIP_FLY = 101, //! < impossible in flight
- ERR_MANIP_BUSY = 102, //! < taking: hands already occupied
- ERR_MANIP_NIL = 103, //! < taking: nothing has to take
- ERR_MANIP_MOTOR = 105, //! < busy: impossible to move
- ERR_MANIP_OCC = 106, //! < busy: location already occupied
- ERR_MANIP_FRIEND = 107, //! < no other vehicle
- ERR_MANIP_RADIO = 108, //! < impossible because radioactive
- ERR_MANIP_WATER = 109, //! < not possible under water
- ERR_MANIP_EMPTY = 110, //! < nothing to deposit
- ERR_BUILD_FLY = 120, //! < not possible in flight
- ERR_BUILD_WATER = 121, //! < not possible under water
- ERR_BUILD_ENERGY = 122, //! < not enough energy
- ERR_BUILD_METALAWAY = 123, //! < lack of metal (too far)
- ERR_BUILD_METALNEAR = 124, //! < lack of metal (too close)
- ERR_BUILD_METALINEX = 125, //! < lack of metal
- ERR_BUILD_FLAT = 126, //! < not enough flat ground
- ERR_BUILD_FLATLIT = 127, //! < not enough flat ground space
- ERR_BUILD_BUSY = 128, //! < location occupied
- ERR_BUILD_BASE = 129, //! < too close to the rocket
- ERR_BUILD_NARROW = 130, //! < buildings too close
- ERR_BUILD_MOTOR = 131, //! < built: not possible in movement
- ERR_BUILD_DISABLED = 132, //! < built: can not produce this object in this mission
- ERR_BUILD_RESEARCH = 133, //! < built: can not produce not researched object
- ERR_SEARCH_FLY = 140, //! < not possible in flight
- ERR_SEARCH_VEH = 141, //! < inappropriate vehicle
- ERR_SEARCH_MOTOR = 142, //! < impossible in movement
- ERR_TERRA_VEH = 150, //! < inappropriate vehicle
- ERR_TERRA_ENERGY = 151, //! < not enough energy
- ERR_TERRA_FLOOR = 152, //! < inappropriate ground
- ERR_TERRA_BUILDING = 153, //! < building too close
- ERR_TERRA_OBJECT = 154, //! < object too close
- ERR_FIRE_VEH = 160, //! < inappropriate vehicle
- ERR_FIRE_ENERGY = 161, //! < not enough energy
- ERR_FIRE_FLY = 162, //! < not possible in flight
- ERR_RECOVER_VEH = 170, //! < inappropriate vehicle
- ERR_RECOVER_ENERGY = 171, //! < not enough energy
- ERR_RECOVER_NULL = 172, //! < lack of ruin
- ERR_CONVERT_EMPTY = 180, //! < no stone was transformed
- ERR_SHIELD_VEH = 190, //! < inappropriate vehicle
- ERR_SHIELD_ENERGY = 191, //! < not enough energy
- ERR_MOVE_IMPOSSIBLE = 200, //! < move impossible
- ERR_FIND_IMPOSSIBLE = 201, //! < find impossible
- ERR_GOTO_IMPOSSIBLE = 210, //! < goto impossible
- ERR_GOTO_ITER = 211, //! < goto too complicated
- ERR_GOTO_BUSY = 212, //! < goto destination occupied
- ERR_DERRICK_NULL = 300, //! < no ore underground
- ERR_STATION_NULL = 301, //! < no energy underground
- ERR_TOWER_POWER = 310, //! < no battery
- ERR_TOWER_ENERGY = 311, //! < more energy
- ERR_RESEARCH_POWER = 320, //! < no battery
- ERR_RESEARCH_ENERGY = 321, //! < more energy
- ERR_RESEARCH_TYPE = 322, //! < the wrong type of battery
- ERR_RESEARCH_ALREADY = 323, //! < research already done
- ERR_ENERGY_NULL = 330, //! < no energy underground
- ERR_ENERGY_LOW = 331, //! < not enough energy
- ERR_ENERGY_EMPTY = 332, //! < lack of metal
- ERR_ENERGY_BAD = 333, //! < transforms only the metal
- ERR_BASE_DLOCK = 340, //! < doors locked
- ERR_BASE_DHUMAN = 341, //! < you must be on spaceship
- ERR_LABO_NULL = 350, //! < nothing to analyze
- ERR_LABO_BAD = 351, //! < analyzes only organic ball
- ERR_LABO_ALREADY = 352, //! < analysis already made
- ERR_NUCLEAR_NULL = 360, //! < no energy underground
- ERR_NUCLEAR_LOW = 361, //! < not enough energy
- ERR_NUCLEAR_EMPTY = 362, //! < lack of uranium
- ERR_NUCLEAR_BAD = 363, //! < transforms only uranium
- ERR_FACTORY_NULL = 370, //! < no metal
- ERR_FACTORY_NEAR = 371, //! < vehicle too close
- ERR_RESET_NEAR = 380, //! < vehicle too close
- ERR_INFO_NULL = 390, //! < no information terminal
- ERR_VEH_VIRUS = 400, //! < vehicle infected by a virus
- ERR_BAT_VIRUS = 401, //! < building infected by a virus
- ERR_DESTROY_NOTFOUND = 410, //! < not found anything to destroy
- ERR_WRONG_OBJ = 420, //! < inappropriate vehicle
- ERR_VEH_POWER = 500, //! < no battery
- ERR_VEH_ENERGY = 501, //! < more energy
- ERR_FLAG_FLY = 510, //! < impossible in flight
- ERR_FLAG_WATER = 511, //! < impossible during swimming
- ERR_FLAG_MOTOR = 512, //! < impossible in movement
- ERR_FLAG_BUSY = 513, //! < taking: already creating flag
- ERR_FLAG_CREATE = 514, //! < too many flags
- ERR_FLAG_PROXY = 515, //! < too close
- ERR_FLAG_DELETE = 516, //! < nothing to remove
- ERR_MISSION_NOTERM = 600, //! < Mission not completed
- ERR_DELETEMOBILE = 700, //! < vehicle destroyed
- ERR_DELETEBUILDING = 701, //! < building destroyed
- ERR_TOOMANY = 702, //! < too many objects
- ERR_OBLIGATORYTOKEN = 800, //! < compulsory instruction missing
- ERR_PROHIBITEDTOKEN = 801, //! < instruction prohibited
+ ERR_OK = 0, //! < ok
+ ERR_GENERIC = 1, //! < any error
+ ERR_CONTINUE = 2, //! < continues
+ ERR_STOP = 3, //! < stops
+ ERR_CMD = 4, //! < unknown command
+ ERR_MANIP_VEH = 100, //! < inappropriate vehicle
+ ERR_MANIP_FLY = 101, //! < impossible in flight
+ ERR_MANIP_BUSY = 102, //! < taking: hands already occupied
+ ERR_MANIP_NIL = 103, //! < taking: nothing has to take
+ ERR_MANIP_MOTOR = 105, //! < busy: impossible to move
+ ERR_MANIP_OCC = 106, //! < busy: location already occupied
+ ERR_MANIP_FRIEND = 107, //! < no other vehicle
+ ERR_MANIP_RADIO = 108, //! < impossible because radioactive
+ ERR_MANIP_WATER = 109, //! < not possible under water
+ ERR_MANIP_EMPTY = 110, //! < nothing to deposit
+ ERR_BUILD_FLY = 120, //! < not possible in flight
+ ERR_BUILD_WATER = 121, //! < not possible under water
+ ERR_BUILD_ENERGY = 122, //! < not enough energy
+ ERR_BUILD_METALAWAY = 123, //! < lack of metal (too far)
+ ERR_BUILD_METALNEAR = 124, //! < lack of metal (too close)
+ ERR_BUILD_METALINEX = 125, //! < lack of metal
+ ERR_BUILD_FLAT = 126, //! < not enough flat ground
+ ERR_BUILD_FLATLIT = 127, //! < not enough flat ground space
+ ERR_BUILD_BUSY = 128, //! < location occupied
+ ERR_BUILD_BASE = 129, //! < too close to the rocket
+ ERR_BUILD_NARROW = 130, //! < buildings too close
+ ERR_BUILD_MOTOR = 131, //! < built: not possible in movement
+ ERR_BUILD_DISABLED = 132, //! < built: can not produce this object in this mission
+ ERR_BUILD_RESEARCH = 133, //! < built: can not produce not researched object
+ ERR_SEARCH_FLY = 140, //! < not possible in flight
+ ERR_SEARCH_VEH = 141, //! < inappropriate vehicle
+ ERR_SEARCH_MOTOR = 142, //! < impossible in movement
+ ERR_TERRA_VEH = 150, //! < inappropriate vehicle
+ ERR_TERRA_ENERGY = 151, //! < not enough energy
+ ERR_TERRA_FLOOR = 152, //! < inappropriate ground
+ ERR_TERRA_BUILDING = 153, //! < building too close
+ ERR_TERRA_OBJECT = 154, //! < object too close
+ ERR_FIRE_VEH = 160, //! < inappropriate vehicle
+ ERR_FIRE_ENERGY = 161, //! < not enough energy
+ ERR_FIRE_FLY = 162, //! < not possible in flight
+ ERR_RECOVER_VEH = 170, //! < inappropriate vehicle
+ ERR_RECOVER_ENERGY = 171, //! < not enough energy
+ ERR_RECOVER_NULL = 172, //! < lack of ruin
+ ERR_CONVERT_EMPTY = 180, //! < no stone was transformed
+ ERR_SHIELD_VEH = 190, //! < inappropriate vehicle
+ ERR_SHIELD_ENERGY = 191, //! < not enough energy
+ ERR_MOVE_IMPOSSIBLE = 200, //! < move impossible
+ ERR_FIND_IMPOSSIBLE = 201, //! < find impossible
+ ERR_GOTO_IMPOSSIBLE = 210, //! < goto impossible
+ ERR_GOTO_ITER = 211, //! < goto too complicated
+ ERR_GOTO_BUSY = 212, //! < goto destination occupied
+ ERR_DERRICK_NULL = 300, //! < no ore underground
+ ERR_STATION_NULL = 301, //! < no energy underground
+ ERR_TOWER_POWER = 310, //! < no battery
+ ERR_TOWER_ENERGY = 311, //! < more energy
+ ERR_RESEARCH_POWER = 320, //! < no battery
+ ERR_RESEARCH_ENERGY = 321, //! < more energy
+ ERR_RESEARCH_TYPE = 322, //! < the wrong type of battery
+ ERR_RESEARCH_ALREADY = 323, //! < research already done
+ ERR_ENERGY_NULL = 330, //! < no energy underground
+ ERR_ENERGY_LOW = 331, //! < not enough energy
+ ERR_ENERGY_EMPTY = 332, //! < lack of metal
+ ERR_ENERGY_BAD = 333, //! < transforms only the metal
+ ERR_BASE_DLOCK = 340, //! < doors locked
+ ERR_BASE_DHUMAN = 341, //! < you must be on spaceship
+ ERR_LABO_NULL = 350, //! < nothing to analyze
+ ERR_LABO_BAD = 351, //! < analyzes only organic ball
+ ERR_LABO_ALREADY = 352, //! < analysis already made
+ ERR_NUCLEAR_NULL = 360, //! < no energy underground
+ ERR_NUCLEAR_LOW = 361, //! < not enough energy
+ ERR_NUCLEAR_EMPTY = 362, //! < lack of uranium
+ ERR_NUCLEAR_BAD = 363, //! < transforms only uranium
+ ERR_FACTORY_NULL = 370, //! < no metal
+ ERR_FACTORY_NEAR = 371, //! < vehicle too close
+ ERR_RESET_NEAR = 380, //! < vehicle too close
+ ERR_INFO_NULL = 390, //! < no information terminal
+ ERR_VEH_VIRUS = 400, //! < vehicle infected by a virus
+ ERR_BAT_VIRUS = 401, //! < building infected by a virus
+ ERR_DESTROY_NOTFOUND = 410, //! < not found anything to destroy
+ ERR_WRONG_OBJ = 420, //! < inappropriate vehicle
+ ERR_VEH_POWER = 500, //! < no battery
+ ERR_VEH_ENERGY = 501, //! < more energy
+ ERR_FLAG_FLY = 510, //! < impossible in flight
+ ERR_FLAG_WATER = 511, //! < impossible during swimming
+ ERR_FLAG_MOTOR = 512, //! < impossible in movement
+ ERR_FLAG_BUSY = 513, //! < taking: already creating flag
+ ERR_FLAG_CREATE = 514, //! < too many flags
+ ERR_FLAG_PROXY = 515, //! < too close
+ ERR_FLAG_DELETE = 516, //! < nothing to remove
+ ERR_MISSION_NOTERM = 600, //! < Mission not completed
+ ERR_DELETEMOBILE = 700, //! < vehicle destroyed
+ ERR_DELETEBUILDING = 701, //! < building destroyed
+ 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
- INFO_CONVERT = 10002, //! < metal available
- INFO_RESEARCH = 10003, //! < search ended
- INFO_FACTORY = 10004, //! < vehicle manufactured
- INFO_LABO = 10005, //! < analysis ended
- INFO_ENERGY = 10006, //! < battery available
- INFO_NUCLEAR = 10007, //! < nuclear battery available
- INFO_FINDING = 10008, //! < nuclear battery available
- INFO_MARKPOWER = 10020, //! < location for station found
- INFO_MARKURANIUM = 10021, //! < location for derrick found
- INFO_MARKSTONE = 10022, //! < location for derrick found
- INFO_MARKKEYa = 10023, //! < location for derrick found
- INFO_MARKKEYb = 10024, //! < location for derrick found
- INFO_MARKKEYc = 10025, //! < location for derrick found
- INFO_MARKKEYd = 10026, //! < location for derrick found
- INFO_RESEARCHTANK = 10030, //! < research ended
- INFO_RESEARCHFLY = 10031, //! < research ended
- INFO_RESEARCHTHUMP = 10032, //! < research ended
- INFO_RESEARCHCANON = 10033, //! < research ended
- INFO_RESEARCHTOWER = 10034, //! < research ended
- INFO_RESEARCHPHAZER = 10035, //! < research ended
- INFO_RESEARCHSHIELD = 10036, //! < research ended
- INFO_RESEARCHATOMIC = 10037, //! < research ended
- INFO_WIN = 10040, //! < win
- INFO_LOST = 10041, //! < lost
- INFO_LOSTq = 10042, //! < lost immediately
- INFO_WRITEOK = 10043, //! < record done
- INFO_DELETEPATH = 10050, //! < way mark deleted
- INFO_DELETEMOTHER = 10100, //! < insect killed
- INFO_DELETEANT = 10101, //! < insect killed
- INFO_DELETEBEE = 10102, //! < insect killed
- INFO_DELETEWORM = 10103, //! < insect killed
- INFO_DELETESPIDER = 10104, //! < insect killed
- INFO_BEGINSATCOM = 10105, //! < use your SatCom
+ INFO_FIRST = 10000, //! < first information
+ INFO_BUILD = 10001, //! < construction builded
+ INFO_CONVERT = 10002, //! < metal available
+ INFO_RESEARCH = 10003, //! < search ended
+ INFO_FACTORY = 10004, //! < vehicle manufactured
+ INFO_LABO = 10005, //! < analysis ended
+ INFO_ENERGY = 10006, //! < battery available
+ INFO_NUCLEAR = 10007, //! < nuclear battery available
+ INFO_FINDING = 10008, //! < nuclear battery available
+ INFO_MARKPOWER = 10020, //! < location for station found
+ INFO_MARKURANIUM = 10021, //! < location for derrick found
+ INFO_MARKSTONE = 10022, //! < location for derrick found
+ INFO_MARKKEYa = 10023, //! < location for derrick found
+ INFO_MARKKEYb = 10024, //! < location for derrick found
+ INFO_MARKKEYc = 10025, //! < location for derrick found
+ INFO_MARKKEYd = 10026, //! < location for derrick found
+ INFO_RESEARCHTANK = 10030, //! < research ended
+ INFO_RESEARCHFLY = 10031, //! < research ended
+ INFO_RESEARCHTHUMP = 10032, //! < research ended
+ INFO_RESEARCHCANON = 10033, //! < research ended
+ INFO_RESEARCHTOWER = 10034, //! < research ended
+ INFO_RESEARCHPHAZER = 10035, //! < research ended
+ INFO_RESEARCHSHIELD = 10036, //! < research ended
+ INFO_RESEARCHATOMIC = 10037, //! < research ended
+ INFO_WIN = 10040, //! < win
+ INFO_LOST = 10041, //! < lost
+ INFO_LOSTq = 10042, //! < lost immediately
+ INFO_WRITEOK = 10043, //! < record done
+ INFO_DELETEPATH = 10050, //! < way mark deleted
+ INFO_DELETEMOTHER = 10100, //! < insect killed
+ INFO_DELETEANT = 10101, //! < insect killed
+ INFO_DELETEBEE = 10102, //! < insect killed
+ INFO_DELETEWORM = 10103, //! < insect killed
+ INFO_DELETESPIDER = 10104, //! < insect killed
+ INFO_BEGINSATCOM = 10105, //! < use your SatCom
ERR_MAX //! < number of values
};
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..dd6b942 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 ( ShouldProcessStop(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 real error and exception must be thrown
+
+bool CScript::ShouldProcessStop(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..fb44342 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 ShouldProcessStop(Error err, int errMode);
static CObject* SearchInfo(CScript* script, CObject* object, float power);
protected: