alesandreo

lib/ale/turtle/turle.lua

Aug 11th, 2021 (edited)
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.61 KB | None | 0 0
  1. -- https://pastebin.com/iEcuJ70J
  2.  
  3. Turtle = {
  4.   -- Turtle's Position Relative to start
  5.   position = Position:new("configs/turtle.position"),
  6.   -- A table to hold important waypoints.
  7.   saved_positions = {},
  8.   -- A history which can be manipulated to rewind actions.
  9.   history = History:new(),
  10.   -- This is how many levels of recursion we've run through for things like mining ore
  11.   stack = 0,
  12.   -- A buffer to prevent an infinite loop from causing infinite recursion
  13.   MAX_STACK_DEPTH = 10,
  14.   -- state of recording crumbs.
  15.   CRUMBS = true,
  16.   -- List of special inventory slots for use in programs. e.g. bucket
  17.   slots = {},
  18.   inventory = TurtleInventory:new()
  19. }
  20.  
  21. function Turtle:new(x, y, z, facing)
  22.   local o = {}
  23.   setmetatable(o, self)
  24.   self.__index = self
  25.   self.position.x = x or self.position.x
  26.   self.position.y = y or self.position.y
  27.   self.position.z = z or self.position.z
  28.   if facing then
  29.     self.position:setFace(facing)
  30.   end
  31.   return o
  32. end
  33.  
  34. function Turtle:save_position(name, position)
  35.   position = position or Position:new(self.position.x, self.position.y, self.position.z, self.position.face)
  36.   if self.saved_positions[name] then error("Position "..name.." is already saved.") end
  37.   self.saved_positions[name] = position
  38.   return true
  39. end
  40.  
  41. function Turtle:delete_position(name)
  42.   self.saved_positions[name] = nil
  43. end
  44.  
  45. function Turtle:forward(record)
  46.   if record == nil then record = true end
  47.   if record then record = self.CRUMBS end
  48.   while turtle.detect() do
  49.     turtle.dig()
  50.     os.sleep(0.1)
  51.   end
  52.   if turtle.forward() then
  53.     if record then self.history:addToLog('forward') end
  54.     self.position:forward()
  55.   end
  56.   return true
  57. end
  58.  
  59. function Turtle:back(record)
  60.   if record == nil then record = true end
  61.   if record then record = self.CRUMBS end
  62.   if turtle.back() then
  63.     if record then self.history:addToLog('back') end
  64.     self.position:back()
  65.   else
  66.     self:turnAround(false)
  67.     if self:forward(false) then
  68.       if record then self.history:addToLog('back') end
  69.     end
  70.     self:turnAround(false)
  71.     self.position:back()
  72.   end
  73.   return true
  74. end
  75.  
  76. function Turtle:up(record)
  77.   if record == nil then record = true end
  78.   if record then record = self.CRUMBS end
  79.   while turtle.detectUp() do
  80.     turtle.digUp()
  81.     os.sleep(0.1)
  82.   end
  83.   if turtle.up() then
  84.     if record then self.history:addToLog('up') end
  85.     self.position:up()
  86.   end
  87.   return true
  88. end
  89.  
  90. function Turtle:down(record)
  91.   if record == nil then record = true end
  92.   if record then record = self.CRUMBS end
  93.   while turtle.detectDown() do
  94.     turtle.digDown()
  95.     os.sleep(0.1)
  96.   end
  97.   if turtle.down() then
  98.     if record then self.history:addToLog('down') end
  99.     self.position:down()
  100.   end
  101.   return true
  102. end
  103.  
  104. function Turtle:turnLeft(record)
  105.   if record == nil then record = true end
  106.   if record then record = self.CRUMBS end
  107.   if turtle.turnLeft() then
  108.     if record then self.history:addToLog('turnLeft') end
  109.     self.position:turnLeft()
  110.   end
  111.   return true
  112. end
  113.  
  114. function Turtle:turnRight(record)
  115.   if record == nil then record = true end
  116.   if record then record = self.CRUMBS end
  117.   if turtle.turnRight() then
  118.     if record then self.history:addToLog('turnRight') end
  119.     self.position:turnRight()
  120.   end
  121.   return true
  122. end
  123.  
  124. function Turtle:turnAround(record)
  125.   if record == nil then record = true end
  126.   if record then record = self.CRUMBS end
  127.   turtle.turnLeft()
  128.   turtle.turnLeft()
  129.   if record then self.history:addToLog('turnAround') end
  130.   self.position:turnAround()
  131.   return true
  132. end
  133.  
  134. function Turtle:turnToFace(face, record)
  135.   while not (self.position.face == face) do
  136.     self:turnLeft(record)
  137.   end
  138. end
  139.  
  140. function Turtle:doOppositeAction(action, record)
  141.   if action == 'forward' then
  142.     return self:back(record)
  143.   elseif action == 'back' then
  144.     return self:forward(record)
  145.   elseif action == 'up' then
  146.     return self:down(record)
  147.   elseif action == 'down' then
  148.     return self:up(record)
  149.   elseif action == 'turnLeft' then
  150.     return self:turnRight(record)
  151.   elseif action == 'turnRight' then
  152.     return self:turnLeft(record)
  153.   elseif action == 'turnAround' then
  154.     return self:turnAround(record)
  155.   end
  156. end
  157.  
  158. function Turtle:doAction(action, record)
  159.   if action == 'forward' then
  160.     return self:forward(record)
  161.   elseif action == 'back' then
  162.     return self:back(record)
  163.   elseif action == 'up' then
  164.     return self:up(record)
  165.   elseif action == 'down' then
  166.     return self:down(record)
  167.   elseif action == 'turnLeft' then
  168.     return self:turnLeft(record)
  169.   elseif action == 'turnRight' then
  170.     return self:turnRight(record)
  171.   elseif action == 'turnAround' then
  172.     return self:turnAround(record)
  173.   end
  174. end
  175.  
  176. function Turtle:rewind(number_of_steps, record)
  177.   local count
  178.   count = 0
  179.   local action
  180.   local return_value
  181.   self.history.rewinding = true
  182.   repeat
  183.     count = count + 1
  184.     action = self.history:undo()
  185.     if action then
  186.         return_value = self:doOppositeAction(action, record)
  187.     else
  188.         return_value = false
  189.     end
  190.   until ((count >= number_of_steps) or (not return_value))
  191.   self.history.rewinding = false
  192.   return return_value
  193. end
  194.  
  195. function Turtle:replay(number_of_steps, record)
  196.   local count
  197.   count = 0
  198.   local action
  199.   local return_value
  200.   self.history.redoing = true
  201.   repeat
  202.     count = count + 1
  203.     action = self.history:redo()
  204.     if action then
  205.         return_value = self:doOppositeAction(action, record)
  206.     else
  207.         return_value = false
  208.     end
  209.   until ((count >= number_of_steps) or (not return_value))
  210.   self.history.redoing = false
  211.   return return_value
  212. end
  213.  
  214. function Turtle:rewindToPosition(position, record)
  215.   while not (self.position:compare(position)) do
  216.     if not self:rewind(1, record) then
  217.       break
  218.     end
  219.   end
  220.   return self.position:compare(position)
  221. end
  222.  
  223. function Turtle:rewindToSavedPosition(position_name, record)
  224.   print("Rewinding to Saved Position: "..position_name)
  225.   local saved_position
  226.   saved_position = self.saved_positions[position_name]
  227.   print("Saved Position: "..saved_position:toString())
  228.   return self:rewindToPosition(saved_position, record)
  229. end
  230.  
  231. function Turtle:replayToPosition(position, record)
  232.   while not (self.position:compare(position)) do    if not self:replay(1, record) then
  233.       break
  234.     end
  235.   end
  236.   return self.position:compare(position)
  237. end
  238.  
  239. function Turtle:replayToSavedPosition(position_name, record)
  240.   local position
  241.   position = self.saved_positions[position_name]
  242.   return self:replayToPosition(position, record)
  243. end
  244.  
  245. function Turtle:printPosition()
  246.   print(self.position:toString())
  247. end
  248.  
  249. function Turtle:goToPosition(position, record)
  250.   if position.y then
  251.     while ( self.position.y < position.y ) do
  252.       self:up(record)
  253.       self:printPosition()
  254.     end
  255.  
  256.     while ( self.position.y > position.y ) do
  257.       self:down(record)
  258.       self:printPosition()
  259.     end
  260.   end
  261.  
  262.   if position.z then
  263.     while ( self.position.z < position.z ) do
  264.       self:turnToFace(2, record)
  265.       self:forward(record)
  266.       self:printPosition()
  267.     end
  268.  
  269.     while ( self.position.z > position.z ) do
  270.       self:turnToFace(0, record)
  271.       self:forward(record)
  272.       self:printPosition()
  273.     end
  274.   end
  275.  
  276.   if position.x then
  277.     while ( self.position.x < position.x ) do
  278.       self:turnToFace(1, record)
  279.       self:forward(record)
  280.       self:printPosition()
  281.     end
  282.  
  283.     while ( self.position.x > position.x ) do
  284.       self:turnToFace(3, record)
  285.       self:forward(record)
  286.       self:printPosition()
  287.     end
  288.   end
  289.  
  290.   if position.face then
  291.     self:turnToFace(position.face, record)
  292.     self:printPosition()
  293.   end
  294. end
Add Comment
Please, Sign In to add comment