[colobot] 34/100: Some CRobotMain cleanup

Didier Raboud odyx at moszumanska.debian.org
Thu Jun 1 18:10:16 UTC 2017


This is an automated email from the git hooks/post-receive script.

odyx pushed a commit to branch debian/master
in repository colobot.

commit 46aa6fc907c7c0fc1fea7963e55caed6245f2574
Author: krzys-h <krzys_h at interia.pl>
Date:   Tue Dec 27 23:38:57 2016 +0100

    Some CRobotMain cleanup
    
    * improved documentation
    * renamed cheat variables to include the word "cheat" to make it clearer what they do
    * removed some useless members
---
 Doxyfile.in                      |   2 +-
 src/common/error.h               | 168 +++++++++--------
 src/level/robotmain.cpp          | 159 ++++------------
 src/level/robotmain.h            | 175 +++++++++++++----
 src/object/auto/autofactory.cpp  |   6 +-
 src/object/motion/motiontoto.cpp |  67 ++++---
 src/object/motion/motiontoto.h   |   2 -
 src/object/object_type.h         | 392 +++++++++++++++++++--------------------
 src/ui/mainshort.cpp             |   4 +-
 9 files changed, 498 insertions(+), 477 deletions(-)

diff --git a/Doxyfile.in b/Doxyfile.in
index c621ae3..5b0d31f 100644
--- a/Doxyfile.in
+++ b/Doxyfile.in
@@ -351,7 +351,7 @@ IDL_PROPERTY_SUPPORT   = YES
 # all members of a group must be documented explicitly.
 # The default value is: NO.
 
-DISTRIBUTE_GROUP_DOC   = NO
+DISTRIBUTE_GROUP_DOC   = YES
 
 # Set the SUBGROUPING tag to YES to allow class member groups of the same type
 # (for instance a group of public functions) to be put as a subgroup of that
diff --git a/src/common/error.h b/src/common/error.h
index 1ba77b1..d3ae49f 100644
--- a/src/common/error.h
+++ b/src/common/error.h
@@ -19,6 +19,10 @@
 
 #pragma once
 
+/**
+ * \file common/error.h
+ * \brief Definition of the Error enum
+ */
 
 /**
  * \enum Error
@@ -26,88 +30,88 @@
  */
 enum Error
 {
-    ERR_OK                = 0,        //! <  ok
-    ERR_UNKNOWN           = 1,        //! <  any error
-    ERR_CONTINUE          = 2,        //! <  continues
-    ERR_STOP              = 3,        //! <  stops
-    ERR_CMD               = 4,        //! <  unknown command
-    ERR_OBJ_BUSY          = 5,        //! <  object is busy
-    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_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_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_MOTOR      = 142,      //! <  impossible in movement
-    ERR_TERRA_ENERGY      = 151,      //! <  not enough energy
-    ERR_FIRE_ENERGY       = 161,      //! <  not enough energy
-    ERR_RECOVER_ENERGY    = 171,      //! <  not enough energy
-    ERR_RECOVER_NULL      = 172,      //! <  lack of ruin
-    ERR_CONVERT_EMPTY     = 180,      //! <  no stone was transformed
-    ERR_SHIELD_ENERGY     = 191,      //! <  not enough energy
-    ERR_MOVE_IMPOSSIBLE   = 200,      //! <  move 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_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_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_ENEMY_OBJECT      = 703,      //! <  can't control enemy object
-    ERR_OBLIGATORYTOKEN   = 800,      //! <  compulsory instruction missing
-    ERR_PROHIBITEDTOKEN   = 801,      //! <  instruction prohibited
-    ERR_AIM_IMPOSSIBLE    = 900,      //! <  cannot aim at specified angle(s)
-    ERR_WRONG_BOT         = 910,      //! <  inappropriate bot
+    ERR_OK                = 0,        //!<  ok
+    ERR_UNKNOWN           = 1,        //!<  any error
+    ERR_CONTINUE          = 2,        //!<  continues
+    ERR_STOP              = 3,        //!<  stops
+    ERR_CMD               = 4,        //!<  unknown command
+    ERR_OBJ_BUSY          = 5,        //!<  object is busy
+    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_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_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_MOTOR      = 142,      //!<  impossible in movement
+    ERR_TERRA_ENERGY      = 151,      //!<  not enough energy
+    ERR_FIRE_ENERGY       = 161,      //!<  not enough energy
+    ERR_RECOVER_ENERGY    = 171,      //!<  not enough energy
+    ERR_RECOVER_NULL      = 172,      //!<  lack of ruin
+    ERR_CONVERT_EMPTY     = 180,      //!<  no stone was transformed
+    ERR_SHIELD_ENERGY     = 191,      //!<  not enough energy
+    ERR_MOVE_IMPOSSIBLE   = 200,      //!<  move 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_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_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_ENEMY_OBJECT      = 703,      //!<  can't control enemy object
+    ERR_OBLIGATORYTOKEN   = 800,      //!<  compulsory instruction missing
+    ERR_PROHIBITEDTOKEN   = 801,      //!<  instruction prohibited
+    ERR_AIM_IMPOSSIBLE    = 900,      //!<  cannot aim at specified angle(s)
+    ERR_WRONG_BOT         = 910,      //!<  inappropriate bot
 
     INFO_FIRST            = 10000,    //! <  first information
     INFO_BUILD            = 10001,    //! <  construction builded
diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp
index aa8ae91..80e9ce0 100644
--- a/src/level/robotmain.cpp
+++ b/src/level/robotmain.cpp
@@ -202,8 +202,8 @@ CRobotMain::CRobotMain()
     m_editLock     = false;
     m_editFull     = false;
     m_hilite       = false;
-    m_selectInsect = false;
-    m_showSoluce   = false;
+    m_cheatSelectInsect = false;
+    m_cheatShowSoluce   = false;
 
     m_codeBattleInit = false;
     m_codeBattleStarted = false;
@@ -211,14 +211,14 @@ CRobotMain::CRobotMain()
     m_teamNames.clear();
 
     #if DEV_BUILD
-    m_showAll      = true; // for development
+    m_cheatAllMission      = true; // for development
     #else
-    m_showAll      = false;
+    m_cheatAllMission      = false;
     #endif
 
     m_cheatRadar   = false;
     m_fixScene     = false;
-    m_trainerPilot = false;
+    m_cheatTrainerPilot = false;
     m_friendAim    = false;
     m_resetCreate  = false;
     m_shortCut     = true;
@@ -451,7 +451,7 @@ void CRobotMain::ChangePhase(Phase phase)
         m_lightning->Flush();
         m_planet->Flush();
         m_interface->Flush();
-        FlushNewScriptName();
+        m_newScriptName.clear();
         m_sound->SetListener(Math::Vector(0.0f, 0.0f, 0.0f), Math::Vector(0.0f, 0.0f, 1.0f));
         m_sound->StopAll();
         m_camera->SetType(Gfx::CAM_TYPE_NULL);
@@ -922,7 +922,7 @@ bool CRobotMain::ProcessEvent(Event &event)
                 }
                 if (data->slot == INPUT_SLOT_HUMAN)
                 {
-                    SelectHuman();
+                    SelectObject(SearchHuman());
                 }
                 if (data->slot == INPUT_SLOT_NEXT && ((event.kmodState & KEY_MOD(CTRL)) != 0))
                 {
@@ -1159,7 +1159,7 @@ void CRobotMain::ExecuteCmd(const std::string& cmd)
 
         if (cmd == "trainerpilot")
         {
-            m_trainerPilot = !m_trainerPilot;
+            m_cheatTrainerPilot = !m_cheatTrainerPilot;
             return;
         }
 
@@ -1410,20 +1410,20 @@ void CRobotMain::ExecuteCmd(const std::string& cmd)
 
     if (cmd == "selectinsect")
     {
-        m_selectInsect = !m_selectInsect;
+        m_cheatSelectInsect = !m_cheatSelectInsect;
         return;
     }
 
     if (cmd == "showsoluce")
     {
-        m_showSoluce = !m_showSoluce;
+        m_cheatShowSoluce = !m_cheatShowSoluce;
         m_ui->ShowSoluceUpdate();
         return;
     }
 
     if (cmd == "allmission")
     {
-        m_showAll = !m_showAll;
+        m_cheatAllMission = !m_cheatAllMission;
         m_ui->AllMissionUpdate();
         return;
     }
@@ -1763,20 +1763,17 @@ void CRobotMain::StopDisplayVisit()
 
 
 
-//! Updates all the shortcuts
 void CRobotMain::UpdateShortcuts()
 {
     m_short->UpdateShortcuts();
 }
 
-//! Returns the object that default was select after the creation of a scene
 CObject* CRobotMain::GetSelectObject()
 {
     if (m_selectObject != nullptr) return m_selectObject;
     return SearchHuman();
 }
 
-//! Deselects everything, and returns the object that was selected
 CObject* CRobotMain::DeselectAll()
 {
     CObject* prev = nullptr;
@@ -1833,17 +1830,8 @@ void CRobotMain::SelectOneObject(CObject* obj, bool displayError)
     {
         m_camera->SetType(Gfx::CAM_TYPE_BACK);
     }
-
-    CObject* toto = SearchToto();
-    if (toto != nullptr)
-    {
-        assert(toto->Implements(ObjectInterfaceType::Movable));
-        CMotionToto* mt = static_cast<CMotionToto*>(dynamic_cast<CMovableObject*>(toto)->GetMotion());
-        mt->SetLinkType(type);
-    }
 }
 
-//! Selects the object aimed by the mouse
 bool CRobotMain::SelectObject(CObject* obj, bool displayError)
 {
     if (m_camera->GetType() == Gfx::CAM_TYPE_VISIT)
@@ -1852,7 +1840,7 @@ bool CRobotMain::SelectObject(CObject* obj, bool displayError)
     if (m_movieLock || m_editLock) return false;
     if (m_movie->IsExist()) return false;
     if (obj != nullptr &&
-        (!obj->Implements(ObjectInterfaceType::Controllable) || !(dynamic_cast<CControllableObject*>(obj)->GetSelectable() || m_selectInsect))) return false;
+        (!obj->Implements(ObjectInterfaceType::Controllable) || !(dynamic_cast<CControllableObject*>(obj)->GetSelectable() || m_cheatSelectInsect))) return false;
 
     if (m_missionType == MISSION_CODE_BATTLE && m_codeBattleStarted && m_codeBattleSpectator)
     {
@@ -1883,7 +1871,6 @@ bool CRobotMain::SelectObject(CObject* obj, bool displayError)
     return true;
 }
 
-//! Deselects the selected object
 bool CRobotMain::DeselectObject()
 {
     DeselectAll();
@@ -1919,49 +1906,11 @@ void CRobotMain::DeleteAllObjects()
     m_objMan->DeleteAllObjects();
 }
 
-//! Selects the human
-void CRobotMain::SelectHuman()
-{
-    SelectObject(SearchHuman());
-}
-
-//! Returns the object human
 CObject* CRobotMain::SearchHuman()
 {
     return m_objMan->FindNearest(nullptr, OBJECT_HUMAN);
 }
 
-//! Returns the object toto
-CObject* CRobotMain::SearchToto()
-{
-    return m_objMan->FindNearest(nullptr, OBJECT_TOTO);
-}
-
-//! Returns the nearest selectable object from a given position
-CObject* CRobotMain::SearchNearest(Math::Vector pos, CObject* exclu)
-{
-    float min = 100000.0f;
-    CObject* best = nullptr;
-    for (CObject* obj : m_objMan->GetAllObjects())
-    {
-        if (obj == exclu) continue;
-        if (!obj->Implements(ObjectInterfaceType::Controllable) || !(dynamic_cast<CControllableObject*>(obj)->GetSelectable() || m_selectInsect)) continue;
-
-        ObjectType type = obj->GetType();
-        if (type == OBJECT_TOTO) continue;
-
-        Math::Vector oPos = obj->GetPosition();
-        float dist = Math::DistanceProjected(oPos, pos);
-        if (dist < min)
-        {
-            min = dist;
-            best = obj;
-        }
-    }
-    return best;
-}
-
-//! Returns the selected object
 CObject* CRobotMain::GetSelect()
 {
     for (CObject* obj : m_objMan->GetAllObjects())
@@ -2113,7 +2062,7 @@ void CRobotMain::HiliteObject(Math::Point pos)
             }
         }
 
