SHOW:
|
|
- or go back to the newest paste.
1 | - | --{program="aHarvester",version="1.10",date="2024-10-30"} |
1 | + | --{program="aHarvester",version="1.02c",date="2021-03-05"} |
2 | --------------------------------------- | |
3 | -- aHarvester by Kaikaku | |
4 | - | -- 2024-10-30, v1.10 UI fix |
4 | + | -- 2021-03-05, v1.02c info clar. + gfs() |
5 | - | -- 2021-03-05, v1.02c info clar. + gfs() |
5 | + | |
6 | -- 2021-02-28, v1.00 initial | |
7 | --------------------------------------- | |
8 | ||
9 | --------------------------------------- | |
10 | ---- DESCRIPTION ---------------------- | |
11 | --------------------------------------- | |
12 | -- This program automates the farming | |
13 | -- of many different plants like | |
14 | -- sugarcane, melons, bamboo. Those | |
15 | -- plants must grow from a source | |
16 | -- block, that is not to be harvested. | |
17 | -- Harvested material is droped into | |
18 | -- chest. Fuel is taken from another. | |
19 | -- For more feature details see info | |
20 | -- screens or YouTube. | |
21 | ||
22 | ||
23 | --------------------------------------- | |
24 | ---- ASSUMPTIONS ---------------------- | |
25 | --------------------------------------- | |
26 | -- Turtle is a mining turtle and a | |
27 | -- sample of its landmark block in | |
28 | -- slot 1. | |
29 | ||
30 | ||
31 | --------------------------------------- | |
32 | ---- PARAMETERS ----------------------- | |
33 | --------------------------------------- | |
34 | local cVersion ="v1.02c" | |
35 | local cPrgName ="aHarvester" | |
36 | local cCritFuel =800 -- stops at fuel station / home if lower than this | |
37 | local cMinFuel =2000 -- refuels at fuel station if lower than this | |
38 | local slotFuel=16 | |
39 | local cSleepTime=60 | |
40 | local cMaxTurns =-1 | |
41 | local turnCounter =0 | |
42 | local turnsRemaining =cMaxTurns | |
43 | local blnCreateStartup=false | |
44 | local createStartup = "shell.run('"..cPrgName.." " | |
45 | local blnNoCannibalism=false -- no checks for other turtles (a bit slower) | |
46 | local blnDetectedTurtle=false | |
47 | local cNoCannibalism={} | |
48 | -- Hint: in case of new botonia versions this might need an update! | |
49 | cNoCannibalism[0]="computercraft:turtle_normal" | |
50 | cNoCannibalism[1]="computercraft:turtle_advanced" | |
51 | ||
52 | local harvestedStuff=0 | |
53 | local harvestedStuffTotal=0 | |
54 | ||
55 | --------------------------------------- | |
56 | ---- VARIABLES ------------------------ | |
57 | --------------------------------------- | |
58 | local blnAskForParameters =true | |
59 | ||
60 | local blnDown = true | |
61 | local blnUp = true | |
62 | ||
63 | local landmarkU -- up | |
64 | local landmarkF --forward | |
65 | local landmarkD --down | |
66 | ||
67 | local nextTrunRight = true | |
68 | local nextTrunTurn = false | |
69 | local blnGoOn = true | |
70 | ||
71 | ||
72 | --------------------------------------- | |
73 | ---- Early UI functions --------------- | |
74 | --------------------------------------- | |
75 | local function swapColors() -- <<-- put into template | |
76 | local backColor=term.getBackgroundColor() | |
77 | local textColor=term.getTextColor() | |
78 | ||
79 | term.setBackgroundColor(textColor) | |
80 | term.setTextColor(backColor) | |
81 | end | |
82 | ||
83 | local function printUI(strInput) -- <<-- put into template | |
84 | - | local function printUI(strInput) |
84 | + | |
85 | ||
86 | if strInput=="header" then | |
87 | term.write("") swapColors() print("") swapColors() | |
88 | - | term.write("+-------------------------------------") print("+") |
88 | + | |
89 | term.write("") swapColors() print("") swapColors() | |
90 | - | term.write("+-------------------------------------") print("+") |
90 | + | |
91 | swapColors() print(" ") swapColors() | |
92 | - | term.write("+-------------------------------------") print("+") |
92 | + | |
93 | term.write("") | |
94 | - | term.write("|") |
94 | + | strInput=strInput.." " |
95 | - | strInput=strInput.." " |
95 | + | |
96 | swapColors() print("") swapColors() | |
97 | - | print("|") |
97 | + | |
98 | end | |
99 | ||
100 | --------------------------------------- | |
101 | ---- tArgs ---------------------------- | |
102 | --------------------------------------- | |
103 | local tArgs = {...} -- <<-- transfere concept to template | |
104 | local paraIdentified=false | |
105 | local paraNumberCount=0 | |
106 | term.clear() term.setCursorPos(1,1) | |
107 | ||
108 | -- header | |
109 | if #tArgs~=0 then | |
110 | printUI("header") | |
111 | printUI(""..cPrgName..", "..cVersion..", by Kaikaku. Enjoy!") | |
112 | printUI("line") | |
113 | print("Starting...") | |
114 | end | |
115 | ||
116 | -- check parameters | |
117 | for i=1,#tArgs do | |
118 | blnAskForParameters=false | |
119 | paraIdentified=false | |
120 | -- tet parameters | |
121 | if string.lower(tArgs[i])=="notdown" then | |
122 | paraIdentified=true blnDown=false | |
123 | createStartup=createStartup..tArgs[i].." " | |
124 | print("Option: not dig down!") | |
125 | end | |
126 | if string.lower(tArgs[i])=="notup" then | |
127 | paraIdentified=true blnUp=false | |
128 | createStartup=createStartup..tArgs[i].." " | |
129 | print("Option: not dig up!") | |
130 | end | |
131 | if string.lower(tArgs[i])=="nocannibalism" then | |
132 | paraIdentified=true blnNoCannibalism=true | |
133 | createStartup=createStartup..tArgs[i].." " | |
134 | print("Option: no cannibalism!") | |
135 | end | |
136 | if string.lower(tArgs[i])=="startup" then | |
137 | paraIdentified=true blnCreateStartup=true | |
138 | print("Option: creating startup") | |
139 | end | |
140 | -- text+number parameters | |
141 | if string.sub(string.lower(tArgs[i]),1,7)=="minfuel" then | |
142 | term.write("Option: minFuel "..cMinFuel.."->") | |
143 | paraIdentified=true | |
144 | createStartup=createStartup..tArgs[i].." " | |
145 | cMinFuel=tonumber(string.sub(string.lower(tArgs[i]),8)) | |
146 | print(cMinFuel) | |
147 | end | |
148 | if string.sub(string.lower(tArgs[i]),1,8)=="critfuel" then | |
149 | term.write("Option: critFuel "..cCritFuel.."->") | |
150 | paraIdentified=true | |
151 | createStartup=createStartup..tArgs[i].." " | |
152 | cCritFuel=tonumber(string.sub(string.lower(tArgs[i]),9)) | |
153 | print(cCritFuel) | |
154 | end | |
155 | -- number parameters | |
156 | if not paraIdentified then | |
157 | if paraNumberCount==0 then | |
158 | cSleepTime=tonumber(tArgs[i]) -- no error handling for text | |
159 | paraIdentified=true | |
160 | createStartup=createStartup..tArgs[i].." " | |
161 | paraNumberCount=paraNumberCount+1 | |
162 | print("Option: sleep time = "..cSleepTime) | |
163 | elseif paraNumberCount==1 then | |
164 | cMaxTurns=tonumber(tArgs[i]) -- no error handling for text | |
165 | turnsRemaining=cMaxTurns | |
166 | paraIdentified=true | |
167 | createStartup=createStartup..tArgs[i].." " | |
168 | paraNumberCount=paraNumberCount+1 | |
169 | print("Option: fixed number of turns = "..cMaxTurns) | |
170 | end | |
171 | end | |
172 | if not paraIdentified then | |
173 | error("Error: Unknown parameter "..i..":'"..tArgs[i].."'") | |
174 | end | |
175 | sleep(0.3) | |
176 | end | |
177 | ||
178 | --------------------------------------- -- <<--- put in template | |
179 | ---- startup generation --------------- | |
180 | --------------------------------------- | |
181 | if blnCreateStartup then | |
182 | local newFileName | |
183 | createStartup=createStartup.."')" | |
184 | print("Creating a startup file with: "..createStartup) | |
185 | ||
186 | -- is there already one? | |
187 | if fs.exists("startup.lua") then | |
188 | print(" '".."startup.lua".."' already exists.") | |
189 | newFileName="startup_old_"..os.date("%Y-%m-%d_%H:%M") | |
190 | print(" Renaming to '".."startup.lua".."'") | |
191 | shell.run("rename startup.lua "..newFileName) | |
192 | end | |
193 | if fs.exists("startup") then | |
194 | print(" '".."startup".."' already exists.") | |
195 | newFileName="startup_old_"..os.date("%Y-%m-%d_%H:%M") | |
196 | print(" Renaming to '"..newFileName.."'") | |
197 | shell.run("rename startup "..newFileName) | |
198 | end | |
199 | ||
200 | print("Saving new startup...") | |
201 | ||
202 | ||
203 | local h = fs.open("startup", "w") | |
204 | h.writeLine("-- Automatically created startup by:") | |
205 | h.writeLine("-- "..cPrgName..", "..cVersion..", by Kaikaku") | |
206 | h.writeLine("-- If you are looking for another") | |
207 | h.writeLine("-- startup file, check files like:") | |
208 | h.writeLine("-- 'startup_old_yyyy-mm-dd-tttt'") | |
209 | h.writeLine(createStartup) | |
210 | h.close() | |
211 | ||
212 | end | |
213 | ||
214 | --------------------------------------- | |
215 | -- basic functions for turtle control - | |
216 | --------------------------------------- | |
217 | local function gf() while not turtle.forward() do end end | |
218 | local function gb() while not turtle.back() do end end | |
219 | local function gu() while not turtle.up() do end end | |
220 | local function gd() while not turtle.down() do end end | |
221 | local function gl() while not turtle.turnLeft() do end end | |
222 | local function gr() while not turtle.turnRight() do end end | |
223 | local function df() local returnValue = turtle.dig() turtle.suck() return returnValue end | |
224 | local function gfs(n) if n==nil then n=1 end for i=1,n,1 do while not turtle.forward() do df() end end end | |
225 | local function du() turtle.digUp() turtle.suckUp() end | |
226 | local function dd() turtle.digDown() turtle.suckDown() end | |
227 | local function pf() turtle.place() end | |
228 | local function pu() turtle.placeUp() end | |
229 | local function pd() return turtle.placeDown() end | |
230 | local function sf() turtle.suck() end | |
231 | local function su() turtle.suckUp() end | |
232 | local function sd() turtle.suckDown() end | |
233 | local function Df() turtle.drop() end | |
234 | local function Du(n) turtle.dropUp(n) end | |
235 | local function Dd() turtle.dropDown() end | |
236 | local function ss(s) turtle.select(s) end | |
237 | local function gic(s) return turtle.getItemCount(s) end | |
238 | ||
239 | ||
240 | ||
241 | local function waitKey(strText) | |
242 | local event, scancode | |
243 | write(strText) | |
244 | event, scancode = os.pullEvent("key") | |
245 | print() | |
246 | end | |
247 | ||
248 | local function askForInputText(textt) | |
249 | local at="" | |
250 | -- check prompting texts | |
251 | if textt==nil then textt="Enter text:" end | |
252 | ||
253 | -- ask for input | |
254 | write(textt) | |
255 | at=read() | |
256 | return at | |
257 | end | |
258 | ||
259 | local function checkFuel() | |
260 | local tmp=turtle.getFuelLevel() | |
261 | return tmp | |
262 | end | |
263 | ||
264 | local function checkTurtle() | |
265 | -- turtle? | |
266 | local turtleOk, turtleVal = pcall(checkFuel) | |
267 | if not turtleOk then | |
268 | term.clear() term.setCursorPos(1,1) | |
269 | print("+-------------------------------------+") | |
270 | print(" ",cPrgName,", by Kaikaku") | |
271 | print("+-------------------------------------+") | |
272 | print("| This is a turtle program. |") | |
273 | print("| Please, execute it with a turtle! |") | |
274 | print("+-------------------------------------+") | |
275 | return | |
276 | end | |
277 | end | |
278 | ||
279 | ||
280 | local function sleepDots(sec) | |
281 | if sec==nil then sec=10 end | |
282 | if sec<1 then return end | |
283 | local sleepDotsCounter=0 | |
284 | ||
285 | for i=1,sec-1 do | |
286 | sleepDotsCounter=sleepDotsCounter+1 | |
287 | sleep(1) | |
288 | if sleepDotsCounter<31 then | |
289 | term.write(".") | |
290 | else | |
291 | sleepDotsCounter=1 | |
292 | print() | |
293 | term.write(".") | |
294 | end | |
295 | end | |
296 | ||
297 | sleep(1) | |
298 | print(".") | |
299 | end | |
300 | ||
301 | ||
302 | --------------------------------------- | |
303 | -- additional functions - | |
304 | --------------------------------------- | |
305 | ||
306 | ||
307 | local function dropInventory() | |
308 | for i=2,16 do | |
309 | if gic(i)>0 then | |
310 | ss(i) | |
311 | harvestedStuff=harvestedStuff+gic() | |
312 | Dd() | |
313 | end | |
314 | end | |
315 | ss(1) | |
316 | end | |
317 | ||
318 | local function doCompares() | |
319 | landmarkU=turtle.compareUp() | |
320 | landmarkF=turtle.compare() | |
321 | landmarkD=turtle.compareDown() | |
322 | end | |
323 | ||
324 | local function doRefuel() | |
325 | local fuelAtStart=turtle.getFuelLevel() | |
326 | ||
327 | -- call this only at fuel station | |
328 | if turtle.getFuelLevel() < cMinFuel then | |
329 | -- need to refuel | |
330 | term.write(" Refueling:"..turtle.getFuelLevel()) | |
331 | if gic(slotFuel)==0 then | |
332 | ss(slotFuel) | |
333 | su() | |
334 | turtle.refuel() | |
335 | ss(1) | |
336 | end | |
337 | print(""..turtle.getFuelLevel()) | |
338 | else | |
339 | print(" Fuel is okay.") | |
340 | end | |
341 | return fuelAtStart<turtle.getFuelLevel() | |
342 | end | |
343 | ||
344 | local function checkCritFuel() | |
345 | local currentSlot = turtle.getSelectedSlot() | |
346 | while turtle.getFuelLevel()<cCritFuel do | |
347 | ss(slotFuel) | |
348 | print("Critical fuel level ("..turtle.getFuelLevel().."/"..cCritFuel..")!") | |
349 | term.write(" Please, provide fuel in slot "..slotFuel.."!") | |
350 | while gic(slotFuel)==0 do | |
351 | term.write(".") | |
352 | sleep(1) | |
353 | end | |
354 | turtle.refuel() | |
355 | end | |
356 | ss(currentSlot) | |
357 | end | |
358 | ||
359 | ||
360 | local function suckAll() | |
361 | while turtle.suck() do end | |
362 | while turtle.suckUp() do end | |
363 | while turtle.suckDOwn() do end | |
364 | end | |
365 | ||
366 | local function debugPrint(str) | |
367 | if false then print(str) end | |
368 | end | |
369 | ||
370 | local function inspectFor(blockArray, strDirection) | |
371 | if strDirection==nil then strDirection="f" end | |
372 | local blnOk, data | |
373 | ||
374 | -- inspect | |
375 | if strDirection=="d" then blnOk, data = turtle.inspectDown() | |
376 | elseif strDirection=="u" then blnOk, data = turtle.inspectUp() | |
377 | elseif strDirection=="f" then blnOk, data = turtle.inspect() | |
378 | else | |
379 | print("Warning: Unknown direction '",strDirection,"' in inspectFor, taking (f)orward instead.") | |
380 | strDirection="f" | |
381 | blnOk, data = turtle.inspect() | |
382 | end | |
383 | if data.name~=nil then debugPrint("Found:"..string.lower(data.name)) end | |
384 | -- compare | |
385 | local i=1 | |
386 | while blockArray[i]~=nil do | |
387 | debugPrint("Compare to:"..string.lower(blockArray[i])) | |
388 | if data.name~=nil then | |
389 | if string.lower(data.name) == string.lower(blockArray[i]) then return true end | |
390 | end | |
391 | i=i+1 | |
392 | end | |
393 | ||
394 | return false -- reached a nil value | |
395 | end | |
396 | ||
397 | local function evadeStrategy() | |
398 | local cTurnProbablity=20 | |
399 | local tmpRnd = math.random(0,100) | |
400 | term.write("") | |
401 | if tmpRnd<=cTurnProbablity then | |
402 | gr() term.write("r") | |
403 | elseif tmpRnd<=cTurnProbablity*2 then | |
404 | gl() term.write("l") | |
405 | else | |
406 | term.write("s") sleep(0.8) | |
407 | end | |
408 | end | |
409 | ||
410 | local function handleReport() | |
411 | print(" Harvested items this turn: "..harvestedStuff) | |
412 | harvestedStuffTotal=harvestedStuffTotal+harvestedStuff | |
413 | harvestedStuff=0 | |
414 | print(" Harvested items total: "..harvestedStuffTotal) | |
415 | end | |
416 | ||
417 | local function handleTurnCounter() | |
418 | -- return true if cMaxTurns is reached, else false | |
419 | handleReport() | |
420 | if turnsRemaining==0 then return true end | |
421 | turnCounter=turnCounter+1 | |
422 | if cMaxTurns>=0 then | |
423 | turnsRemaining=turnsRemaining-1 | |
424 | term.write("Turn "..turnCounter.."/"..cMaxTurns..":") | |
425 | else | |
426 | term.write("Turn "..turnCounter..":") | |
427 | end | |
428 | return false | |
429 | end | |
430 | ||
431 | ------------------------------------------------------------------------------ | |
432 | -- main ---------------------------------------------------------------------- | |
433 | ------------------------------------------------------------------------------ | |
434 | checkTurtle() | |
435 | ||
436 | if blnAskForParameters then | |
437 | term.clear() term.setCursorPos(1,1) | |
438 | local iPage=0 | |
439 | local iPageMax=10 | |
440 | term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
441 | repeat | |
442 | printUI("header") | |
443 | printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
444 | printUI("line") | |
445 | -- 1234567890123456789012345678901234567 | |
446 | printUI("This program automates the farming") | |
447 | printUI(" of many different plants like") | |
448 | printUI(" sugar cane, melons, mushrooms,") | |
449 | printUI(" bamboo, kelp and many more. These") | |
450 | printUI(" plants typically grow or spread") | |
451 | printUI(" from a source block. ") | |
452 | printUI("Starting it w/o parameter (as now)") | |
453 | printUI(" shows this info and uses defaults.") | |
454 | printUI("footer") | |
455 | until askForInputText("Press enter when ready:")=="" | |
456 | ||
457 | term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
458 | repeat | |
459 | printUI("header") | |
460 | printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
461 | printUI("line") | |
462 | -- 1234567890123456789012345678901234567 | |
463 | printUI("Determine a landmark block (not dirt)") | |
464 | printUI(" and frame the area in where to har-") | |
465 | printUI(" vest. Place this frame at y level") | |
466 | printUI(" of the turtle is. Put 1 in slot 1.") | |
467 | printUI("The turtle will allways move forward") | |
468 | printUI(" until it hits this block. Then it") | |
469 | printUI(" makes a u-turn right then left...") | |
470 | printUI(" In corners it changes the orient.") | |
471 | printUI("footer") | |
472 | until askForInputText("Press enter when ready:")=="" | |
473 | ||
474 | term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
475 | repeat | |
476 | printUI("header") | |
477 | printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
478 | printUI("line") | |
479 | -- 1234567890123456789012345678901234567 | |
480 | printUI("Put a chest below the turtle level") | |
481 | printUI(" with a landmark block two blocks") | |
482 | printUI(" above, this is the home position.") | |
483 | printUI("Place a chest above the turtle level") | |
484 | printUI(" with a landmark block two blocks") | |
485 | printUI(" below, this is the refuel chest.") | |
486 | printUI("You can have as many home and fuel") | |
487 | printUI(" stations as you like.") | |
488 | printUI("footer") | |
489 | until askForInputText("Press enter when ready:")=="" | |
490 | ||
491 | term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
492 | repeat | |
493 | printUI("header") | |
494 | printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
495 | printUI("line") | |
496 | -- 1234567890123456789012345678901234567 | |
497 | printUI("Side view example:") | |
498 | printUI(" ") | |
499 | printUI(" L c T=turtle") | |
500 | printUI(" Lssssss T L L=landmark block") | |
501 | printUI(" ssssss C L s=sugar cane") | |
502 | printUI(" ssssss C=home chest") | |
503 | printUI(" XXXXXXXXXXXX c=fuel chest") | |
504 | printUI(" XXXXXXXXXXXX X=dirt/etc.") | |
505 | printUI("footer") | |
506 | until askForInputText("Press enter when ready:")=="" | |
507 | ||
508 | term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
509 | repeat | |
510 | printUI("header") | |
511 | printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
512 | printUI("line") | |
513 | -- 1234567890123456789012345678901234567 | |
514 | printUI("Number parameters: ") | |
515 | printUI(" The first number parameter you use") | |
516 | printUI(" determines the waiting time at ") | |
517 | printUI(" the home position (default=60).") | |
518 | printUI(" A second number parameter deter-") | |
519 | printUI(" mines the number of turns ") | |
520 | printUI(" (=reaching home position) if you") | |
521 | printUI(" want to limit the runs.") | |
522 | printUI("footer") | |
523 | until askForInputText("Press enter when ready:")=="" | |
524 | term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
525 | ||
526 | repeat | |
527 | printUI("header") | |
528 | printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
529 | printUI("line") | |
530 | -- 1234567890123456789012345678901234567 | |
531 | printUI("Harvest options: ") | |
532 | printUI(" Turtle will harvest allways blocks ") | |
533 | printUI(" in front of it and by default all") | |
534 | printUI(" blocks above and below it. ") | |
535 | printUI(" To disable harvesting of blocks you") | |
536 | printUI(" use one or both of the following ") | |
537 | printUI(" not case sensitive parameters: ") | |
538 | printUI(" notUp and/or notDown") | |
539 | printUI("footer") | |
540 | until askForInputText("Press enter when ready:")=="" | |
541 | ||
542 | term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
543 | repeat | |
544 | printUI("header") | |
545 | printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
546 | printUI("line") | |
547 | -- 1234567890123456789012345678901234567 | |
548 | printUI("Fuel parameters: At min fuel level") | |
549 | printUI(" (2000) the turtle refuels. With") | |
550 | printUI(" the parameter minFuelxxxx you cust-") | |
551 | printUI(" omize this value to 'xxxx'.") | |
552 | printUI("At crit fuel level (800) the turtle") | |
553 | printUI(" won't move from home or (empty?)") | |
554 | printUI(" fuel stations: Use parameter ") | |
555 | printUI(" critFuelxxxx to change this.") | |
556 | printUI("footer") | |
557 | until askForInputText("Press enter when ready:")=="" | |
558 | ||
559 | term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
560 | repeat | |
561 | printUI("header") | |
562 | printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
563 | printUI("line") | |
564 | -- 1234567890123456789012345678901234567 | |
565 | printUI("Auto startup:") | |
566 | printUI(" If you want the turtle to allways") | |
567 | printUI(" start the program when the world or") | |
568 | printUI(" chunk is loaded, use the parameter:") | |
569 | printUI(" startup") | |
570 | printUI(" This will create a startup pro-") | |
571 | printUI(" gram using the same parameters") | |
572 | printUI(" as the current call.") | |
573 | printUI("footer") | |
574 | until askForInputText("Press enter when ready:")=="" | |
575 | ||
576 | term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
577 | repeat | |
578 | printUI("header") | |
579 | printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
580 | printUI("line") | |
581 | -- 1234567890123456789012345678901234567 | |
582 | printUI("Example calls:") | |
583 | printUI("aHarvester notDown") | |
584 | printUI("->Turtle starts w/ default values, ") | |
585 | printUI(" but no harvesting down.") | |
586 | printUI("aHarvester 120 2 minFuel1000 startup") | |
587 | printUI("->Creates a startup program, 120 sec") | |
588 | printUI(" waiting at home, only 2 runs, min") | |
589 | printUI(" fuel is set to 1000. Turtle starts.") | |
590 | printUI("footer") | |
591 | until askForInputText("Press enter when ready:")=="" | |
592 | ||
593 | term.clear() term.setCursorPos(1,1) iPage=iPage+1 | |
594 | repeat | |
595 | printUI("header") | |
596 | printUI(""..cPrgName..", "..cVersion..", by Kaikaku ("..iPage.."/"..iPageMax..")") | |
597 | printUI("line") | |
598 | -- 1234567890123456789012345678901234567 | |
599 | printUI("Parameter: noCannibalsm") | |
600 | printUI(" You can use multiple turtles in one") | |
601 | printUI(" farm w/o them eating each other.") | |
602 | printUI(" In very rare cases, the hungry ") | |
603 | printUI(" turtle will stop until solved.") | |
604 | printUI("Sorry for this long description, as") | |
605 | printUI(" fall back you can watch the YouTube") | |
606 | printUI(" video. Enjoy!") | |
607 | printUI("footer") | |
608 | until askForInputText("Press enter to START! (stop w/ ctrl+t)")=="" | |
609 | end | |
610 | ||
611 | ||
612 | --------------------------------------- | |
613 | -- main loop - | |
614 | --------------------------------------- | |
615 | ||
616 | -- step 1: check starting stuff | |
617 | ss(1) | |
618 | local tmpSleep=1 | |
619 | while turtle.getItemCount()==0 do | |
620 | print("Put 1 landmark block in slot 1!") | |
621 | print("Sleeping",tmpSleep,"seconds") | |
622 | sleepDots(tmpSleep) | |
623 | tmpSleep=tmpSleep+1 | |
624 | ss(1) | |
625 | end | |
626 | ||
627 | ||
628 | -- step 2: program loop | |
629 | term.write("Inital turn 0:") | |
630 | ||
631 | while blnGoOn do | |
632 | ||
633 | ||
634 | -- step 2.0: need to turn once more? | |
635 | if nextTrunTurn then | |
636 | -- need to turn once more, because of wall last turn | |
637 | nextTrunTurn=false | |
638 | if nextTrunRight then | |
639 | gr() print("r") nextTrunRight=false | |
640 | else | |
641 | gl() print("l") nextTrunRight=true | |
642 | end | |
643 | end | |
644 | ||
645 | -- step 2.1: check for landmarks | |
646 | doCompares() | |
647 | ||
648 | -- step 2.2: handle home base | |
649 | if landmarkU then | |
650 | -- at my base | |
651 | if math.random()<0.95 then | |
652 | print() term.write("Home. ") | |
653 | else | |
654 | print() term.write("I'm home, honey! ") | |
655 | end | |
656 | print("Fuel:",turtle.getFuelLevel().."/"..cMinFuel) | |
657 | print("Dropping inventory:") | |
658 | dropInventory() | |
659 | if handleTurnCounter() then print("Finished all "..cMaxTurns.." turns.") break end | |
660 | print(" Sleeping for "..cSleepTime.." seconds") | |
661 | sleepDots(cSleepTime) | |
662 | checkCritFuel() | |
663 | ||
664 | end | |
665 | ||
666 | -- step 2.3: handle fuel station | |
667 | if landmarkD then | |
668 | -- at fuel station | |
669 | print() print("Fuel station. Fuel:",turtle.getFuelLevel().."/"..cMinFuel) | |
670 | while doRefuel() do end | |
671 | checkCritFuel() | |
672 | end | |
673 | ||
674 | -- step 2.4: handle wall/corner | |
675 | if landmarkF then | |
676 | -- found wall | |
677 | nextTrunTurn=true | |
678 | if nextTrunRight then | |
679 | gr() term.write("r") | |
680 | if turtle.compare() then | |
681 | print() term.write("Changing orientation:") | |
682 | gl() term.write("l") gl() print("l") | |
683 | nextTrunTurn=false | |
684 | nextTrunRight=false | |
685 | end | |
686 | else | |
687 | gl() term.write("l") | |
688 | if turtle.compare() then | |
689 | print() term.write("Changing orientation:") | |
690 | gr() term.write("r") gr() print("r") | |
691 | nextTrunTurn=false | |
692 | nextTrunRight=true | |
693 | end | |
694 | end | |
695 | landmarkF=turtle.compare() | |
696 | end | |
697 | ||
698 | -- step 2.5: dig'n move | |
699 | if blnNoCannibalism then blnDetectedTurtle=inspectFor(cNoCannibalism,"f") end | |
700 | if blnDetectedTurtle then | |
701 | -- found a turtle!! | |
702 | evadeStrategy() | |
703 | else | |
704 | -- regular move | |
705 | if not landmarkF then | |
706 | df() while turtle.suck() do end | |
707 | end | |
708 | if not landmarkU and not landmarkD then | |
709 | if blnUp then du() end while turtle.suckUp() do end | |
710 | if blnDown then dd() end while turtle.suckDown() do end | |
711 | end | |
712 | if not landmarkF then | |
713 | if not landmarkD then while turtle.suckUp() do end end | |
714 | if blnNoCannibalism then blnDetectedTurtle=inspectFor(cNoCannibalism,"f") end | |
715 | if not blnDetectedTurtle then gfs() term.write("") end | |
716 | end | |
717 | end | |
718 | ||
719 | -- step 2.6: safety check | |
720 | while gic(1)~=1 do | |
721 | print() | |
722 | print("Safety violation!") | |
723 | print(" I need exactly 1 landmark block in") | |
724 | print(" slot 1 (currently: "..gic(1)..")!") | |
725 | term.write("Sleeping for 10 sec ") | |
726 | sleepDots(10) | |
727 | end | |
728 | end | |
729 | ||
730 | ||
731 | print("That was quite a bit of work :)") | |
732 | os.sleep(0.4) | |
733 | print("***************************************") | |
734 | print("* Check out YouTube for more videos *") | |
735 | print("* and turtle programs by Kaikaku :) *") | |
736 | print("***************************************") |