1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
local numutil = require 'numutil'
local function ensure_equipped(ptype, item)
local cur = peripheral.getType"left"
print(cur)
if cur == ptype then return true end
for i = 1,16 do
local det = turtle.getItemDetail(i)
if det and det.name == item then
turtle.select(i)
return turtle.equipLeft()
end
end
return false, "couldn't find "..item
end
local function ensure_modem() return ensure_equipped("modem","computercraft:wireless_modem_normal") end
local function ensure_scanner() return error("aaa") end
local function turte_pos_init()
assert(ensure_modem())
local POS = vector.new(gps.locate())
while turtle.detect() do turtle.turnRight() end
turtle.forward()
local newpos = vector.new(gps.locate())
turtle.back()
local FACING = newpos - POS
return POS, FACING
end
local POS, FACING = turte_pos_init()
local function moveby_y(delta)
local fn = turtle.up
if delta < 0 then fn = turtle.down delta = -delta end
for i=1,delta do fn() end
end
local function rotatev(v,nq)
-- rotates v by n quarters, clockwise (rightwards)
nq = nq%4
if nq == 0 then return vector.new( v.x, v.y, v.z)
elseif nq == 1 then return vector.new(-v.z, v.y, v.x)
elseif nq == 2 then return vector.new(-v.x, v.y, -v.z)
elseif nq == 3 then return vector.new( v.z, v.y, -v.x)
end
end
local function turn_right()
FACING = rotatev(FACING,1)
turtle.turnRight()
end
local function turn_left()
FACING = rotatev(FACING,-1)
turtle.turnLeft()
end
local function turn_to_face(newfacing)
if newfacing == FACING then return
elseif newfacing == -FACING then turtle.turnRight() turtle.turnRight()
elseif newfacing == rotatev(FACING,1) then turtle.turnRight()
elseif newfacing == rotatev(FACING,-1) then turtle.turnLeft()
else error("invalid facing "..tostring(newfacing),2)
end
end
local function moveby_xz(dv)
if dv.x ~= 0 then
turn_to_face(vector.new(numutil.sign(dv.x), 0, 0))
for i=1,math.abs(dv.x) do turtle.forward() end
end
if dv.z ~= 0 then
turn_to_face(vector.new(0, 0, numutil.sign(dv.z)))
for i=1,math.abs(dv.z) do turtle.forward() end
end
end
local function moveby(delta)
moveby_y(delta.y)
moveby_xz(delta)
end
local datum = vector.new(-18, 128, -1837)
local delta = datum - POS
moveby(delta)
|