rework turtle policies

This commit is contained in:
kepler155c@gmail.com 2019-01-17 13:31:05 -05:00
parent eabfde64e9
commit 644fd0352f
3 changed files with 111 additions and 101 deletions

View File

@ -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

View File

@ -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",

View File

@ -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,26 +263,14 @@ 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
function turtle.refuel(qtyOrName, qty)
if not qtyOrName or type(qtyOrName) == 'number' then
return turtle.native.refuel(qtyOrName or 64)
end
return inventoryAction(turtle.native.refuel, qtyOrName, qty or 64)
end
-- [[ Dig ]] --
turtle.addPolicy('digNone', noop)
function turtle.isTurtleAtSide(side)
local sideType = peripheral.getType(side)
return sideType and sideType == 'turtle'
end
turtle.digPolicies = {
none = noop,
dig = function(action)
turtle.addPolicy('dig', function(action)
return action.dig()
end,
end)
turtleSafe = function(action)
turtle.addPolicy('turtleSafe', function(action)
if action.side == 'back' then
return false
end
@ -278,17 +278,14 @@ turtle.digPolicies = {
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,
end)
digAndDrop = function(action)
turtle.addPolicy('digAndDrop', function(action)
if action.detect() then
local slots = turtle.getInventory()
if action.dig() then
@ -297,13 +294,14 @@ turtle.digPolicies = {
end
end
return false
end
}
end)
turtle.movePolicies = {
none = noop,
default = _defaultMove,
assured = function(action)
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
@ -317,50 +315,54 @@ turtle.movePolicies = {
state.status = oldStatus
end
return true
end,
}
end)
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 },
attack = { attack = turtle.attackPolicies.attack },
defaultMove = { move = turtle.movePolicies.default },
assuredMove = { move = turtle.movePolicies.assured },
}
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
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
function turtle.refuel(qtyOrName, qty)
if not qtyOrName or type(qtyOrName) == 'number' then
return turtle.native.refuel(qtyOrName or 64)
end
return inventoryAction(turtle.native.refuel, qtyOrName, qty or 64)
end
function turtle.isTurtleAtSide(side)
local sideType = peripheral.getType(side)
return sideType and sideType == 'turtle'
end
function turtle.set(args)
for k,v in pairs(args) do
if k == 'attackPolicy' then
turtle.setAttackPolicy(turtle.getPolicy(v))
elseif k == 'digPolicy' then
turtle.setDigPolicy(turtle.getPolicy(v))
elseif k == 'movePolicy' then
turtle.setMovePolicy(turtle.getPolicy(v))
elseif k == 'movementStrategy' then
turtle.setMovementStrategy(v)
elseif k == 'pathingBox' then
turtle.setPathingBox(v)
elseif k == 'point' then
turtle.setPoint(v)
elseif k == 'moveCallback' then
turtle.setMoveCallback(v)
else
error('Invalid turle.set: ' .. tostring(k))
end
end
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()