[colobot] 56/377: Added radarall() (#624)

Didier Raboud odyx at moszumanska.debian.org
Wed Mar 30 13:33:57 UTC 2016


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

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

commit 6492908cefa7b93fe0f06df89b2017fecba7f0be
Author: krzys-h <krzys_h at interia.pl>
Date:   Sun Nov 22 14:10:45 2015 +0100

    Added radarall() (#624)
---
 src/object/object_manager.cpp | 71 +++++++++++++++++++++++++----------
 src/object/object_manager.h   | 43 ++++++++++++++++++++++
 src/script/cbottoken.cpp      | 11 ++++--
 src/script/scriptfunc.cpp     | 86 ++++++++++++++++++++++++++++++-------------
 src/script/scriptfunc.h       |  2 +
 5 files changed, 165 insertions(+), 48 deletions(-)

diff --git a/src/object/object_manager.cpp b/src/object/object_manager.cpp
index 3c43c75..1ca47aa 100644
--- a/src/object/object_manager.cpp
+++ b/src/object/object_manager.cpp
@@ -230,15 +230,15 @@ int CObjectManager::CountObjectsImplementing(ObjectInterfaceType interface)
     return count;
 }
 
-CObject* CObjectManager::Radar(CObject* pThis, ObjectType type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
+std::vector<CObject*> CObjectManager::RadarAll(CObject* pThis, ObjectType type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
 {
     std::vector<ObjectType> types;
     if (type != OBJECT_NULL)
         types.push_back(type);
-    return Radar(pThis, types, angle, focus, minDist, maxDist, furthest, filter, cbotTypes);
+    return RadarAll(pThis, types, angle, focus, minDist, maxDist, furthest, filter, cbotTypes);
 }
 
-CObject* CObjectManager::Radar(CObject* pThis, std::vector<ObjectType> type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
+std::vector<CObject*> CObjectManager::RadarAll(CObject* pThis, std::vector<ObjectType> type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
 {
     Math::Vector iPos;
     float iAngle;
@@ -253,22 +253,22 @@ CObject* CObjectManager::Radar(CObject* pThis, std::vector<ObjectType> type, flo
         iPos   = Math::Vector();
         iAngle = 0.0f;
     }
-    return Radar(pThis, iPos, iAngle, type, angle, focus, minDist, maxDist, furthest, filter, cbotTypes);
+    return RadarAll(pThis, iPos, iAngle, type, angle, focus, minDist, maxDist, furthest, filter, cbotTypes);
 }
 
-CObject* CObjectManager::Radar(CObject* pThis, Math::Vector thisPosition, float thisAngle, ObjectType type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
+std::vector<CObject*> CObjectManager::RadarAll(CObject* pThis, Math::Vector thisPosition, float thisAngle, ObjectType type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
 {
     std::vector<ObjectType> types;
     if (type != OBJECT_NULL)
         types.push_back(type);
-    return Radar(pThis, thisPosition, thisAngle, types, angle, focus, minDist, maxDist, furthest, filter, cbotTypes);
+    return RadarAll(pThis, thisPosition, thisAngle, types, angle, focus, minDist, maxDist, furthest, filter, cbotTypes);
 }
 
-CObject* CObjectManager::Radar(CObject* pThis, Math::Vector thisPosition, float thisAngle, std::vector<ObjectType> type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
+std::vector<CObject*> CObjectManager::RadarAll(CObject* pThis, Math::Vector thisPosition, float thisAngle, std::vector<ObjectType> type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
 {
-    CObject     *pObj, *pBest;
+    CObject     *pObj;
     Math::Vector    iPos, oPos;
-    float       best, iAngle, d, a;
+    float       iAngle, d, a;
     ObjectType  oType;
 
     minDist *= g_unit;
@@ -282,9 +282,7 @@ CObject* CObjectManager::Radar(CObject* pThis, Math::Vector thisPosition, float
     RadarFilter filter_flying = static_cast<RadarFilter>(filter & (FILTER_ONLYLANDING | FILTER_ONLYFLYING));
     RadarFilter filter_enemy = static_cast<RadarFilter>(filter & (FILTER_FRIENDLY | FILTER_ENEMY | FILTER_NEUTRAL));
 
-    if ( !furthest )  best = 100000.0f;
-    else              best = 0.0f;
-    pBest = nullptr;
+    std::map<float, CObject*> best;
     for ( auto it = m_objects.begin() ; it != m_objects.end() ; ++it )
     {
         pObj = it->second.get();
@@ -359,16 +357,51 @@ CObject* CObjectManager::Radar(CObject* pThis, Math::Vector thisPosition, float
         a = Math::RotateAngle(oPos.x-iPos.x, iPos.z-oPos.z);  // CW !
         if ( Math::TestAngle(a, iAngle-focus/2.0f, iAngle+focus/2.0f) || focus >= Math::PI*2.0f )
         {
-            if ( (!furthest && d < best) ||
-                (furthest && d > best) )
-            {
-                best = d;
-                pBest = pObj;
-            }
+            best[d] = pObj;
+        }
+    }
+
+    std::vector<CObject*> sortedBest;
+    if (!furthest)
+    {
+        for (auto it = best.begin(); it != best.end(); ++it)
+        {
+            sortedBest.push_back(it->second);
+        }
+    }
+    else
+    {
+        for (auto it = best.rbegin(); it != best.rend(); ++it)
+        {
+            sortedBest.push_back(it->second);
         }
     }
 
-    return pBest;
+    return sortedBest;
+}
+
+CObject* CObjectManager::Radar(CObject* pThis, ObjectType type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
+{
+    std::vector<CObject*> best = RadarAll(pThis, type, angle, focus, minDist, maxDist, furthest, filter, cbotTypes);
+    return best.size() > 0 ? best[0] : nullptr;
+}
+
+CObject* CObjectManager::Radar(CObject* pThis, std::vector<ObjectType> type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
+{
+    std::vector<CObject*> best = RadarAll(pThis, type, angle, focus, minDist, maxDist, furthest, filter, cbotTypes);
+    return best.size() > 0 ? best[0] : nullptr;
+}
+
+CObject* CObjectManager::Radar(CObject* pThis, Math::Vector thisPosition, float thisAngle, ObjectType type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
+{
+    std::vector<CObject*> best = RadarAll(pThis, thisPosition, thisAngle, type, angle, focus, minDist, maxDist, furthest, filter, cbotTypes);
+    return best.size() > 0 ? best[0] : nullptr;
+}
+
+CObject* CObjectManager::Radar(CObject* pThis, Math::Vector thisPosition, float thisAngle, std::vector<ObjectType> type, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter, bool cbotTypes)
+{
+    std::vector<CObject*> best = RadarAll(pThis, thisPosition, thisAngle, type, angle, focus, minDist, maxDist, furthest, filter, cbotTypes);
+    return best.size() > 0 ? best[0] : nullptr;
 }
 
 CObject*  CObjectManager::FindNearest(CObject* pThis, ObjectType type, float maxDist, bool cbotTypes)
diff --git a/src/object/object_manager.h b/src/object/object_manager.h
index 080a25b..cd2bde5 100644
--- a/src/object/object_manager.h
+++ b/src/object/object_manager.h
@@ -194,6 +194,49 @@ public:
 
     //! Finds an object, like radar() in CBot
     //@{
+    std::vector<CObject*> RadarAll(CObject* pThis,
+                    ObjectType type = OBJECT_NULL,
+                    float angle = 0.0f,
+                    float focus = Math::PI*2.0f,
+                    float minDist = 0.0f,
+                    float maxDist = 1000.0f,
+                    bool furthest = false,
+                    RadarFilter filter = FILTER_NONE,
+                    bool cbotTypes = false);
+    std::vector<CObject*> RadarAll(CObject* pThis,
+                    std::vector<ObjectType> type = std::vector<ObjectType>(),
+                    float angle = 0.0f,
+                    float focus = Math::PI*2.0f,
+                    float minDist = 0.0f,
+                    float maxDist = 1000.0f,
+                    bool furthest = false,
+                    RadarFilter filter = FILTER_NONE,
+                    bool cbotTypes = false);
+    std::vector<CObject*> RadarAll(CObject* pThis,
+                       Math::Vector thisPosition,
+                       float thisAngle,
+                       ObjectType type = OBJECT_NULL,
+                       float angle = 0.0f,
+                       float focus = Math::PI*2.0f,
+                       float minDist = 0.0f,
+                       float maxDist = 1000.0f,
+                       bool furthest = false,
+                       RadarFilter filter = FILTER_NONE,
+                       bool cbotTypes = false);
+    std::vector<CObject*> RadarAll(CObject* pThis,
+                    Math::Vector thisPosition,
+                    float thisAngle,
+                    std::vector<ObjectType> type = std::vector<ObjectType>(),
+                    float angle = 0.0f,
+                    float focus = Math::PI*2.0f,
+                    float minDist = 0.0f,
+                    float maxDist = 1000.0f,
+                    bool furthest = false,
+                    RadarFilter filter = FILTER_NONE,
+                    bool cbotTypes = false);
+    //@}
+    //! Finds an object, like radar() in CBot
+    //@{
     CObject*  Radar(CObject* pThis,
                     ObjectType type = OBJECT_NULL,
                     float angle = 0.0f,
diff --git a/src/script/cbottoken.cpp b/src/script/cbottoken.cpp
index dc491c5..535265c 100644
--- a/src/script/cbottoken.cpp
+++ b/src/script/cbottoken.cpp
@@ -272,6 +272,7 @@ std::string GetHelpFilename(const char *token)
     if ( strcmp(token, "destroy"       ) == 0 )  helpfile = "cbot/destroy";
     if ( strcmp(token, "search"        ) == 0 )  helpfile = "cbot/search";
     if ( strcmp(token, "radar"         ) == 0 )  helpfile = "cbot/radar";
+    if ( strcmp(token, "radarall"      ) == 0 )  helpfile = "cbot/radarall";
     if ( strcmp(token, "direction"     ) == 0 )  helpfile = "cbot/direct";
     if ( strcmp(token, "distance"      ) == 0 )  helpfile = "cbot/dist";
     if ( strcmp(token, "distance2d"    ) == 0 )  helpfile = "cbot/dist2d";
@@ -421,6 +422,7 @@ bool IsFunction(const char *token)
     if ( strcmp(token, "destroy"      ) == 0 )  return true;
     if ( strcmp(token, "search"       ) == 0 )  return true;
     if ( strcmp(token, "radar"        ) == 0 )  return true;
+    if ( strcmp(token, "radarall"     ) == 0 )  return true;
     if ( strcmp(token, "detect"       ) == 0 )  return true;
     if ( strcmp(token, "direction"    ) == 0 )  return true;
     if ( strcmp(token, "distance"     ) == 0 )  return true;
@@ -522,6 +524,7 @@ const char* GetHelpText(const char *token)
     if ( strcmp(token, "destroy"   ) == 0 )  return "object.destroy ( );";
     if ( strcmp(token, "search"    ) == 0 )  return "search ( cat, pos );";
     if ( strcmp(token, "radar"     ) == 0 )  return "radar ( cat, angle, focus, min, max, sens, filter );";
+    if ( strcmp(token, "radarall"  ) == 0 )  return "radarall ( cat, angle, focus, min, max, sens, filter );";
     if ( strcmp(token, "detect"    ) == 0 )  return "detect ( cat );";
     if ( strcmp(token, "direction" ) == 0 )  return "direction ( position );";
     if ( strcmp(token, "distance2d") == 0 )  return "distance2d ( p1, p2 );";
@@ -566,10 +569,10 @@ const char* GetHelpText(const char *token)
     if ( strcmp(token, "strfind"   ) == 0 )  return "strfind ( string, substring );";
     if ( strcmp(token, "strlower"  ) == 0 )  return "strlower ( string );";
     if ( strcmp(token, "strupper"  ) == 0 )  return "strupper ( string );";
-    if ( strcmp(token, "open"      ) == 0 )  return "open ( filename, mode );";
-    if ( strcmp(token, "close"     ) == 0 )  return "close ( );";
-    if ( strcmp(token, "writeln"   ) == 0 )  return "writeln ( string );";
-    if ( strcmp(token, "readln"    ) == 0 )  return "readln ( );";
+    if ( strcmp(token, "open"      ) == 0 )  return "file.open ( filename, mode );";
+    if ( strcmp(token, "close"     ) == 0 )  return "file.close ( );";
+    if ( strcmp(token, "writeln"   ) == 0 )  return "file.writeln ( string );";
+    if ( strcmp(token, "readln"    ) == 0 )  return "file.readln ( );";
     if ( strcmp(token, "eof"       ) == 0 )  return "eof ( );";
     if ( strcmp(token, "deletefile") == 0 )  return "deletefile ( filename );";
     if ( strcmp(token, "openfile"  ) == 0 )  return "openfile ( filename, mode );";
diff --git a/src/script/scriptfunc.cpp b/src/script/scriptfunc.cpp
index 3b55bb2..a49dc9c 100644
--- a/src/script/scriptfunc.cpp
+++ b/src/script/scriptfunc.cpp
@@ -1027,51 +1027,56 @@ bool CScriptFunctions::rSearch(CBotVar* var, CBotVar* result, int& exception, vo
 }
 
 
-// Compilation of instruction "radar(type, angle, focus, min, max, sens)".
-
-CBotTypResult CScriptFunctions::cRadar(CBotVar* &var, void* user)
+CBotTypResult compileRadar(CBotVar* &var, void* user, CBotTypResult returnValue)
 {
     CBotVar*    array;
 
-    if ( var == nullptr )  return CBotTypResult(CBotTypPointer, "object");
+    if ( var == nullptr )  return returnValue;
     if ( var->GetType() == CBotTypArrayPointer )
     {
         array = var->GetItemList();
-        if ( array == nullptr )  return CBotTypResult(CBotTypPointer, "object");
+        if ( array == nullptr )  return returnValue;
         if ( array->GetType() > CBotTypDouble )  return CBotTypResult(CBotErrBadNum);  // type
     }
     else if ( var->GetType() > CBotTypDouble )  return CBotTypResult(CBotErrBadNum);  // type
     var = var->GetNext();
-    if ( var == nullptr )  return CBotTypResult(CBotTypPointer, "object");
+    if ( var == nullptr )  return returnValue;
     if ( var->GetType() > CBotTypDouble )  return CBotTypResult(CBotErrBadNum);  // angle
     var = var->GetNext();
-    if ( var == nullptr )  return CBotTypResult(CBotTypPointer, "object");
+    if ( var == nullptr )  return returnValue;
     if ( var->GetType() > CBotTypDouble )  return CBotTypResult(CBotErrBadNum);  // focus
     var = var->GetNext();
-    if ( var == nullptr )  return CBotTypResult(CBotTypPointer, "object");
+    if ( var == nullptr )  return returnValue;
     if ( var->GetType() > CBotTypDouble )  return CBotTypResult(CBotErrBadNum);  // min
     var = var->GetNext();
-    if ( var == nullptr )  return CBotTypResult(CBotTypPointer, "object");
+    if ( var == nullptr )  return returnValue;
     if ( var->GetType() > CBotTypDouble )  return CBotTypResult(CBotErrBadNum);  // max
     var = var->GetNext();
-    if ( var == nullptr )  return CBotTypResult(CBotTypPointer, "object");
+    if ( var == nullptr )  return returnValue;
     if ( var->GetType() > CBotTypDouble )  return CBotTypResult(CBotErrBadNum);  // sense
     var = var->GetNext();
-    if ( var == nullptr )  return CBotTypResult(CBotTypPointer, "object");
+    if ( var == nullptr )  return returnValue;
     if ( var->GetType() > CBotTypDouble )  return CBotTypResult(CBotErrBadNum);  // filter
     var = var->GetNext();
-    if ( var == nullptr )  return CBotTypResult(CBotTypPointer, "object");
+    if ( var == nullptr )  return returnValue;
     return CBotTypResult(CBotErrOverParam);
 }
 
-// Instruction "radar(type, angle, focus, min, max, sens, filter)".
+CBotTypResult CScriptFunctions::cRadarAll(CBotVar* &var, void* user)
+{
+    return compileRadar(var, user, CBotTypResult(CBotTypArrayPointer, CBotTypResult(CBotTypPointer, "object")));
+}
 
-bool CScriptFunctions::rRadar(CBotVar* var, CBotVar* result, int& exception, void* user)
+// Compilation of instruction "radar(type, angle, focus, min, max, sens)".
+
+CBotTypResult CScriptFunctions::cRadar(CBotVar* &var, void* user)
+{
+    return compileRadar(var, user, CBotTypResult(CBotTypPointer, "object"));
+}
+
+bool runRadar(CBotVar* var, std::function<bool(std::vector<ObjectType>, float, float, float, float, bool, RadarFilter)> code)
 {
-    CObject*    pThis = static_cast<CScript*>(user)->m_object;
-    CObject     *pBest;
     CBotVar*    array;
-    Math::Vector    oPos;
     RadarFilter filter;
     float       minDist, maxDist, sens, angle, focus;
     int         type;
@@ -1153,17 +1158,47 @@ bool CScriptFunctions::rRadar(CBotVar* var, CBotVar* result, int& exception, voi
         }
     }
 
-    pBest = CObjectManager::GetInstancePointer()->Radar(pThis, type_v, angle, focus, minDist, maxDist, sens < 0, filter, true); //TODO: why is "sens" done like that?
+    return code(type_v, angle, focus, minDist, maxDist, sens < 0, filter);
+}
 
-    if ( pBest == nullptr )
+// Instruction "radar(type, angle, focus, min, max, sens, filter)".
+
+bool CScriptFunctions::rRadar(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+    return runRadar(var, [&result, user](std::vector<ObjectType> types, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter)
     {
-        result->SetPointer(nullptr);
-    }
-    else
+        CObject* pThis = static_cast<CScript*>(user)->m_object;
+        CObject* best = CObjectManager::GetInstancePointer()->Radar(pThis, types, angle, focus, minDist, maxDist, furthest, filter, true);
+
+        if (best == nullptr)
+        {
+            result->SetPointer(nullptr);
+        }
+        else
+        {
+            result->SetPointer(best->GetBotVar());
+        }
+
+        return true;
+    });
+}
+
+bool CScriptFunctions::rRadarAll(CBotVar* var, CBotVar* result, int& exception, void* user)
+{
+    return runRadar(var, [&result, user](std::vector<ObjectType> types, float angle, float focus, float minDist, float maxDist, bool furthest, RadarFilter filter)
     {
-        result->SetPointer(pBest->GetBotVar());
-    }
-    return true;
+        CObject* pThis = static_cast<CScript*>(user)->m_object;
+        std::vector<CObject*> best = CObjectManager::GetInstancePointer()->RadarAll(pThis, types, angle, focus, minDist, maxDist, furthest, filter, true);
+
+        int i = 0;
+        result->SetInit(CBotVar::InitType::DEF);
+        for (CObject* obj : best)
+        {
+            result->GetItem(i++, true)->SetPointer(obj->GetBotVar());
+        }
+
+        return true;
+    });
 }
 
 
@@ -3779,6 +3814,7 @@ void CScriptFunctions::Init()
     CBotProgram::AddFunction("delete",    rDelete,    CScriptFunctions::cDelete);
     CBotProgram::AddFunction("search",    rSearch,    CScriptFunctions::cSearch);
     CBotProgram::AddFunction("radar",     rRadar,     CScriptFunctions::cRadar);
+    CBotProgram::AddFunction("radarall",  rRadarAll,  CScriptFunctions::cRadarAll);
     CBotProgram::AddFunction("detect",    rDetect,    CScriptFunctions::cDetect);
     CBotProgram::AddFunction("direction", rDirection, CScriptFunctions::cDirection);
     CBotProgram::AddFunction("produce",   rProduce,   CScriptFunctions::cProduce);
diff --git a/src/script/scriptfunc.h b/src/script/scriptfunc.h
index e01cf7a..9428879 100644
--- a/src/script/scriptfunc.h
+++ b/src/script/scriptfunc.h
@@ -58,6 +58,7 @@ private:
     static CBotTypResult cDelete(CBotVar* &var, void* user);
     static CBotTypResult cSearch(CBotVar* &var, void* user);
     static CBotTypResult cRadar(CBotVar* &var, void* user);
+    static CBotTypResult cRadarAll(CBotVar* &var, void* user);
     static CBotTypResult cDetect(CBotVar* &var, void* user);
     static CBotTypResult cDirection(CBotVar* &var, void* user);
     static CBotTypResult cProduce(CBotVar* &var, void* user);
@@ -108,6 +109,7 @@ private:
     static bool rDelete(CBotVar* var, CBotVar* result, int& exception, void* user);
     static bool rSearch(CBotVar* var, CBotVar* result, int& exception, void* user);
     static bool rRadar(CBotVar* var, CBotVar* result, int& exception, void* user);
+    static bool rRadarAll(CBotVar* var, CBotVar* result, int& exception, void* user);
     static bool rDetect(CBotVar* var, CBotVar* result, int& exception, void* user);
     static bool rDirection(CBotVar* var, CBotVar* result, int& exception, void* user);
     static bool rCanBuild(CBotVar* var, CBotVar* result, int& exception, void* user);

-- 
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