Compare commits

..

23 commits

Author SHA1 Message Date
Emerson Rosen-Jones
7e524f29eb fix: fix requesting logic 2026-01-17 18:53:10 -05:00
Emerson Rosen-Jones
76787d4283 fix: remove syntax errors 2026-01-17 17:33:29 -05:00
Emerson Rosen-Jones
367744fdd6 chore: change plural item forms to match mc
E.g. "ingots" to "ingot"
2026-01-17 16:58:10 -05:00
Emerson Rosen-Jones
bcb70f8780 misc: remove completed goals 2026-01-17 16:54:53 -05:00
Emerson Rosen-Jones
4c7eaf14e9 feat: use getName to find names of items 2026-01-17 16:54:12 -05:00
Emerson Rosen-Jones
94dfe3c2b8 feat: new getName table
Table of utility functions
2026-01-17 16:53:25 -05:00
Emerson Rosen-Jones
a53c0b7508 feat: new config format
This reverts commit ecb7ff7c40.
It also integrates the new config somewhat
2026-01-17 16:50:04 -05:00
Emerson Rosen-Jones
2e424a2cda chore: align variable names
Changes STORAGE_ADDRESS to STORAGE_ADDR to match the other addresses.
2026-01-17 16:32:56 -05:00
Emerson Rosen-Jones
fa433f3c62 feat: start craft function 2026-01-17 16:32:14 -05:00
Emerson Rosen-Jones
47c3db46f9 feat: add crafting requester 2026-01-17 16:30:43 -05:00
Emerson Rosen-Jones
ceca1b3d60 misc: update progress 2026-01-16 23:34:56 -05:00
Emerson Rosen-Jones
acdd22bd1f feat: keep requesting until above MAX_NUM 2026-01-16 22:05:57 -05:00
Emerson Rosen-Jones
256b3779ed misc: name main ticker better 2026-01-16 22:04:29 -05:00
Emerson Rosen-Jones
378f44a977 fix: use request ticker for requests 2026-01-16 22:03:42 -05:00
Emerson Rosen-Jones
cc95868b29 fix: only allocate main_inv once 2026-01-16 22:03:03 -05:00
Emerson Rosen-Jones
95ba994777 chore: remove unused variable 2026-01-16 22:02:01 -05:00
Emerson Rosen-Jones
c7257114ef feat: implement new request_more 2026-01-16 22:01:46 -05:00
Emerson Rosen-Jones
9b17cd22fe misc: change todo 2026-01-16 21:56:31 -05:00
Emerson Rosen-Jones
4481b8e7fa feat: change sum_items for stock ticker 2026-01-16 21:55:56 -05:00
Emerson Rosen-Jones
ecb7ff7c40 revert: last commit 2026-01-16 21:55:07 -05:00
Emerson Rosen-Jones
3fb955bf0f feat: change config format 2026-01-16 18:20:44 -05:00
Emerson Rosen-Jones
25eae158b1 misc: demo old code 2026-01-03 20:23:31 -05:00
Emerson Rosen-Jones
55635e4b64 misc: set goals for update 2026-01-03 20:17:27 -05:00

View file

