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