Skip to content
Snippets Groups Projects
Commit 0d088123 authored by Yann Roberge's avatar Yann Roberge
Browse files

Implémentation de l'excavation de volume, avec auto-remplissage de carburant...

Implémentation de l'excavation de volume, avec auto-remplissage de carburant et auto-dump d'inventaire.
parent 97394a2c
No related branches found
No related tags found
No related merge requests found
......@@ -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
......@@ -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"
......
......@@ -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
......
......@@ -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())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment