Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

technic_cnc: use programs definition to generate formspec #647

Merged
merged 1 commit into from
Aug 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
165 changes: 80 additions & 85 deletions technic_cnc/cnc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -72,74 +72,68 @@ else
end
end

local onesize_products = {
slope = 2,
slope_edge = 1,
slope_inner_edge = 1,
pyramid = 2,
spike = 1,
cylinder = 2,
oblate_spheroid = 1,
sphere = 1,
stick = 8,
slope_upsdown = 2,
slope_edge_upsdown = 1,
slope_inner_edge_upsdown = 1,
cylinder_horizontal = 2,
slope_lying = 2,
onecurvededge = 1,
twocurvededge = 1,
}
local twosize_products = {
element_straight = 2,
element_end = 2,
element_cross = 1,
element_t = 1,
element_edge = 2,
}

local cnc_formspec =
"size[9,11;]"..
"label[1,0;"..S("Choose Milling Program:").."]"..
"image_button[1,0.5;1,1;technic_cnc_slope.png;slope; ]"..
"image_button[2,0.5;1,1;technic_cnc_slope_edge.png;slope_edge; ]"..
"image_button[3,0.5;1,1;technic_cnc_slope_inner_edge.png;slope_inner_edge; ]"..
"image_button[4,0.5;1,1;technic_cnc_pyramid.png;pyramid; ]"..
"image_button[5,0.5;1,1;technic_cnc_spike.png;spike; ]"..
"image_button[6,0.5;1,1;technic_cnc_cylinder.png;cylinder; ]"..
"image_button[7,0.5;1,1;technic_cnc_oblate_spheroid.png;oblate_spheroid; ]"..
"image_button[8,0.5;1,1;technic_cnc_stick.png;stick; ]"..

"image_button[1,1.5;1,1;technic_cnc_slope_upsdwn.png;slope_upsdown; ]"..
"image_button[2,1.5;1,1;technic_cnc_slope_edge_upsdwn.png;slope_edge_upsdown; ]"..
"image_button[3,1.5;1,1;technic_cnc_slope_inner_edge_upsdwn.png;slope_inner_edge_upsdown; ]"..
"image_button[4,1.5;1,1;technic_cnc_cylinder_horizontal.png;cylinder_horizontal; ]"..
"image_button[5,1.5;1,1;technic_cnc_sphere.png;sphere; ]"..

"image_button[1,2.5;1,1;technic_cnc_slope_lying.png;slope_lying; ]"..
"image_button[2,2.5;1,1;technic_cnc_onecurvededge.png;onecurvededge; ]"..
"image_button[3,2.5;1,1;technic_cnc_twocurvededge.png;twocurvededge; ]"..

"label[1,3.5;"..S("Slim Elements half / normal height:").."]"..

"image_button[1,4;1,0.5;technic_cnc_full.png;full; ]"..
"image_button[1,4.5;1,0.5;technic_cnc_half.png;half; ]"..
"image_button[2,4;1,1;technic_cnc_element_straight.png;element_straight; ]"..
"image_button[3,4;1,1;technic_cnc_element_end.png;element_end; ]"..
"image_button[4,4;1,1;technic_cnc_element_cross.png;element_cross; ]"..
"image_button[5,4;1,1;technic_cnc_element_t.png;element_t; ]"..
"image_button[6,4;1,1;technic_cnc_element_edge.png;element_edge; ]"..

"label[0, 5;"..S("In:").."]"..
"list[current_name;src;0.5,5.5;1,1;]"..
"label[4, 5;"..S("Out:").."]"..
"list[current_name;dst;5,5.5;4,1;]"..

"list[current_player;main;0,7;8,4;]"..
"listring[current_name;dst]"..
"listring[current_player;main]"..
"listring[current_name;src]"..
"listring[current_player;main]"
local function add_buttons(do_variants, t, x, y)
local X_OFFSET = 1
local BUTTONS_PER_ROW = 7