-        if (obj->Implements(ObjectInterfaceType::Controllable) && (dynamic_cast<CControllableObject*>(obj)->GetSelectable() || m_selectInsect))
+        if (obj->Implements(ObjectInterfaceType::Controllable) && (dynamic_cast<CControllableObject*>(obj)->GetSelectable() || m_cheatSelectInsect))
         {
             if (dynamic_cast<CControllableObject*>(obj)->GetSelectable())
             {
@@ -2652,7 +2601,6 @@ bool CRobotMain::EventObject(const Event &event)
 
 
 
-//! Load the scene for the character
 void CRobotMain::ScenePerso()
 {
     DeleteAllObjects();  // removes all the current 3D Scene
@@ -3629,7 +3577,7 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
 
             if (line->GetCommand() == "NewScript" && !resetObject)
             {
-                AddNewScriptName(line->GetParam("type")->AsObjectType(OBJECT_NULL), const_cast<char*>(line->GetParam("name")->AsPath("ai").c_str()));
+                m_newScriptName.push_back(NewScriptName(line->GetParam("type")->AsObjectType(OBJECT_NULL), const_cast<char*>(line->GetParam("name")->AsPath("ai").c_str())));
                 continue;
             }
 
@@ -3950,15 +3898,17 @@ void CRobotMain::ChangeColor()
 }
 
 //! Calculates the distance to the nearest object
-float CRobotMain::SearchNearestObject(Math::Vector center, CObject *exclu)
+namespace
+{
+float SearchNearestObject(CObjectManager* objMan, Math::Vector center, CObject* exclu)
 {
     float min = 100000.0f;
-    for (CObject* obj : m_objMan->GetAllObjects())
+    for (CObject* obj : objMan->GetAllObjects())
     {
         if (!obj->GetDetectable()) continue;  // inactive?
         if (IsObjectBeingTransported(obj)) continue;
 
-        if (obj == exclu)  continue;
+        if (obj == exclu) continue;
 
         ObjectType type = obj->GetType();
 
@@ -3968,35 +3918,36 @@ float CRobotMain::SearchNearestObject(Math::Vector center, CObject *exclu)
             if (oPos.x != center.x ||
                 oPos.z != center.z)
             {
-                float dist = Math::Distance(center, oPos)-80.0f;
+                float dist = Math::Distance(center, oPos) - 80.0f;
                 if (dist < 0.0f) dist = 0.0f;
                 min = Math::Min(min, dist);
                 continue;
             }
         }
 
-        if (type == OBJECT_STATION   ||
-            type == OBJECT_REPAIR    ||
+        if (type == OBJECT_STATION ||
+            type == OBJECT_REPAIR ||
             type == OBJECT_DESTROYER)
         {
             Math::Vector oPos = obj->GetPosition();
-            float dist = Math::Distance(center, oPos)-8.0f;
+            float dist = Math::Distance(center, oPos) - 8.0f;
             if (dist < 0.0f) dist = 0.0f;
             min = Math::Min(min, dist);
         }
 
-        for (const auto& crashSphere : obj->GetAllCrashSpheres())
+        for (const auto &crashSphere : obj->GetAllCrashSpheres())
         {
             Math::Vector oPos = crashSphere.sphere.pos;
             float oRadius = crashSphere.sphere.radius;
 
-            float dist = Math::Distance(center, oPos)-oRadius;
+            float dist = Math::Distance(center, oPos) - oRadius;
             if (dist < 0.0f) dist = 0.0f;
             min = Math::Min(min, dist);
         }
     }
     return min;
 }
+}
 
 //! Calculates a free space
 bool CRobotMain::FreeSpace(Math::Vector &center, float minRadius, float maxRadius,
@@ -4018,7 +3969,7 @@ bool CRobotMain::FreeSpace(Math::Vector &center, float minRadius, float maxRadiu
                 pos.z = p.y;
                 pos.y = 0.0f;
                 m_terrain->AdjustToFloor(pos, true);
-                float dist = SearchNearestObject(pos, exclu);
+                float dist = SearchNearestObject(m_objMan.get(), pos, exclu);
                 if (dist >= space)
                 {
                     float flat = m_terrain->GetFlatZoneRadius(pos, dist/2.0f);
@@ -4047,7 +3998,7 @@ bool CRobotMain::FreeSpace(Math::Vector &center, float minRadius, float maxRadiu
                 pos.z = p.y;
                 pos.y = 0.0f;
                 m_terrain->AdjustToFloor(pos, true);
-                float dist = SearchNearestObject(pos, exclu);
+                float dist = SearchNearestObject(m_objMan.get(), pos, exclu);
                 if (dist >= space)
                 {
                     float flat = m_terrain->GetFlatZoneRadius(pos, dist/2.0f);
@@ -4083,7 +4034,7 @@ bool CRobotMain::FlatFreeSpace(Math::Vector &center, float minFlat, float minRad
                 pos.z = p.y;
                 pos.y = 0.0f;
                 m_terrain->AdjustToFloor(pos, true);
-                float dist = SearchNearestObject(pos, exclu);
+                float dist = SearchNearestObject(m_objMan.get(), pos, exclu);
                 if (dist >= space)
                 {
                     float flat = m_terrain->GetFlatZoneRadius(pos, dist/2.0f);
@@ -4116,7 +4067,7 @@ bool CRobotMain::FlatFreeSpace(Math::Vector &center, float minFlat, float minRad
                 pos.z = p.y;
                 pos.y = 0.0f;
                 m_terrain->AdjustToFloor(pos, true);
-                float dist = SearchNearestObject(pos, exclu);
+                float dist = SearchNearestObject(m_objMan.get(), pos, exclu);
                 if (dist >= space)
                 {
                     float flat = m_terrain->GetFlatZoneRadius(pos, dist/2.0f);
@@ -4140,7 +4091,7 @@ bool CRobotMain::FlatFreeSpace(Math::Vector &center, float minFlat, float minRad
 float CRobotMain::GetFlatZoneRadius(Math::Vector center, float maxRadius,
                                     CObject *exclu)
 {
-    float dist = SearchNearestObject(center, exclu);
+    float dist = SearchNearestObject(m_objMan.get(), center, exclu);
     if (dist == 0.0f) return 0.0f;
     if (dist < maxRadius)
         maxRadius = dist;
@@ -4412,36 +4363,19 @@ bool CRobotMain::ReadFileStack(CObject *obj, FILE *file, int objRank)
     return programmable->ReadStack(file);
 }
 
-
-//! Empty the list
-void CRobotMain::FlushNewScriptName()
-{
-    m_newScriptName.clear();
-}
-
-//! Adds a script name
-void CRobotMain::AddNewScriptName(ObjectType type, const std::string& name)
+std::vector<std::string> CRobotMain::GetNewScriptNames(ObjectType type)
 {
-    NewScriptName newscript;
-    newscript.type = type;
-    newscript.name = name;
-    m_newScriptName.push_back(newscript);
-}
-
-//! Seeks a script name for a given type
-std::string CRobotMain::GetNewScriptName(ObjectType type, int rank)
-{
-    for (unsigned int i = 0; i < m_newScriptName.size(); i++)
+    std::vector<std::string> names;
+    for (const auto& newScript : m_newScriptName)
     {
-        if (m_newScriptName[i].type == type        ||
-            m_newScriptName[i].type == OBJECT_NULL  )
+        if (newScript.type == type        ||
+            newScript.type == OBJECT_NULL  )
         {
-            if (rank == 0) return m_newScriptName[i].name;
-            else           rank --;
+            names.push_back(newScript.name);
         }
     }
 
-    return "";
+    return names;
 }
 
 
@@ -5114,7 +5048,7 @@ const std::map<std::string, MinMax>& CRobotMain::GetObligatoryTokenList()
 //! Indicates whether it is possible to control a driving robot
 bool CRobotMain::GetTrainerPilot()
 {
-    return m_trainerPilot;
+    return m_cheatTrainerPilot;
 }
 
 //! Indicates whether the scene is fixed, without interaction
@@ -5137,7 +5071,7 @@ const std::string& CRobotMain::GetScriptFile()
 
 bool CRobotMain::GetShowSoluce()
 {
-    return m_showSoluce;
+    return m_cheatShowSoluce;
 }
 
 bool CRobotMain::GetSceneSoluce()
@@ -5148,7 +5082,7 @@ bool CRobotMain::GetSceneSoluce()
 
 bool CRobotMain::GetShowAll()
 {
-    return m_showAll;
+    return m_cheatAllMission;
 }
 
 bool CRobotMain::GetRadar()
@@ -5272,7 +5206,6 @@ void CRobotMain::UpdateSpeedLabel()
 }
 
 
-//! Creates interface shortcuts to the units
 bool CRobotMain::CreateShortcuts()
 {
     if (m_phase != PHASE_SIMUL) return false;
@@ -5662,11 +5595,6 @@ Error CRobotMain::CanBuildError(ObjectType type, int team)
     return ERR_OK;
 }
 
-bool CRobotMain::CanBuild(ObjectType type, int team)
-{
-    return CanBuildError(type, team) == ERR_OK;
-}
-
 Error CRobotMain::CanFactoryError(ObjectType type, int team)
 {
     ToolType tool = GetToolFromObject(type);
@@ -5690,11 +5618,6 @@ Error CRobotMain::CanFactoryError(ObjectType type, int team)
     return ERR_OK;
 }
 
-bool CRobotMain::CanFactory(ObjectType type, int team)
-{
-    return CanFactoryError(type, team) == ERR_OK;
-}
-
 void CRobotMain::PushToSelectionHistory(CObject* obj)
 {
     if (!m_selectionHistory.empty() && m_selectionHistory.back() == obj)
diff --git a/src/level/robotmain.h b/src/level/robotmain.h
index 54d15ab..346e8fc 100644
--- a/src/level/robotmain.h
+++ b/src/level/robotmain.h
@@ -120,6 +120,8 @@ struct NewScriptName
 {
     ObjectType  type = OBJECT_NULL;
     std::string name = "";
+
+    NewScriptName(ObjectType type, const std::string& name) : type(type), name(name) {}
 };
 
 
@@ -156,6 +158,17 @@ const int SATCOM_PROG       = 4;
 const int SATCOM_SOLUCE     = 5;
 const int SATCOM_MAX        = 6;
 
+/**
+ * \brief Main class managing the game world
+ *
+ * This is the main class of the whole game engine. It's main job is to manage main parts of the gameplay,
+ * like loading levels and checking for win conditions, but it's also a place where all things that don't fit
+ * elsewhere have landed.
+ *
+ * \todo In the future, it would be nice to refactor this class to remove as much unrelated stuff as possible
+ *
+ * \nosubgrouping
+ */
 class CRobotMain : public CSingleton<CRobotMain>
 {
 public:
@@ -168,11 +181,16 @@ public:
     Ui::CDisplayText* GetDisplayText();
     CPauseManager* GetPauseManager();
 
+    /**
+     * \name Phase management
+     */
+    //@{
     void        ChangePhase(Phase phase);
     bool        ProcessEvent(Event &event);
     Phase       GetPhase();
+    //@}
 
-    bool        CreateShortcuts();
+    //! Load the scene for apperance customization
     void        ScenePerso();
 
     void        SetMovieLock(bool lock);
@@ -187,16 +205,32 @@ public:
     void        SetFriendAim(bool friendAim);
     bool        GetFriendAim();
 
+    //! \name Simulation speed management
+    //@{
     void        SetSpeed(float speed);
     float       GetSpeed();
+    //@}
 
+    //! \brief Create the shortcuts at the top of the screen, if they should be visible
+    //! \see CMainShort::CreateShortcuts
+    bool        CreateShortcuts();
+    //! \brief Update the shortcuts at the top of the screen
+    //! \see CMainShort::UpdateShortcuts
     void        UpdateShortcuts();
-    void        SelectHuman();
+    //! Find the astronaut (::OBJECT_HUMAN) object
     CObject*    SearchHuman();
-    CObject*    SearchToto();
-    CObject*    SearchNearest(Math::Vector pos, CObject* exclu);
+    /**
+     * \brief Select an object
+     * \param obj Object to select
+     * \param displayError If true and the object is currently in error state, automatically display the error message
+     *
+     * \note This function automatically adds objects to selection history (see PushToSelectionHistory())
+     */
     bool        SelectObject(CObject* obj, bool displayError=true);
+    //! Return the object that was selected at the start of the scene
     CObject*    GetSelectObject();
+    //! Deselect currently selected object
+    //! \return Object that was deselected
     CObject*    DeselectAll();
 
     void        ResetObject();
@@ -251,9 +285,10 @@ public:
     void        ClearInterface();
     void        ChangeColor();
 
-    float       SearchNearestObject(Math::Vector center, CObject *exclu);
     bool        FreeSpace(Math::Vector &center, float minRadius, float maxRadius, float space, CObject *exclu);
     bool        FlatFreeSpace(Math::Vector &center, float minFlat, float minRadius, float maxRadius, float space, CObject *exclu);
+    //! \name In-world indicators
+    //@{
     float       GetFlatZoneRadius(Math::Vector center, float maxRadius, CObject *exclu);
     void        HideDropZone(CObject* metal);
     void        ShowDropZone(CObject* metal, CObject* transporter);
@@ -262,28 +297,34 @@ public:
                              float radius, float duration=SHOWLIMITTIME);
     void        StartShowLimit();
     void        FrameShowLimit(float rTime);
+    //@}
 
     void        SaveAllScript();
     void        SaveOneScript(CObject *obj);
     bool        SaveFileStack(CObject *obj, FILE *file, int objRank);
     bool        ReadFileStack(CObject *obj, FILE *file, int objRank);
 
-    void        FlushNewScriptName();
-    void        AddNewScriptName(ObjectType type, const std::string& name);
-    std::string GetNewScriptName(ObjectType type, int rank);
+    //! Return list of scripts to load to robot created in BotFactory
+    std::vector<std::string> GetNewScriptNames(ObjectType type);
 
     void        SelectPlayer(std::string playerName);
     CPlayerProfile* GetPlayerProfile();
 
+    /**
+     * \name Saved game read/write
+     */
+    //@{
     bool        IOIsBusy();
     bool        IOWriteScene(std::string filename, std::string filecbot, std::string filescreenshot, const std::string& info, bool emergencySave = false);
     void        IOWriteSceneFinished();
     CObject*    IOReadScene(std::string filename, std::string filecbot);
     void        IOWriteObject(CLevelParserLine *line, CObject* obj, const std::string& programDir, int objRank);
     CObject*    IOReadObject(CLevelParserLine *line, const std::string& programDir, const std::string& objCounterText, float objectProgress, int objRank = -1);
+    //@}
 
     int         CreateSpot(Math::Vector pos, Gfx::Color color);
 
+    //! Find the currently selected object
     CObject*    GetSelect();
 
     void        DisplayError(Error err, CObject* pObj, float time=10.0f);
@@ -298,12 +339,17 @@ public:
 
     void        StartMissionTimer();
 
+    /**
+     * \name Autosave management
+     */
+    //@{
     void        SetAutosave(bool enable);
     bool        GetAutosave();
     void        SetAutosaveInterval(int interval);
     int         GetAutosaveInterval();
     void        SetAutosaveSlots(int slots);
     int         GetAutosaveSlots();
+    //@}
 
     //! Enable mode where completing mission closes the game
     void        SetExitAfterMission(bool exit);
@@ -311,49 +357,97 @@ public:
     //! Returns true if player can interact with things manually
     bool        CanPlayerInteract();
 
+    /**
+     * \name Team definition management
+     */
+    //@{
     //! Returns team name for the given team id
     const std::string& GetTeamName(int id);
 
     //! Returns true if team-specific colored texture is available
     bool        IsTeamColorDefined(int id);
+    //@}
 
-    //! Get/set enabled buildings
+    /**
+     * \name EnableBuild/EnableResearch/DoneResearch
+     * Management of enabled buildings, enabled researches, and completed researches
+     */
     //@{
+    /**
+     * \brief Get enabled buildings
+     * \return Bitmask of BuildType values
+     */
     int         GetEnableBuild();
+    /**
+     * \brief Set enabled buildings
+     * \param enableBuild Bitmask of BuildType values
+     */
     void        SetEnableBuild(int enableBuild);
-    //@}
-    //! Get/set enabled researches
-    //@{
+
+    /**
+     * \brief Get enabled researches
+     * \return Bitmask of ResearchType values
+     */
     int         GetEnableResearch();
+    /**
+     * \brief Set enabled researches
+     * \param enableResearch Bitmask of ResearchType values
+     */
     void        SetEnableResearch(int enableResearch);
-    //@}
-    //! Get/set done researches
-    //@{
-    int         GetDoneResearch(int team);
-    void        SetDoneResearch(int doneResearch, int team);
-    //@}
-
-    //! Returns true if the given building is enabled
-    //@{
+    /**
+     * \brief Get done researches
+     * \param team Team to get researches for
+     * \return Bitmask of ResearchType values
+     */
+    int         GetDoneResearch(int team = 0);
+    /**
+     * \brief Set done researches
+     * \param doneResearch Bitmask of ResearchType values
+     * \param team Team to set researches for
+     */
+    void        SetDoneResearch(int doneResearch, int team = 0);
+
+    //! \brief Check if the given building is enabled
     bool        IsBuildingEnabled(BuildType type);
+    //! \brief Check if the given building is enabled
     bool        IsBuildingEnabled(ObjectType type);
-    //@}
-    //! Returns true if the given research is enabled
+    //! \brief Check if the given research is enabled
     bool        IsResearchEnabled(ResearchType type);
-    //! Returns true if the given research is done
+    //! \brief Check if the given research is done
     bool        IsResearchDone(ResearchType type, int team);
-    //! Marks research as done
+    //! \brief Mark given research as done
     void        MarkResearchDone(ResearchType type, int team);
 
-    //! Retruns true if all requirements to build this object are met (EnableBuild + DoneResearch)
-    //@{
-    bool        CanBuild(ObjectType type, int team);
+    /**
+     * \brief Check if all requirements to build this object are met (EnableBuild + DoneResearch)
+     * \return true if the building can be built, false otherwise
+     * \see CanBuildError() for a version which returns a specific reason for the build being denied
+     */
+    inline bool CanBuild(ObjectType type, int team)
+    {
+        return CanBuildError(type, team) == ERR_OK;
+    }
+    /**
+     * \brief Check if all requirements to build this object are met (EnableBuild + DoneResearch)
+     * \return One of Error values - ::ERR_OK if the building can be built, ::ERR_BUILD_DISABLED or ::ERR_BUILD_RESEARCH otherwise
+     * \see CanBuild() for a version which returns a boolean
+     */
     Error       CanBuildError(ObjectType type, int team);
-    //@}
 
-    //! Retruns true if all requirements to create this object in BotFactory are met (DoneResearch)
-    //@{
-    bool        CanFactory(ObjectType type, int team);
+    /**
+     * \brief Check if all requirements to build this object in BotFactory are met (DoneResearch)
+     * \return true if the robot can be built, false otherwise
+     * \see CanFactoryError() for a version which returns a specific reason for the build being denied
+     */
+    inline bool CanFactory(ObjectType type, int team)
+    {
+        return CanFactoryError(type, team) == ERR_OK;
+    }
+    /**
+     * \brief Check if all requirements to build this object in BotFactory are met (DoneResearch)
+     * \return One of Error values - ::ERR_OK if the robot can be built, ::ERR_BUILD_DISABLED or ::ERR_BUILD_RESEARCH otherwise
+     * \see CanFactory() for a version which returns a boolean
+     */
     Error       CanFactoryError(ObjectType type, int team);
     //@}
 
@@ -364,7 +458,9 @@ public:
 
     void        StartDetectEffect(COldObject* object, CObject* target);
 
+    //! Enable crash sphere debug rendering
     void SetDebugCrashSpheres(bool draw);
+    //! Check if crash sphere debug rendering is enabled
     bool GetDebugCrashSpheres();
 
 protected:
@@ -388,8 +484,11 @@ protected:
     CObject*    DetectObject(Math::Point pos);
     void        ChangeCamera();
     void        AbortMovie();
+    //! \brief Select an object, without deselecting the previous one
     void        SelectOneObject(CObject* obj, bool displayError=true);
     void        HelpObject();
+    //! \brief Switch to previous object
+    //! \see PopFromSelectionHistory()
     bool        DeselectObject();
     void        DeleteAllObjects();
     void        UpdateInfoText();
@@ -405,9 +504,13 @@ protected:
     void        PushToSelectionHistory(CObject* obj);
     CObject*    PopFromSelectionHistory();
 
+    //! \name Code battle interface
+    //@{
     void        CreateCodeBattleInterface();
     void        DestroyCodeBattleInterface();
     void        SetCodeBattleSpectatorMode(bool mode);
+    //@}
+
     void        UpdateDebugCrashSpheres();
 
 
@@ -469,9 +572,9 @@ protected:
     ActivePause*    m_freePhotoPause = nullptr;
     bool            m_cmdEdit = false;
     ActivePause*    m_cmdEditPause = nullptr;
-    bool            m_selectInsect = false;
-    bool            m_showSoluce = false;
-    bool            m_showAll = false;
+    bool            m_cheatSelectInsect = false;
+    bool            m_cheatShowSoluce = false;
+    bool            m_cheatAllMission = false;
     bool            m_cheatRadar = false;
     bool            m_shortCut = false;
     std::string     m_audioTrack;
@@ -493,7 +596,7 @@ protected:
     bool            m_editLock = false;        // edition in progress?
     bool            m_editFull = false;        // edition in full screen?
     bool            m_hilite = false;
-    bool            m_trainerPilot = false;    // remote trainer?
+    bool            m_cheatTrainerPilot = false;    // remote trainer?
     bool            m_friendAim = false;
     bool            m_resetCreate = false;
     bool            m_mapShow = false;
diff --git a/src/object/auto/autofactory.cpp b/src/object/auto/autofactory.cpp
index b48e7cf..7dfc280 100644
--- a/src/object/auto/autofactory.cpp
+++ b/src/object/auto/autofactory.cpp
@@ -664,11 +664,9 @@ bool CAutoFactory::CreateVehicle()
     if (vehicle->Implements(ObjectInterfaceType::ProgramStorage))
     {
         CProgramStorageObject* programStorage = dynamic_cast<CProgramStorageObject*>(vehicle);
-        for ( int i=0 ; ; i++ )
+        for (const std::string& name : m_main->GetNewScriptNames(m_type))
         {
-            std::string name = m_main->GetNewScriptName(m_type, i);
-            if (name.empty()) break;
-            Program* prog = programStorage->GetOrAddProgram(i);
+            Program* prog = programStorage->AddProgram();
             programStorage->ReadProgram(prog, InjectLevelPathsForCurrentLevel(name));
             prog->readOnly = true;
             prog->filename = name;
diff --git a/src/object/motion/motiontoto.cpp b/src/object/motion/motiontoto.cpp
index 18db747..7f1a608 100644
--- a/src/object/motion/motiontoto.cpp
+++ b/src/object/motion/motiontoto.cpp
@@ -57,7 +57,6 @@ CMotionToto::CMotionToto(COldObject* object) : CMotion(object)
     m_blinkTime   = 0.0f;
     m_blinkProgress = -1.0f;
     m_lastMotorParticle = 0.0f;
-    m_type = OBJECT_NULL;
     m_mousePos = Math::Point(0.0f, 0.0f);
 }
 
@@ -325,36 +324,39 @@ bool CMotionToto::EventFrame(const Event &event)
         distance = 30.0f-progress*18.0f;  // remoteness
         shift    = 18.0f-progress*11.0f;  // shift is left
         verti    = 10.0f-progress* 8.0f;  // shift at the top
+        
+        CObject* selected = m_main->GetSelect();
+        ObjectType type = selected != nullptr ? selected->GetType() : OBJECT_NULL;
 
         if ( m_actionType == -1 &&
-             (m_type == OBJECT_HUMAN    ||
-              m_type == OBJECT_TECH     ||
-              m_type == OBJECT_MOBILEwa ||
-              m_type == OBJECT_MOBILEta ||
-              m_type == OBJECT_MOBILEfa ||
-              m_type == OBJECT_MOBILEia ||
-              m_type == OBJECT_MOBILEwc ||
-              m_type == OBJECT_MOBILEtc ||
-              m_type == OBJECT_MOBILEfc ||
-              m_type == OBJECT_MOBILEic ||
-              m_type == OBJECT_MOBILEwi ||
-              m_type == OBJECT_MOBILEti ||
-              m_type == OBJECT_MOBILEfi ||
-              m_type == OBJECT_MOBILEii ||
-              m_type == OBJECT_MOBILEws ||
-              m_type == OBJECT_MOBILEts ||
-              m_type == OBJECT_MOBILEfs ||
-              m_type == OBJECT_MOBILEis ||
-              m_type == OBJECT_MOBILErt ||
-              m_type == OBJECT_MOBILErc ||
-              m_type == OBJECT_MOBILErr ||
-              m_type == OBJECT_MOBILErs ||
-              m_type == OBJECT_MOBILEsa ||
-              m_type == OBJECT_MOBILEwt ||
-              m_type == OBJECT_MOBILEtt ||
-              m_type == OBJECT_MOBILEft ||
-              m_type == OBJECT_MOBILEit ||
-              m_type == OBJECT_MOBILEdr ) )  // vehicle?
+             (type == OBJECT_HUMAN    ||
+              type == OBJECT_TECH     ||
+              type == OBJECT_MOBILEwa ||
+              type == OBJECT_MOBILEta ||
+              type == OBJECT_MOBILEfa ||
+              type == OBJECT_MOBILEia ||
+              type == OBJECT_MOBILEwc ||
+              type == OBJECT_MOBILEtc ||
+              type == OBJECT_MOBILEfc ||
+              type == OBJECT_MOBILEic ||
+              type == OBJECT_MOBILEwi ||
+              type == OBJECT_MOBILEti ||
+              type == OBJECT_MOBILEfi ||
+              type == OBJECT_MOBILEii ||
+              type == OBJECT_MOBILEws ||
+              type == OBJECT_MOBILEts ||
+              type == OBJECT_MOBILEfs ||
+              type == OBJECT_MOBILEis ||
+              type == OBJECT_MOBILErt ||
+              type == OBJECT_MOBILErc ||
+              type == OBJECT_MOBILErr ||
+              type == OBJECT_MOBILErs ||
+              type == OBJECT_MOBILEsa ||
+              type == OBJECT_MOBILEwt ||
+              type == OBJECT_MOBILEtt ||
+              type == OBJECT_MOBILEft ||
+              type == OBJECT_MOBILEit ||
+              type == OBJECT_MOBILEdr ) )  // vehicle?
         {
             m_clownTime += event.rTime;
             if ( m_clownTime >= m_clownDelay )
@@ -832,10 +834,3 @@ Error CMotionToto::SetAction(int action, float time)
 
     return ERR_OK;
 }
-
-// Specifies the type of the object is attached to toto.
-
-void CMotionToto::SetLinkType(ObjectType type)
-{
-    m_type = type;
-}
diff --git a/src/object/motion/motiontoto.h b/src/object/motion/motiontoto.h
index 1e97c03..fe90730 100644
--- a/src/object/motion/motiontoto.h
+++ b/src/object/motion/motiontoto.h
@@ -43,7 +43,6 @@ public:
     void    Create(Math::Vector pos, float angle, ObjectType type, float power, Gfx::COldModelManager* modelManager) override;
     bool    EventProcess(const Event &event) override;
     Error   SetAction(int action, float time=0.2f) override;
-    void    SetLinkType(ObjectType type);
 
     void    StartDisplayInfo();
     void    StopDisplayInfo();
@@ -65,6 +64,5 @@ protected:
     float       m_blinkTime;
     float       m_blinkProgress;
     int         m_soundChannel;
-    ObjectType  m_type;
     Math::Point     m_mousePos;
 };
diff --git a/src/object/object_type.h b/src/object/object_type.h
index 7467ff3..11d5763 100644
--- a/src/object/object_type.h
+++ b/src/object/object_type.h
@@ -33,203 +33,203 @@
 enum ObjectType
 {
     OBJECT_NULL             = 0,
-    OBJECT_PORTICO          = 2,    //! < Portico
-    OBJECT_BASE             = 3,    //! < SpaceShip
-    OBJECT_DERRICK          = 4,    //! < Derrick
-    OBJECT_FACTORY          = 5,    //! < BotFactory
-    OBJECT_STATION          = 6,    //! < PowerStation
-    OBJECT_CONVERT          = 7,    //! < Converter
-    OBJECT_REPAIR           = 8,    //! < RepairStation
-    OBJECT_TOWER            = 9,    //! < DefenseTower
-    OBJECT_NEST             = 10,   //! < AlienNest
-    OBJECT_RESEARCH         = 11,   //! < ResearchCenter
-    OBJECT_RADAR            = 12,   //! < RadarStation
-    OBJECT_ENERGY           = 13,   //! < PowerPlant
-    OBJECT_LABO             = 14,   //! < AutoLab
-    OBJECT_NUCLEAR          = 15,   //! < NuclearPlant
-    OBJECT_START            = 16,   //! < StartArea
-    OBJECT_END              = 17,   //! < EndArea
-    OBJECT_INFO             = 18,   //! < ExchangePost
-    OBJECT_PARA             = 19,   //! < PowerCaptor
-    OBJECT_TARGET1          = 20,   //! < Target1 (gate)
-    OBJECT_TARGET2          = 21,   //! < Target2 (center)
-    OBJECT_SAFE             = 22,   //! < Vault
-    OBJECT_HUSTON           = 23,   //! < Houston
-    OBJECT_DESTROYER        = 24,   //! < Destroyer
-    OBJECT_STONE            = 31,   //! < TitaniumOre
-    OBJECT_URANIUM          = 32,   //! < UraniumOre
-    OBJECT_METAL            = 33,   //! < Titanium
-    OBJECT_POWER            = 34,   //! < PowerCell
-    OBJECT_ATOMIC           = 35,   //! < NuclearCell
-    OBJECT_BULLET           = 36,   //! < OrgaMatter
-    OBJECT_BBOX             = 37,   //! < BlackBox
-    OBJECT_TNT              = 38,   //! < TNT
-    OBJECT_MARKPOWER        = 50,   //! < PowerSpot
-    OBJECT_MARKSTONE        = 51,   //! < TitaniumSpot
-    OBJECT_MARKURANIUM      = 52,   //! < UraniumSpot
-    OBJECT_MARKKEYa         = 53,   //! < KeyASpot
-    OBJECT_MARKKEYb         = 54,   //! < KeyBSpot
-    OBJECT_MARKKEYc         = 55,   //! < KeyCSpot
-    OBJECT_MARKKEYd         = 56,   //! < KeyDSpot
-    OBJECT_BOMB             = 60,   //! < Mine
-    OBJECT_WINFIRE          = 61,   //! < Firework
-    OBJECT_SHOW             = 62,   //! < arrow above object (Visit)
-    OBJECT_BAG              = 63,   //! < Bag
-    OBJECT_PLANT0           = 70,   //! < Greenery0
-    OBJECT_PLANT1           = 71,   //! < Greenery1
-    OBJECT_PLANT2           = 72,   //! < Greenery2
-    OBJECT_PLANT3           = 73,   //! < Greenery3
-    OBJECT_PLANT4           = 74,   //! < Greenery4
-    OBJECT_PLANT5           = 75,   //! < Greenery5
-    OBJECT_PLANT6           = 76,   //! < Greenery6
-    OBJECT_PLANT7           = 77,   //! < Greenery7
-    OBJECT_PLANT8           = 78,   //! < Greenery8
-    OBJECT_PLANT9           = 79,   //! < Greenery9
-    OBJECT_PLANT10          = 80,   //! < Greenery10
-    OBJECT_PLANT11          = 81,   //! < Greenery11
-    OBJECT_PLANT12          = 82,   //! < Greenery12
-    OBJECT_PLANT13          = 83,   //! < Greenery13
-    OBJECT_PLANT14          = 84,   //! < Greenery14
-    OBJECT_PLANT15          = 85,   //! < Greenery15
-    OBJECT_PLANT16          = 86,   //! < Greenery16
-    OBJECT_PLANT17          = 87,   //! < Greenery17
-    OBJECT_PLANT18          = 88,   //! < Greenery18
-    OBJECT_PLANT19          = 89,   //! < Greenery19
-    OBJECT_TREE0            = 90,   //! < Tree0
-    OBJECT_TREE1            = 91,   //! < Tree1
-    OBJECT_TREE2            = 92,   //! < Tree2
-    OBJECT_TREE3            = 93,   //! < Tree3
-    OBJECT_TREE4            = 94,   //! < Tree4
-    OBJECT_TREE5            = 95,   //! < Tree5
-    OBJECT_MOBILEwt         = 100,  //! < PracticeBot
-    OBJECT_MOBILEtt         = 101,  //! < track-trainer (unused)
-    OBJECT_MOBILEft         = 102,  //! < fly-trainer (unused)
-    OBJECT_MOBILEit         = 103,  //! < insect-trainer (unused)
-    OBJECT_MOBILEwa         = 110,  //! < WheeledGrabber
-    OBJECT_MOBILEta         = 111,  //! < TrackedGrabber
-    OBJECT_MOBILEfa         = 112,  //! < WingedGrabber
-    OBJECT_MOBILEia         = 113,  //! < LeggedGrabber
-    OBJECT_MOBILEwc         = 120,  //! < WheeledShooter
-    OBJECT_MOBILEtc         = 121,  //! < TrackedShooter
-    OBJECT_MOBILEfc         = 122,  //! < WingedShooter
-    OBJECT_MOBILEic         = 123,  //! < LeggedShooter
-    OBJECT_MOBILEwi         = 130,  //! < WheeledOrgaShooter
-    OBJECT_MOBILEti         = 131,  //! < TrackedOrgaShooter
-    OBJECT_MOBILEfi         = 132,  //! < WingedOrgaShooter
-    OBJECT_MOBILEii         = 133,  //! < LeggedOrgaShooter
-    OBJECT_MOBILEws         = 140,  //! < WheeledSniffer
-    OBJECT_MOBILEts         = 141,  //! < TrackedSniffer
-    OBJECT_MOBILEfs         = 142,  //! < WingedSniffer
-    OBJECT_MOBILEis         = 143,  //! < LeggedSniffer
-    OBJECT_MOBILErt         = 200,  //! < Thumper
-    OBJECT_MOBILErc         = 201,  //! < PhazerShooter
-    OBJECT_MOBILErr         = 202,  //! < Recycler
-    OBJECT_MOBILErs         = 203,  //! < Shielder
-    OBJECT_MOBILEsa         = 210,  //! < Subber
-    OBJECT_MOBILEtg         = 211,  //! < TargetBot
-    OBJECT_MOBILEdr         = 212,  //! < Scribbler
-    OBJECT_CONTROLLER       = 213,  //! < MissionController
-    OBJECT_WAYPOINT         = 250,  //! < WayPoint
-    OBJECT_FLAGb            = 260,  //! < BlueFlag
-    OBJECT_FLAGr            = 261,  //! < RedFlag
-    OBJECT_FLAGg            = 262,  //! < GreenFlag
-    OBJECT_FLAGy            = 263,  //! < YellowFlag
-    OBJECT_FLAGv            = 264,  //! < VioletFlag
-    OBJECT_KEYa             = 270,  //! < KeyA
-    OBJECT_KEYb             = 271,  //! < KeyB
-    OBJECT_KEYc             = 272,  //! < KeyC
-    OBJECT_KEYd             = 273,  //! < KeyD
-    OBJECT_HUMAN            = 300,  //! < Me
-    OBJECT_TOTO             = 301,  //! < Robby (toto)
-    OBJECT_TECH             = 302,  //! < Tech
-    OBJECT_BARRIER0         = 400,  //! < Barrier0
-    OBJECT_BARRIER1         = 401,  //! < Barrier1
-    OBJECT_BARRIER2         = 402,  //! < Barrier2
-    OBJECT_BARRIER3         = 403,  //! < Barrier3
-    OBJECT_MOTHER           = 500,  //! < AlienQueen
-    OBJECT_EGG              = 501,  //! < AlienEgg
-    OBJECT_ANT              = 502,  //! < AlienAnt
-    OBJECT_SPIDER           = 503,  //! < AlienSpider
-    OBJECT_BEE              = 504,  //! < AlienWasp
-    OBJECT_WORM             = 505,  //! < AlienWorm
-    OBJECT_RUINmobilew1     = 600,  //! < WreckBotw1
-    OBJECT_RUINmobilew2     = 601,  //! < WreckBotw2
-    OBJECT_RUINmobilet1     = 602,  //! < WreckBott1
-    OBJECT_RUINmobilet2     = 603,  //! < WreckBott2
-    OBJECT_RUINmobiler1     = 604,  //! < WreckBotr1
-    OBJECT_RUINmobiler2     = 605,  //! < WreckBotr2
-    OBJECT_RUINfactory      = 606,  //! < RuinBotFactory
-    OBJECT_RUINdoor         = 607,  //! < RuinDoor
-    OBJECT_RUINsupport      = 608,  //! < RuinSupport
-    OBJECT_RUINradar        = 609,  //! < RuinRadar
-    OBJECT_RUINconvert      = 610,  //! < RuinConvert
-    OBJECT_RUINbase         = 611,  //! < RuinBaseCamp
-    OBJECT_RUINhead         = 612,  //! < RuinHeadCamp
-    OBJECT_TEEN0            = 620,  //! < Teen0
-    OBJECT_TEEN1            = 621,  //! < Teen1
-    OBJECT_TEEN2            = 622,  //! < Teen2
-    OBJECT_TEEN3            = 623,  //! < Teen3
-    OBJECT_TEEN4            = 624,  //! < Teen4
-    OBJECT_TEEN5            = 625,  //! < Teen5
-    OBJECT_TEEN6            = 626,  //! < Teen6
-    OBJECT_TEEN7            = 627,  //! < Teen7
-    OBJECT_TEEN8            = 628,  //! < Teen8
-    OBJECT_TEEN9            = 629,  //! < Teen9
-    OBJECT_TEEN10           = 630,  //! < Teen10
-    OBJECT_TEEN11           = 631,  //! < Teen11
-    OBJECT_TEEN12           = 632,  //! < Teen12
-    OBJECT_TEEN13           = 633,  //! < Teen13
-    OBJECT_TEEN14           = 634,  //! < Teen14
-    OBJECT_TEEN15           = 635,  //! < Teen15
-    OBJECT_TEEN16           = 636,  //! < Teen16
-    OBJECT_TEEN17           = 637,  //! < Teen17
-    OBJECT_TEEN18           = 638,  //! < Teen18
-    OBJECT_TEEN19           = 639,  //! < Teen19
-    OBJECT_TEEN20           = 640,  //! < Teen20
-    OBJECT_TEEN21           = 641,  //! < Teen21
-    OBJECT_TEEN22           = 642,  //! < Teen22
-    OBJECT_TEEN23           = 643,  //! < Teen23
-    OBJECT_TEEN24           = 644,  //! < Teen24
-    OBJECT_TEEN25           = 645,  //! < Teen25
-    OBJECT_TEEN26           = 646,  //! < Teen26
-    OBJECT_TEEN27           = 647,  //! < Teen27
-    OBJECT_TEEN28           = 648,  //! < Teen28
-    OBJECT_TEEN29           = 649,  //! < Teen29
-    OBJECT_TEEN30           = 650,  //! < Teen30
-    OBJECT_TEEN31           = 651,  //! < Teen31
-    OBJECT_TEEN32           = 652,  //! < Teen32
-    OBJECT_TEEN33           = 653,  //! < Teen33
-    OBJECT_TEEN34           = 654,  //! < Stone (Teen34)
-    OBJECT_TEEN35           = 655,  //! < Teen35
-    OBJECT_TEEN36           = 656,  //! < Teen36
-    OBJECT_TEEN37           = 657,  //! < Teen37
-    OBJECT_TEEN38           = 658,  //! < Teen38
-    OBJECT_TEEN39           = 659,  //! < Teen39
-    OBJECT_TEEN40           = 660,  //! < Teen40
-    OBJECT_TEEN41           = 661,  //! < Teen41
-    OBJECT_TEEN42           = 662,  //! < Teen42
-    OBJECT_TEEN43           = 663,  //! < Teen43
-    OBJECT_TEEN44           = 664,  //! < Teen44
-    OBJECT_QUARTZ0          = 700,  //! < Quartz0
-    OBJECT_QUARTZ1          = 701,  //! < Quartz1
-    OBJECT_QUARTZ2          = 702,  //! < Quartz2
-    OBJECT_QUARTZ3          = 703,  //! < Quartz3
-    OBJECT_ROOT0            = 710,  //! < MegaStalk0
-    OBJECT_ROOT1            = 711,  //! < MegaStalk1
-    OBJECT_ROOT2            = 712,  //! < MegaStalk2
-    OBJECT_ROOT3            = 713,  //! < MegaStalk3
-    OBJECT_ROOT4            = 714,  //! < MegaStalk4
-    OBJECT_ROOT5            = 715,  //! < MegaStalk5
-    OBJECT_MUSHROOM1        = 731,  //! < Mushroom1
-    OBJECT_MUSHROOM2        = 732,  //! < Mushroom2
-    OBJECT_APOLLO1          = 900,  //! < ApolloLEM
-    OBJECT_APOLLO2          = 901,  //! < ApolloJeep
-    OBJECT_APOLLO3          = 902,  //! < ApolloFlag
-    OBJECT_APOLLO4          = 903,  //! < ApolloModule
-    OBJECT_APOLLO5          = 904,  //! < ApolloAntenna
-    OBJECT_HOME1            = 910,  //! < Home
+    OBJECT_PORTICO          = 2,    //!< Portico
+    OBJECT_BASE             = 3,    //!< SpaceShip
+    OBJECT_DERRICK          = 4,    //!< Derrick
+    OBJECT_FACTORY          = 5,    //!< BotFactory
+    OBJECT_STATION          = 6,    //!< PowerStation
+    OBJECT_CONVERT          = 7,    //!< Converter
+    OBJECT_REPAIR           = 8,    //!< RepairStation
+    OBJECT_TOWER            = 9,    //!< DefenseTower
+    OBJECT_NEST             = 10,   //!< AlienNest
+    OBJECT_RESEARCH         = 11,   //!< ResearchCenter
+    OBJECT_RADAR            = 12,   //!< RadarStation
+    OBJECT_ENERGY           = 13,   //!< PowerPlant
+    OBJECT_LABO             = 14,   //!< AutoLab
+    OBJECT_NUCLEAR          = 15,   //!< NuclearPlant
+    OBJECT_START            = 16,   //!< StartArea
+    OBJECT_END              = 17,   //!< EndArea
+    OBJECT_INFO             = 18,   //!< ExchangePost
+    OBJECT_PARA             = 19,   //!< PowerCaptor
+    OBJECT_TARGET1          = 20,   //!< Target1 (gate)
+    OBJECT_TARGET2          = 21,   //!< Target2 (center)
+    OBJECT_SAFE             = 22,   //!< Vault
+    OBJECT_HUSTON           = 23,   //!< Houston
+    OBJECT_DESTROYER        = 24,   //!< Destroyer
+    OBJECT_STONE            = 31,   //!< TitaniumOre
+    OBJECT_URANIUM          = 32,   //!< UraniumOre
+    OBJECT_METAL            = 33,   //!< Titanium
+    OBJECT_POWER            = 34,   //!< PowerCell
+    OBJECT_ATOMIC           = 35,   //!< NuclearCell
+    OBJECT_BULLET           = 36,   //!< OrgaMatter
+    OBJECT_BBOX             = 37,   //!< BlackBox
+    OBJECT_TNT              = 38,   //!< TNT
+    OBJECT_MARKPOWER        = 50,   //!< PowerSpot
+    OBJECT_MARKSTONE        = 51,   //!< TitaniumSpot
+    OBJECT_MARKURANIUM      = 52,   //!< UraniumSpot
+    OBJECT_MARKKEYa         = 53,   //!< KeyASpot
+    OBJECT_MARKKEYb         = 54,   //!< KeyBSpot
+    OBJECT_MARKKEYc         = 55,   //!< KeyCSpot
+    OBJECT_MARKKEYd         = 56,   //!< KeyDSpot
+    OBJECT_BOMB             = 60,   //!< Mine
+    OBJECT_WINFIRE          = 61,   //!< Firework
+    OBJECT_SHOW             = 62,   //!< arrow above object (Visit)
+    OBJECT_BAG              = 63,   //!< Bag
+    OBJECT_PLANT0           = 70,   //!< Greenery0
+    OBJECT_PLANT1           = 71,   //!< Greenery1
+    OBJECT_PLANT2           = 72,   //!< Greenery2
+    OBJECT_PLANT3           = 73,   //!< Greenery3
+    OBJECT_PLANT4           = 74,   //!< Greenery4
+    OBJECT_PLANT5           = 75,   //!< Greenery5
+    OBJECT_PLANT6           = 76,   //!< Greenery6
+    OBJECT_PLANT7           = 77,   //!< Greenery7
+    OBJECT_PLANT8           = 78,   //!< Greenery8
+    OBJECT_PLANT9           = 79,   //!< Greenery9
+    OBJECT_PLANT10          = 80,   //!< Greenery10
+    OBJECT_PLANT11          = 81,   //!< Greenery11
+    OBJECT_PLANT12          = 82,   //!< Greenery12
+    OBJECT_PLANT13          = 83,   //!< Greenery13
+    OBJECT_PLANT14          = 84,   //!< Greenery14
+    OBJECT_PLANT15          = 85,   //!< Greenery15
+    OBJECT_PLANT16          = 86,   //!< Greenery16
+    OBJECT_PLANT17          = 87,   //!< Greenery17
+    OBJECT_PLANT18          = 88,   //!< Greenery18
+    OBJECT_PLANT19          = 89,   //!< Greenery19
+    OBJECT_TREE0            = 90,   //!< Tree0
+    OBJECT_TREE1            = 91,   //!< Tree1
+    OBJECT_TREE2            = 92,   //!< Tree2
+    OBJECT_TREE3            = 93,   //!< Tree3
+    OBJECT_TREE4            = 94,   //!< Tree4
+    OBJECT_TREE5            = 95,   //!< Tree5
+    OBJECT_MOBILEwt         = 100,  //!< PracticeBot
+    OBJECT_MOBILEtt         = 101,  //!< track-trainer (unused)
+    OBJECT_MOBILEft         = 102,  //!< fly-trainer (unused)
+    OBJECT_MOBILEit         = 103,  //!< insect-trainer (unused)
+    OBJECT_MOBILEwa         = 110,  //!< WheeledGrabber
+    OBJECT_MOBILEta         = 111,  //!< TrackedGrabber
+    OBJECT_MOBILEfa         = 112,  //!< WingedGrabber
+    OBJECT_MOBILEia         = 113,  //!< LeggedGrabber
+    OBJECT_MOBILEwc         = 120,  //!< WheeledShooter
+    OBJECT_MOBILEtc         = 121,  //!< TrackedShooter
+    OBJECT_MOBILEfc         = 122,  //!< WingedShooter
+    OBJECT_MOBILEic         = 123,  //!< LeggedShooter
+    OBJECT_MOBILEwi         = 130,  //!< WheeledOrgaShooter
+    OBJECT_MOBILEti         = 131,  //!< TrackedOrgaShooter
+    OBJECT_MOBILEfi         = 132,  //!< WingedOrgaShooter
+    OBJECT_MOBILEii         = 133,  //!< LeggedOrgaShooter
+    OBJECT_MOBILEws         = 140,  //!< WheeledSniffer
+    OBJECT_MOBILEts         = 141,  //!< TrackedSniffer
+    OBJECT_MOBILEfs         = 142,  //!< WingedSniffer
+    OBJECT_MOBILEis         = 143,  //!< LeggedSniffer
+    OBJECT_MOBILErt         = 200,  //!< Thumper
+    OBJECT_MOBILErc         = 201,  //!< PhazerShooter
+    OBJECT_MOBILErr         = 202,  //!< Recycler
+    OBJECT_MOBILErs         = 203,  //!< Shielder
+    OBJECT_MOBILEsa         = 210,  //!< Subber
+    OBJECT_MOBILEtg         = 211,  //!< TargetBot
+    OBJECT_MOBILEdr         = 212,  //!< Scribbler
+    OBJECT_CONTROLLER       = 213,  //!< MissionController
+    OBJECT_WAYPOINT         = 250,  //!< WayPoint
+    OBJECT_FLAGb            = 260,  //!< BlueFlag
+    OBJECT_FLAGr            = 261,  //!< RedFlag
+    OBJECT_FLAGg            = 262,  //!< GreenFlag
+    OBJECT_FLAGy            = 263,  //!< YellowFlag
+    OBJECT_FLAGv            = 264,  //!< VioletFlag
+    OBJECT_KEYa             = 270,  //!< KeyA
+    OBJECT_KEYb             = 271,  //!< KeyB
+    OBJECT_KEYc             = 272,  //!< KeyC
+    OBJECT_KEYd             = 273,  //!< KeyD
+    OBJECT_HUMAN            = 300,  //!< Me
+    OBJECT_TOTO             = 301,  //!< Robby (toto)
+    OBJECT_TECH             = 302,  //!< Tech
+    OBJECT_BARRIER0         = 400,  //!< Barrier0
+    OBJECT_BARRIER1         = 401,  //!< Barrier1
+    OBJECT_BARRIER2         = 402,  //!< Barrier2
+    OBJECT_BARRIER3         = 403,  //!< Barrier3
+    OBJECT_MOTHER           = 500,  //!< AlienQueen
+    OBJECT_EGG              = 501,  //!< AlienEgg
+    OBJECT_ANT              = 502,  //!< AlienAnt
+    OBJECT_SPIDER           = 503,  //!< AlienSpider
+    OBJECT_BEE              = 504,  //!< AlienWasp
+    OBJECT_WORM             = 505,  //!< AlienWorm
+    OBJECT_RUINmobilew1     = 600,  //!< WreckBotw1
+    OBJECT_RUINmobilew2     = 601,  //!< WreckBotw2
+    OBJECT_RUINmobilet1     = 602,  //!< WreckBott1
+    OBJECT_RUINmobilet2     = 603,  //!< WreckBott2
+    OBJECT_RUINmobiler1     = 604,  //!< WreckBotr1
+    OBJECT_RUINmobiler2     = 605,  //!< WreckBotr2
+    OBJECT_RUINfactory      = 606,  //!< RuinBotFactory
+    OBJECT_RUINdoor         = 607,  //!< RuinDoor
+    OBJECT_RUINsupport      = 608,  //!< RuinSupport
+    OBJECT_RUINradar        = 609,  //!< RuinRadar
+    OBJECT_RUINconvert      = 610,  //!< RuinConvert
+    OBJECT_RUINbase         = 611,  //!< RuinBaseCamp
+    OBJECT_RUINhead         = 612,  //!< RuinHeadCamp
+    OBJECT_TEEN0            = 620,  //!< Teen0
+    OBJECT_TEEN1            = 621,  //!< Teen1
+    OBJECT_TEEN2            = 622,  //!< Teen2
+    OBJECT_TEEN3            = 623,  //!< Teen3
+    OBJECT_TEEN4            = 624,  //!< Teen4
+    OBJECT_TEEN5            = 625,  //!< Teen5
+    OBJECT_TEEN6            = 626,  //!< Teen6
+    OBJECT_TEEN7            = 627,  //!< Teen7
+    OBJECT_TEEN8            = 628,  //!< Teen8
+    OBJECT_TEEN9            = 629,  //!< Teen9
+    OBJECT_TEEN10           = 630,  //!< Teen10
+    OBJECT_TEEN11           = 631,  //!< Teen11
+    OBJECT_TEEN12           = 632,  //!< Teen12
+    OBJECT_TEEN13           = 633,  //!< Teen13
+    OBJECT_TEEN14           = 634,  //!< Teen14
+    OBJECT_TEEN15           = 635,  //!< Teen15
+    OBJECT_TEEN16           = 636,  //!< Teen16
+    OBJECT_TEEN17           = 637,  //!< Teen17
+    OBJECT_TEEN18           = 638,  //!< Teen18
+    OBJECT_TEEN19           = 639,  //!< Teen19
+    OBJECT_TEEN20           = 640,  //!< Teen20
+    OBJECT_TEEN21           = 641,  //!< Teen21
+    OBJECT_TEEN22           = 642,  //!< Teen22
+    OBJECT_TEEN23           = 643,  //!< Teen23
+    OBJECT_TEEN24           = 644,  //!< Teen24
+    OBJECT_TEEN25           = 645,  //!< Teen25
+    OBJECT_TEEN26           = 646,  //!< Teen26
+    OBJECT_TEEN27           = 647,  //!< Teen27
+    OBJECT_TEEN28           = 648,  //!< Teen28
+    OBJECT_TEEN29           = 649,  //!< Teen29
+    OBJECT_TEEN30           = 650,  //!< Teen30
+    OBJECT_TEEN31           = 651,  //!< Teen31
+    OBJECT_TEEN32           = 652,  //!< Teen32
+    OBJECT_TEEN33           = 653,  //!< Teen33
+    OBJECT_TEEN34           = 654,  //!< Stone (Teen34)
+    OBJECT_TEEN35           = 655,  //!< Teen35
+    OBJECT_TEEN36           = 656,  //!< Teen36
+    OBJECT_TEEN37           = 657,  //!< Teen37
+    OBJECT_TEEN38           = 658,  //!< Teen38
+    OBJECT_TEEN39           = 659,  //!< Teen39
+    OBJECT_TEEN40           = 660,  //!< Teen40
+    OBJECT_TEEN41           = 661,  //!< Teen41
+    OBJECT_TEEN42           = 662,  //!< Teen42
+    OBJECT_TEEN43           = 663,  //!< Teen43
+    OBJECT_TEEN44           = 664,  //!< Teen44
+    OBJECT_QUARTZ0          = 700,  //!< Quartz0
+    OBJECT_QUARTZ1          = 701,  //!< Quartz1
+    OBJECT_QUARTZ2          = 702,  //!< Quartz2
+    OBJECT_QUARTZ3          = 703,  //!< Quartz3
+    OBJECT_ROOT0            = 710,  //!< MegaStalk0
+    OBJECT_ROOT1            = 711,  //!< MegaStalk1
+    OBJECT_ROOT2            = 712,  //!< MegaStalk2
+    OBJECT_ROOT3            = 713,  //!< MegaStalk3
+    OBJECT_ROOT4            = 714,  //!< MegaStalk4
+    OBJECT_ROOT5            = 715,  //!< MegaStalk5
+    OBJECT_MUSHROOM1        = 731,  //!< Mushroom1
+    OBJECT_MUSHROOM2        = 732,  //!< Mushroom2
+    OBJECT_APOLLO1          = 900,  //!< ApolloLEM
+    OBJECT_APOLLO2          = 901,  //!< ApolloJeep
+    OBJECT_APOLLO3          = 902,  //!< ApolloFlag
+    OBJECT_APOLLO4          = 903,  //!< ApolloModule
+    OBJECT_APOLLO5          = 904,  //!< ApolloAntenna
+    OBJECT_HOME1            = 910,  //!< Home
 
-    OBJECT_MAX              = 1000  //! < number of values
+    OBJECT_MAX              = 1000  //!< number of values
 };
 
 struct ObjectTypeHash
diff --git a/src/ui/mainshort.cpp b/src/ui/mainshort.cpp
index 0ec5f8a..d9fffa2 100644
--- a/src/ui/mainshort.cpp
+++ b/src/ui/mainshort.cpp
@@ -280,9 +280,9 @@ void CMainShort::SelectNext()
 
     CObject* pPrev = m_main->DeselectAll();
 
-    if(m_shortcuts.size() == 0)
+    if (m_shortcuts.size() == 0)
     {
-        m_main->SelectHuman();
+        m_main->SelectObject(m_main->SearchHuman());
         return;
     }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git



More information about the Pkg-games-commits mailing list