View difference between Paste ID: Fev0U5eG and CA08dhhG
SHOW: | | - or go back to the newest paste.
1
-- Tunnel script V2.2 --
2
-- By Ninetainedo -- NoFake Dev Team--
3
-- Dig a tunnel and fills walls --
4
5
args = {...}
6
local width, height, length = 3, 3, 10
7
local config = false
8
9
if (#args == 1 and args[1] == "-c") then
10
  config = true
11
elseif #args ~= 1 then
12
  shell.run("clear")
13
  print("Usage : tunnel option\n")
14
  print("Option can be :")
15
  print("  -c to run in config mode.")
16
  print("  -d to run in default mode.\n")
17
  print("In default mode, it makes a 3x3x10 tunnel and fills walls, floor and ceiling.\nIt also empties itself and comes back when it needs blocks.")
18
  return
19
end
20
21
local name = "Tunnel"
22
local side, x, y, z = 0, 0, 0, 0
23
local moved = 0
24
local a, b, c
25
local blockSlotsToKeep = 8
26
local slots = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
27
local goBackForCobble, goBackForEmpty, digOnly, sendOnRednet = true, true, false, true
28
local fillCeiling, fillFloor, fillLeftWall, fillRightWall, fillBackWall = true, true, true, true, true
29
local pos = "left"
30
local percent, oldPercent = 0, -1
31
local wTerm, hTerm = term.getSize()
32
local screen = {}
33
local messages = {}
34
local percent = 50
35
local msgLen = math.ceil(hTerm / 2) - 2
36
local currentMsgIndex = 1
37
local infos = { blocksDug = 0, blocksPlaced = 0}
38
local p = 0
39
40
function main()
41
  shell.run("clear")
42
  if (config == true) then
43
    configMode()
44
  end
45
46
  if (sendOnRednet) then
47
    rednet.open("right")
48
  end
49
  
50
  screenQuery("init")
51
  tell("Launching !")
52
  checkBlock()
53
  a = 0
54
  
55
  -- Boucle sur la longueur --
56
  while (a < length) do
57
    b = 0
58
    if (side == 3) then
59
      turnRight()
60
    elseif (side == 1) then
61
      turnLeft()
62
    end
63
    if (turtle.detect()) then dig() end
64
    forward()
65
    
66
    -- Boucle de balayage vertical --
67
    while (b < height) do
68
      c = 0
69
      if (side == 0 and pos == "left") then
70
        turnLeft()
71
      elseif (side == 0 and pos == "right") then
72
        turnRight()
73
      end
74
      putBlock()
75
      if (pos == "right") then
76
        turnLeft()
77
      elseif (pos == "left") then
78
        turnRight()
79
      end
80
      if (side == 0 and pos == "right") then
81
        turnLeft()
82
      elseif (side == 0 and pos == "left") then
83
        turnRight()
84
      end
85
      
86
      -- Boucle de balayage horizontal --
87
      while (c < width) do
88
        if (c == width - 1) then
89
          putBlock()
90
        end
91
        if (z == 0) then
92
          putBlock("down")
93
        end
94
        if (z == height - 1) then
95
          putBlock("up")
96
        end
97
       
98
        if (not digOnly and fillBackWall and a == length - 1) then
99
          if (pos == "left") then
100
            turnLeft()
101
          else
102
            turnRight()
103
          end
104
          putBlock()
105
          if (pos == "right") then
106
            turnLeft()
107
          else
108
            turnRight()
109
          end
110
        end
111
        
112
        if (c < width - 1) then
113
          if (turtle.detect()) then dig() end
114
        end
115
        if (z < height - 1) then
116
          if (turtle.detectUp()) then dig("up") end
117
        end
118
        if (c < width - 1) then
119
          forward()
120
        end
121
        c = c + 1
122
        checkBlock()
123
        checkInventory()
124
        updatePercent()
125
      end -- While y
126
      if (z < height - 1) then
127
        up()
128
      end
129
      if (pos == "left") then
130
        pos = "right"
131
      else
132
        pos = "left"
133
      end
134
      b = b + 1
135
    end -- While z
136
    while (z ~= 0) do down() end
137
  a = a + 1
138
  end -- While x
139
  goToPos(-1 * x, -1 * y, -1 * z, -1 * side, "szyx")
140
  tell("Done !!")
141
  
142
  if (sendOnRednet) then
143
    rednet.close("right")
144
  end
145
end
146
147
function updatePercent()
148
  percent = math.floor(reMap(p, 0, length * width * height, 0, 100))
149
  screenQuery("update", "progress", percent)
150
  screenQuery("draw")
151
end
152
153
function reMap(val, min1, max1, min2, max2)
154
  local div = max1 - min1
155
156
  if (div == 0) then div = 1 end
157
  return ((val - min1) * (max2 - min2) / div + min2)
158
end
159
160
function screenQuery(query, ...)
161
  local tArgs = {...}
162
  local writeAtPos = function(message, x, y)
163
    term.setCursorPos(x, y)
164
    write(message)
165
  end
166
  local getCenteredX = function(message)
167
    return math.ceil((wTerm / 2) - (#message / 2))
168
  end
169
  local writeInTable = function(message, x, y)
170
    if (x + #message > wTerm) then
171
      return false
172
    end
173
    for i = 1, #message do
174
      screen[y][x + i - 1] = message:sub(i, i)
175
    end
176
    return true
177
  end
178
  local printProgressBar = function(percent)
179
    local y = math.ceil(hTerm / 2 * 3 / 2)
180
    local barPercent = reMap(percent, 0, 100, 4, wTerm - 2)
181
    local a = 4
182
183
    screen[y][3] = '['
184
    screen[y][wTerm - 2] = ']'
185
    while (a < barPercent) do
186
      screen[y][a] = '='
187
      a = a + 1
188
    end
189
    writeInTable(tostring(percent).."%", getCenteredX(tostring(percent).."%") + 1, y + 1)
190
  end
191
192
  if (query == "init") then
193
    local mid = math.ceil(hTerm / 2)
194
    for j = 1, hTerm do
195
      screen[j] = {}
196
      for i = 1, wTerm do
197
        if ((i == 1 or i == wTerm) and (j == 1 or j == hTerm)) then
198
          screen[j][i] = '+'
199
        elseif (i == 1 or i == wTerm) then
200
          screen[j][i] = '|'
201
        elseif (j == 1 or j == hTerm) then
202
          screen[j][i] = '-'
203
        elseif (j == mid) then
204
          screen[j][i] = '-'
205
        else
206
          screen[j][i] = ' '
207
        end
208
      end
209
    end
210
    printProgressBar(0)
211
    for j = 1, msgLen do
212
      messages[j] = ""
213
    end
214
    elseif (query == "draw") then
215
      for j = 1, hTerm do
216
        for i = 1, wTerm do
217
          writeAtPos(screen[j][i], i, j)
218
        end
219
      end
220
    elseif (query == "update" and tArgs[1] == "progress") then
221
      printProgressBar(tArgs[2])
222
    elseif (query == "update" and tArgs[1] == "message") then
223
      messages[currentMsgIndex] = tArgs[2]
224
      for j = 1, msgLen do
225
        writeInTable(messages[j], 2, j + 1)
226
      end
227
      if (currentMsgIndex + 1 > msgLen)then
228
        table.remove(messages, 1)
229
        currentMsgIndex = msgLen
230
      else
231
        currentMsgIndex = currentMsgIndex + 1
232
      end
233
    end
234
end
235
236
function checkInventory()
237
  local count = 1
238
239
  if (goBackForEmpty and isInventoryFull()) then
240
    tell("Need empty")
241
    goToPos(-1 * x, -1 * y, -1 * z, -1 * side, "szyx")
242
    turtle.turnLeft()
243
    turtle.turnLeft()
244
    for i = (digOnly and 1 or 2),16 do
245
      turtle.select(i)
246
      if (digOnly or count >= blockSlotsToKeep or not turtle.compareTo(1)) then
247
        turtle.drop()
248
      else
249
        count = count + 1
250
      end
251
    end
252
    turtle.select(1)
253
    tell("Empty done !")
254
    turtle.turnRight()
255
    turtle.turnRight()
256
    goToPos(x, y, z, side, "zyxs")
257
  end
258
end
259
260
function manageInventory()
261
  local blockSlots = {}
262
  local emptySlot = -1
263
264
  if (digOnly) then
265
    return true
266
  end
267
  -- Superposition d'un maximum d'items --
268
  for i, slot in ipairs(slots) do
269
    turtle.select(slot)
270
    if (turtle.getItemCount(slot) > 0) then
271
      for j, slot2 in ipairs(slots) do
272
        if (slot2 > slot) then
273
          if (turtle.getItemSpace(slot) == 0) then
274
            break
275
          end
276
          if (turtle.compareTo(slot2)) then
277
            turtle.select(slot2)
278
            turtle.transferTo(slot)
279
            turtle.select(slot)
280
          end
281
        end
282
      end
283
    end
284
  end
285
286
  -- On met tous les items le plus en haut à gauche possible --
287
  for i, slot in ipairs(slots) do
288
    if (turtle.getItemCount(slot) == 0) then
289
      for j, slot2 in ipairs(slots) do
290
        if (slot2 > slot and turtle.getItemCount(slot2) > 0) then
291
          turtle.select(slot2)
292
          turtle.transferTo(slot)
293
          turtle.select(slot)
294
          break
295
        end
296
      end
297
    end
298
  end
299
  
300
  -- Chargement des infos de l'inventaire pour la gestion des blocs de remplissage --
301
  for i, slot in ipairs(slots) do
302
    turtle.select(slot)
303
    if (turtle.compareTo(1)) then
304
      table.insert(blockSlots, slot)
305
    end
306
  end
307
  
308
  -- On cherche un slot vide --
309
  for i, slot in ipairs(slots) do
310
    if (not digOnly and slot > blockSlotsToKeep and turtle.getItemCount(slot) == 0) then
311
      emptySlot = slot
312
      break
313
    end
314
  end
315
  
316
  if (emptySlot == -1) then
317
    return false
318
  end
319
  -- On supprime de la table le slot de référence --
320
  table.remove(blockSlots, 1)
321
  local blockSlotsLen = #blockSlots
322
  
323
  -- Pour chaque emplacement de block qu'on
324
  -- veut "reserver", on y place de la block
325
  -- s'il y en a ailleurs --
326
  -- --
327
  -- Ex : Si le slot 2 est vide alors que
328
  -- blockslotsToKeep vaut 4, on va chercher
329
  -- de la block dans les slots de 3 a 16 et,
330
  -- si on en trouve, on va la mettre dans le
331
  -- slot 2 --
332
  for i = 2, blockSlotsToKeep do
333
    turtle.select(i)
334
    if (not turtle.compareTo(1) and turtle.getItemCount(i) > 0) then
335
      if (blockSlotsLen > 0) then
336
        slotTransfer(blockSlots[1], i, emptySlot)
337
        table.remove(blockSlots, 1)
338
        blockSlotsLen = blockSlotsLen - 1
339
      else
340
        break
341
      end
342
    end
343
  end
344
end
345
346
function slotTransfer(slotSrc, slotDest, slotEmpty)
347
  local hasEmpty = false
348
  
349
  if (turtle.getItemCount(slotEmpty) > 0) then
350
    turtle.select(slotEmpty)
351
    turtle.drop()
352
    hasEmpty = true
353
  end
354
  if (turtle.getItemCount(slotDest) == 0) then
355
    turtle.select(slotSrc)
356
    turtle.transferTo(slotDest)
357
  else
358
    turtle.select(slotDest)
359
    turtle.transferTo(slotEmpty)
360
    turtle.select(slotSrc)
361
    turtle.transferTo(slotDest)
362
    turtle.select(slotEmpty)
363
    turtle.transferTo(slotSrc)
364
  end
365
  if (hasEmpty) then
366
    turtle.suck()
367
  end
368
end
369
370
function isInventoryFull(var)
371
  for i, slot in ipairs(slots) do
372
    if (turtle.getItemCount(slot) == 0) then
373
      return false
374
    end
375
  end
376
  if (not var) then
377
    manageInventory()
378
    return isInventoryFull(true)
379
  end
380
  return true
381
end
382
383
function putBlock(face)
384
  turtle.select(1)
385
  
386
  if (digOnly) then
387
    return
388
  end
389
  
390
  if (face == nil) then
391
    if ((side == 1 and fillRightWall) or (side == 3 and fillLeftWall) or (side == 0 and fillBackWall)) then
392
      if (not turtle.detect()) then
393
        while (not turtle.place()) do
394
          turtle.attack()
395
        end
396
        infos.blocksPlaced = infos.blocksPlaced + 1
397
      elseif (not turtle.compare()) then
398
        dig()
399
        while (not turtle.place()) do
400
          turtle.attack()
401
        end
402
        infos.blocksPlaced = infos.blocksPlaced + 1
403
      end
404
    end
405
  elseif (face == "up") then
406
    if (fillCeiling) then
407
      if (not turtle.detectUp()) then
408
        while (not turtle.placeUp()) do
409
          turtle.attackUp()
410
        end
411
        infos.blocksPlaced = infos.blocksPlaced + 1
412
      elseif (not turtle.compareUp()) then
413
        dig("up")
414
        while (not turtle.placeUp()) do
415
          turtle.attackUp()
416
        end
417
        infos.blocksPlaced = infos.blocksPlaced + 1
418
      end
419
    end
420
  elseif (face == "down") then
421
    if (fillFloor) then
422
      if (not turtle.detectDown()) then
423
        while (not turtle.placeDown()) do
424
          turtle.attackDown()
425
        end
426
        infos.blocksPlaced = infos.blocksPlaced + 1
427
      elseif (not turtle.compareDown()) then
428
        dig("down")
429
        while (not turtle.placeDown()) do
430
          turtle.attackDown()
431
        end
432
        infos.blocksPlaced = infos.blocksPlaced + 1
433
      end
434
    end
435
  end
436
end
437
438
function readPrompt(prompt, mode, onError, onSuccess, needClear, stricly)
439
  local value = nil
440
441
  while (value == nil) do
442
    if (needClear) then
443
      shell.run("clear")
444
    end
445
    write(prompt)
446
    value = read()
447
    if (mode == 1) then
448
      value = tonumber(value)
449
      if (value == nil or (stricly and value <= 0)) then
450
        onError()
451
        value = nil
452
      end
453
    elseif (mode == 2) then
454
      if (value ~= "y" and value ~= "n") then
455
        onError()
456
        value = nil
457
      end
458
    end
459
  end
460
  onSuccess()
461
  return value
462
end
463
464
function configMode()
465
  local isOk = false
466
  local widTmp, heiTmp, lenTmp, tmpBlockSlotsToKeep = nil, nil, nil, nil
467
  local goBackForCobbleTmp, goBackToEmptyTmp, sendOnRednetTmp = nil, nil, nil
468
  local fillLeftWallTmp, fillRightWallTmp, fillFloorTmp, fillCeilingTmp, fillBackWallTmp = nil, nil, nil, nil, nil
469
  local digOnlyTmp = nil
470
  local timeToWait = 0
471
  local success = function()
472
    print("Hum... Ok !")
473
    os.sleep(timeToWait)
474
  end
475
  local numberError = function()
476
    print("Invalid entry : need a strictly positive number.")
477
    os.sleep(timeToWait)
478
  end
479
  local ynError = function()
480
    print("I told you to ask y or n.")
481
    os.sleep(timeToWait)
482
  end
483
  
484
  while (not isOk) do
485
    widTmp = readPrompt("Tunnel width : ", 1, numberError, success, true, true)
486
    heiTmp = readPrompt("Tunnel height : ", 1, numberError, success, true, true)
487
    lenTmp = readPrompt("Tunnel length : ", 1, numberError, success, true, true)
488
    digOnlyTmp = readPrompt("Run in dig only ? (y/n) ", 2, ynError, success, true)
489
    if (digOnlyTmp == "n") then
490
      fillLeftWallTmp = readPrompt("Should I fill the left wall ? (y/n) ", 2, ynError, success, true)
491
      fillRightWallTmp = readPrompt("Should I fill the right wall ? (y/n) ", 2, ynError, success, true)
492
      fillBackWallTmp = readPrompt("Should I fill the back wall ? (y/n) ", 2, ynError, success, true)
493
      fillFloorTmp = readPrompt("Should I fill the floor ? (y/n) ", 2, ynError, success, true)
494
      fillCeilingTmp = readPrompt("Should I fill the ceiling ? (y/n) ", 2, ynError, success, true)
495
      if (fillLeftWallTmp == "n" and fillRightWallTmp == "n" and fillBackWallTmp == "n" and fillFloorTmp == "n" and fillCeilingTmp == "n") then
496
        digOnlyTmp = "y"
497
      end
498
    end
499
    if (digOnlyTmp == "n") then
500
      tmpBlockSlotsToKeep = readPrompt("How many slots do you want me to keep for filling blocks ? ", 1, numberError, success, true, true)
501
      goBackForCobbleTmp = readPrompt("Should I go back to start when I need filling blocks ? (y/n) ", 2, ynError, success, true)
502
    end
503
    goBackToEmptyTmp = readPrompt("Should I empty when I'm full ? (y/n) ", 2, ynError, success, true)
504
    sendOnRednetTmp = readPrompt("Should I send infos on rednet ? (y/n) ", 2, ynError, success, true)
505
    shell.run("clear")
506
    print("Tunnel w = "..widTmp.." h = "..heiTmp.." l = "..lenTmp)
507
    print("Dig Only : "..digOnlyTmp)
508
    if (digOnlyTmp == "n") then
509
      print("Fill left wall : "..fillLeftWallTmp)
510
      print("Fill right wall : "..fillRightWallTmp)
511
      print("Fill back wall : "..fillBackWallTmp)
512
      print("Fill floor wall : "..fillFloorTmp)
513
      print("Fill ceiling wall : "..fillCeilingTmp)
514
      print("Blocks to keep : "..tmpBlockSlotsToKeep)
515
      print("Back when need blocks : "..goBackForCobbleTmp)
516
    end
517
    print("Empty when full : "..goBackToEmptyTmp)
518
    print("Infos on rednet : "..sendOnRednetTmp)
519
    print("")
520
    isOk = readPrompt("Is this ok for you ? (y/n) ", 2, ynError, success, false)
521
    if (isOk == "y") then isOk = true else isOk = false end
522
  end
523
  width = widTmp
524
  height = heiTmp
525
  length = lenTmp
526
  blockSlotsToKeep = tmpBlockSlotsToKeep
527
  if (digOnlyTmp == "y") then digOnly = true else digOnly = false end
528
  
529
  if (fillLeftWallTmp == "y") then fillLeftWall = true else fillLeftWall = false end
530
  if (fillRightWallTmp == "y") then fillRightWall = true else fillRightWall = false end
531
  if (fillBackWallTmp == "y") then fillBackWall = true else fillBackWall = false end
532
  if (fillCeilingTmp == "y") then fillCeiling = true else fillCeiling = false end
533
  if (fillFloorTmp == "y") then fillFloor = true else fillFloor = false end
534
  
535
  if (goBackForCobbleTmp == "y") then goBackForCobble = true else goBackForCobble = false end
536
  if (goBackToEmptyTmp == "y") then goBackForEmpty = true else goBackForEmpty = false end
537
  if (sendOnRednetTmp == "y") then sendOnRednet = true else sendOnRednet = false end
538
end
539
540
function dig(face)
541
  if (face == nil) then
542
    while (turtle.detect()) do
543
      while (not turtle.dig()) do
544
        turtle.attack()
545
      end
546
      os.sleep(0.5)
547
      infos.blocksDug = infos.blocksDug + 1
548
    end
549
  elseif (face == "up") then
550
    while (turtle.detectUp()) do
551
      while (not turtle.digUp()) do
552
        turtle.attackUp()
553
      end
554
      os.sleep(0.5)
555
      infos.blocksDug = infos.blocksDug + 1
556
    end
557
  elseif (face == "down") then
558
    while (not turtle.digDown()) do
559
      turtle.attackDown()
560
    end
561
    infos.blocksDug = infos.blocksDug + 1
562
  end
563
end
564
565
function checkBlock()
566
  local countBlock = 0
567
  
568
  if (digOnly) then
569
    return
570
  end
571
572
  if (turtle.getItemCount(1) < 5) then
573
    manageInventory()
574
  else
575
    return
576
  end
577
  
578
  for i = 1, blockSlotsToKeep do
579
    turtle.select(i)
580
    if (turtle.compareTo(1)) then
581
      countBlock = countBlock + turtle.getItemCount(i)
582
    end
583
  end
584
  
585
  if (countBlock < 5 and goBackForCobble) then
586
    tell("Need block !")
587
    if (moved == 0) then goToPos(-1 * x, -1 * y, -1 * z, -1 * side, "szyx") end
588
    moved = 1
589
    os.sleep(10)
590
    return checkBlock()
591
  end
592
  if (moved == 1) then
593
    tell("Going back to work !")
594
    goToPos(x, y, z, side, "zyxs")
595
    moved = 0
596
  end
597
end
598
599
function left()
600
  turnLeft()
601
  forward()
602
  turnRight()
603
end
604
605
function forward()
606
  while (not turtle.forward()) do
607
    if (turtle.detect()) then
608
      turtle.dig()
609
    else
610
      turtle.attack()
611
    end
612
  end
613
  if (side == 0) then
614
    x = x + 1
615
  elseif (side == 1) then
616
    y = y + 1
617
  elseif (side == 2) then
618
    x = x - 1
619
  elseif (side == 3) then
620
    y = y - 1
621
  else
622
    tell("Unknown side found : "..side)
623
  end
624
  p = p + 1
625
end
626
627
function back()
628
  if (turtle.back()) then
629
    if (side == 0) then
630
      x = x - 1
631
    elseif (side == 1) then
632
      y = y - 1
633
    elseif (side == 2) then
634
      x = x + 1
635
    elseif (side == 3) then
636
      y = y + 1
637
    else
638
      tell("Unknown side found : "..side)
639
    end
640
  else
641
    turtle.turnLeft()
642
    turtle.turnLeft()
643
    forward()
644
    turtle.turnRight()
645
    turtle.turnRight()
646
  end
647
end
648
649
function up()
650
  while (not turtle.up()) do
651
    if (turtle.detectUp()) then
652
      turtle.digUp()
653
    else
654
      turtle.attackUp()
655
    end
656
  end
657
  z = z + 1
658
  p = p + 1
659
end
660
661
function down()
662
  while (not turtle.down()) do
663
    if (turtle.detectDown()) then
664
      turtle.digDown()
665
    else
666
      turtle.attackDown()
667
    end
668
  end
669
  z = z - 1
670
end
671
672
function turnLeft()
673
  turtle.turnLeft()
674
  side = side - 1
675
  if (side < 0) then
676
    side = side + 4
677
  end
678
end
679
680
function turnRight()
681
  turtle.turnRight()
682
  side = side + 1
683
  if (side >= 4) then
684
    side = side - 4
685
  end
686
end
687
688
function right()
689
  turnRight()
690
  forward()
691
  turnLeft()
692
end
693
694
function tell(message)
695
  screenQuery("update", "message", message)
696
  screenQuery("draw")
697
  if (sendOnRednet) then
698
    rednet.broadcast(name.." "..message)
699
  end
700
end
701
702
function goToPos(xTmp, yTmp, zTmp, sideTmp, order)
703
  local xMove = function()
704
    while (xTmp ~= 0) do
705
      if (xTmp > 0) then
706
        while (not turtle.forward()) do
707
          turtle.dig()
708
          turtle.attack()
709
          os.sleep(0.4)
710
        end
711
        xTmp = xTmp - 1
712
      else
713
        if (not turtle.back()) then
714
          turtle.turnLeft()
715
          turtle.turnLeft()
716
          while (not turtle.forward()) do
717
            turtle.dig()
718
            turtle.attack()
719
            os.sleep(0.4)
720
          end
721
          turtle.turnRight()
722
          turtle.turnRight()
723
        end
724
        xTmp = xTmp + 1
725
      end
726
    end
727
  end
728
  local yMove = function()
729
    if (yTmp > 0) then
730
      turtle.turnRight()
731
      while (yTmp > 0) do
732
        while (not turtle.forward()) do
733
          turtle.dig()
734
          turtle.attack()
735
          os.sleep(0.4)
736
        end
737
        yTmp = yTmp - 1
738
      end
739
      turtle.turnLeft()
740
    elseif (yTmp < 0) then
741
      turtle.turnLeft()
742
      while (yTmp < 0) do
743
        while (not turtle.forward()) do
744
          turtle.dig()
745
          turtle.attack()
746
          os.sleep(0.4)
747
        end
748
        yTmp = yTmp + 1
749
      end
750
      turtle.turnRight()
751
    end
752
  end
753
  local zMove = function()
754
    while (zTmp ~= 0) do
755
      if (zTmp < 0) then
756
        while (not turtle.down()) do
757
          turtle.attackDown()
758
          turtle.digDown()
759
          os.sleep(0.4)
760
        end
761
        zTmp = zTmp + 1
762
      else
763
        while (not turtle.up()) do
764
          turtle.attackUp()
765
          turtle.digUp()
766
          os.sleep(0.4)
767
        end
768
        zTmp = zTmp - 1
769
      end
770
    end
771
  end
772
  local sMove = function()
773
    while (sideTmp ~= 0) do
774
      if (sideTmp > 0) then
775
        turtle.turnRight()
776
        sideTmp = sideTmp - 1
777
      else
778
        turtle.turnLeft()
779
        sideTmp = sideTmp + 1
780
      end
781
    end
782
  end
783
784
  for a = 1, 4 do
785
    if (order:sub(a, a) == "x") then
786
      xMove()
787
    elseif (order:sub(a, a) == "y") then
788
      yMove()
789
    elseif (order:sub(a, a) == "z") then
790
      zMove()
791
    elseif (order:sub(a, a) == "s") then
792
      sMove()
793
    end
794
  end
795
end
796
797
-- Point de départ du programme --
798
main()