View difference between Paste ID: QhtKKPcL and gkz5sgZ8
SHOW: | | - or go back to the newest paste.
1
--[[ORE COLLECTING MINER V2.6 by BrunoZockt
2
3
MIT License
4
5
Copyright (c) 2018 Bruno Heberle
6
7
Permission is hereby granted, free of charge, to any person obtaining a copy
8
of this software and associated documentation files (the "Software"), to deal
9
in the Software without restriction, including without limitation the rights
10
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
copies of the Software, and to permit persons to whom the Software is
12
furnished to do so, subject to the following conditions:
13
14
The above copyright notice and this permission notice shall be included in all
15
copies or substantial portions of the Software.
16
17
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
SOFTWARE.
24
25
26
V1.0 released 22.07.2016 17kb
27
V1.1 released 16.08.2016 17kb
28
V2.0 released 07.10.2017 35kb
29
V2.1 released 15.12.2017 40kb
30
V2.2 released 17.12.2017 42kb
31
V2.3 released 11.02.2018 46kb
32
V2.4 released 19.06.2018 57kb
33
V2.5 released 15.07.2018 68kb
34
V2.5.1 released 19.08.2018 78kb
35
V2.6 released 16.09.2018 90kb
36
This program is a work in progress and
37
will automatically update itself.
38
If you have any problems, questions or
39
suggestions I'd be happy if you wrote
40
an e-mail to 8run0z0ckt@gmail.com.
41
Feel free to use this program whenever
42
you want. If you want to use parts of
43
my program for developing, do so but
44
don't say it's yours - a sidenote
45
e.g. "by BrunoZockt" would be nice :)
46
If you want to understand this program
47
I recommend to read the variables first
48
and then the rest of the code from the
49
bottom to the top! Maybe I will add
50
some comments for better understanding
51
soon! The names of my functions and
52
variables may sound strange because
53
some are german and others are not
54
really creative, but I hope you
55
understand it anyways ;) ]]--
56
57
local HOST_ENV = _ENV or getfenv()
58
local OUR_ENV = {}
59
60
setmetatable(OUR_ENV, {__index = HOST_ENV, OUR_ENV = OUR_ENV})
61
setfenv(1, OUR_ENV)
62
63
-----###-----configurable variables-----###-----
64
65
settings = {
66
  ["language"] = "en",
67
  ["tunnelspace"] = 4,
68
  ["quantity"] = 10,
69
  ["length"] = 8,
70
  ["ignor"] = {"minecraft:stone", "minecraft:cobblestone", "minecraft:dirt", "minecraft:lava", "minecraft:flowing_lava", "minecraft:water", "minecraft:flowing_water", "minecraft:torch"},
71-
  ["chestSelect"] = 3,
71+
  ["chestSelect"] = 1,
72
  ["torches"] = true,
73
  ["mainTorches"] = true,
74
  ["lateralTorches"] = 1,
75
  ["Autofuel"] = true,
76
  ["floor"] = true,
77
  ["trash"] = false,
78
  ["walls"] = false
79
}
80
81
-----###-----constants-----###-----
82
83
local programName = shell.getRunningProgram()
84
local label = os.getComputerLabel() or "the turtle"
85-
local chestSlot = 16
85+
local chestSlot = 15
86
local fuelLevel = turtle.getFuelLevel()
87
local w, h = term.getSize()
88
local kill = false
89
chestList = {"minecraft:chest", "IronChest:BlockIronChest", "IronChest:BlockIronChest:1", "IronChest:BlockIronChest:2", "IronChest:BlockIronChest:3", "IronChest:BlockIronChest:4", "IronChest:BlockIronChest:5", "IronChest:BlockIronChest:6"}
90-
enderChestList = {"EnderStorage:enderChest", "enderstorage:ender_storage", "ThermalExpansion:Strongbox", "ThermalExpansion:Tesseract"}
90+
enderChestList = {"enderstorage:ender_storage", "ThermalExpansion:Strongbox", "ThermalExpansion:Tesseract"}
91
cardinal = {"North", "West", "South", "East"}
92
93
-----###-----mining variables-----###-----
94
95
variables = {
96
  ["searching"] = false,
97
  ["level"] = 0,
98
  ["direction"] = 1,
99
  ["cache"] = {},
100
  ["maxSpace"] = false,
101
  ["setup"] = false,
102
  ["index"] = 2,
103
  ["slots"] = {"_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_"},
104
  ["torchPositions"] = {},
105
  ["stats"] = {
106
    ["dug"] = 0,
107
    ["ores"] = 0,
108
    ["time"] = 0,
109
    ["moves"] = 0
110
  },
111
  ["TorchDemand"] = 0,
112
  ["orientation"] = {},
113
  ["CrosswayAmount"] = 0,
114
  ["FuelDemand"] = 0,
115
  ["startDay"] = 0,
116
  ["startTime"] = 0
117
}
118
119
-----###-----menu variables-----###-----
120
121
local select = 1
122
local menustate
123
local checkbox = false
124
local gone = {}
125
local timer = {}
126
local chest = {"enderchest", "chest", "none"}
127
local objects = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}
128
local errors = {false, false, false, false, false, false, false, false}
129
local Check = {["Fuellevel"] = false, ["torches"] = false, ["chest"] = false}
130
131
local menuVars = {
132
  ["notificationCenter"] = {
133
    time = 0
134
  },
135
  ["drawOptions"] = {
136
    shift = 0,
137
    shift2 = 0,
138
    saved = false,
139
    scroll = 0,
140
    scroll2 = 0,
141
    focus = 100,
142
    ypos
143
  },
144
  ["drawPopup"] = {
145
    scroll = 0,
146
    lastscroll = 0,
147
    ypos = 9
148
  },
149
  ["drawNews"] = {
150
    scroll = 0
151
  }
152
}
153
154
155
-----###-----helpful functions-----###-----
156
157
function Sprint(str, xpos, ypos)
158
  term.setCursorPos(xpos, ypos)
159
  term.write(str)