@ -6,11 +6,42 @@
-- constants -- constants
local INVENTORY = "left" local MAIN_TICKER = ""
local REQUEST_TICKER = ""
local CRAFTING_REQUESTER = ""
local STORAGE_ADDR = ""
local COMPACTING_ADDR = ""
local UNPACKING_ADDR = ""
local SLEEP_TIME = 30 local SLEEP_TIME = 30
local NUGGET_RATIO = 63 -- amount of nuggets per craft local NUGGET_RATIO = 63 -- amount of nuggets per craft
local BLOCK_RATIO = 7 -- amount of blocks per craft local BLOCK_RATIO = 7 -- amount of blocks per craft
local ITEM_TYPES = { "iron", "copper", "zinc", "gold", "electrum" } local ITEM_TYPES = {
iron = {
nugget = "minecraft",
ingot = "minecraft",
block = "minecraft",
},
copper = {
nugget = "create",
ingot = "minecraft",
block = "minecraft",
},
zinc = {
nugget = "create",
ingot = "create",
block = "create",
},
gold = {
nugget = "minecraft",
ingot = "minecraft",
block = "minecraft",
},
electrum = {
nugget = "createaddition",
ingot = "createaddition",
block = "createaddition",
},
}
local STACKS = 64 local STACKS = 64
local NUGGETS = 1 local NUGGETS = 1
@ -21,100 +52,90 @@ local BLOCKS = 81
local MIN_NUM = (4 * STACKS * NUGGETS) + (4 * STACKS * INGOTS) local MIN_NUM = (4 * STACKS * NUGGETS) + (4 * STACKS * INGOTS)
local MAX_NUM = (8 * STACKS * NUGGETS) + (8 * STACKS * INGOTS) local MAX_NUM = (8 * STACKS * NUGGETS) + (8 * STACKS * INGOTS)
-- TODO map targets to specific relays and faces local getName = {
-- Key - 1: nuggets_to_ingots, 2: ingots_to_blocks, 3: blocks_to_ingots, nugget = function (item_type)
-- 4: ingots_to_nuggets, 5: enable/disable production return ("%s:%s_nugget"):format(
local target = {} ITEM_TYPES[item_type].nugget,
target.iron = {} item_type
target.iron[1] = "0:front" )
target.iron[2] = "0:top" end,
target.iron[3] = "0:back" ingot = function (item_type)
target.iron[4] = "16:front" return ("%s:%s_ingot"):format(
target.iron[5] = "17:back" ITEM_TYPES[item_type].ingot,
target.copper = {} item_type
target.copper[1] = "1:front" )
target.copper[2] = "1:top" end,
target.copper[3] = "1:back" block = function (item_type)
target.copper[4] = "16:top" return ("%s:%s_block"):format(
target.copper[5] = "18:front" ITEM_TYPES[item_type].block,
target.zinc = {} item_type
target.zinc[1] = "2:front" )
target.zinc[2] = "2:top" end,
target.zinc[3] = "2:back" }
target.zinc[4] = "16:back"
target.zinc[5] = "18:top"
target.gold = {}
target.gold[1] = "3:front"
target.gold[2] = "3:top"
target.gold[3] = "3:back"
target.gold[4] = "17:front"
target.gold[5] = "18:back"
target.electrum = {}
target.electrum[1] = "4:front"
target.electrum[2] = "4:top"
target.electrum[3] = "4:back"
target.electrum[4] = "17:top"
-- basic actions -- basic actions
function craft (item_type, conversion_type) function craft (requester, item_type, conversion_type)
-- TODO double check this -- conversion_type key: 1, nuggets to ingots; 2, ingots to blocks;
local relay_num, face = string.match( -- 3, blocks to ingots; 4, ingots to nuggets
target[item_type][conversion_type], local convert = {
"(%d+):(%l+)" getName.nugget,
) getName.ingot,
local periph = string.format("redstone_relay_%d", relay_num) getName.block,
peripheral.call(periph, "setOutput", face, true) getName.ingot,
os.sleep(0.1) }
peripheral.call(periph, "setOutput", face, false) local name = convert[conversion_type](item_type)
local compacting = conversion_type <= 2
local count, address
if compacting then
count = NUGGET_RATIO
address = COMPACTING_ADDR
else
count = BLOCK_RATIO
address = UNPACKING_ADDR
end
requester.setAddress(address)
requester.setRequest({ name = name, count = count })
requester.request()
end end
function craft_multiple (item_type, conversion_type, count) function craft_multiple (requester, item_type, conversion_type, count)
if count < 1 then if count < 1 then
return return
else else
craft(item_type, conversion_type) craft(requester, item_type, conversion_type)
os.sleep(1) os.sleep(1)
return craft_multiple(item_type, conversion_type, count - 1) return craft_multiple(requester, item_type, conversion_type, count - 1)
end end
end end
function execute_crafts (item_type, crafts) function execute_crafts (requester, item_type, crafts)
local num_crafts = crafts.nuggets local num_crafts = crafts.nugget
if num_crafts > 0 then if num_crafts > 0 then
print(("Crafting %s nuggets"):format(item_type)) print(("Crafting %s nuggets"):format(item_type))
craft_multiple(item_type, 4, num_crafts) craft_multiple(requester, item_type, 4, num_crafts)
elseif num_crafts < 0 then elseif num_crafts < 0 then
print(("Crafting %s ingots"):format(item_type)) print(("Crafting %s ingots"):format(item_type))
craft_multiple(item_type, 1, -num_crafts) craft_multiple(requester, item_type, 1, -num_crafts)
end end
num_crafts = crafts.blocks num_crafts = crafts.block
if num_crafts > 0 then if num_crafts > 0 then
print(("Crafting %s blocks"):format(item_type)) print(("Crafting %s blocks"):format(item_type))
craft_multiple(item_type, 2, num_crafts) craft_multiple(requester, item_type, 2, num_crafts)
elseif num_crafts < 0 then elseif num_crafts < 0 then
print(("Crafting %s ingots"):format(item_type)) print(("Crafting %s ingots"):format(item_type))
craft_multiple(item_type, 3, -num_crafts) craft_multiple(requester, item_type, 3, -num_crafts)
end end
end end
function set_production (item_type, produce) function request_more (ticker, item_type)
local target_string = target[item_type][5] ticker.requestFiltered(STORAGE_ADDR, { name = getName.nugget(item_type) })
if target_string == nil then return end
local relay_num, face = string.match(
target_string,
"(%d+):(%l+)"
)
local periph = string.format("redstone_relay_%d", relay_num)
-- ON is disable production
if produce then print(("Producing %s"):format(item_type)) end
peripheral.call(periph, "setOutput", face, not produce)
end end
-- logic -- logic
function sum_items (inv) function sum_items (inv_f)
local result = {} local result = {}
for _, item in pairs(inv.list()) do for _, item in pairs(inv_f()) do
if result[item.name] == nil then result[item.name] = 0 end if result[item.name] == nil then result[item.name] = 0 end
result[item.name] = result[item.name] + item.count result[item.name] = result[item.name] + item.count
end end
@ -122,14 +143,13 @@ function sum_items (inv)
end end
function dist_to_num (dist) function dist_to_num (dist)
return dist.nuggets + dist.ingots * INGOTS + dist.blocks * BLOCKS return dist.nugget + (dist.ingot * INGOTS) + (dist.block * BLOCKS)
end end
function get_dist (item_type, items) function get_dist (item_type, items)
local dist = { nuggets = 0, ingots = 0, blocks = 0 } local dist = { nugget = 0, ingot = 0, block = 0 }
for item, count in pairs(items) do for item, count in pairs(items) do
local type, form = item:match":(%l-)_(%l*)" local type, form = item:match":(%l-)_(%l*)"
form = string.format("%ss", form)
if type == item_type and dist[form] ~= nil then if type == item_type and dist[form] ~= nil then
dist[form] = dist[form] + count dist[form] = dist[form] + count
end end
@ -138,52 +158,51 @@ function get_dist (item_type, items)
end end
function decide_dist (num) function decide_dist (num)
local dist = { nuggets = 0, ingots = 0, blocks = 0 } local dist = { nugget = 0, ingot = 0, block = 0 }
if num > MAX_NUM then if num > MAX_NUM then
local excess = num - MAX_NUM local excess = num - MAX_NUM
dist.blocks = math.floor(excess / BLOCKS) dist.block = math.floor(excess / BLOCKS)
num = num - (dist.blocks * BLOCKS) num = num - (dist.block * BLOCKS)
end end
local balance = math.floor(num / 10) local balance = math.floor(num / 10)
dist.nuggets, dist.ingots = balance, balance dist.nugget, dist.ingot = balance, balance
num = num - (balance * 10) num = num - (balance * 10)
dist.nuggets = dist.nuggets + num dist.nugget = dist.nugget + num
return dist return dist
end end
function get_diff (dist1, dist2) function get_diff (dist1, dist2)
return { return {
nuggets = dist1.nuggets - dist2.nuggets, nugget = dist1.nugget - dist2.nugget,
ingots = dist1.ingots - dist2.ingots, ingot = dist1.ingot - dist2.ingot,
blocks = dist1.blocks - dist2.blocks block = dist1.block - dist2.block
} }
end end
function filter_clamp (diff, current_dist) function filter_clamp (diff, current_dist)
-- reduce diff numbers to what can be crafted using current resources -- reduce diff numbers to what can be crafted using current resources
if diff.blocks > 0 then if diff.block > 0 then
diff.blocks = math.min( diff.block = math.min(
diff.blocks - (diff.blocks % BLOCK_RATIO), diff.block - (diff.block % BLOCK_RATIO),
math.floor(current_dist.ingots / 9) math.floor(current_dist.ingot / 9)
) )
end end
if diff.nuggets > 0 then if diff.nugget > 0 then
diff.nuggets = math.min( diff.nugget = math.min(
diff.nuggets - (diff.nuggets % NUGGET_RATIO), diff.nugget - (diff.nugget % NUGGET_RATIO),
current_dist.ingots * 9 current_dist.ingot * 9
) )
end end
diff.ingots = (-diff.nuggets / 9) + (-diff.blocks * 9) diff.ingot = (-diff.nugget / 9) + (-diff.block * 9)
return diff return diff
end end
function diff_to_crafts (diff) function diff_to_crafts (diff)
-- TODO double-check this one
-- go from one end e.g. nuggets to the other e.g. blocks, removing -- go from one end e.g. nuggets to the other e.g. blocks, removing
-- from the diff to create crafts until the diff is empty -- from the diff to create crafts until the diff is empty
local crafts = {} local crafts = {}
crafts.nuggets = math.floor(diff.nuggets / NUGGET_RATIO) crafts.nugget = math.floor(diff.nugget / NUGGET_RATIO)
crafts.blocks = math.floor(diff.blocks / BLOCK_RATIO) crafts.block = math.floor(diff.block / BLOCK_RATIO)
return crafts return crafts
end end
@ -196,24 +215,35 @@ function print_counts (items)
end end
end end
local main_t = peripheral.wrap(MAIN_TICKER)
local request_t = peripheral.wrap(REQUEST_TICKER)
local craft_requester = peripheral.wrap(CRAFTING_REQUESTER)
craft_requester.setConfiguration("strict")
local requesting = {}
while true do while true do
-- 1. Sum items in inventory and organize by item type -- 1. Sum items in inventory and organize by item type
local items = sum_items(peripheral.wrap(INVENTORY)) local items = sum_items(main_t.stock)
-- print_counts(items) -- print_counts(items)
-- 2. either work towards a desired distribution or create more resources -- 2. either work towards a desired distribution or create more resources
for _, item_type in ipairs(ITEM_TYPES) do for item_type, _ in pairs(ITEM_TYPES) do
local current_dist = get_dist(item_type, items) local current_dist = get_dist(item_type, items)
local num = dist_to_num(current_dist) local num = dist_to_num(current_dist)
if num > MAX_NUM then set_production(item_type, false) end
if num > MIN_NUM then if num > MIN_NUM then
local desired_dist = decide_dist(num) local desired_dist = decide_dist(num)
local diff = get_diff(desired_dist, current_dist) local diff = get_diff(desired_dist, current_dist)
diff = filter_clamp(diff, current_dist) diff = filter_clamp(diff, current_dist)
local crafts = diff_to_crafts(diff) local crafts = diff_to_crafts(diff)
execute_crafts(item_type, crafts) execute_crafts(craft_requester, item_type, crafts)
else else
set_production(item_type, true) requesting[item_type] = true
end
if num > MAX_NUM then
-- keep requesting until above MAX_NUM
requesting[item_type] = false
end
if requesting[item_type] then
request_more(request_t, item_type)
end end
end end