View difference between Paste ID: 9KaENBMd and YzLLYEzm
SHOW: | | - or go back to the newest paste.
1
local settings={}
2
settings["debug"]=false
3
settings["reserveFuelLevel"]=10
4
settings["nextStep"]=nil
5
settings["rightNext"]=false
6
settings["leftNext"]=false
7
8
9
--CONSTANTS
10
local cNone=0
11
local cLeft=1
12
local cYes=2
13
local cNo=3
14
local cPowerDown=4
15
local cPowerUp=5
16
local cForward=6
17
local cReadyCharge=7
18
local cComplete=8
19
local cGoHome=9
20
local cRight=10
21
local cReboot=11
22
local cShutdown=12
23
local cClearSettings=13
24
local cNeedFuel=14
25
local cPairing=15
26
27
function loadSettings()
28
   local file = fs.open("SnapBoxSettings","r")
29
   local data = file.readAll()
30
   file.close()
31
   settings=textutils.unserialize(data)
32
end
33
34
function saveSettings()
35
    local file = fs.open("SnapBoxSettings","w")
36
    file.write(textutils.serialize(settings))
37
    file.close()
38
end
39
40
function needFuel()
41
    local level=turtle.getFuelLevel()
42
    if level=="unlimited" or level>settings["reserveFuelLevel"] then
43
        sendMessageToPartner(cNo)
44
    else
45
        sendMessageToPartner(cYes)
46
    end
47
end
48
49
function checkStatus()
50
	if turtle.getItemCount(1)>0 then
51
		print("Energy Cell OK")
52
	else
53
		print("Please insert Locked Energy Tesseract or Redstone Energy Cell into slot 1")
54
		while turtle.getItemCount(1)==0 do
55
			turtle.select(1)
56
			sleep(0.1)
57
		end
58
	end
59
	if turtle.getFuelLevel()~="unlimited" and turtle.getFuelLevel()<settings["reserveFuelLevel"] then
60
        if turtle.getItemCount(16)>0 then
61
            print("Fuel Level OK")
62
        else
63
            turtle.select(16)
64
            print("Please insert fuel into slot 16")
65
            while turtle.getItemCount(16)==0 do
66
                sleep(0.1)
67
            end
68
        end
69
    end
70
end
71
72
function waitForPartner()
73
	print("Waiting for Box")
74
	sendMessageToPartner(cPairing)
75
	local message=nil
76
	while message~=cPairing do
77
        event = os.pullEvent("redstone")
78
        message=redstone.getAnalogInput("front")
79
    end
80
    sendMessageToPartner(cPairing)
81
	print("Off we go")
82
end
83
84
function sendMessageToPartner(message)
85
    if debug==true then
86
        print("Sent "..message)
87
    end
88
    redstone.setAnalogOutput("front",message)
89
    sleep(0.1)
90
    redstone.setAnalogOutput("front",cNone)
91
end
92
93
function forward()
94
    sendMessageToPartner(cForward)
95
    while turtle.forward()==false do
96
        sleep(0.1)
97
    end
98
    if settings["rightNext"]==true then
99
        turtle.turnRight()
100
        settings["rightNext"]=false
101
    end
102
    if settings["leftNext"]==true then
103
        turtle.turnLeft()
104
        settings["leftNext"]=false
105
    end
106
    saveSettings()
107
end
108
109
function readyCharge()
110
    sendMessageToPartner(cReadyCharge)
111
    while turtle.back()==false do
112
        sleep(0.1)
113
    end
114
    settings["nextStep"]="wait-forward"
115
    saveSettings()
116
    waitForward()
117
end
118
119
function waitForward()
120
    sleep(2)
121
    while turtle.detect()==true do
122
        sleep(0.1)
123
    end
124
    sleep(2)
125
    while turtle.forward()==false do
126
        sleep(0.1)
127
    end
128
    settings["nextStep"]=nil
129
    saveSettings()
130
    sendMessageToPartner(cComplete)
131
end
132
133
function powerUp()
134
	turtle.select(1)
135
	turtle.digDown()
136
    sendMessageToPartner(cPowerUp)
137
end
138
139
function powerDown()
140
	turtle.select(1)
141
	while turtle.placeDown()==false and turtle.getItemCount(1)>0 do
142
            sleep(0.1)
143
	end
144
    sendMessageToPartner(cPowerDown)
145
end
146
147
function waitForMessageFromPartner()
148
    if settings["debug"]==true then
149
        print("Waiting for message")
150
    end
151
    os.pullEvent("redstone")
152
153
    --check to see if Box has turned and moved - only works on left turns :(
154
    local msg=redstone.getAnalogInput("front")
155
156
    if msg==cPowerDown then
157
        powerDown()
158
    elseif msg==cPowerUp then
159
        powerUp()
160
    elseif msg==cRight then
161
        settings["rightNext"]=true
162
        saveSettings()
163
        sendMessageToPartner(cRight)
164
    elseif msg==cLeft then
165
        settings["leftNext"]=true
166
        saveSettings()
167
        sendMessageToPartner(cLeft)
168
    elseif msg==cForward then
169
        forward()
170
    elseif msg==cClearSettings then
171
        shell.run("clearsettings")
172
    elseif msg==cShutdown then
173
        os.shutdown()
174
    elseif msg==cReboot then
175
        os.reboot()
176
    elseif msg==cNeedFuel then
177
        needFuel()
178
    elseif msg==cReadyCharge then
179
        readyCharge()
180
    end
181
end
182
183
function checkResume()
184
    local file=fs.open("SnapBoxSettings","r")
185
    if file==nil then
186
        return false
187
    else
188
        file.close()
189
        return true
190
    end
191
end
192
193
194
-----MAIN PROGRAM
195
--Hack to fix situations where Snap gets left behind
196
turtle.forward()
197
198
term.clear()
199
term.setCursorPos(1,1)
200
201
--Check for a resume
202
if checkResume()==false then
203
    --Check to make sure it has all the items it needs
204
    checkStatus()
205
206
    --initial refuel
207
    turtle.select(16)
208
    turtle.refuel()
209
    turtle.select(1)
210
211
    --wait to find partner
212
    waitForPartner()
213
    saveSettings()
214
else
215
    print("Resuming")
216
    loadSettings()
217
end
218
219
while true do
220
    if settings["nextStep"]=="wait-forward" then
221
        waitForward()
222
    end
223
    waitForMessageFromPartner()
224
end