diff --git a/New Attempts/Centrifuges.lua b/New Attempts/Centrifuges.lua new file mode 100644 index 0000000..0a5f49e --- /dev/null +++ b/New Attempts/Centrifuges.lua @@ -0,0 +1,417 @@ + +xRelPos = 0 -- "positive = forward" +yRelPos = 0 -- "positive = right" +zRelPos = 0 -- "positive = upwards" + +facing = { + x = 1, + y = 0 +} + +cells_drop = 0 +slot_cells_min = 0 +slot_cells_max = 0 +slot_cells_cur = 0 + +input_drop = 0 +slot_input_min = 0 +slot_input_max = 0 +slot_input_cur = 0 + +output_1_take = 0 +slot_output_1_min = 0 +slot_output_1_max = 0 +slot_output_1_cur = 0 + +output_2_take = 0 +slot_output_2_min = 0 +slot_output_2_max = 0 +slot_output_2_cur = 0 + +output_3_take = 0 +slot_output_3_min = 0 +slot_output_3_max = 0 +slot_output_3_cur = 0 + +output_4_take = 0 +slot_output_4_min = 0 +slot_output_4_max = 0 +slot_output_4_cur = 0 + +function printPos() + print("At (", xRelPos, ", ", yRelPos, ", ", zRelPos, ") facing (", facing.x, ", ", facing.y, ")") +end + +-- helper functions for movement +function forward() + xRelPos = xRelPos + facing.x + yRelPos = yRelPos + facing.y + + if turtle.forward() then + return true + end + + xRelPos = xRelPos - facing.x + yRelPos = yRelPos - facing.y + + turtle.dig() + turtle.attack() + return false +end + +function forceForward() + -- try moving forward until it works + while not forward() do end +end + +function upwards() + zRelPos = zRelPos + 1 + if turtle.up() then + return true + end + zRelPos = zRelPos - 1 + turtle.digUp() + turtle.attackUp() + return false +end + +function forceUpwards() + -- try moving upwards until it works + while not upwards() do end +end + +function downwards() + zRelPos = zRelPos - 1 + if turtle.down() then + return true + end + zRelPos = zRelPos + 1 + turtle.digDown() + turtle.attackDown() + return false +end + +function forceDownwards() + -- try moving upwards until it works + while not downwards() do end +end + +function forcePlace() + -- try placing until it works + while not turtle.place() do + turtle.dig() + turtle.attack() + end +end + +function forcePlaceDown() + -- try placing until it works + while not turtle.placeDown() do + turtle.digDown() + turtle.attackDown() + end +end + +function forcePlaceUp() + -- try placing until it works + while not turtle.placeUp() do + turtle.digUp() + turtle.attackUp() + end +end + +function turnRight() + if facing.x == 1 and facing.y == 0 then -- facing forward + facing.x = 0 + facing.y = 1 + elseif facing.x == 0 and facing.y == 1 then -- facing right + facing.x = -1 + facing.y = 0 + elseif facing.x == -1 and facing.y == 0 then -- facing backward + facing.x = 0 + facing.y = -1 + elseif facing.x == 0 and facing.y == -1 then -- facing left + facing.x = 1 + facing.y = 0 + else + print("turnRight: This should never happen") + end + turtle.turnRight() +end + +function turnLeft() + if facing.x == 1 and facing.y == 0 then -- facing forward + facing.x = 0 + facing.y = -1 + elseif facing.x == 0 and facing.y == 1 then -- facing right + facing.x = 1 + facing.y = 0 + elseif facing.x == -1 and facing.y == 0 then -- facing backward + facing.x = 0 + facing.y = 1 + elseif facing.x == 0 and facing.y == -1 then -- facing left + facing.x = -1 + facing.y = 0 + else + print("turnLeft: This should never happen") + end + turtle.turnLeft() +end + +function faceTo(x, y) + if (x == facing.x) and (y == facing.y) then + return + end + if (x == 1 and facing.x == -1) or (x == -1 and facing.x == 1) or (y == 1 and facing.y == -1) or (y == -1 and facing.y == 1) then + turnRight() + turnRight() + elseif (facing.y == -1 and x == 1) or (facing.y == 1 and x == -1) or (facing.x == 1 and y == 1) or (facing.x == -1 and y == -1) then + turnRight() + elseif (facing.y == -1 and x == -1) or (facing.y == 1 and x == 1) or (facing.x == 1 and y == -1) or (facing.x == -1 and y == 1) then + turnLeft() + else + print("faceTo: This should never happen") + end +end + +function moveTo(x, y) + if (yRelPos > y) then + faceTo(0, -1) + while yRelPos > y do + forward() + end + elseif (yRelPos < y) then + faceTo(0, 1) + while yRelPos < y do + forward() + end + end + + if (xRelPos > x) then + faceTo(-1, 0) + while xRelPos > x do + forward() + end + elseif (xRelPos < x) then + faceTo(1, 0) + while xRelPos < x do + forward() + end + end +end + +function resupplyItem(slot, num) + turtle.select(slot) + while (turtle.getItemCount(slot) < num) do + turtle.suck(num - turtle.getItemCount(slot)) + end +end + +function resupplyAll() + -- clean entire inventory + moveTo(0, 2); faceTo(-1, 0) + for i = 1, 16 do + while turtle.getItemCount(i) > 0 do + turtle.select(i) + turtle.drop() + end + end + + -- get ingredient + moveTo(0, 1); faceTo(-1, 0) + slot_input_cur = slot_input_min + for i = slot_input_min, slot_input_max do + if (turtle.getItemCount(i) < 64) then + resupplyItem(i, 64) + end + end + + -- get cells + moveTo(0, 0); faceTo(-1, 0) + slot_cells_cur = slot_cells_min + for i = slot_cells_min, slot_cells_max do + if (turtle.getItemCount(i) < 64) then + resupplyItem(i, 64) + end + end +end + +function supplyCentrifuge() + module = peripheral.wrap("right") + + -- drop cells from below (side 0) + turtle.select(slot_cells_cur) + drop = cells_drop + if (turtle.getItemCount(slot_cells_cur) < drop) then + drop = drop - turtle.getItemCount(slot_cells_cur) + module.dropSneakyUp(0) + slot_cells_cur = slot_cells_cur + 1 + turtle.select(slot_cells_cur) + end + module.dropSneakyUp(0, drop) + + -- drop input from above (side 1) + turtle.select(slot_input_cur) + drop = input_drop + if (turtle.getItemCount(slot_input_cur) < drop) then + drop = drop - turtle.getItemCount(slot_input_cur) + module.dropSneakyUp(1) + slot_input_cur = slot_input_cur + 1 + turtle.select(slot_input_cur) + end + module.dropSneakyUp(1, drop) +end + +function emptyCentrifuge() + module = peripheral.wrap("right") + + -- get output 1 + turtle.select(slot_output_1_cur) + take = output_1_take + if (turtle.getItemCount(slot_output_1_cur) + take > 64) then + take_now = 64 - turtle.getItemCount(slot_output_1_cur) + take = take - take_now + module.suckSneakyUp(2, take_now) + slot_output_1_cur = slot_output_1_cur + 1 + turtle.select(slot_output_1_cur) + end + -- if no input is ready, move on immediately + if module.suckSneakyUp(2, take) == false then + return + end + + -- get output 2 + turtle.select(slot_output_2_cur) + take = output_2_take + if (turtle.getItemCount(slot_output_2_cur) + take > 64) then + take_now = 64 - turtle.getItemCount(slot_output_2_cur) + take = take - take_now + module.suckSneakyUp(2, take_now) + slot_output_2_cur = slot_output_2_cur + 1 + turtle.select(slot_output_2_cur) + end + module.suckSneakyUp(2, take) + + -- get output 3 + turtle.select(slot_output_3_cur) + take = output_3_take + if (turtle.getItemCount(slot_output_3_cur) + take > 64) then + take_now = 64 - turtle.getItemCount(slot_output_3_cur) + take = take - take_now + module.suckSneakyUp(2, take_now) + slot_output_3_cur = slot_output_3_cur + 1 + turtle.select(slot_output_3_cur) + end + module.suckSneakyUp(2, take) + + -- get output 4 + turtle.select(slot_output_4_cur) + take = output_4_take + if (turtle.getItemCount(slot_output_4_cur) + take > 64) then + take_now = 64 - turtle.getItemCount(slot_output_4_cur) + take = take - take_now + module.suckSneakyUp(2, take_now) + slot_output_4_cur = slot_output_4_cur + 1 + turtle.select(slot_output_4_cur) + end + module.suckSneakyUp(2, take) +end + +-- sets up slot numbers with slots for cells and slots for input ingredient, and output 1 through 4 numbers of slots +function setupSlots(cells, input, output_1, output_2, output_3, output_4) + slot_cells_min = 1 + slot_cells_max = cells + slot_cells_cur = slot_cells_min + cells_drop = cells + + slot_input_min = slot_cells_max + 1 + slot_input_max = slot_input_min + input - 1 + slot_input_cur = slot_input_min + input_drop = input + + slot_output_1_min = 1 + slot_output_1_max = output_1 + slot_output_1_cur = slot_output_1_min + output_1_take = output_1 + + slot_output_2_min = slot_output_1_max + 1 + slot_output_2_max = slot_output_2_min + output_2 - 1 + slot_output_2_cur = slot_output_2_min + output_2_take = output_2 + + slot_output_3_min = slot_output_2_max + 1 + slot_output_3_max = slot_output_3_min + output_3 - 1 + slot_output_3_cur = slot_output_3_min + output_3_take = output_3 + + slot_output_4_min = slot_output_3_max + 1 + slot_output_4_max = slot_output_4_min + output_4 - 1 + slot_output_4_cur = slot_output_4_min + output_4_take = output_4 +end + +function enterSupplyLoop() + while true do + print("Resupplying...") + resupplyAll() + + -- go to first centrifuge and wait to start + moveTo(1, 0) + turtle.select(16) + while turtle.suckUp() do + putBack = turtle.getItemCount(16) + turtle.dropUp(putBack) + sleep(5) + end + + print("Putting cells and ingredient in the centrifuges...") + -- putting in ingredients on the way there + for i = 1, 7, 2 do + for j = 0, 7, 1 do -- moving right + moveTo(i, j) + supplyCentrifuge() + end + for j = 7, 0, -1 do -- moving left + moveTo(i + 1, j) + supplyCentrifuge() + end + end + + sleep(5) + -- wait a little so all centrifuges are ready for having their outputs taken + + print("Getting outputs from the centrifuges...") + -- getting outputs out on the way back + for i = 7, 1, -2 do + for j = 0, 7, 1 do -- moving right + moveTo(i + 1, j) + emptyCentrifuge() + end + for j = 7, 0, -1 do -- moving left + moveTo(i, j) + emptyCentrifuge() + end + end + end +end + +function redstoneLoop() + print("Supplying Redstone Centrifuges") + setupSlots(4, 10, 1, 5, 1, 3) -- 4 slots cells, 10 slots redstone + print("Starting in 5s...") + sleep(5) + + enterSupplyLoop() +end + +function platinumLoop() + print("Supplying Platinum Dust Centrifuges") + setupSlots(0, 1, 1, 0, 0, 0) -- 0 slots cells, 1 slot platinum dust + print("Starting in 5s...") + sleep(5) + + enterSupplyLoop() +end + +print("Centrifuges even item distribution program") +redstoneLoop()