diff --git a/sys/autorun/gps.lua b/sys/autorun/gps.lua index 8a51fea..856ebad 100644 --- a/sys/autorun/gps.lua +++ b/sys/autorun/gps.lua @@ -19,7 +19,7 @@ if turtle and modem then s = turtle.enableGPS(2) end if not s and config.destructive then - turtle.setPolicy('turtleSafe') + turtle.set({ attackPolicy = 'attack', digPolicy = 'turtleSafe' }) s = turtle.enableGPS(2) end @@ -28,7 +28,7 @@ if turtle and modem then end if config.destructive then - turtle.setPolicy('turtleSafe') + turtle.set({ attackPolicy = 'attack', digPolicy = 'turtleSafe' }) end if not turtle.pathfind(config.home) then diff --git a/sys/etc/app.db b/sys/etc/app.db index 643db6a..f36d4f9 100644 --- a/sys/etc/app.db +++ b/sys/etc/app.db @@ -103,6 +103,11 @@ \030 \031f\030f\0310\136\140\140\030 ", run = "https://gist.github.com/LDDestroier/c7528d95bc0103545c2a/raw", }, + [ "785af2a4ad3c4ee912623c6e0b6d4299ea305bf6" ] = { + title = "Pipes", + category = "Games", + run = "https://pastebin.com/raw/skcs9x1s", + }, [ "53a5d150062b1e03206b9e15854b81060e3c7552" ] = { title = "Minesweeper", category = "Games", diff --git a/sys/extensions/6.tl3.lua b/sys/extensions/6.tl3.lua index dd8f522..58ca25d 100644 --- a/sys/extensions/6.tl3.lua +++ b/sys/extensions/6.tl3.lua @@ -2,8 +2,6 @@ if not _G.turtle then return end -_G.requireInjector(_ENV) - local Pathing = require('turtle.pathfind') local GPS = require('gps') local Point = require('point') @@ -69,8 +67,6 @@ function turtle.reset() return true end -turtle.reset() - local function _dig(name, inspect, dig) if name then local s, b = inspect() @@ -158,6 +154,24 @@ if type(turtle.getFuelLevel()) ~= 'number' then end end +-- [[ Policies ]] -- +turtle.policies = { } + +function turtle.addPolicy(name, policy) + turtle.policies[name] = policy +end + +function turtle.getPolicy(policy) + if type(policy) == 'function' then + return policy + end + local p = turtle.policies[policy] + if not p then + error('Invalid policy: ' .. tostring(policy)) + end + return p +end + -- [[ Basic turtle actions ]] -- local function inventoryAction(fn, name, qty) local slots = turtle.getFilledSlots() @@ -191,18 +205,15 @@ local function _attack(action) return false end -turtle.attackPolicies = { - none = noop, - - attack = function(action) - return _attack(action) - end, -} - function turtle.attack() return _attack(actions.forward) end function turtle.attackUp() return _attack(actions.up) end function turtle.attackDown() return _attack(actions.down) end +turtle.addPolicy('attackNone', noop) +turtle.addPolicy('attack', function(action) + return _attack(action) +end) + function turtle.setAttackPolicy(policy) state.attackPolicy = policy end -- [[ Place ]] -- @@ -240,6 +251,7 @@ function turtle.place(slot) return _place(actions.forward, slot) end function turtle.placeUp(slot) return _place(actions.up, slot) end function turtle.placeDown(slot) return _place(actions.down, slot) end +-- [[ Drop ]] -- local function _drop(action, qtyOrName, qty) if not qtyOrName or type(qtyOrName) == 'number' then return action.drop(qtyOrName or 64) @@ -251,6 +263,64 @@ function turtle.drop(count, slot) return _drop(actions.forward, count, slot) function turtle.dropUp(count, slot) return _drop(actions.up, count, slot) end function turtle.dropDown(count, slot) return _drop(actions.down, count, slot) end +-- [[ Dig ]] -- +turtle.addPolicy('digNone', noop) + +turtle.addPolicy('dig', function(action) + return action.dig() +end) + +turtle.addPolicy('turtleSafe', function(action) + if action.side == 'back' then + return false + end + if not turtle.isTurtleAtSide(action.side) then + return action.dig() + end + return Util.tryTimes(6, function() + os.sleep(.25) + if not action.detect() then + return true + end + end) +end) + +turtle.addPolicy('digAndDrop', function(action) + if action.detect() then + local slots = turtle.getInventory() + if action.dig() then + turtle.reconcileInventory(slots) + return true + end + end + return false +end) + +function turtle.setDigPolicy(policy) state.digPolicy = policy end + +-- [[ Move ]] -- +turtle.addPolicy('moveNone', noop) +turtle.addPolicy('moveDefault', _defaultMove) +turtle.addPolicy('moveAssured', function(action) + if not _defaultMove(action) then + if action.side == 'back' then + return false + end + local oldStatus = state.status + print('assured move: stuck') + state.status = 'stuck' + repeat + os.sleep(1) + until _defaultMove(action) + state.status = oldStatus + end + return true +end) + +function turtle.setMoveCallback(cb) state.moveCallback = cb end +function turtle.clearMoveCallback() state.moveCallback = noop end +function turtle.getMoveCallback() return state.moveCallback end + function turtle.refuel(qtyOrName, qty) if not qtyOrName or type(qtyOrName) == 'number' then return turtle.native.refuel(qtyOrName or 64) @@ -263,104 +333,36 @@ function turtle.isTurtleAtSide(side) return sideType and sideType == 'turtle' end -turtle.digPolicies = { - none = noop, +function turtle.set(args) + for k,v in pairs(args) do - dig = function(action) - return action.dig() - end, + if k == 'attackPolicy' then + turtle.setAttackPolicy(turtle.getPolicy(v)) - turtleSafe = function(action) - if action.side == 'back' then - return false - end - if not turtle.isTurtleAtSide(action.side) then - return action.dig() - end - return Util.tryTimes(6, function() --- if not turtle.isTurtleAtSide(action.side) then --- return true --action.dig() --- end - os.sleep(.25) - if not action.detect() then - return true - end - end) - end, + elseif k == 'digPolicy' then + turtle.setDigPolicy(turtle.getPolicy(v)) - digAndDrop = function(action) - if action.detect() then - local slots = turtle.getInventory() - if action.dig() then - turtle.reconcileInventory(slots) - return true - end - end - return false - end -} + elseif k == 'movePolicy' then + turtle.setMovePolicy(turtle.getPolicy(v)) -turtle.movePolicies = { - none = noop, - default = _defaultMove, - assured = function(action) - if not _defaultMove(action) then - if action.side == 'back' then - return false - end - local oldStatus = state.status - print('assured move: stuck') - state.status = 'stuck' - repeat - os.sleep(1) - until _defaultMove(action) - state.status = oldStatus - end - return true - end, -} + elseif k == 'movementStrategy' then + turtle.setMovementStrategy(v) -turtle.policies = { - none = { dig = turtle.digPolicies.none, attack = turtle.attackPolicies.none }, - digOnly = { dig = turtle.digPolicies.dig, attack = turtle.attackPolicies.none }, - attackOnly = { dig = turtle.digPolicies.none, attack = turtle.attackPolicies.attack }, - digAttack = { dig = turtle.digPolicies.dig, attack = turtle.attackPolicies.attack }, - turtleSafe = { dig = turtle.digPolicies.turtleSafe, attack = turtle.attackPolicies.attack }, + elseif k == 'pathingBox' then + turtle.setPathingBox(v) - attack = { attack = turtle.attackPolicies.attack }, + elseif k == 'point' then + turtle.setPoint(v) - defaultMove = { move = turtle.movePolicies.default }, - assuredMove = { move = turtle.movePolicies.assured }, -} + elseif k == 'moveCallback' then + turtle.setMoveCallback(v) -function turtle.setPolicy(...) - local args = { ... } - for _, policy in pairs(args) do - if type(policy) == 'string' then - policy = turtle.policies[policy] - end - if not policy then - error('Invalid policy') - -- return false, 'Invalid policy' - end - if policy.dig then - state.digPolicy = policy.dig - end - if policy.attack then - state.attackPolicy = policy.attack - end - if policy.move then - state.movePolicy = policy.move + else + error('Invalid turle.set: ' .. tostring(k)) end end - return true end -function turtle.setDigPolicy(policy) state.digPolicy = policy end -function turtle.setMoveCallback(cb) state.moveCallback = cb end -function turtle.clearMoveCallback() state.moveCallback = noop end -function turtle.getMoveCallback() return state.moveCallback end - -- [[ Heading ]] -- function turtle.getHeading() return turtle.point.heading @@ -732,7 +734,7 @@ function turtle.gotoY(dy) return true end --- [[ Slot management ]] -- +-- [[ Inventory ]] -- function turtle.getSlot(indexOrId, slots) if type(indexOrId) == 'string' then slots = slots or turtle.getInventory() @@ -936,6 +938,7 @@ function turtle.getItemCount(idOrName) return count end +-- [[ Equipment ]] -- function turtle.equip(side, item) if item then if not turtle.select(item) then @@ -1235,3 +1238,5 @@ function turtle.addFeatures(...) require('turtle.' .. feature) end end + +turtle.reset()