160
end
161
162
function printCentered(str, ypos)
163
  term.setCursorPos(w/2 - #str/2 + 1, ypos)
164
  term.write(str)
165
end
166
167
function printRight(str, ypos, xoffset)
168
  if xoffset == nil then
169
    xoffset = 0
170
  end
171
  term.setCursorPos(w - xoffset - (#str - 1), ypos)
172
  term.write(str)
173
end
174
175
function printLeft(str, ypos)
176
  term.setCursorPos(1, ypos)
177
  term.write(str)
178
end
179
180
function printB(tab, y, stop, start)
181
  if start == nil then
182
    start = 1
183
  end
184
  if stop == nil then
185
    stop = w
186
  end
187
  local letters = 0
188
  for i in pairs(tab) do
189
    letters = letters + #tab[i]
190
  end
191
  local space = (stop-start)+1-letters
192
  term.setCursorPos(start, y)
193
  if (space/(#tab+1))%1 == 0 then
194
    for i in ipairs(tab) do
195
      term.write(string.rep(" ", space/(#tab+1))..tab[i])
196
    end
197
  elseif (space/(#tab))%2 == 0 then
198
    term.write(string.rep(" ", (space/#tab)/2))
199
    for i in ipairs(tab) do
200
      term.write(tab[i]..string.rep(" ", space/#tab))
201
    end
202
  elseif space == #tab-1 then
203
    term.write(tab[1])
204
    for i = 2, #tab do
205
      term.write(" "..tab[i])
206
    end
207
  else
208
    for i in ipairs(tab) do
209
      term.write(string.rep(" ", round(space/(#tab-i+2), "u"))..tab[i])
210
      space = space - round(space/(#tab-i+2), "u")
211
    end
212
  end
213
end
214
215
function printWrapped(tab, xpos, ypos, Space, sep)
216
  local sep = sep or " "
217
  if tab[1] == "-" then
218
    Sprint(tab[1]..sep, xpos, ypos)
219
    table.remove(tab, 1)
220
    xpos = xpos+2
221
    Space = Space-2
222
  end
223
  local leftSpace = Space
224
  local newxpos = xpos
225
  for word = 1, #tab do
226
    if Space < #tab[word] + #sep then
227
      return false
228
    elseif leftSpace >= #tab[word]+#sep then
229
      Sprint(tab[word]..sep, newxpos, ypos)
230
      leftSpace = leftSpace - (#tab[word]+#sep)
231
      newxpos = newxpos + #tab[word]+#sep
232
    else
233
      ypos = ypos + 1
234
      leftSpace = Space
235
      Sprint(tab[word]..sep, xpos, ypos)
236
      leftSpace = leftSpace - (#tab[word]+#sep)
237
      newxpos = xpos + (#tab[word]+#sep)
238
    end
239
  end
240
  return ypos
241
end
242
243
function printLine(xpos, start, stop, point, endPoint)
244
  for i = start, stop do
245
    Sprint("|", xpos, i)
246
  end
247
  if point ~= nil then
248
    Sprint(point, xpos, start)
249
    Sprint((endPoint or point), xpos, stop)
250
  end
251
end
252
253
function Splitter(inputstr, sep)
254
  if inputstr == nil then
255
    return nil
256
  elseif sep == nil then
257
    sep = "%s"
258
  end
259
  local t, i = {}, 1
260
  for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
261
    t[i] = str
262
    i = i + 1
263
  end
264
  return t
265
end
266
267
local Version = tonumber(Splitter(os.version())[2])
268
269
function ItemCount(Block, Slot)
270
  if Slot == 0 then
271
    return false
272
  elseif Slot == nil then
273
    return false
274
  end
275
  local loops = 1
276
  if type(Block) == "table" then
277
    loops = #Block
278
  end
279
  if Version >= 1.64 then
280
    for i = 1, loops do
281
      local Data = turtle.getItemDetail(Slot)
282
      if Data == nil then
283
        return 0
284
      elseif loops == 1 then
285
        if Data.name == Block then
286
          return Data.count
287
        end
288
      else
289
        if Data.name == Block[i] then
290
          return Data.count
291
        end
292
      end
293
    end
294
    return false
295
  else
296
    return turtle.getItemCount(Slot)
297
  end
298
end
299
300
function Color()
301
  if Version <= 1.45 then
302
    return false
303
  elseif term.isColor() then
304
    return true
305
  else
306
    return false
307
  end
308
end
309
310
function MoveObjects(deleted, mode)
311
  if mode == 1 then
312
    for k, v in ipairs(gone) do
313
      if v == deleted then
314
        return
315
      end
316
    end
317
    for k, v in ipairs(objects) do
318
      if k > deleted and k < 12 then
319
        objects[k] = objects[k] - 1
320
      end
321
    end
322
    table.insert(gone, deleted)
323
  elseif mode == 2 then
324
    for k, v in ipairs(gone) do
325
      if v == deleted then
326
        table.remove(gone, k)
327
        for k, v in ipairs(objects) do
328
          if k > deleted and k < 12 then
329
            objects[k] = objects[k] + 1
330
          end
331
        end
332
      end
333
    end
334
  end
335
end
336
337
function OreCounter()
338
  if variables.searching == true then
339
    variables.stats["ores"] = variables.stats["ores"] + 1
340
    if variables.stats["ores"] == 1 then
341
      print(lang.status(settings.language, 1))
342
    else
343
      print(lang.status(settings.language, 2, variables.stats["ores"]))
344
    end
345
  end
346
end
347
348
function SlotCalculator(code, param)
349
  local output = {}
350
  local item
351
  if param ~= nil and param ~= "check" then
352
    item = param
353
  elseif param == "check" then
354
    if code == "T" then
355
      item = "minecraft:torch"
356
    elseif code == "C" then
357
      if settings.chestSelect == 1 then
358
        item = enderChestList
359
      elseif settings.chestSelect == 2 then
360
        item = chestList
361
      end
362
    end
363
  end
364
  for n = 1, #variables.slots do
365
    if variables.slots[n] == code then
366
      if param == "empty" then
367
        table.insert(output, n)
368
      elseif param == nil then
369
        if turtle.getItemCount(n) > 0 then
370
          table.insert(output, n)
371
        end
372
      elseif ItemCount(item, n) ~= false and ItemCount(item, n) ~= 0 then
373
        table.insert(output, n)
374
      end
375
    end
376
  end
377
  return output
378
end
379
380
function refuel(Amount, Execute)
381
  local ActualAmount = turtle.getItemCount()
382
  if ActualAmount < Amount then
383
    if Execute == true then
384
      if turtle.refuel() == false then
385
        return false
386
      else
387
        while turtle.refuel() ~= false do
388
        end
389
        return ActualAmount
390
      end
391
    else
392
      return false
393
    end
394
  else
395
    turtle.refuel(Amount)
396
    return true
397
  end
398
end
399
400
function basicInputHandler(orientation, event, key)
401
  if event == "key" then
402
    if key == 28 then
403
      menustate = menu[menustate].options[select]
404
      select = 1
405
    elseif orientation == "vertical" then
406
      if key == 200 and select > 1 then
407
        select = select-1
408
      elseif key == 208 and select < #menu[menustate].options then
409
        select = select + 1
410
      end
411
    else
412
      if key == 203 and select > 1 then
413
        select = select - 1
414
      elseif key == 205 and select < #menu[menustate].options then
415
        select = select + 1
416
      end
417
    end
418
  end
419
end
420
421
function save(path, content, todolist)
422
	local file = fs.open(path, "w")
423
  if todolist then
424
    file.writeLine("todoList = "..textutils.serialize(content))
425
  elseif type(content) == "table" then
426
    for k, v in pairs(content) do
427
      if type(content[k]) == "table" then
428
        file.writeLine(k.." = "..textutils.serialize(content[k]))
429
      else
430
        file.writeLine(k.." = "..tostring(content[k]))
431
      end
432
    end
433
  else
434
	  file.writeLine(content)
435
  end
436
	file.close()
437
end
438
439
function translate(str, category)
440
  if category == "layout" then
441
    n = 35
442
  end
443
  for i = 1, n do
444
    if str == lang[category]("en", i) then
445
      return lang[category](settings.language, i)
446
    end
447
  end
448
end
449
450
function round(int, mode, dez)
451
  if dez == nil then
452
    dez = 1
453
  end
454
  if mode == "d" then
455
    mode = 0.4999
456
  elseif mode == "u" then
457
    mode = 0.5
458
  end
459
  return math.floor(int/dez+mode)*dez
460
end
461
462
local function compile(chunk) -- returns compiled chunk or nil and error message
463
  if type(chunk) ~= "string" then
464
    error("expected string, got ".. type(chunk), 2)
465
  end
466
467
  local function findChunkName(var)
468
    for k,v in pairs(HOST_ENV) do
469
      if v==var then
470
        return k
471
      end
472
    end
473
    return "Unknown chunk"
474
  end
475
476
  return load(chunk, findChunkName(chunk), "t", OUR_ENV)
477
end
478
479
function insert(code)
480
  table.insert(todoList, variables.index, code)
481
  variables.index = variables.index + 1
482
  save("database/OCM/resume/todoList", todoList, true)
483
end
484
485
-----###-----improved functions-----###-----
486
487
function dig(gravel)
488
  local a = false
489
  insert('OreCounter()')
490
  variables.stats["dug"] = variables.stats["dug"] + 1
491
  if gravel then
492
    while turtle.dig() do
493
      os.sleep(0.05)
494
      a = true
495
    end
496
    return a
497
  else
498
    return turtle.dig()
499
  end
500
end
501
502
function digUp()
503
  insert('OreCounter()')
504
  variables.stats["dug"] = variables.stats["dug"] + 1
505
  return turtle.digUp()
506
end
507
508
function digDown()
509
  insert('OreCounter()')
510
  variables.stats["dug"] = variables.stats["dug"] + 1
511
  return turtle.digDown()
512
end
513
514
function face(int)
515
  if int == variables.direction then
516
    return
517
  elseif (int + variables.direction)%2 == 0 then
518
    return turn()
519
  elseif math.abs(int - variables.direction) == 1 then
520
    if variables.direction < int then
521
      return left()
522
    else
523
      return right()
524
    end
525
  else
526
    if variables.direction < int then
527
      return right()
528
    else
529
      return left()
530
    end
531
  end
532
end
533
534
function right()
535
  turtle.turnRight()
536
  variables.direction = variables.direction - 1
537
  if variables.direction == 0 then
538
    variables.direction = 4
539
  end
540
end
541
542
function left()
543
  turtle.turnLeft()
544
  variables.direction = variables.direction + 1
545
  if variables.direction == 5 then
546
    variables.direction = 1
547
  end
548
end
549
550
function turn()
551
  left()
552
  left()
553
end
554
555
function Freeway()
556
  variables.searching = false
557
  insert([[while not turtle.forward() do
558
    if turtle.getFuelLevel() == 0 then
559
      Fuel()
560
    elseif dig() == false then
561
      turtle.attack()
562
    end
563
  end]])
564
  variables.stats["moves"] = variables.stats["moves"] + 1
565
end
566
567
function FreewayUp()
568
  variables.searching = false
569
  insert("variables.level = variables.level + 1")
570
  insert([[while not turtle.up() do
571
    if turtle.getFuelLevel() == 0 then
572
      Fuel()
573
    elseif digUp() == false then
574
      turtle.attackUp()
575
    end
576
  end]])
577
  variables.stats['moves'] = variables.stats['moves'] + 1
578
end
579
580
function FreewayDown()
581
  variables.searching = false
582
  insert("variables.level = variables.level - 1")
583
  insert([[while not turtle.down() do
584
    if turtle.getFuelLevel() == 0 then
585
      Fuel()
586
    elseif digDown() == false then
587
      turtle.attackDown()
588
    end
589
  end]])
590
  variables.stats['moves'] = variables.stats['moves'] + 1
591
end
592
593
function FreewayBack()
594
  variables.searching = false
595
  while not turtle.back() do
596
    if turtle.getFuelLevel() == 0 then
597
      Fuel()
598
    else
599
      turn()
600
      insert([[if dig() == false then
601
        for i = 1, 20 do
602
          turtle.attack()
603
          os.sleep(0.05)
604
        end
605
      end]])
606
      turn()
607
    end
608
  end
609
  variables.stats["moves"] = variables.stats["moves"] + 1
610
end
611
612
613
-----###-----drawMenus-----###-----
614
615
function notificationCenter()
616
  local advice = {
617
  lang.adv(settings.language, 1, ErrorSlot),
618
  lang.adv(settings.language, 2, 1),
619
  lang.adv(settings.language, 3, chestSlot),
620
  lang.adv(settings.language, 4, chestSlot),
621
  lang.adv(settings.language, 5, chestSlot),
622
  lang.adv(settings.language, 6, chestSlot),
623
  lang.adv(settings.language, 7, 1),
624
  lang.adv(settings.language, 8, 1)
625
  }
626
  if menuVars["notificationCenter"].time > 5 then
627
    for i = 1, #errors do
628
      if errors[i] ~= false then
629
        printWrapped(Splitter(advice[i], " "), 1, objects[8], w - 10)
630
        return
631
      end
632
    end
633
  end
634
  for i = 1, 4 do
635
    printLeft(lang.layout(settings.language, i), objects[i+7])
636
  end
637
  menuVars["notificationCenter"].time = menuVars["notificationCenter"].time + 0.5
638
end
639
640
function drawPopup(event, p1, p2, p3)
641
  local errorMessages = {
642
    lang.popup(settings.language, 1, ErrorSlot),
643
    lang.popup(settings.language, 2),
644
    lang.popup(settings.language, 1, chestSlot),
645
    lang.popup(settings.language, 3),
646
    lang.popup(settings.language, 1, chestSlot),
647
    lang.popup(settings.language, 4),
648
    lang.popup(settings.language, 5),
649
    lang.popup(settings.language, 6)
650
  }
651
  local leftBorder = round(w/9, "u")
652
  local rightBorder = round(w+1-w/9, "u")
653
  local winWidth = rightBorder-leftBorder-1
654
655
  menuVars["drawPopup"].lastscroll = menuVars["drawPopup"].scroll
656
657
  if event == "mouse_scroll" then
658
    menuVars["drawPopup"].scroll = menuVars["drawPopup"].scroll - p1
659
  elseif event == "mouse_click" and p1 == 1 then
660
    if p2 == leftBorder+winWidth then
661
      if p3 == 6 then
662
        menuVars["drawPopup"].scroll = menuVars["drawPopup"].scroll + 1
663
      elseif p3 == h-3 then
664
        menuVars["drawPopup"].scroll = menuVars["drawPopup"].scroll - 1
665
      end
666
    end
667
  elseif event == "key" then
668
    if p1 == 208 then
669
      menuVars["drawPopup"].scroll = menuVars["drawPopup"].scroll - 1
670
    elseif p1 == 200 then
671
      menuVars["drawPopup"].scroll = menuVars["drawPopup"].scroll + 1
672
    end
673
  end
674
  if menuVars["drawPopup"].scroll < -(menuVars["drawPopup"].ypos-menuVars["drawPopup"].lastscroll-(math.ceil((h-6)/10)+6)) then
675
    menuVars["drawPopup"].scroll = -(menuVars["drawPopup"].ypos-menuVars["drawPopup"].lastscroll-(math.ceil((h-6)/10)+6))
676
  elseif menuVars["drawPopup"].scroll > 0 then
677
    menuVars["drawPopup"].scroll = 0
678
  end
679
680
  printLine(leftBorder, 4, h-1, "+")
681
  printLine(rightBorder, 4, h-1, "+")
682
  menuVars["drawPopup"].ypos = math.ceil((h-6)/10)+5+menuVars["drawPopup"].scroll
683
  for i = 1, #errors do
684
    if errors[i] == true then
685
      menuVars["drawPopup"].ypos = printWrapped(Splitter("- "..errorMessages[i]), leftBorder+1, menuVars["drawPopup"].ypos+1, winWidth, " ")
686
    end
687
  end
688
  printCentered(string.rep("-", winWidth), 4)
689
  printCentered(string.rep("-", winWidth), h-1)
690
  printCentered(string.rep(" ", winWidth), 5)
691
  printCentered(string.rep(" ", winWidth), 6)
692
  printWrapped(Splitter(lang.popup(settings.language, 7, label)), leftBorder+1, math.ceil((h-6)/10)+4, winWidth, " ")
693
  printCentered(string.rep(" ", winWidth), h-3)
694
  printCentered(string.rep(" ", winWidth), 3)
695
  drawHeader()
696
  printLine(rightBorder-1, 6, h-3, "^", "v")
697
  if select == 1 then
698
    printB({">"..lang.popup(settings.language, 8).."<"," "..lang.popup(settings.language, 9).." ", " "..lang.popup(settings.language, 10).." "}, math.ceil((h-6)/10*9)+4, rightBorder-1, leftBorder+1)
699
  elseif select == 2 then
700
    printB({" "..lang.popup(settings.language, 8).." ",">"..lang.popup(settings.language, 9).."<", " "..lang.popup(settings.language, 10).." "}, math.ceil((h-6)/10*9)+4, rightBorder-1, leftBorder+1)
701
  else
702
    printB({" "..lang.popup(settings.language, 8).." "," "..lang.popup(settings.language, 9).." ", ">"..lang.popup(settings.language, 10).."<"}, math.ceil((h-6)/10*9)+4, rightBorder-1, leftBorder+1)
703
  end
704
end
705
706
function drawHeader()
707
  printCentered("ORE SEARCHING STRIP MINER by BrunoZockt", 1)
708
  printLeft(string.rep("-", w), 2)
709
end
710
711
function drawUpdate(event, p1, p2, p3)
712
  local leftBorder = round(w/6, "u")
713
  local rightBorder = round(w/6*5, "u")
714
  local winWidth = rightBorder-leftBorder-1
715
  local space = round(winWidth-13, "u")
716
  if event == "mouse_click" and p1 == 1 then
717
    if p2 == leftBorder+3 and p3 == math.ceil((h-6)/2)+5 then
718
      checkbox = not checkbox
719
    elseif p3 == math.ceil((h-6)/10*9)+4 then
720
      if p2 >= leftBorder+round(0.25*space, "u")+1 and p2 <= leftBorder+round(0.25*space, "u")+11 then
721
        if select == 1 then
722
          menustate = menu[menustate].options[select]
723
        else
724
          select = 1
725
        end
726
      elseif leftBorder+round(0.75*space, "u")+12 <= p2 and p2 <= leftBorder+round(0.75*space, "u")+13 then
727
        if select == 2 then
728
          menustate = menu[menustate].options[select]
729
        else
730
          select = 2
731
        end
732
      end
733
    end
734
  elseif event == "key" then
735
    if p1 == 203 and select > 1 then
736
      select = select - 1
737
    elseif p1 == 205 and select < #menu[menustate].options then
738
      select = select + 1
739
    elseif p1 == 28 then
740
      menustate = menu[menustate].options[select]
741
    end
742
  end
743
  printCentered(lang.layout(settings.language, 5), math.ceil((h-6)/6.9)+4)
744
  printCentered(string.rep("-", math.floor(w/3*2)), 4)
745
  printCentered(string.rep("-", math.floor(w/3*2)), 12)
746
  printLine(leftBorder, 4, 12, "+")
747
  printLine(rightBorder, 4, 12, "+")
748
  Sprint("_", leftBorder+3, math.ceil((h-6)/2)+4)
749
  Sprint("|_|"..lang.layout(settings.language, 6), leftBorder+2, math.ceil((h-6)/2)+5)
750
  if select == 1 then
751
    printB({">"..lang.layout(settings.language, 7).."<", " "..lang.layout(settings.language, 8).." "}, math.ceil((h-6)/10*9)+4, rightBorder-1, leftBorder+1)
752
  elseif select == 2 then
753
    printB({" "..lang.layout(settings.language, 7).." ", ">"..lang.layout(settings.language, 8).."<"}, math.ceil((h-6)/10*9)+4, rightBorder-1, leftBorder+1)
754
  end
755
  if checkbox == true then
756
    Sprint("X", leftBorder+3, math.ceil((h-6)/2)+5)
757
  end
758
end
759
760
function drawNews(event, p1, p2, p3)
761
  if event == "mouse_scroll" then
762
    menuVars["drawNews"].scroll = menuVars["drawNews"].scroll - p1
763
  elseif event == "key" then
764
    if p1 == 28 then
765
      menustate = menu[menustate].options[select]
766
      select = 1
767
      menuVars["drawNews"].scroll = 0
768
    elseif p1 == 208 then
769
      menuVars["drawNews"].scroll = menuVars["drawNews"].scroll - 1
770
    elseif p1 == 200 then
771
      menuVars["drawNews"].scroll = menuVars["drawNews"].scroll + 1
772
    end
773
  elseif event == "mouse_click" then
774
    if p1 == 1 then
775
      if p2 == w then
776
        if p3 == 3 then
777
          menuVars["drawNews"].scroll = menuVars["drawNews"].scroll + 1
778
        elseif p3 == h then
779
          menuVars["drawNews"].scroll = menuVars["drawNews"].scroll - 1
780
        end
781
      elseif p2 >= w/2-2 and p2 <= w/2+2 and p3 == h then
782
        menustate = menu[menustate].options[select]
783
        select = 1
784
        menuVars["drawNews"].scroll = 0
785
      end
786
    end
787
  end
788
  if menuVars["drawNews"].scroll > 0 then
789
    menuVars["drawNews"].scroll = 0
790
  elseif menuVars["drawNews"].scroll < -283 then
791
    menuVars["drawNews"].scroll = -283
792
  end
793
  Sprint("Patch 2.6", 1, 3+menuVars["drawNews"].scroll)
794
  Sprint("-----------", 1, 4+menuVars["drawNews"].scroll)
795
  Sprint("1.NEW FEATURES", 2, 6+menuVars["drawNews"].scroll)
796
  local ypos = printWrapped(Splitter("- The program will now continue automatically after a server restart."), 3, 7+menuVars["drawNews"].scroll, w-3, " ")
797
  ypos = printWrapped(Splitter("- To achieve this it is very important that there is always one torch available so that the turtle can orientate itself."), 4, ypos+1, w-4, " ")
798
  ypos = printWrapped(Splitter("- The program will also install my Startup Handler in 'startup' so that it can be automatically executed. Any file existing in 'startup' will be moved to 'old_startup' and called whenever there is no program that needs to be resumed."), 4, ypos+1, w-4, " ")
799
  ypos = printWrapped(Splitter("- Everything that needs to be done is written to an extern file, which also takes up some disk space (very unlikely to exceed 10kb). So make sure that there is some file space left."), 4, ypos+1, w-4, " ")
800
  ypos = printWrapped(Splitter("- The options 'chest' and 'enderchest' are now compatible with all the chests from the mods 'Iron chests' and 'Thermal Expansion'."), 4, ypos+1, w-4, " ")
801
  Sprint("2.OPTIMIZATIONS", 2, ypos+2)
802
  ypos = printWrapped(Splitter("- The path of the external files is now including your program name so that you could have multiple instances of the program on one turtle. The updater had to be modified aswell."), 3, ypos+3, w-3, " ")
803
  ypos = printWrapped(Splitter("- This page looks a lot cleaner now."), 3, ypos+3, w-3, " ")
804
  ypos = printWrapped(Splitter("- The variables are now ordered a lot better by splitting them into categories."), 3, ypos+1, w-3, " ")
805
  ypos = printWrapped(Splitter("- Many minor changes in program structure to save a few bytes."), 3, ypos+1, w-3, " ")
806
  Sprint("3.Bug fixes", 2, ypos+2)
807
  ypos = printWrapped(Splitter("- The 'place Walls'-option will now place walls in water or lava like it was originally supposed to (quite stupid mistake on my part)."), 3, ypos+3, w-3, " ")
808
  Sprint("Patch 2.5.1", 1, ypos+2)
809
  Sprint("-----------", 1, ypos+3)
810
  Sprint("1.NEW FEATURES", 2, ypos+5)
811
  ypos = printWrapped(Splitter("- You can now choose to let the turtle build walls and ceiling to prevent the hallways from being flooded by water or lava."), 3, ypos+6, w-3, " ")
812
  ypos = printWrapped(Splitter("- If torches need to be placed, the turtle will now determine it's cardial direction at the beginning of digging."), 3, ypos+1, w-3, " ")
813
  ypos = printWrapped(Splitter("- Torches will -now for real- be placed under all circumstances (see 'Bug fixes')."), 3, ypos+1, w-3, " ")
814
  Sprint("2.OPTIMIZATIONS", 2, ypos+2)
815
  ypos = printWrapped(Splitter("- When trash-option or chest-option is true, the turtle will now keep 1 Stack of cobblestone to place floor or walls, if selected."), 3, ypos+3, w-3, " ")
816
  ypos = printWrapped(Splitter("- Added the page counter in the bottom left"), 3, ypos+1, w-3, " ")
817
  Sprint("3.Bug fixes", 2, ypos+2)
818
  ypos = printWrapped(Splitter("- There was a 50% chance (turtle heading north or south) that 50% of the torches (either on the right or the left crosstunnel) were lost. That is because torches are by default placed heading west if possible. The turtle will now determine where it is heading and adjust the way it places torches accordingly so that it never loses a single torch."), 3, ypos+3, w-3, " ")
819
  ypos = printWrapped(Splitter("- When in default settings, 'chest' was set to 'none' there would be a slot for a chest anyways."), 3, ypos+1, w-3, " ")
820
  ypos = printWrapped(Splitter("- I missed two instances in my code that would cause a crash when no cobblestone was available. However the probability to hit this crash was soooo low that I'm sure nobody ever encountered it."), 3, ypos+1, w-3, " ")
821
  Sprint("Patch 2.5", 1, ypos+2)
822
  Sprint("---------", 1, ypos+3)
823
  Sprint("1.NEW FEATURES", 2, ypos+5)
824
  ypos = printWrapped(Splitter("- If you are using ComputerCraft Version 1.64 or higher, the turtle won't determine whether to mine a block or not by comparing it to the Ignor-slots but by comparing it with the new Ignor-list, which you can add blocks to. This is not only easier and more flexible but also a lot faster."), 3, ypos+6, w-3, " ")
825
  ypos = printWrapped(Splitter("- If you want to, the turtle will now throw away items contained on the Ignor-list."), 3, ypos+1, w-3, " ")
826
  ypos = printWrapped(Splitter("- The decision whether to empty the inventory into a chest, also takes the length of the lateral tunnel into account now, to prevent the loss of items."), 3, ypos+1, w-3, " ")
827
  ypos = printWrapped(Splitter("- Torches will now be placed immediatly after digging the tunnel and not only after searching through the tunnel, to prevent mobspawns."), 3, ypos+1, w-3, " ")
828
  ypos = printWrapped(Splitter("- Torches will now be placed under all circumstances, even if a block for the torch to hold on to has to be placed."), 3, ypos+1, w-3, " ")
829
  ypos = printWrapped(Splitter("- As soon as torch-slots become free because all its torches have been placed, it changes to an empty slot now, which makes it available for ores."), 3, ypos+1, w-3, " ")
830
  ypos = printWrapped(Splitter("- The program wont throw an error and terminate, when it doesn't have blocks it wants to place, it simply doesn't place them."), 3, ypos+1, w-3, " ")
831
  Sprint("2.OPTIMIZATIONS", 2, ypos+2)
832
  ypos = printWrapped(Splitter("- The turtle will also search right and left at the very first two blocks of the tunnel, just in case you are lazy."), 3, ypos+3, w-3, " ")
833
  ypos = printWrapped(Splitter("- When you decide to use no chest, the chest-slot will now be converted to an empty slot, available as inventory."), 3, ypos+1, w-3, " ")
834
  ypos = printWrapped(Splitter("- The floor will now be placed after digging out ores, so that there will definitly be no holes in the ground."), 3, ypos+1, w-3, " ")
835
  ypos = printWrapped(Splitter("- The inventory will now be cleared after finishing."), 3, ypos+1, w-3, " ")
836
  ypos = printWrapped(Splitter("- Optimized the dig() function to run faster, increasing the overall speed of the program drasticly."), 3, ypos+1, w-3, " ")
837
  Sprint("3.Bug fixes", 2, ypos+2)
838
  ypos = printWrapped(Splitter("- In the main hallway, there was a 25% chance that the block a torch was just placed on gets destroyed a second after, and thereby losing the torch."), 3, ypos+3, w-3, " ")
839
  ypos = printWrapped(Splitter("- In rare cases when selected normal chest, the turtle would try to return to its chest after the program had finished, resulting in the turtle vanishing to Australia."), 3, ypos+1, w-3, " ")
840
  ypos = printWrapped(Splitter("- Asking for fuel and taking that fuel wasn't always sync."), 3, ypos+1, w-3, " ")
841
  ypos = printWrapped(Splitter("- The turtle would sometimes put the coal it needs to fuel itself into the chest."), 3, ypos+1, w-3, " ")
842
  ypos = printWrapped(Splitter("- When a tunnellength <= 4 was chosen the turtle placed way too much torches."), 3, ypos+1, w-3, " ")
843
  ypos = printWrapped(Splitter("- Many variables weren't refreshed after changing some options, messing up the preparation page."), 3, ypos+1, w-3, " ")
844
  ypos = printWrapped(Splitter("- When running out of fuel the turtle would think that it encountered an obstacle, constantly digging and hitting the air in front."), 3, ypos+1, w-3, " ")
845
  Sprint("Patch 2.4", 1, ypos+2)
846
  Sprint("---------", 1, ypos+3)
847
  Sprint("1.NEW FEATURES", 2, ypos+5)
848
  ypos = printWrapped(Splitter("- Option to place a floor, if needed"), 3, ypos+6, w-3, " ")
849
  ypos = printWrapped(Splitter("- Option to change language. Currently available: english, german"), 3, ypos+1, w-3, " ")
850
  ypos = printWrapped(Splitter("- Added a scrollbar to the options page, too"), 3, ypos+1, w-3, " ")
851
  Sprint("2.OPTIMIZATIONS", 2, ypos+2)
852
  ypos = printWrapped(Splitter("- The positions of the Buttons are determined more intelligent now, therefore being evenly spaced on every possible monitor size"), 3, ypos+3, w-3, " ")
853
  ypos = printWrapped(Splitter("- The structure of code is more centralized now, which results in faster processing and less blocked storage"), 3, ypos+1, w-3, " ")
854
  ypos = printWrapped(Splitter("- The Buttons of the options page won't slide up anymore when there is enough space, was a stupid feature anyways..."), 3, ypos+1, w-3, " ")
855
  Sprint("3.Bug fixes", 2, ypos+2)
856
  ypos = printWrapped(Splitter("- When more than 12 stacks torches were needed the ignore slots were overwritten, and wouldn't reset even when the options were changed to need less torches"), 3, ypos+3, w-3, " ")
857
  ypos = printWrapped(Splitter("- Fixed a bug that caused the turtle to claim having found an ore, even though it had not"), 3, ypos+1, w-3, " ")
858
  ypos = printWrapped(Splitter("- Fixed a bug where the turtle would place torches at wrong positions when the options were changed before start"), 3, ypos+1, w-3, " ")
859
  ypos = printWrapped(Splitter("- Everytime after placing a torch the turtle would freeze for a few seconds (related to the bug above), this precious time is being saved now"), 3, ypos+1, w-3, " ")
860
  Sprint("Patch 2.3", 1, ypos+2)
861
  Sprint("---------", 1, ypos+3)
862
  Sprint("1.LAYOUT", 2, ypos+5)
863
  ypos = printWrapped(Splitter("- Popup on execution in case of Errors"), 3, ypos+6, w-3, " ")
864
  ypos = printWrapped(Splitter("- Tiny optical improvement on the scrollbar"), 3, ypos+1, w-3, " ")
865
  Sprint("2.NEW FEATURES", 2, ypos+2)
866
  ypos = printWrapped(Splitter("- Option to make the turtle place the floor when it's missing"), 3, ypos+3, w-3, " ")
867
  ypos = printWrapped(Splitter("- Captions in the startmenu are visible for at least 5 seconds now"), 3, ypos+1, w-3, " ")
868
  Sprint("3.Bug fixes", 2, ypos+2)
869
  ypos = printWrapped(Splitter("- Autofuel would always refuel 5 coal, no matter how much was needed"), 3, ypos+3, w-3, " ")
870
  ypos = printWrapped(Splitter("- Options sometimes couldn't be selected or the layout got ugly"), 3, ypos+1, w-3, " ")
871
  ypos = printWrapped(Splitter("- In the startmenu the displayed amount of necessary torches was wrong"), 3, ypos+1, w-3, " ")
872
  Sprint("Patch 2.2", 1, ypos+2)
873
  Sprint("---------", 1, ypos+3)
874
  Sprint("1.NEW LAYOUT", 2, ypos+5)
875
  ypos = printWrapped(Splitter("- The awesome update window!"), 3, ypos+6, w-3, " ")
876
  ypos = printWrapped(Splitter("-> Anti-Annoying-Checkbox ;)"), 4, ypos+1, w-4, " ")
877
  ypos = printWrapped(Splitter("- This awesome news window!"), 3, ypos+1, w-3, " ")
878
  ypos = printWrapped(Splitter("-> Very functional scrollbar (mouse_wheel, arrow-keys or arrow-buttons can be used)"), 4, ypos+1, w-4, " ")
879
  Sprint("2.NEW FEATURES", 2, ypos+2)
880
  ypos = printWrapped(Splitter("- Favorite options are now savable"), 3, ypos+3, w-3, " ")
881
  ypos = printWrapped(Splitter("- There is a new function that, when activated, places torches automatically: Perfectly spaced so no mobs can spawn!!!"), 3, ypos+1, w-3, " ")
882
  ypos = printWrapped(Splitter("- Torches on the main floor are placed instantly now, to prevent mobs from spawning"), 3, ypos+1, w-3, " ")
883
  Sprint("3.Bug fixes", 2, ypos+2)
884
  ypos = printWrapped(Splitter("- Putting wrong items into a torchslot resulted in a wrong Errormessage"), 3, ypos+3, w-3, " ")
885
  ypos = printWrapped(Splitter("- When normal chest was selected, the program crashed trying to deploy the chest"), 3, ypos+1, w-3, " ")
886
  printLeft(string.rep(" ", w-2), h)
887
  printLeft("Page "..tostring(math.ceil((-menuVars["drawNews"].scroll+1)/10)).."/"..tostring(math.ceil((ypos-menuVars["drawNews"].scroll)/10)-1), h)
888
  printCentered(">Ok<", h)
889
  printLine(w, 3, h, "^", "v")
890
  drawHeader()
891
end
892
893
function drawHome(event, p1, p2, p3)
894
  for i = 1, 3 do
895
    printCentered(lang.layout(settings.language, i+8), round((h-5)*(i/4), "u")+i+2)
896
  end
897
  printCentered(string.rep("-", #lang.layout(settings.language, select+8)), round((h-5)*(select/4), "u")+select+3)
898
end
899
900
function drawStart(event, p1, p2, p3)
901
  --Fuellevel
902
  if turtle.getFuelLevel() ~= "unlimited" then
903
    MoveObjects(3, 2)
904
    printLeft(lang.layout(settings.language, 12), objects[3])
905
    if settings.Autofuel then
906
      fuelLevel = turtle.getFuelLevel()
907
      if fuelLevel < 3*variables.FuelDemand/settings.quantity then
908
        Fuellevel = "low"
909
        errors[8] = true
910
        printCentered(lang.layout(settings.language, 13), objects[3])
911
      elseif fuelLevel >= variables.FuelDemand then
912
        Fuellevel = "perfect"
913
        errors[8] = false
914
      elseif fuelLevel > variables.FuelDemand*0.5 then
915
        Fuellevel = "ready"
916
        errors[8] = false
917
      else
918
        Fuellevel = "risky"
919
        errors[8] = false
920
      end
921
    else
922
      if fuelLevel >= variables.FuelDemand*1.5 then
923
        Fuellevel = "perfect"
924
      elseif fuelLevel >= variables.FuelDemand*1 then
925
        Fuellevel = "ready"
926
      else
927
        Fuellevel = "low"
928
        printCentered(lang.layout(settings.language, 13), objects[3])
929
      end
930
    end
931
    if help[1] == false then
932
      help[1] = fuelLevel
933
    end
934
    if Color() then
935
      if Fuellevel == "perfect" then
936
        term.setBackgroundColor(colors.lime)
937
      elseif Fuellevel == "ready" or Fuellevel == "risky" then
938
        term.setBackgroundColor(colors.yellow)
939
      elseif Fuellevel == "low" then
940
        term.setBackgroundColor(colors.red)
941
      end
942
      printRight(fuelLevel.."/"..variables.FuelDemand, objects[3])
943
      term.setBackgroundColor(colors.black)
944
    else
945
      if Fuellevel == "perfect" then
946
        printRight("+ "..fuelLevel.."/"..variables.FuelDemand, objects[3])
947
      elseif Fuellevel == "ready" or Fuellevel == "risky" then
948
        printRight("+/- "..fuelLevel.."/"..variables.FuelDemand, objects[3])
949
      elseif Fuellevel == "low" then
950
        printRight("- "..fuelLevel.."/"..variables.FuelDemand, objects[3])
951
      end
952
    end
953
  else
954
    MoveObjects(3, 1)
955
  end
956
957
  --Torches
958
  local TorchAmount = 0
959
  ErrorSlot = 0
960
  for i = 1, #variables.slots do
961
    if variables.slots[i] == "T" then
962
      if ItemCount("minecraft:torch", i) ~= false then
963
        TorchAmount = TorchAmount + ItemCount("minecraft:torch", i)
964
      else
965
        ErrorSlot = i
966
      end
967
    end
968
  end
969
  if ErrorSlot ~= 0 then
970
    errors[1] = true
971
  else
972
    errors[1] = false
973
  end
974
  if variables.TorchDemand ~= 0 then
975
    MoveObjects(4, 2)
976
    printLeft(lang.layout(settings.language, 14), objects[4])
977
    if TorchAmount < variables.TorchDemand then
978
      Check.torch = false
979
      if Color() then
980
        term.setBackgroundColor(colors.red)
981
      end
982
    else
983
      Check.torch = true
984
      if Color() then
985
        term.setBackgroundColor(colors.lime)
986
      end
987
    end
988
    printRight(TorchAmount.."/"..variables.TorchDemand, objects[4])
989
    if Check.torch == false then
990
      errors[7] = true
991
    else
992
      errors[7] = false
993
    end
994
    term.setBackgroundColor(colors.black)
995
  else
996
    MoveObjects(4, 1)
997
    errors[7] = false
998
  end
999
1000
  --Chest
1001
  errors[2] = false
1002
  errors[3] = false
1003
  errors[4] = false
1004
  errors[5] = false
1005
  errors[6] = false
1006
  Check.chest = false
1007
  if settings.chestSelect == 1 then
1008
    MoveObjects(5, 2)
1009
    printLeft(lang.layout(settings.language, 15), objects[5])
1010
    if Version < 1.64 then
1011
      if turtle.getItemCount(chestSlot) == 0 then
1012
        errors[4] = true
1013
      else
1014
        Check.chest = true
1015
      end
1016
    else
1017
      if ItemCount("minecraft:ender_chest", chestSlot) ~= false and ItemCount("minecraft:ender_chest", chestSlot) > 0 then
1018
        errors[2] = true
1019
      elseif ItemCount(enderChestList, chestSlot) == false then
1020
        errors[3] = true
1021
      elseif ItemCount(enderChestList, chestSlot) == 0 then
1022
        errors[4] = true
1023
      else
1024
        Check.chest = true
1025
      end
1026
    end
1027
  elseif settings.chestSelect == 2 then
1028
    MoveObjects(5, 2)
1029
    printLeft(lang.layout(settings.language, 18), objects[5])
1030
    if ItemCount(chestList, chestSlot) == false then
1031
      errors[5] = true
1032
    elseif ItemCount(chestList, chestSlot) == 0 then
1033
      errors[6] = true
1034
    else
1035
      Check.chest = true
1036
    end
1037
  else
1038
    Check.chest = true
1039
    MoveObjects(5, 1)
1040
  end
1041
  if Check.chest == false then
1042
    if Color() then
1043
      term.setBackgroundColor(colors.red)
1044
    end
1045
    printRight(lang.layout(settings.language, 16), objects[5])
1046
  else
1047
    if Color() then
1048
      term.setBackgroundColor(colors.lime)
1049
    end
1050
    printRight(lang.layout(settings.language, 17), objects[5])
1051
  end
1052
  term.setBackgroundColor(colors.black)
1053
1054
  --Autofuel
1055
  if settings.Autofuel == true then
1056
    MoveObjects(6, 2)
1057
    printLeft(lang.layout(settings.language, 19), objects[6])
1058
    term.setBackgroundColor(colors.lime)
1059
    printRight(lang.layout(settings.language, 17), objects[6])
1060
    term.setBackgroundColor(colors.black)
1061
    if help[4] == false then
1062
      help[4] = turtle.getItemCount(AutofuelSlot)
1063
    end
1064
  else
1065
    MoveObjects(6, 1)
1066
  end
1067
1068
  printLeft(string.rep("-", w), objects[7])
1069
1070
  --Inventory
1071
  if Version < 1.64 then
1072
    for i = 1, #variables.slots do
1073
      if variables.slots[i] == "I" then
1074
        variables.slots[i] = "_"
1075
      end
1076
    end
1077
    for i = 1, settings.ignor do
1078
      variables.slots[i] = "I"
1079
    end
1080
  end
1081
  for k, v in ipairs(SlotCalculator("T", "empty")) do
1082
    variables.slots[v] = "_"
1083
  end
1084
  local stupid = SlotCalculator("_", "empty")
1085
  for k, v in ipairs(stupid) do
1086
    if k > #stupid-math.ceil(variables.TorchDemand/64) then
1087
      variables.slots[v] = "T"
1088
    end
1089
  end
1090
  notificationCenter()
1091
  printRight("|"..variables.slots[1].."|"..variables.slots[2].."|"..variables.slots[3].."|"..variables.slots[4].."|", objects[8])
1092
  printRight("|"..variables.slots[5].."|"..variables.slots[6].."|"..variables.slots[7].."|"..variables.slots[8].."|", objects[9])
1093
  printRight("|"..variables.slots[9].."|"..variables.slots[10].."|"..variables.slots[11].."|"..variables.slots[12].."|", objects[10])
1094
  printRight("|"..variables.slots[13].."|"..variables.slots[14].."|"..variables.slots[15].."|"..variables.slots[16].."|", objects[11])
1095
1096
  if objects[11] < 12 then
1097
    printLeft(string.rep("-", w), 12)
1098
  end
1099
1100
  --Buttons
1101
  if select == 1 then
1102
    printB({">"..lang.layout(settings.language, 20).."<", " "..lang.layout(settings.language, 10).." ", " "..lang.layout(settings.language, 21).." "}, objects[13])
1103
  elseif select == 2 then
1104
    printB({" "..lang.layout(settings.language, 20).." ", ">"..lang.layout(settings.language, 10).."<", " "..lang.layout(settings.language, 21).." "}, objects[13])
1105
  elseif select == 3 then
1106
    printB({" "..lang.layout(settings.language, 20).." ", " "..lang.layout(settings.language, 10).." ", ">"..lang.layout(settings.language, 21).."<"}, objects[13])
1107
  end
1108
1109
  --Action
1110
  if fuelLevel < 3*variables.FuelDemand/settings.quantity then
1111
    local FuelAmount = math.ceil((3*variables.FuelDemand/settings.quantity-fuelLevel)/80)
1112
    for i = 1, #SlotCalculator("_", "minecraft:coal") do
1113
      turtle.select(SlotCalculator("_", "minecraft:coal")[i])
1114
      local output = refuel(FuelAmount, true)
1115
      if output == true then
1116
        errors[8] = false
1117
        Fuellevel = "risky"
1118
      else
1119
        FuelAmount = FuelAmount - output
1120
      end
1121
    end
1122
  end
1123
end
1124
1125
function drawOptions(event, p1, p2, p3)
1126
  if menuVars["drawOptions"].focus == 100 then
1127
    calculateFuelDemand()
1128
    TorchCalculator()
1129
    if menuVars["drawOptions"].saved == true and select == 3 then
1130
      select = 2
1131
    end
1132
  end
1133
  if event == "mouse_scroll" then
1134
    if menuVars["drawOptions"].focus == 100 then
1135
      menuVars["drawOptions"].scroll = menuVars["drawOptions"].scroll - p1
1136
    elseif menuVars["drawOptions"].focus == 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift and ((p1 < 0 and menuVars["drawOptions"].scroll2 < 0) or (p1 >= 0 and h < menuVars["drawOptions"].ypos)) then
1137
      menuVars["drawOptions"].scroll2 = menuVars["drawOptions"].scroll2 - p1
1138
    end
1139
  elseif event == "mouse_click" and p1 == 1 and menuVars["drawOptions"].focus == 100 then
1140
    if p2 == w then
1141
      if p3 == 3 then
1142
        menuVars["drawOptions"].scroll = menuVars["drawOptions"].scroll + 1
1143
      elseif p3 == h then
1144
        menuVars["drawOptions"].scroll = menuVars["drawOptions"].scroll - 1
1145
      end
1146
    else
1147
      menuVars["drawOptions"].focus = p3
1148
      if menuVars["drawOptions"].focus > 15+menuVars["drawOptions"].shift+menuVars["drawOptions"].shift2 or menuVars["drawOptions"].focus > h-3 or menuVars["drawOptions"].focus < 3 then
1149
        menuVars["drawOptions"].focus = 100
1150
      end
1151
    end
1152
  elseif event == "key" then
1153
    if p1 == 28 and menuVars["drawOptions"].focus ~= 0 then
1154
      menuVars["drawOptions"].saved = false
1155
      menuVars["drawOptions"].focus = 100
1156
    elseif p1 == 208 and menuVars["drawOptions"].focus == 100 then
1157
      menuVars["drawOptions"].scroll = menuVars["drawOptions"].scroll - 1
1158
    elseif p1 == 200 and menuVars["drawOptions"].focus == 100 then
1159
      menuVars["drawOptions"].scroll = menuVars["drawOptions"].scroll + 1
1160
    else
1161
      if settings.torches == false then
1162
        if menuVars["drawOptions"].focus == 8+menuVars["drawOptions"].scroll then
1163
          if p1 == 203 and settings.mainTorches == false then
1164
            settings.mainTorches = true
1165
          elseif p1 == 205 and settings.mainTorches == true then
1166
            settings.mainTorches = false
1167
          end
1168
        end
1169
      end
1170
      menuVars["drawOptions"].shift2 = 0
1171
      if Version >= 1.64 then
1172
        if menuVars["drawOptions"].focus == 14+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
1173
          if p1 == 203 and settings.trash == false then
1174
            settings.trash = true
1175
          elseif p1 == 205 and settings.trash == true then
1176
            settings.trash = false
1177
          end
1178
        end
1179
      else
1180
        menuVars["drawOptions"].shift2 = menuVars["drawOptions"].shift2-1
1181
      end
1182
      if menuVars["drawOptions"].focus == 3+menuVars["drawOptions"].scroll then
1183
        if p1 == 203 and settings.language == "de" then
1184
          settings.language = "en"
1185
        elseif p1 == 205 and settings.language == "en" then
1186
          settings.language = "de"
1187
        end
1188
      elseif menuVars["drawOptions"].focus == 4+menuVars["drawOptions"].scroll then
1189
        if p1 == 203 and settings.tunnelspace == 4 then
1190
          settings.tunnelspace = 3
1191
        elseif p1 == 205 and settings.tunnelspace == 3 then
1192
          settings.tunnelspace = 4
1193
        end
1194
      elseif menuVars["drawOptions"].focus == 7+menuVars["drawOptions"].scroll then
1195
        if p1 == 203 and settings.chestSelect > 1 then
1196
          settings.chestSelect = settings.chestSelect - 1
1197
        elseif p1 == 205 and settings.chestSelect < #chest then
1198
          settings.chestSelect = settings.chestSelect + 1
1199
        end
1200
        for k, v in ipairs(chest) do
1201
          if k == settings.chestSelect then
1202
            v = true
1203
          else
1204
            v = false
1205
          end
1206
        end
1207
      elseif menuVars["drawOptions"].focus == 8+menuVars["drawOptions"].scroll then
1208
        if p1 == 203 and settings.torches == false then
1209
          settings.torches = true
1210
        elseif p1 == 205 and settings.torches == true then
1211
          settings.torches = false
1212
        end
1213
      elseif menuVars["drawOptions"].focus == 11+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
1214
        if p1 == 203 and settings.Autofuel == false then
1215
          settings.Autofuel = true
1216
        elseif p1 == 205 and settings.Autofuel == true then
1217
          settings.Autofuel = false
1218
        end
1219
      elseif menuVars["drawOptions"].focus == 12+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
1220
        if p1 == 203 and settings.floor == false then
1221
          settings.floor = true
1222
        elseif p1 == 205 and settings.floor == true then
1223
          settings.floor = false
1224
        end
1225
      elseif menuVars["drawOptions"].focus == 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
1226
        if p1 == 200 and menuVars["drawOptions"].scroll2 < 0 then
1227
          menuVars["drawOptions"].scroll2 = menuVars["drawOptions"].scroll2+1
1228
        elseif p1 == 208 and h < menuVars["drawOptions"].ypos then
1229
          menuVars["drawOptions"].scroll2 = menuVars["drawOptions"].scroll2-1
1230
        elseif Version >= 1.64 then
1231
          if p1 == 57 or p1 == 14 then
1232
            for i = 1, 16 do
1233
              local data = turtle.getItemDetail(i)
1234
              if data then
1235
                for k, v in ipairs(settings.ignor) do
1236
                  if v == data.name then
1237
                    table.remove(settings.ignor, k)
1238
                  end
1239
                end
1240
                if p1 == 57 then
1241
                  table.insert(settings.ignor, data.name)
1242
                end
1243
              end
1244
            end
1245
          end
1246
        end
1247
      elseif menuVars["drawOptions"].focus == 15+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
1248
        if p1 == 203 and settings.walls == false then
1249
          settings.walls = true
1250
        elseif p1 == 205 and settings.walls == true then
1251
          settings.walls = false
1252
        end
1253
      end
1254
    end
1255
  end
1256
  if menuVars["drawOptions"].scroll > 0 then
1257
    menuVars["drawOptions"].scroll = 0
1258
  elseif menuVars["drawOptions"].scroll < -(5+menuVars["drawOptions"].shift+menuVars["drawOptions"].shift2) then
1259
    menuVars["drawOptions"].scroll = -(5+menuVars["drawOptions"].shift+menuVars["drawOptions"].shift2)
1260
  end
1261
1262
  if settings.torches == false then
1263
    if menuVars["drawOptions"].focus == 9+menuVars["drawOptions"].scroll then
1264
      printLeft(lang.layout(settings.language, 31), menuVars["drawOptions"].focus)
1265
      if settings.mainTorches == true then
1266
        printRight(">"..lang.layout(settings.language, 29).."<  "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
1267
      else
1268
        printRight(lang.layout(settings.language, 29).."  >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
1269
      end
1270
    elseif menuVars["drawOptions"].focus == 10+menuVars["drawOptions"].scroll then
1271
      printLeft(lang.layout(settings.language, 32), menuVars["drawOptions"].focus)
1272
      term.setCursorPos(w-2, menuVars["drawOptions"].focus)
1273
      settings.lateralTorches = tonumber(read())
1274
      term.clear()
1275
      drawHeader()
1276
      return drawOptions("key", 28)
1277
    end
1278
    menuVars["drawOptions"].shift = 0
1279
  else
1280
    menuVars["drawOptions"].shift = -2
1281
  end
1282
  if Version >= 1.64 then
1283
    if menuVars["drawOptions"].focus == 14+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
1284
      printLeft(lang.layout(settings.language, 39), menuVars["drawOptions"].focus)
1285
      if settings.trash == true then
1286
        printRight(">"..lang.layout(settings.language, 29).."<  "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
1287
      else
1288
        printRight(lang.layout(settings.language, 29).."  >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
1289
      end
1290
    end
1291
  end
1292
  if menuVars["drawOptions"].focus == 3+menuVars["drawOptions"].scroll then
1293
    printLeft(lang.layout(settings.language, 34), menuVars["drawOptions"].focus)
1294
    if settings.language == "en" then
1295
      printRight(">en<   de ", menuVars["drawOptions"].focus)
1296
    else
1297
      printRight("en   >de<", menuVars["drawOptions"].focus)
1298
    end
1299
  elseif menuVars["drawOptions"].focus == 4+menuVars["drawOptions"].scroll then
1300
    printLeft(lang.layout(settings.language, 22), menuVars["drawOptions"].focus)
1301
    if settings.tunnelspace == 3 then
1302
      printRight(">2<  3 ", menuVars["drawOptions"].focus)
1303
    else
1304
      printRight("2  >3<", menuVars["drawOptions"].focus)
1305
    end
1306
  elseif menuVars["drawOptions"].focus == 5+menuVars["drawOptions"].scroll then
1307
    printLeft(lang.layout(settings.language, 23), menuVars["drawOptions"].focus)
1308
    term.setCursorPos(w-2, menuVars["drawOptions"].focus)
1309
    settings.quantity = tonumber(read())
1310
    term.clear()
1311
    drawHeader()
1312
    return drawOptions("key", 28)
1313
  elseif menuVars["drawOptions"].focus == 6+menuVars["drawOptions"].scroll then
1314
    printLeft(lang.layout(settings.language, 24), menuVars["drawOptions"].focus)
1315
    term.setCursorPos(w-2, menuVars["drawOptions"].focus)
1316
    settings.length = tonumber(read())
1317
    term.clear()
1318
    drawHeader()
1319
    return drawOptions("key", 28)
1320
  elseif menuVars["drawOptions"].focus == 7+menuVars["drawOptions"].scroll then
1321
    printLeft(lang.layout(settings.language, 18), menuVars["drawOptions"].focus)
1322
    variables.slots[16] = "C"
1323
    if settings.chestSelect == 1 then
1324
      printRight(">"..lang.layout(settings.language, 25).."< "..lang.layout(settings.language, 26).."  "..lang.layout(settings.language, 27).." ", menuVars["drawOptions"].focus)
1325
    elseif settings.chestSelect == 2 then
1326
      printRight(lang.layout(settings.language, 25).." >"..lang.layout(settings.language, 26).."< "..lang.layout(settings.language, 27).." ", menuVars["drawOptions"].focus)
1327
    else
1328
      printRight(lang.layout(settings.language, 25).."  "..lang.layout(settings.language, 26).." >"..lang.layout(settings.language, 27).."<", menuVars["drawOptions"].focus)
1329
      if variables.slots[16] == "C" then
1330
        variables.slots[16] = "_"
1331
      end
1332
    end
1333
  elseif menuVars["drawOptions"].focus == 8+menuVars["drawOptions"].scroll then
1334
    printLeft(lang.layout(settings.language, 28), menuVars["drawOptions"].focus)
1335
    if settings.torches == true then
1336
      printRight(">"..lang.layout(settings.language, 29).."< "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
1337
    else
1338
      printRight(" "..lang.layout(settings.language, 29).." >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
1339
    end
1340
  elseif menuVars["drawOptions"].focus == 11+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
1341
    printLeft(lang.layout(settings.language, 19), menuVars["drawOptions"].focus)
1342
    if settings.Autofuel == true then
1343
      printRight(">"..lang.layout(settings.language, 29).."<   "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
1344
    else
1345
      printRight(lang.layout(settings.language, 29).."   >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
1346
    end
1347
  elseif menuVars["drawOptions"].focus == 12+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
1348
    printLeft(lang.layout(settings.language, 33), menuVars["drawOptions"].focus)
1349
    if settings.floor == true then
1350
      printRight(">"..lang.layout(settings.language, 29).."<   "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
1351
    else
1352
      printRight(lang.layout(settings.language, 29).."   >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
1353
    end
1354
  elseif menuVars["drawOptions"].focus == 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
1355
    if Version >= 1.64 then
1356
      printLeft(lang.layout(settings.language, 36), 3)
1357
      local ypos = printWrapped(textutils.unserialize(string.gsub(textutils.serialize(settings.ignor), "minecraft:(%a+)", function(q) return q.."," end)), 1, 4, w)
1358
      menuVars["drawOptions"].ypos = printWrapped(Splitter(lang.layout(settings.language, 37, label)), 1, ypos+2+menuVars["drawOptions"].scroll2, w-1)
1359
      for i = 1, ypos+1 do
1360
        printLeft(string.rep(" ", w), i)
1361
      end
1362
      drawHeader()
1363
      printLeft(lang.layout(settings.language, 36), 3)
1364
      printWrapped(textutils.unserialize(string.gsub(textutils.serialize(settings.ignor), "minecraft:(%a+_*%a*)", function(q) return q.."," end)), 1, 4, w)
1365
      printLine(w, ypos+2, h, "^", "v")
1366
    else
1367
      printLeft(lang.layout(settings.language, 38), menuVars["drawOptions"].focus)
1368
      term.setCursorPos(w-2, menuVars["drawOptions"].focus)
1369
      settings.ignor = tonumber(read())
1370
      term.clear()
1371
      drawHeader()
1372
      return drawOptions("key", 28)
1373
    end
1374
  elseif menuVars["drawOptions"].focus == 15+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift then
1375
    printLeft(lang.layout(settings.language, 40), menuVars["drawOptions"].focus)
1376
    if settings.walls == true then
1377
      printRight(">"..lang.layout(settings.language, 29).."<   "..lang.layout(settings.language, 30).." ", menuVars["drawOptions"].focus)
1378
    else
1379
      printRight(lang.layout(settings.language, 29).."   >"..lang.layout(settings.language, 30).."<", menuVars["drawOptions"].focus)
1380
    end
1381
  elseif menuVars["drawOptions"].focus == 100 then
1382
    printLeft(lang.layout(settings.language, 34), 3+menuVars["drawOptions"].scroll)
1383
    printLeft(lang.layout(settings.language, 22), 4+menuVars["drawOptions"].scroll)
1384
    printLeft(lang.layout(settings.language, 23), 5+menuVars["drawOptions"].scroll)
1385
    printLeft(lang.layout(settings.language, 24), 6+menuVars["drawOptions"].scroll)
1386
    printLeft(lang.layout(settings.language, 18), 7+menuVars["drawOptions"].scroll)
1387
    printLeft(lang.layout(settings.language, 28), 8+menuVars["drawOptions"].scroll)
1388
    if settings.torches == false then
1389
      printLeft(lang.layout(settings.language, 31), 9+menuVars["drawOptions"].scroll)
1390
      printLeft(lang.layout(settings.language, 32), 10+menuVars["drawOptions"].scroll)
1391
    end
1392
    printLeft(lang.layout(settings.language, 19), 11+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift)
1393
    printLeft(lang.layout(settings.language, 33), 12+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift)
1394
    printLeft("#"..lang.layout(settings.language, 36), 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift)
1395
    printLeft(lang.layout(settings.language, 39), 14+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift)
1396
    printLeft(lang.layout(settings.language, 40), 15+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift)
1397
    printRight(settings.language, 3+menuVars["drawOptions"].scroll, 1)
1398
    printRight(tostring(settings.tunnelspace-1), 4+menuVars["drawOptions"].scroll, 1)
1399
    printRight(tostring(settings.quantity), 5+menuVars["drawOptions"].scroll, 1)
1400
    printRight(tostring(settings.length), 6+menuVars["drawOptions"].scroll, 1)
1401
    printRight(translate(chest[tonumber(settings.chestSelect)], "layout"), 7+menuVars["drawOptions"].scroll, 1)
1402
    printRight(translate(tostring(settings.torches), "layout"), 8+menuVars["drawOptions"].scroll, 1)
1403
    if settings.torches == false then
1404
      printRight(translate(tostring(settings.mainTorches), "layout"), 9+menuVars["drawOptions"].scroll, 1)
1405
      printRight(tostring(settings.lateralTorches), 10+menuVars["drawOptions"].scroll, 1)
1406
    end
1407
    printRight(translate(tostring(settings.Autofuel), "layout"), 11+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
1408
    printRight(translate(tostring(settings.floor), "layout"), 12+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
1409
    if Version >= 1.64 then
1410
      printRight(tostring(#settings.ignor-4), 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
1411
    else
1412
      printRight(tostring(settings.ignor), 13+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
1413
    end
1414
    printRight(translate(tostring(settings.trash), "layout"), 14+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
1415
    printRight(translate(tostring(settings.walls), "layout"), 15+menuVars["drawOptions"].scroll+menuVars["drawOptions"].shift, 1)
1416
    printLeft(string.rep(" ", w-1), h)
1417
    printLeft(string.rep(" ", w-1), h-1)
1418
    printLeft(string.rep(" ", w-1), h-2)
1419
    printB({lang.layout(settings.language, 9), lang.layout(settings.language, 21), lang.layout(settings.language, 35)}, 12)
1420
    if select == 1 then
1421
      printB({string.rep("_", #lang.layout(settings.language, 9)), string.rep(" ", #lang.layout(settings.language, 21)), string.rep(" ", #lang.layout(settings.language, 35))}, 13)
1422
    elseif select == 2 then
1423
      printB({string.rep(" ", #lang.layout(settings.language, 9)), string.rep("_", #lang.layout(settings.language, 21)), string.rep(" ", #lang.layout(settings.language, 35))}, 13)
1424
    else
1425
      printB({string.rep(" ", #lang.layout(settings.language, 9)), string.rep(" ", #lang.layout(settings.language, 21)), string.rep("_", #lang.layout(settings.language, 35))}, 13)
1426
    end
1427
    printLine(w, 3, h-2, "^", "v")
1428
    drawHeader()
1429
  end
1430
end
1431
1432
function drawResume(time)
1433
  term.setCursorPos(1, 3)
1434
  print("Program will resume in "..tostring(time).." seconds.\n")
1435
  print("Press Enter to stop resuming...")
1436
end
1437
1438
menu = {
1439
  ["Update"] = {
1440
    options = {"News", "Home"},
1441
    orientation = "horizontal",
1442
    draw = drawUpdate
1443
  },
1444
  ["News"] = {
1445
    options = {"Home"},
1446
    orientation = "horizontal",
1447
    draw = drawNews
1448
  },
1449
  ["Home"] = {
1450
    options = {"Start", "Options", "Quit"},
1451
    orientation = "vertical",
1452
    draw = drawHome
1453
  },
1454
  ["Start"] = {
1455
    options = {"Go!", "Options", "Home"},
1456
    orientation = "horizontal",
1457
    draw = drawStart
1458
  },
1459
  ["Options"] = {
1460
    options = {"Start", "Home", "Save as default"},
1461
    orientation = "horizontal",
1462
    draw = drawOptions
1463
  },
1464
  ["Popup"] = {
1465
    options = {"Go!", "Start", "Quit"},
1466
    orientation = "horizontal",
1467
    draw = drawPopup
1468
  }
1469
}
1470
1471
-----###-----sequences-----###-----
1472
1473
function Return()
1474
  face(1)
1475
  if #variables.cache == 0 then
1476
    return
1477
  elseif variables.cache[#variables.cache] == 5 then
1478
    insert('FreewayDown()')
1479
  elseif variables.cache[#variables.cache] == 6 then
1480
    insert('FreewayUp()')
1481
  else
1482
    insert('FreewayBack()')
1483
    insert('variables.direction = variables.cache[#variables.cache]')
1484
  end
1485
  insert('face(1)')
1486
  insert('table.remove(variables.cache, #variables.cache)')
1487
end
1488
1489
function compare(method, slotNum)
1490
  turtle.select(slotNum)
1491
  if method == "down" then
1492
    return turtle.compareDown()
1493
  elseif method == "up" then
1494
    return turtle.compareUp()
1495
  elseif method == "front" then
1496
    return turtle.compare()
1497
  end
1498
end
1499
1500
function CompareDown(walls)
1501
  if Version >= 1.64 then
1502
    local boolean, data = turtle.inspectDown()
1503
    if boolean then
1504
      for k, v in pairs(settings.ignor) do
1505
        if v == data.name then
1506
          return
1507
        end
1508
      end
1509
    else
1510
      return
1511
    end
1512
  elseif turtle.detectDown() then
1513
    for k, v in pairs(SlotCalculator("I")) do
1514
      if compare("down", k) == true then
1515
        return
1516
      end
1517
    end
1518
  else
1519
    return
1520
  end
1521
  insert('variables.searching = true')
1522
  insert('turtle.select(SlotCalculator("_", "empty")[1])')
1523
  insert('digDown()')
1524
  insert('FreewayDown()')
1525
  insert('table.insert(variables.cache, 6)')
1526
  insert('CompareAll("CompareUp()")')
1527
end
1528
1529
function CompareUp(walls)
1530
  if Version >= 1.64 then
1531
    local boolean, data = turtle.inspectUp()
1532
    if boolean then
1533
      for k, v in pairs(settings.ignor) do
1534
        if v == data.name then
1535
          return (walls and placeWall("placeUp")) or nil
1536
        end
1537
      end
1538
    else
1539
      return (walls and placeWall("placeUp")) or nil
1540
    end
1541
  elseif turtle.detectUp() then
1542
    for k, v in pairs(SlotCalculator("I")) do
1543
      if compare("up", k) == true then
1544
        return
1545
      end
1546
    end
1547
  else
1548
    return (walls and placeWall("placeUp")) or nil
1549
  end
1550
  insert('variables.searching = true')
1551
  insert('turtle.select(SlotCalculator("_", "empty")[1])')
1552
  insert('digUp()')
1553
  insert('FreewayUp()')
1554
  insert('table.insert(variables.cache, 5)')
1555
  if walls == true then
1556
    insert('placeWall()')
1557
  end
1558
  insert('CompareAll("CompareDown()")')
1559
end
1560
1561
function CompareRight(walls)
1562
  Compare(4, walls)
1563
end
1564
1565
function CompareBack(walls)
1566
  Compare(3, walls)
1567
end
1568
1569
function CompareLeft(walls)
1570
  Compare(2, walls)
1571
end
1572
1573
function Compare(facing, walls)
1574
  if facing == nil then
1575
    facing = 1
1576
  elseif type(facing) == "boolean" then
1577
    walls = facing
1578
    facing = 1
1579
  end
1580
  face(facing)
1581
  if Version >= 1.64 then
1582
    local boolean, data = turtle.inspect()
1583
    if boolean then
1584
      for k, v in pairs(settings.ignor) do
1585
        if v == data.name then
1586
          return (walls and placeWall("placeUp")) or nil
1587
        end
1588
      end
1589
    else
1590
      return (walls and placeWall()) or nil
1591
    end
1592
  elseif turtle.detect() then
1593
    for k, v in pairs(SlotCalculator("I")) do
1594
      if compare("front", k) == true then
1595
        return
1596
      end
1597
    end
1598
  else
1599
    return (walls and placeWall()) or nil
1600
  end
1601
  insert('variables.searching = true')
1602
  insert('turtle.select(SlotCalculator("_", "empty")[1])')
1603
  insert('dig()')
1604
  insert('Freeway()')
1605
  insert('table.insert(variables.cache, variables.direction)')
1606
  if walls == true then
1607
    insert('placeWall("placeUp")')
1608
  end
1609
  insert('variables.direction = 1')
1610
  insert('CompareAll("CompareBack()")')
1611
end
1612
1613
function CompareAll(...)
1614
  local exceptions = {...}
1615
  local walls
1616
  if type(exceptions[1]) == "boolean" then
1617
    walls = exceptions[1]
1618
    table.remove(exceptions, 1)
1619
  end
1620
  insert('Compare()')
1621
  insert('CompareLeft()')
1622
  insert('CompareBack()')
1623
  insert('CompareRight()')
1624
  insert('CompareUp()')
1625
  insert('CompareDown()')
1626
  insert('Return()')
1627
  local sub = 0
1628
  for j = 2, 8-sub do
1629
    for k, v in ipairs(exceptions) do
1630
      if v == todoList[j] then
1631
        table.remove(todoList, j)
1632
        table.remove(exceptions, k)
1633
        j = j - 1
1634
        sub = sub + 1
1635
      end
1636
    end
1637
  end
1638
  if walls == true then
1639
    for i = 2, 15 do
1640
      if todoList[i] == 'Return()' then
1641
        break
1642
      elseif string.find(todoList[i], 'placeWall(') == nil then
1643
        if string.find(todoList[i], 'Up') ~= nil then
1644
          table.insert(todoList, i+1, 'placeWall("placeUp")')
1645
        elseif string.find(todoList[i], 'Down') == nil then
1646
          table.insert(todoList, i+1, 'placeWall()')
1647
        end
1648
      end
1649
    end
1650
  end
1651
end
1652
1653
function trash(keptCobble)
1654
  for k, v in ipairs(SlotCalculator("_")) do
1655
    local data = turtle.getItemDetail(v)
1656
    for k2, v2 in pairs(settings.ignor) do
1657
      if v2 == data.name then
1658
        if not keptCobble and v2 == "minecraft:cobblestone" then
1659
          keptCobble = true
1660
        else
1661
          turtle.select(v)
1662
          turtle.drop()
1663
        end
1664
      end
1665
    end
1666
  end
1667
end
1668
1669
function Enderchest(keptCoal, keptCobble)
1670
  if (#SlotCalculator("_") >= #SlotCalculator("_", "empty")-1-math.ceil(settings.length/12) or keptCoal == true) and #SlotCalculator("C", "check") ~= 0 then
1671
    turtle.select(SlotCalculator("C", "check")[1])
1672
    if variables.level == 1 then
1673
      insert('FreewayDown()')
1674
    end
1675
    insert('FreewayBack()')
1676
    insert([[while not turtle.place() do
1677
      turtle.attack()
1678
    end]])
1679
    insert([[for k, v in ipairs(SlotCalculator("_")) do
1680
      if settings.Autofuel and not keptCoal and Version >= 1.64 and turtle.getItemDetail(v).name == "minecraft:coal" then
1681
        keptCoal = true
1682
      elseif not keptCobble and v == "minecraft:cobblestone" then
1683
        keptCobble = true
1684
      else
1685
        turtle.select(v)
1686
        while not turtle.drop() do
1687
          print(lang.status(settings.language, 3))
1688
          sleep(10)
1689
        end
1690
      end
1691
    end
1692
    turtle.select(SlotCalculator("C", "empty")[1])]])
1693
    insert('dig()')
1694
    insert('Freeway()')
1695
    insert([[turtle.select(SlotCalculator("_", "empty")[1])
1696
    print(lang.status(settings.language, 4))]])
1697
  end
1698
end
1699
1700
function NormalChest(keptCoal, keptCobble)
1701
  local function goToOrigin()
1702
    insert('turn()')
1703
    insert([[if variables.level == 1 then
1704
      FreewayDown()
1705
    end
1706
    for Way_Back = 1, variables.CrosswayAmount*settings.tunnelspace do
1707
      Freeway()
1708
    end]])
1709
    insert('turn()')
1710
  end
1711
  local function dropOff()
1712
    insert([[for k, v in ipairs(SlotCalculator("_")) do
1713
      if settings.Autofuel and not keptCoal and Version >= 1.64 and turtle.getItemDetail(v).name == "minecraft:coal" then
1714
        keptCoal = true
1715
      elseif not keptCobble and v == "minecraft:cobblestone" then
1716
        keptCobble = true
1717
      else
1718
        turtle.select(v)
1719
        while not turtle.dropDown() and turtle.getItemCount() ~= 0 do
1720
          print(lang.status(settings.language, 3))
1721
          sleep(10)
1722
        end
1723
      end
1724
    end]])
1725
  end
1726-
  if variables.setup == true then
1726+
  if variables.setup == nil then
1727
    if #SlotCalculator("C", "check") == 0 then
1728
      variables.setup = false
1729
    elseif #SlotCalculator("_") >= #SlotCalculator("_", "empty")-1-math.ceil(settings.length/12) then
1730
      goToOrigin()
1731
      insert('turtle.select(SlotCalculator("C", "check")[1])')
1732
      insert([[while not turtle.placeDown() do
1733-
  elseif #SlotCalculator("C", "check") == 0 then
1733+
        digDown()
1734
      end]])
1735-
  elseif #SlotCalculator("_") >= #SlotCalculator("_", "empty")-1-math.ceil(settings.length/12) then
1735+
      insert('variables.setup = true')
1736
      dropOff()
1737-
    insert('turtle.select(SlotCalculator("C", "check")[1])')
1737+
      insert([[for Way_Back = 1, variables.CrosswayAmount*settings.tunnelspace do
1738-
    insert([[while not turtle.placeDown() do
1738+
        Freeway()
1739-
      digDown()
1739+
1740
      insert('print(lang.status(settings.language, 4))')
1741-
    insert('variables.setup = true')
1741+
1742
  elseif variables.setup == true then
1743
    goToOrigin()
1744
    dropOff()
1745
    insert([[for Way_Back = 1, variables.CrosswayAmount*settings.tunnelspace do
1746
      Freeway()
1747
    end]])
1748
    insert('print(lang.status(settings.language, 4))')
1749
  end
1750
end
1751
1752
function Fuel()
1753
  local FuelAmount = math.ceil(3*variables.FuelDemand/settings.quantity/80)
1754
  fuelLevel = turtle.getFuelLevel()
1755
  if fuelLevel < 3*variables.FuelDemand/settings.quantity then
1756
    while true do
1757
      while #SlotCalculator("_", "minecraft:coal") > 0 do
1758
        turtle.select(SlotCalculator("_", "minecraft:coal")[1])
1759
        local output = refuel(FuelAmount, true)
1760
        if output == true then
1761
          print(lang.status(settings.language, 5))
1762
          return
1763
        else
1764
          FuelAmount = FuelAmount - output
1765
        end
1766
      end
1767
      term.clear()
1768
      term.setCursorPos(1,1)
1769
      print(lang.status(settings.language, 6))
1770
      write(lang.status(settings.language, 7))
1771
      for k, v in ipairs(SlotCalculator("_", "empty")) do
1772
        if k == #SlotCalculator("_", "empty") then
1773
          print(v)
1774
        else
1775
          write(v..", ")
1776
        end
1777
      end
1778
      os.pullEvent()
1779
    end
1780
  end
1781
end
1782
1783
function placeFloor()
1784
  if settings.floor == true and turtle.detectDown() == false and #SlotCalculator("_", "minecraft:cobblestone") ~= 0 then
1785
    turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])
1786
    turtle.placeDown()
1787
  end
1788
end
1789
1790
function placeWall(param)
1791
  if param == true then
1792
    param = "place"
1793
  else
1794
    param = param or "place"
1795
  end
1796
  if #SlotCalculator("_", "minecraft:cobblestone") > 0 then
1797
    turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])
1798
    turtle[param]()
1799
    return true
1800
  end
1801
  return false
1802
end
1803
1804
-----###-----Processing-----###-----
1805
function TorchCalculator()
1806
  local Tspace
1807
  if settings.torches == true then
1808
    if (settings.tunnelspace == 4 and settings.length <= 8) or (settings.tunnelspace == 3 and settings.length <= 10) then
1809
      settings.lateralTorches = 1
1810
    else
1811
      settings.lateralTorches = math.floor((settings.length-math.floor(16/settings.tunnelspace))/12)+1
1812
    end
1813
    if (settings.tunnelspace == 4 and settings.length <= 3) or (settings.tunnelspace == 3 and settings.length <= 4) then
1814
      settings.mainTorches = true
1815
      settings.lateralTorches = 0
1816
    elseif (settings.tunnelspace == 4 and ((settings.length+2)%12 <= 5 or settings.length == 9)) or (settings.tunnelspace == 3 and (settings.length+1)%12 <= 5) then
1817
      settings.mainTorches = true
1818
    else
1819
      settings.mainTorches = false
1820
    end
1821
  end
1822
  if settings.lateralTorches >= 1 then
1823
    if settings.mainTorches == true then
1824
      Tspace = round((settings.length+(settings.tunnelspace-1)-settings.lateralTorches)/(settings.lateralTorches+0.5), "u")
1825
    else
1826
      Tspace = (settings.length+(settings.tunnelspace-1)-settings.lateralTorches)/settings.lateralTorches
1827
    end
1828
    if Tspace == 11 then
1829
      variables.maxSpace = true
1830
    else
1831
      variables.maxSpace = false
1832
    end
1833
    local done = false
1834
    while not done do
1835
      variables.torchPositions = {}
1836
      table.insert(variables.torchPositions, round(Tspace/2, "d")+1)
1837
      for i = 2, settings.lateralTorches do
1838
        table.insert(variables.torchPositions, round(Tspace+1+variables.torchPositions[i-1], "d"))
1839
      end
1840
      if variables.torchPositions[#variables.torchPositions] > settings.length then
1841
        Tspace = Tspace - 0.1
1842
      else
1843
        done = true
1844
      end
1845
    end
1846
  else
1847
    variables.maxSpace = false
1848
    variables.torchPositions = {}
1849
  end
1850
  variables.TorchDemand = 2*(settings.lateralTorches*settings.quantity)+1
1851
  if settings.mainTorches == true then
1852
    variables.TorchDemand = variables.TorchDemand + settings.quantity
1853
  end
1854
  for k, v in ipairs(SlotCalculator("T", "empty")) do
1855
    variables.slots[v] = "_"
1856
  end
1857
  local stupid = SlotCalculator("_", "empty")
1858
  for k, v in ipairs(stupid) do
1859
    if k > #stupid-math.ceil(variables.TorchDemand/64) then
1860
      variables.slots[v] = "T"
1861
    end
1862
  end
1863
end
1864
1865
function calculateFuelDemand()
1866
  if settings.chestSelect == 1 then
1867
    variables.FuelDemand = ((settings.length*2+settings.tunnelspace)*3+3)*settings.quantity
1868
  elseif settings.chestSelect == 2 then
1869
    variables.FuelDemand = math.ceil(((settings.length*2+settings.tunnelspace)*3+2)*settings.quantity+settings.tunnelspace*(settings.quantity/2)^2)
1870
  else
1871
    variables.FuelDemand = ((settings.length*2+settings.tunnelspace)*3+2)*settings.quantity
1872
  end
1873
  if variables.maxSpace == true then
1874
    variables.FuelDemand = variables.FuelDemand + #variables.torchPositions
1875
  end
1876
end
1877
1878
1879
-----###-----Core functions-----###-----
1880
function update()
1881
  if not fs.exists("database/"..programName.."/state") then
1882
  	save("database/"..programName.."/state", "0")
1883
  end
1884
  file = fs.open("database/"..programName.."/state", "r")
1885
  local fileData = {}
1886
  local line = file.readLine()
1887
  repeat
1888
    table.insert(fileData, line)
1889
    line = file.readLine()
1890
  until line == nil
1891
  file.close()
1892
  updated = fileData[1]
1893
1894
  if updated == "0" then
1895
    kill = true
1896
    term.clear()
1897
    print("loading...")
1898
    shell.run("pastebin get cR9vEiTc database/"..programName.."/lang")
1899
    term.clear()
1900
    local function installAsStartup()
1901
      if fs.exists("startup") then
1902
        os.loadAPI("startup")
1903
        if startup.name == "SupHa - Startup Handler by BrunoZockt" then
1904
          for k, v in ipairs(startup.getList()) do
1905
            if v == programName then
1906
              return
1907
            end
1908
          end
1909
          startup.set(programName)
1910
        else
1911
          os.unloadAPI("startup")
1912
          fs.move("startup", "old_startup")
1913
          shell.run("pastebin get 19VG8eD6 startup")
1914
          os.loadAPI("startup")
1915
          startup.set("old_startup", "standart")
1916
          startup.set(programName)
1917
        end
1918
      else
1919
        shell.run("pastebin get 19VG8eD6 startup")
1920
        os.loadAPI("startup")
1921
        startup.set(programName)
1922
      end
1923
    end
1924
    installAsStartup()
1925
    if programName ~= "OCM" then
1926
      fs.delete("database/OCM")
1927
    end
1928
    if shell.run("database/"..programName.."/updaterV2") == false then
1929
      fs.delete("database/"..programName.."/updater")
1930
      term.clear()
1931
  	  print("loading...")
1932
      shell.run("pastebin get rUMt9siN database/"..programName.."/updaterV2")
1933
      term.clear()
1934
      shell.run("database/"..programName.."/updaterV2")
1935
    end
1936
  end
1937
end
1938
1939
function getVariables(path)
1940
  local extSettings = {}
1941
  if fs.exists("database/"..programName.."/"..path) then
1942
    file = fs.open("database/"..programName.."/"..path, "r")
1943
    local line = Splitter(file.readLine(), " = ")
1944
    repeat
1945
      if line[2] == "{" or line[2] == "{}" then
1946
        local str = line[2]
1947
        if line[2] == "{" then
1948
        repeat
1949
          local tline = file.readLine()
1950
          if tline ~= nil then
1951
            str = str..tline
1952
          end
1953
        until tline == "}"
1954
        end
1955
        extSettings[line[1]] = textutils.unserialize(str)
1956
      else
1957
        extSettings[line[1]] = line[2]
1958
      end
1959
      line = Splitter(file.readLine(), " = ")
1960
    until line == nil
1961
    file.close()
1962
    for k, v in pairs(extSettings) do
1963
      if type(extSettings[k]) ~= "table" then
1964
        if not tonumber(extSettings[k]) then
1965
          if extSettings[k] == "true" or extSettings[k] == "false" then
1966
            extSettings[k] = extSettings[k] == "true"
1967
          end
1968
        else
1969
          extSettings[k] = tonumber(extSettings[k])
1970
        end
1971
      end
1972
      if Splitter(path, "/")[#Splitter(path, "/")] == "settings" then
1973
        settings[k] = extSettings[k]
1974
      elseif Splitter(path, "/")[#Splitter(path, "/")] == "variables" then
1975
        variables[k] = extSettings[k]
1976
      end
1977
    end
1978
  end
1979
  if fs.exists("database/"..programName.."/updateCheckbox/V2.6") then
1980
    local file = fs.open("database/"..programName.."/updateCheckbox/V2.6", "r")
1981
    checkbox = file.readLine() == "true"
1982
    file.close()
1983
  end
1984
  if checkbox == true then
1985
    menustate = "Home"
1986
  else
1987
    menustate = "Update"
1988
  end
1989
  if settings.chestSelect < 3 and #SlotCalculator("C", "empty") == 0 then
1990
    variables.slots[16] = "C"
1991
  end
1992
  calculateFuelDemand()
1993
  TorchCalculator()
1994
end
1995
1996
function getList(path)
1997
  local file = fs.open("database/"..programName.."/"..path, "r")
1998
  todoList = textutils.unserialize(Splitter(file.readLine(), " = ")[2]..file.readAll())
1999
  file.close()
2000
end
2001
2002
function saveVars(path, content)
2003
  save("database/"..programName.."/"..path, content)
2004
end
2005
2006
function compStep(n)
2007
  if n == nil then
2008
    n = 1
2009
  else
2010
    n = tonumber(n)
2011
  end
2012
  for i = 1, n do
2013
    insert('turtle.select(SlotCalculator("T", "empty")[1])')
2014
    insert('Freeway()')
2015
    if variables.level == 0 then
2016
      insert('CompareAll("Compare()", "CompareBack()", "CompareUp()")')
2017
      insert('placeFloor()')
2018
      insert('turtle.select(SlotCalculator("T", "empty")[1])')
2019
      insert('FreewayUp()')
2020
      insert('CompareAll("Compare()", "CompareBack()", "CompareDown()")')
2021
    elseif variables.level == 1 then
2022
      insert('CompareAll("Compare()", "CompareBack()", "CompareDown()")')
2023
      insert('turtle.select(SlotCalculator("T", "empty")[1])')
2024
      insert('FreewayDown()')
2025
      insert('CompareAll("Compare()", "CompareBack()", "CompareUp()")')
2026
      insert('placeFloor()')
2027
    end
2028
  end
2029
end
2030
2031
function mainstep(n, first)
2032
  if n == nil then
2033
    n = 1
2034
  else
2035
    n = tonumber(n)
2036
  end
2037
  turtle.select(SlotCalculator("_", "empty")[1])
2038
  for i = 1, n do
2039
    insert('variables.searching = false')
2040
    insert('dig()')
2041
    insert('Freeway()')
2042
    insert([[if variables.level == 0 then
2043
      insert('placeFloor()')
2044
      insert('digUp()')
2045
      if ]]..tostring(first)..[[ and ]]..tostring(i)..[[ == 1 or (settings.walls == true and ]]..tostring(i)..[[ == 2 and settings.tunnelspace == 4) then
2046
        insert('CompareAll("Compare()", "CompareBack()", "CompareUp()")')
2047
      else
2048
        insert('CompareDown()')
2049
      end
2050
      insert('FreewayUp()')
2051
      if ]]..tostring(first)..[[ and ]]..tostring(i)..[[ == 1 or (settings.walls == true and ]]..tostring(i)..[[ == 2 and settings.tunnelspace == 4) then
2052
        insert('CompareAll("Compare()", "CompareBack()", "CompareDown()")')
2053
      else
2054
        insert('CompareUp()')
2055
        insert('placeWall("placeUp")')
2056
      end
2057
    elseif variables.level == 1 then
2058
      insert('digDown()')
2059
      if ]]..tostring(first)..[[ and ]]..tostring(i)..[[ == 1 or (settings.walls == true and ]]..tostring(i)..[[ == 2 and settings.tunnelspace == 4) then
2060
        insert('CompareAll("Compare()", "CompareBack()", "CompareDown()")')
2061
      else
2062
        insert('CompareUp()')
2063
        insert('placeWall("placeUp")')
2064
      end
2065
      if i == 2 and settings.mainTorches then
2066
        insert('variables.searching = false')
2067
        insert('dig(true)')
2068
      end
2069
      insert('FreewayDown()')
2070
      if ]]..tostring(first)..[[ and ]]..tostring(i)..[[ == 1 or (settings.walls == true and ]]..tostring(i)..[[ == 2 and settings.tunnelspace == 4) then
2071
        insert('CompareAll("Compare()", "CompareBack()", "CompareUp()")')
2072
      else
2073
        insert('CompareDown()')
2074
      end
2075
      insert('placeFloor()')
2076
    end]])
2077
    if settings.mainTorches == true then
2078
      if i == 2 and #SlotCalculator('T', 'check') ~= 0 then
2079
        insert([[turtle.select(SlotCalculator('T', 'check')[1])
2080
        if variables.level == 1 then
2081
          FreewayDown()
2082
        end]])
2083
        insert([[if not turtle.placeUp() then
2084
          insert('FreewayUp()')
2085
          insert('left()')
2086
          insert('turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])')
2087
          insert('dig()')
2088
          insert('turtle.place()')
2089
          insert('right()')
2090
          insert('FreewayDown()')
2091
          insert('turtle.select(SlotCalculator("T", "check")[1])')
2092
          insert('turtle.placeUp()')
2093
        end]])
2094
        insert([[for k, v in ipairs(SlotCalculator('T', 'empty')) do
2095
          variables.slots[v] = '_'
2096
        end
2097
        local stupid = SlotCalculator('_', 'empty')
2098
        for k, v in ipairs(stupid) do
2099
          if k > #stupid-math.ceil(variables.TorchDemand/64) then
2100
            variables.slots[v] = 'T'
2101
          end
2102
        end
2103
        variables.TorchDemand = variables.TorchDemand - 1]])
2104
      end
2105
    end
2106
  end
2107
end
2108
2109
function stepAside(n)
2110
  if n == nil then
2111
    n = 1
2112
  else
2113
    n = tonumber(n)
2114
  end
2115
  for i = 1, n do
2116
    insert('variables.searching = false')
2117
    insert('dig()')
2118
    insert('Freeway()')
2119
    if variables.level == 1 then
2120
      insert('digDown()')
2121
    elseif variables.level == 0 then
2122
      insert('placeFloor()')
2123
      insert('digUp()')
2124
    end
2125
  end
2126
end
2127
2128
function youJustGotLittUp(steps, func, left)
2129
  if left == nil then
2130
    left = false
2131
  end
2132
  for Steprepeat = 1, steps do
2133
    if func == stepAside then
2134
      insert('stepAside()')
2135
    end
2136
    for k, v in ipairs(variables.torchPositions) do
2137
      if ((func == stepAside and settings.length-v+1 == Steprepeat) or (func == compStep and v == Steprepeat)) and #SlotCalculator("T", "check") > 0 then
2138
        insert([[turtle.select(SlotCalculator("T", "check")[1])
2139
        if variables.maxSpace == true then
2140
          if settings.mainTorches == false and left == true then
2141
            if k%2 == #variables.torchPositions%2 then
2142
              if variables.level == 1 then
2143
                if variables.orientation[1] == "North" or variables.orientation[1] == "South" then
2144
                  insert('dig()')
2145
                end
2146
                insert('FreewayDown()')
2147
              elseif variables.orientation[1] == "North" or variables.orientation[1] == "South" then
2148
                insert('FreewayUp()')
2149
                insert('dig()')
2150
                insert('FreewayDown()')
2151
              end
2152
            else
2153
              if variables.level == 0 then
2154
                insert('FreewayUp()')
2155
              end
2156
            end
2157
          else
2158
            if k%2 == #variables.torchPositions%2 then
2159
              if variables.level == 0 then
2160
                insert('FreewayUp()')
2161
              end
2162
            else
2163
              if variables.level == 1 then
2164
                if variables.orientation[1] == "North" or variables.orientation[1] == "South" then
2165
                  insert('dig()')
2166
                end
2167
                insert('FreewayDown()')
2168
              elseif variables.orientation[1] == "North" or variables.orientation[1] == "South" then
2169
                insert('FreewayDown()')
2170
                insert('dig()')
2171
                insert('FreewayUp()')
2172
              end
2173
            end
2174
          end
2175
        elseif variables.orientation[1] == "North" or variables.orientation[1] == "South" then
2176
          if variables.level == 0 then
2177
            insert('FreewayUp()')
2178
          end
2179
        end]])
2180
        insert([[if variables.level == 1 then
2181
          turtle.placeDown()
2182
        elseif variables.level == 0 then
2183
          if not turtle.placeUp() then
2184
            insert('FreewayUp()')
2185
            insert('left()')
2186
            insert('turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])')
2187
            insert('dig()')
2188
            insert('turtle.place()')
2189
            insert('right()')
2190
            insert('FreewayDown()')
2191
            insert('turtle.select(SlotCalculator("T", "check")[1])')
2192
            insert('turtle.placeUp()')
2193
          end
2194
        end]])
2195
        insert([[for k, v in ipairs(SlotCalculator("T", "empty")) do
2196
          variables.slots[v] = "_"
2197
        end
2198
        local stupid = SlotCalculator("_", "empty")
2199
        for k, v in ipairs(stupid) do
2200
          if k > #stupid-math.ceil(variables.TorchDemand/64) then
2201
            variables.slots[v] = "T"
2202
          end
2203
        end]])
2204
        insert([[if func == compStep then
2205
          variables.TorchDemand = variables.TorchDemand - 1
2206
        end
2207
        turtle.select(SlotCalculator("_", "empty")[1])]])
2208
      end
2209
    end
2210
    if func == compStep then
2211
      if Steprepeat == settings.length then
2212
        insert('Freeway()')
2213
      else
2214
        insert('compStep()')
2215
      end
2216
    end
2217
  end
2218
end
2219
2220
function tunnel(first)
2221
  if settings.Autofuel == true then
2222
    insert('Fuel()')
2223
  end
2224
  if settings.trash == true then
2225
    insert('trash()')
2226
  end
2227
  if settings.chestSelect == 1 then
2228
    insert('Enderchest()')
2229
  elseif settings.chestSelect == 2 then
2230
    insert('NormalChest()')
2231
  end
2232
  insert("mainstep(settings.tunnelspace, "..tostring(first)..")")
2233
  insert("turtle.turnRight()")
2234
  insert('old_orientation = {}')
2235
  insert([[for k,v in ipairs(variables.orientation) do
2236
    old_orientation[k] = v
2237
  end]])
2238
  for i = 1, 4 do
2239
    insert('variables.orientation['..tostring(i)..'] = old_orientation[('..tostring(i)..'+2)%4+1]')
2240
  end
2241
  insert("youJustGotLittUp(settings.length, stepAside)")
2242
  insert([[if variables.level == 1 then
2243
    insert('CompareAll("CompareBack()", "CompareDown()")')
2244
    insert('FreewayDown()')
2245
    insert('CompareAll("CompareBack()", "CompareUp()")')
2246
  else
2247
    insert('CompareAll("CompareBack()", "CompareUp()")')
2248
    insert('FreewayUp()')
2249
    insert('CompareAll("CompareBack()", "CompareDown()")')
2250
  end]])
2251
  insert('face(3)')
2252
  insert('old_orientation = {}')
2253
  insert([[for k,v in ipairs(variables.orientation) do
2254
    old_orientation[k] = v
2255
  end]])
2256
  for i = 1, 4 do
2257
    insert('variables.orientation['..tostring(i)..'] = old_orientation[('..tostring(i)..'+1)%4+1]')
2258
  end
2259
  insert('variables.direction = 1')
2260
  insert("youJustGotLittUp(settings.length, compStep)")
2261
  insert("youJustGotLittUp(settings.length, stepAside, true)")
2262
  insert([[if variables.level == 1 then
2263
    insert('CompareAll("CompareBack()", "CompareDown()")')
2264
    insert('FreewayDown()')
2265
    insert('CompareAll("CompareBack()", "CompareUp()")')
2266
  else
2267
    insert('CompareAll("CompareBack()", "CompareUp()")')
2268
    insert('FreewayUp()')
2269
    insert('CompareAll("CompareBack()", "CompareDown()")')
2270
  end]])
2271
  insert('face(3)')
2272
  insert('old_orientation = {}')
2273
  insert([[for k,v in ipairs(variables.orientation) do
2274
    old_orientation[k] = v
2275
  end]])
2276
  for i = 1, 4 do
2277
    insert('variables.orientation['..tostring(i)..'] = old_orientation[('..tostring(i)..'+1)%4+1]')
2278
  end
2279
  insert('variables.direction = 1')
2280
  insert("youJustGotLittUp(settings.length, compStep, true)")
2281
  insert('turtle.turnLeft()')
2282
  insert('old_orientation = {}')
2283
  insert([[for k,v in ipairs(variables.orientation) do
2284
    old_orientation[k] = v
2285
  end]])
2286
  for i = 1, 4 do
2287
    insert('variables.orientation['..tostring(i)..'] = old_orientation[('..tostring(i)..')%4+1]')
2288
  end
2289
end
2290
2291
function go()
2292
  saveVars("resume/settings", settings)
2293
  variables.startDay = os.day()
2294
  variables.startTime = os.time()
2295
  for Tunnelrepeat = 1, settings.quantity do
2296
    insert("tunnel("..tostring(Tunnelrepeat == 1)..")")
2297
    insert([[variables.CrosswayAmount = variables.CrosswayAmount + 1
2298
    print(lang.status(settings.language, 8, variables.CrosswayAmount, settings.quantity))]])
2299
  end
2300
  insert('print(lang.status(settings.language, 9))')
2301
  insert('turn()')
2302
  insert([[if variables.level == 1 then
2303
    FreewayDown()
2304
  end]])
2305
  for Way_Back = 1, settings.quantity*settings.tunnelspace do
2306
    insert('Freeway()')
2307
  end
2308
  if settings.trash == true then
2309
    insert('trash()')
2310
  end
2311
  if settings.chestSelect == 1 then
2312
    insert("Enderchest(true)")
2313
  elseif settings.chestSelect == 2 then
2314
    insert("NormalChest(true, true)")
2315
  end
2316
  insert([[local endDay = os.day()
2317
  local endTime = os.time()
2318
  variables.stats["time"] = (endDay-variables.startDay)*24.000+(endTime-variables.startTime)]])
2319
end
2320
2321
function Navigation()
2322
  table.insert(timer, os.startTimer(0.05))
2323
  while true do
2324
    local tempState = menustate
2325
    local event, p1, p2, p3 = os.pullEvent()
2326
    while (event == "timer" and p1 ~= timer[#timer]) or event == "key_up" do
2327
      event, p1, p2, p3 = os.pullEvent()
2328
    end
2329
    if menuVars["drawOptions"].focus == 100 then
2330
      basicInputHandler(menu[menustate].orientation, event, p1)
2331
    end
2332
    if menustate == "Quit" then
2333
      break
2334
    elseif menustate == "Save as default" then
2335
      saveVars("settings", settings)
2336
      menuVars["drawOptions"].saved = true
2337
      menustate = "Options"
2338
    elseif menustate == "Go!" then
2339
      menustate = "Popup"
2340
      local ready = true
2341
      for i = 1, #errors do
2342
        if errors[i] == true then
2343
          ready = false
2344
        end
2345
      end
2346
      if (Fuellevel ~= "low" and ready == true) or tempState == "Popup" then
2347
        return execute()
2348
      end
2349
    end
2350
    term.clear()
2351
    drawHeader()
2352
    if tempState == menustate then
2353
      menu[menustate].draw(event, p1, p2, p3)
2354
    else
2355
      menu[menustate].draw()
2356
    end
2357
    if tempState == "Update" then
2358
      save("database/"..programName.."/updateCheckbox/V2.6", checkbox)
2359
    end
2360
    table.insert(timer, os.startTimer(0.5))
2361
  end
2362
end
2363
2364
function extractstats()
2365
  save("database/"..programName.."/variables.stats", variables.stats)
2366
end
2367
2368
function close()
2369
  fs.delete("database/"..programName.."/resume")
2370
  term.clear()
2371
  term.setCursorPos(1,1)
2372
  if Color() then
2373
    term.setTextColor(colors.yellow)
2374
    print(os.version())
2375
    term.setTextColor(colors.white)
2376
  else
2377
    print(os.version())
2378
  end
2379
  term.setCursorPos(1, 2)
2380
end
2381
2382
-----###-----Executive-----###------
2383
2384
local function compile(chunk) -- returns compiled chunk or nil and error message
2385
  if type(chunk) ~= "string" then
2386
    error("expected string, got ".. type(chunk), 2)
2387
  end
2388
2389
  local function findChunkName(var)
2390
    for k,v in pairs(HOST_ENV) do
2391
      if v==var then
2392
        return k
2393
      end
2394
    end
2395
    return "Unknown chunk"
2396
  end
2397
2398
  return load(chunk, findChunkName(chunk), "t", OUR_ENV)
2399
end
2400
2401
function getOrientation(resume)
2402
  if resume then
2403
    for i = 1, 2-variables.level do
2404
      insert('FreewayUp()')
2405
    end
2406
  end
2407
  if #SlotCalculator("T", "check") ~= 0 then
2408
    insert('Freeway()')
2409
    if Version >= 1.64 then
2410
      insert('FreewayUp()')
2411
      for i = 1, 3 do
2412
        insert('right()')
2413
        insert('dig(true)')
2414
      end
2415
      insert('right()')
2416
      insert([[if turtle.detect() == false then
2417
        turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])
2418
        turtle.place()
2419
      end]])
2420
      insert('FreewayDown()')
2421
      insert('turtle.select(SlotCalculator("T", "check")[1])')
2422
      insert('turtle.placeUp()')
2423
2424
      insert('torch = {"West", "East", "North", "South"}')
2425
      insert('_, data = turtle.inspectUp()')
2426
      insert('new_orientation = torch[data.metadata]')
2427
2428
      insert('digUp()')
2429
      insert('FreewayBack()')
2430
      insert('_, data, torch = nil, nil, nil')
2431
    else
2432
      insert('Freeway()')
2433
      insert('digDown()')
2434
      insert('FreewayUp()')
2435
      for i = 1, 4 do
2436
        insert([[if turtle.detect() == false then
2437
          turtle.select(SlotCalculator("_", "minecraft:cobblestone")[1])
2438
          turtle.place()
2439
        end]])
2440
        insert('right()')
2441
      end
2442
      insert('FreewayDown()')
2443
      insert('turtle.select(SlotCalculator("T", "check")[1])')
2444
      insert('turtle.placeUp()')
2445
2446
      insert('torch = {"West", "South", "East", "North"}')
2447
      for i = 1, 4 do
2448
        insert('Freeway()')
2449
        insert('digUp()')
2450
        insert('os.sleep(0.5)')
2451
        insert('FreewayBack()')
2452
        insert([[if turtle.detectUp() == false then
2453
          i = ]]..tostring(i)..[[
2454
          insert('turtle.select(SlotCalculator("T", "check")[1])')
2455
          insert('turtle.suckDown()')
2456
          insert('new_orientation = torch[i]')
2457
          insert('i = nil')
2458
        end]])
2459
        insert('turtle.turnLeft()')
2460
      end
2461
      insert('face(variables.direction)')
2462
      insert('FreewayBack()')
2463
    end
2464
  end
2465
  if resume then
2466
    for i = 1, 2-variables.level do
2467
      insert('FreewayDown()')
2468
    end
2469
    insert([[for k, v in pairs(cardinal) do
2470
      if v == new_orientation then
2471
        new_orientation = k
2472
      end
2473
      if v == variables.orientation[variables.direction] then
2474
        variables.orientation[variables.direction] = k
2475
      end
2476
    end]])
2477
    insert([[if new_orientation ~= variables.orientation[variables.direction] then
2478
      if math.abs(new_orientation-variables.orientation[variables.direction]) == 2 then
2479
        insert('turtle.turnLeft()')
2480
        insert('turtle.turnLeft()')
2481
      elseif (new_orientation-variables.orientation[variables.direction]+1)%4 == 0 then
2482
        insert('turtle.turnLeft()')
2483
      elseif (new_orientation-variables.orientation[variables.direction]-1)%4 == 0 then
2484
        insert('turtle.turnRight()')
2485
      end
2486
    end]])
2487
    insert('variables.orientation[variables.direction] = cardinal[variables.orientation[variables.direction]]')
2488
  else
2489
    insert([[for k, v in ipairs(cardinal) do
2490
      if new_orientation == v then
2491
        for i = 1, 4 do
2492
          table.insert(variables.orientation, cardinal[(k+i-2)%4+1])
2493
        end
2494
      end
2495
    end]])
2496
  end
2497
end
2498
2499
function execute(resume)
2500
  if not resume then
2501
    todoList = {"go()"}
2502
  end
2503
  table.insert(todoList, 1, 'getOrientation('..tostring(resume)..')')
2504
  while #todoList > 0 do
2505
    compile(todoList[1])()
2506
    table.remove(todoList, 1)
2507
    variables.index = 2
2508
    save("database/"..programName.."/resume/todoList", todoList, true)
2509
    saveVars("resume/variables", variables)
2510
  end
2511
end
2512
2513
function main()
2514
  if fs.exists("database/"..programName.."/resume") then
2515
    os.loadAPI("database/"..programName.."/lang")
2516
    local countdown = 10
2517
    local count = {}
2518
    term.clear()
2519
    drawResume(countdown)
2520
    table.insert(count, os.startTimer(1))
2521
    repeat
2522
      local event, p1 = os.pullEvent()
2523
      while (event == "timer" and p1 ~= count[#count]) do
2524
        event, p1 = os.pullEvent()
2525
      end
2526
      if event == "key" then
2527
        if p1 == 28 then
2528
          fs.delete("database/"..programName.."/resume")
2529
          return main()
2530
        end
2531
      elseif event == "timer" and p1 == count[#count] then
2532
        countdown = countdown - 1
2533
      end
2534
      term.clear()
2535
      drawResume(countdown)
2536
      table.insert(count, os.startTimer(1))
2537
    until countdown == 0
2538
    getVariables("resume/settings")
2539
    getVariables("resume/variables")
2540
    getList("resume/todoList")
2541
    execute(true)
2542
  else
2543
    update()
2544
    if kill == true then
2545
      return
2546
    end
2547
    save("database/"..programName.."/state", "0")
2548
    os.loadAPI("database/"..programName.."/lang")
2549
    getVariables("settings")
2550
    Navigation()
2551
  end
2552
  --extractstats()
2553
  close()
2554
end
2555
2556
main()