From 0d08812319d7674ac21d15ae2cf68a07ac3b0e73 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9tro?= <yann.roberge@polymtl.ca>
Date: Fri, 6 Nov 2020 22:17:48 -0500
Subject: [PATCH] =?UTF-8?q?Impl=C3=A9mentation=20de=20l'excavation=20de=20?=
 =?UTF-8?q?volume,=20avec=20auto-remplissage=20de=20carburant=20et=20auto-?=
 =?UTF-8?q?dump=20d'inventaire.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 excaver.lua   | 82 +++++++++++++++++++++++++++++++++++++++++++++++----
 macros.lua    |  2 ++
 rsiTurtle.lua | 27 +++++++++++++----
 test.lua      | 11 +++----
 4 files changed, 107 insertions(+), 15 deletions(-)

diff --git a/excaver.lua b/excaver.lua
index 9e45b81..44aacc4 100644
--- a/excaver.lua
+++ b/excaver.lua
@@ -12,7 +12,7 @@ RSI_Excavatrice.__index = RSI_Excavatrice
 rsiT = require("rsiTurtle")
 
 ---
--- \brief Constructeur de RSI_Bucheron
+-- \brief Constructeur de RSI_Excavatrice
 function RSI_Excavatrice:init()
     local excavatrice = {}
     setmetatable(excavatrice,RSI_Excavatrice)
@@ -25,6 +25,75 @@ function RSI_Excavatrice:init()
 end
 
 
+---
+-- \brief Couper les arbres tout en avançant le long d'une ligne
+-- \param int   distance  Nombre de blocs à parcourir
+-- \return bool Succès
+function RSI_Excavatrice:maintainFuelLevels()
+    if (turtle.getFuelLevel() < FUEL_LOW)
+    then
+        return self.base_:refuelUntil(FUEL_FULL, SLOT_ENDERCHEST_FUEL)
+    end
+    return true
+end
+
+---
+-- \brief Si l'inventaire est plein, le vider dans le enderchest prévu pour
+-- \return bool Succès
+function RSI_Excavatrice:manageInventory()
+    if ( self.base_:inventoryFull(SLOT_STORAGE_START, SLOT_STORAGE_END) )
+    then
+        return self.base_:dumpInventory(SLOT_STORAGE_START, SLOT_STORAGE_END,
+                                        SLOT_ENDERCHEST_DUMP)
+    end
+end
+
+
+---
+-- \brief Quadriller une zone carrée. La tortue traverse chaque case, ligne par
+--          ligne. N'affecte pas l'altitude.
+-- \param int               lines       Nombre de lignes    (direction: avant)
+-- \param int               cols        Nombre de colonnes  (direction: droite)
+-- \return bool Succès
+function RSI_Excavatrice:excavateArea(lines, cols)
+    local success = true
+
+    assert(lines >= 1)
+    assert(cols >= 1)
+
+    -- La ligne de la case de départ compte comme 1
+    lines = lines - 1
+
+    action()
+
+    success = self:moveForward(lines, grounded, action)
+
+    for i=2,cols,1
+    do
+        print("Debut de colonne.")
+
+        if ( (i%2) == 1 )
+        then
+            success = self:left(grounded)
+            self:turnLeft()
+        else
+            success = self:right(grounded)
+            self:turnRight()
+        end
+        action()
+
+        success = self:moveForward(lines, grounded, action)
+
+        if not success
+        then
+            return success
+        end
+
+    end
+    return success
+end
+
+
 ---
 -- \brief Affiche la position et l'orientation de l'excavatrice
 function RSI_Excavatrice:print()
@@ -40,10 +109,13 @@ end
 -- \param int depth     Profondeur z (vers le bas) sur laquelle excaver
 -- \return bool Succès
 function RSI_Excavatrice:excavateVolumeDown(lines, cols, depth)
-    --TODO: Refuel quand < 100
-    --TODO: Vider l'inventaire quand on a ramassé un truc et qu'il n'y a plus
-    --      de cases libres
-    return self.base_:goThroughVolume(lines, cols, depth, turtle.digDown)
+    action = function ()
+        self:maintainFuelLevels()
+        self:manageInventory()
+        turtle.select(SLOT_STORAGE_START)
+        self.base_:dig(nil, "down")
+    end
+    return self.base_:goThroughVolume(lines, cols, depth, action)
 end
 
 return RSI_Excavatrice