-- ipairs: only iterate over continuous integers
for _, data in ipairs(technic_cnc.programs) do
-- Never add full variants. Only add half variants when asked
if not data.half_counterpart and (do_variants == (data.full_counterpart ~= nil)) then
--print("add", data.suffix)
t[#t + 1] = ("image_button[%g,%g;1,1;%s.png;%s; ]"):format(
x + X_OFFSET, y, data.suffix, data.short_name
)
t[#t + 1] = ("tooltip[%s;%s]"):format(
data.short_name, minetest.formspec_escape(data.desc .. " (* " .. data.output .. ")")
)

x = x + 1
if x == BUTTONS_PER_ROW then
x = 0
y = y + 1
end
end
end
end

local function make_formspec()
local t = {
"size[9,11;]",
"label[1,0;"..S("Choose Milling Program:").."]",
}
add_buttons(false, t, 0, 0.5)

t[#t + 1] = (
"label[1,3.5;"..S("Slim Elements half / normal height:").."]"..
"image_button[1,4;1,0.5;technic_cnc_full.png;full; ]"..
"image_button[1,4.5;1,0.5;technic_cnc_half.png;half; ]"
)
add_buttons(true, t, 1, 4)

t[#t + 1] = (
"label[0, 5;"..S("In:").."]"..
"list[current_name;src;0.5,5.5;1,1;]"..
"label[4, 5;"..S("Out:").."]"..
"list[current_name;dst;5,5.5;4,1;]"..

"list[current_player;main;0,7;8,4;]"..
"listring[current_name;dst]"..
"listring[current_player;main]"..
"listring[current_name;src]"..
"listring[current_player;main]"
)

return table.concat(t)
end

local cnc_formspec = nil

minetest.register_on_mods_loaded(function()
technic_cnc._populate_shortcuts()
cnc_formspec = make_formspec()
end)


-- The form handler is declared here because we need it in both the inactive and active modes
-- in order to be able to change programs wile it is running.
Expand Down Expand Up @@ -168,27 +162,28 @@ local function form_handler(pos, formname, fields, sender)

for k, _ in pairs(fields) do
-- Set a multipier for the half/full size capable blocks
local multiplier
if twosize_products[k] ~= nil then
multiplier = size * twosize_products[k]
else
multiplier = onesize_products[k]
local program = technic_cnc.programs["technic_cnc_" .. k]
if size == 1 and program and program.full_counterpart then
program = technic_cnc.programs["technic_cnc_" .. k .. "_double"]
end
if program then
local multiplier = program.output
local product = inputname .. "_" .. program.suffix

if onesize_products[k] ~= nil or twosize_products[k] ~= nil then
meta:set_float( "cnc_multiplier", multiplier)
meta:set_string("cnc_user", sender:get_player_name())
end

if onesize_products[k] ~= nil or (twosize_products[k] ~= nil and size==2) then
meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k)
--print(inputname .. "_technic_cnc_" .. k)
break
end

if twosize_products[k] ~= nil and size==1 then
meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k .. "_double")
--print(inputname .. "_technic_cnc_" .. k .. "_double")
if program.half_counterpart then -- is full
if size == 1 then
meta:set_string("cnc_product", product)
--print(product, multiplier)
end
break -- no larger sizes allowed
end

-- half for normal
meta:set_string("cnc_product", product)
--print(product, multiplier)
break
end
end
Expand Down Expand Up @@ -236,7 +231,7 @@ local run = function(pos, node)
meta:set_int("src_time", meta:get_int("src_time") + 1)
if meta:get_int("src_time") >= 3 then -- 3 ticks per output
meta:set_int("src_time", 0)
srcstack = inv:get_stack("src", 1)
local srcstack = inv:get_stack("src", 1)
srcstack:take_item()
inv:set_stack("src", 1, srcstack)
inv:add_item("dst", result.." "..meta:get_int("cnc_multiplier"))
Expand Down
Loading