initial commit
This commit is contained in:
commit
6687714b77
5
README.md
Normal file
5
README.md
Normal file
@ -0,0 +1,5 @@
|
||||
# ComputerCraft utilities
|
||||
|
||||
A bunch of non-related scripts which I don't know where to put, but here.
|
||||
|
||||
TODO: Maybe `cc-craft` and `cc-qturtle`, should be merged into here?
|
19
char-matrix.lua
Normal file
19
char-matrix.lua
Normal file
@ -0,0 +1,19 @@
|
||||
-- Print out all available characters in a matrix
|
||||
print(" |0123456789abcdef")
|
||||
print("-+----------------")
|
||||
for i=0, 15 do
|
||||
io.write(("%x|"):format(i))
|
||||
for j=0, 15 do
|
||||
local c = 16*i + j
|
||||
|
||||
-- The character 10 is \n. And it messes up the matrix
|
||||
-- So just write it as a space
|
||||
if c == 10 then
|
||||
io.write(" ")
|
||||
else
|
||||
io.write(("%c"):format(c, c))
|
||||
end
|
||||
end
|
||||
io.write("\n")
|
||||
end
|
||||
|
122
randbuild.lua
Normal file
122
randbuild.lua
Normal file
@ -0,0 +1,122 @@
|
||||
-- Removes blocks which are not placeable
|
||||
local function removeNonBlocks()
|
||||
-- Travel to the ground to test if it can place each item
|
||||
local traveled = 0
|
||||
while not turtle.detectDown() do turtle.down() traveled = traveled + 1 end
|
||||
local blocks = {}
|
||||
|
||||
-- Try placing each item and look at the error message produced
|
||||
-- If the message contains 'item' then it is an item
|
||||
for i=1, 16 do
|
||||
blocks[i] = turtle.getItemDetail(i)
|
||||
if blocks[i] then
|
||||
turtle.select(i)
|
||||
local _, reason = turtle.placeDown()
|
||||
if reason:match("item") then
|
||||
print(("Found non-block in slot '%s'"):format(i))
|
||||
blocks[i] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Travel back up to where the turtle started
|
||||
for _=1, traveled do turtle.up() end
|
||||
-- Drop all the items marked as non-blocks
|
||||
for i, details in pairs(blocks) do
|
||||
if type(details) ~= "table" then
|
||||
turtle.select(i)
|
||||
turtle.drop()
|
||||
blocks[i] = nil
|
||||
end
|
||||
end
|
||||
return blocks
|
||||
end
|
||||
|
||||
local function followPath(walk_path)
|
||||
local command_lookup = {
|
||||
U = turtle.up, D = turtle.down,
|
||||
F = turtle.forward, B = turtle.back,
|
||||
L = turtle.turnLeft, R = turtle.turnRight
|
||||
}
|
||||
local count, op = 0, ""
|
||||
local pattern_iterator = walk_path:gmatch("(%d+)([UDFBLR])")
|
||||
return function()
|
||||
while true do
|
||||
if count == 0 then
|
||||
count, op = pattern_iterator()
|
||||
if not (count and op) then return end
|
||||
end
|
||||
|
||||
command_lookup[op]()
|
||||
count = count - 1
|
||||
if op ~= "L" and op ~= "R" then
|
||||
return count, op
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function getTravelCost(walk_path)
|
||||
local distance = 0
|
||||
for count, op in walk_path:gmatch("(%d+)([UDFBLR])") do
|
||||
if op ~= "L" and op ~= "R" then
|
||||
distance = distance + count
|
||||
end
|
||||
end
|
||||
return distance
|
||||
end
|
||||
|
||||
-- Main
|
||||
math.randomseed(os.epoch())
|
||||
local build_path = "6F 1R 20F 1R 14F 1R 20F 1R 5F"
|
||||
|
||||
local travel_cost = getTravelCost(build_path)
|
||||
if travel_cost > turtle.getFuelLevel() then
|
||||
print(("- Insufficient fuel level %s, needed %s"):format(turtle.getFuelLevel(), travel_cost))
|
||||
return
|
||||
end
|
||||
print(("- Sufficient fuel level %s, needed %s"):format(turtle.getFuelLevel(), travel_cost))
|
||||
|
||||
print("- Removing items which are not blocks")
|
||||
local blocks_lookup = {}
|
||||
local total_blocks = 0
|
||||
for i, details in pairs(removeNonBlocks()) do
|
||||
local name = ("%s/%s"):format(details.name, details.damage or 0)
|
||||
blocks_lookup[name] = blocks_lookup[name] or {}
|
||||
blocks_lookup[name][i] = details.count
|
||||
blocks_lookup[name].total = (blocks_lookup[name].total or 0) + details.count
|
||||
total_blocks = total_blocks + details.count
|
||||
end
|
||||
turtle.up()
|
||||
|
||||
if travel_cost > total_blocks then
|
||||
print(("- Insufficient block count %s, needed %s"):format(total_blocks, travel_cost))
|
||||
return
|
||||
end
|
||||
print(("- Sufficient block count %s, needed %s"):format(total_blocks, travel_cost))
|
||||
|
||||
print(("- Following path and building: '%s'"):format(build_path))
|
||||
for _ in followPath(build_path) do
|
||||
local target_name, target_score
|
||||
|
||||
for name, details in pairs(blocks_lookup) do
|
||||
local score = details.total * math.random()
|
||||
if not target_score or score > target_score then
|
||||
target_score = score
|
||||
target_name = name
|
||||
end
|
||||
end
|
||||
|
||||
local target_block = blocks_lookup[target_name]
|
||||
for i=1, 16 do
|
||||
if target_block[i] and target_block[i] > 0 then
|
||||
turtle.select(i)
|
||||
target_block[i] = target_block[i] - 1
|
||||
target_block.total = target_block.total - 1
|
||||
break
|
||||
end
|
||||
end
|
||||
turtle.placeDown()
|
||||
end
|
||||
|
||||
print("- Finished")
|
Loading…
Reference in New Issue
Block a user