diff --git a/macros.lua b/macros.lua
index f251bda..7a49a58 100644
--- a/macros.lua
+++ b/macros.lua
@@ -14,6 +14,8 @@ FUEL_FULL   = 400
 -- Cases de l'inventaire dédiées
 SLOT_ENDERCHEST_FUEL = 1
 SLOT_ENDERCHEST_DUMP = 2
+SLOT_STORAGE_START   = 3
+SLOT_STORAGE_END     = 16
 
 -- ID Blocs
 ID_LOG          = "log"
diff --git a/rsiTurtle.lua b/rsiTurtle.lua
index 282e2ca..5b1b156 100644
--- a/rsiTurtle.lua
+++ b/rsiTurtle.lua
@@ -710,6 +710,7 @@ function RSI_Turtle:refuelUntil(fuelLevel, fuelChestSlot)
     end
 
     -- Ramasser le coffre
+    turtle.select(fuelChestSlot)
     success = self:dig()
     if (not success) then return false end
 
@@ -724,23 +725,40 @@ end
 
 
 ---
--- \brief   Place le contenu de l'inventaire dans un conteneur devant soit
+-- \brief   Place le contenu de l'inventaire dans un ender chest devant soit
 --          (ou le balance par terre s'il n'y a aucun bloc de stockage)
 --          Agit sur un intervalle de cases de l'inventaire
 --          ex: 1,4 va prendre les cases d'inventaire 1, 2, 3, et 4
 -- \param int   firstSlot   Première case
 -- \param int   lastSlot    Dernière case
 -- \return bool Succès
-function RSI_Turtle:dumpInventory(firstSlot, lastSlot)
+function RSI_Turtle:dumpInventory(firstSlot, lastSlot, dumpChestSlot)
     local success
 
+    self:dig() -- Faire de la place pour le coffre
+    turtle.select(dumpChestSlot)
+    success = turtle.place()
+    if (not success) then return false end
+    
     for i=firstSlot, lastSlot, 1
     do
         turtle.select(i)
         success = turtle.drop() or (turtle.getItemCount() == 0)
         if (not success) then return false end
     end
-    return true
+    
+    -- Ramasser le coffre
+    turtle.select(dumpChestSlot)
+    success = self:dig()
+    if (not success) then return false end
+
+    -- Vérifier qu'on a bien ramassé le coffre au bon emplacement de l'inventaire
+    itemInDumpChestSlot = turtle.getItemDetail(dumpChestSlot)
+    if (itemInDumpChestSlot ~= nil)
+    then
+        return string.match(itemInDumpChestSlot.name, ID_ENDERCHEST)
+    end
+    return false
 end
 
 
@@ -756,8 +774,7 @@ function RSI_Turtle:inventoryFull(firstSlot, lastSlot)
     for i=firstSlot, lastSlot, 1
     do
         turtle.select(i)
-        print(turtle.getItemCount())
-        if (turtle.getItemCount() ~= 0)
+        if (turtle.getItemCount() == 0)
         then
             return false
         end
diff --git a/test.lua b/test.lua
index b9e8cd8..0d22d00 100644
--- a/test.lua
+++ b/test.lua
@@ -186,9 +186,10 @@ end
 --print("Test goThroughVolume")
 --assert(t:goThroughVolume(4,3,3, turtle.digDown))
 
---print("Test excavateVolumeDown")
---assert(e:excavateVolumeDown(2,2,3))
---assert(e:excavateVolumeDown(10,10,68)) Attention: prend des heures
+print("Test excavateVolumeDown")
+--assert(e:excavateVolumeDown(10,10,1))
+assert(e:excavateVolumeDown(10,10,30)) --Attention: prend des heures
+assert(e.base_:moveToOrigin())
 
 -- print("Test refuelUntil")
 -- assert(e.base_:refuelUntil(FUEL_FULL, SLOT_ENDERCHEST_FUEL))
@@ -199,8 +200,8 @@ end
 -- print("Test dumpInventory")
 -- assert(e.base_:dumpInventory(3, 12))
 
-print("Test inventoryFull")
-print(e.base_:inventoryFull(3,12))
+--print("Test inventoryFull")
+--print(e.base_:inventoryFull(3,12))
 
 -- assert(e.base_:moveToOrigin())
 -- print(e.base_:getPos())
-- 
GitLab