Merge pull request #296 from kosmakoff/dev

Fixes for issue #295
dev-ui
krzys-h 2014-03-21 16:01:07 +01:00
commit e2cc06f84c
5 changed files with 179 additions and 134 deletions

View File

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

View File

@ -26,6 +26,7 @@
CTaskGunGoal::CTaskGunGoal(CObject* object) : CTask(object) CTaskGunGoal::CTaskGunGoal(CObject* object) : CTask(object)
{ {
m_aimImpossible = false;
} }
// Object's destructor. // Object's destructor.
@ -116,6 +117,12 @@ Error CTaskGunGoal::Start(float dirV, float dirH)
m_progress = 0.0f; 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; return ERR_OK;
} }
@ -126,12 +133,25 @@ Error CTaskGunGoal::IsEnded()
if ( m_engine->GetPause() ) return ERR_CONTINUE; if ( m_engine->GetPause() ) return ERR_CONTINUE;
if ( m_initialDirV == m_finalDirV && if ( m_initialDirV == m_finalDirV &&
m_initialDirH == m_finalDirH ) return ERR_STOP; m_initialDirH == m_finalDirH )
if ( m_progress < 1.0f ) return ERR_CONTINUE; {
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->SetGunGoalV(m_finalDirV);
m_object->SetGunGoalH(m_finalDirH); m_object->SetGunGoalH(m_finalDirH);
Abort(); Abort();
if ( m_aimImpossible )
{
return ERR_AIM_IMPOSSIBLE;
}
return ERR_STOP; return ERR_STOP;
} }

View File

@ -44,5 +44,7 @@ protected:
float m_finalDirV; // direction to reach float m_finalDirV; // direction to reach
float m_initialDirH; // initial direction float m_initialDirH; // initial direction
float m_finalDirH; // direction to reach float m_finalDirH; // direction to reach
bool m_aimImpossible; // set to true if impossible aim was set
}; };

View File

@ -1393,7 +1393,7 @@ bool CScript::Process(CScript* script, CBotVar* result, int &exception)
if ( err == ERR_STOP ) err = ERR_OK; if ( err == ERR_STOP ) err = ERR_OK;
result->SetValInt(err); // indicates the error or 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; exception = err;
return false; 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)". // Compilation of the instruction "detect(type)".
CBotTypResult CScript::cDetect(CBotVar* &var, void* user) 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 = var->GetNext();
var == 0 ? y=0.0f : y=var->GetValFloat(); var == 0 ? y=0.0f : y=var->GetValFloat();
err = script->m_primaryTask->StartTaskGunGoal(x*Math::PI/180.0f, y*Math::PI/180.0f); err = script->m_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; delete script->m_primaryTask;
script->m_primaryTask = 0; script->m_primaryTask = 0;

View File

@ -24,6 +24,8 @@
#include "common/event.h" #include "common/event.h"
#include "common/global.h"
#include "app/pausemanager.h" #include "app/pausemanager.h"
#include "CBot/CBotDll.h" #include "CBot/CBotDll.h"
@ -209,6 +211,7 @@ public:
private: private:
static bool Process(CScript* script, CBotVar* result, int &exception); 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); static CObject* SearchInfo(CScript* script, CObject* object, float power);
protected: protected: