elepower/elepower_tome/i_page_machines.lua

314 lines
11 KiB
Lua

---------------------------------------------------
-- ___ _ --
-- | __| |___ _ __ _____ __ _____ _ _ --
-- | _|| / -_) '_ \/ _ \ V V / -_) '_| --
-- |___|_\___| .__/\___/\_/\_/\___|_| --
-- |_| --
-- _____ --
-- |_ _|__ _ __ ___ --
-- | |/ _ \ ' \/ -_) --
-- |_|\___/_|_|_\___| --
---------------------------------------------------
-- Machines/Node Crafters --
---------------------------------------------------
function eletome.machines(machine,page_num)
-- remove "action:" from string
local raw_mach_input = string.match(machine, ":(.*)")
-- split on "-" to remove "machine"
local machine_split = string.split(raw_mach_input,"-")
local machine_name = machine_split[2]
local mach_group
if machine_name == "ele_provider" then
machine_name = "Generators"
mach_group = "ele_provider"
elseif machine_name == "ele_storage" then
machine_name = "Powercells"
mach_group = "ele_storage"
elseif machine_name == "ele_user" then
machine_name = "Machine"
mach_group = "ele_user"
elseif machine_name == "ele_lighting" then
machine_name = "Lighting"
mach_group = "ele_lighting"
end
-- remove "_"
local mach_name = string.gsub(machine_name,"_", " ")
-- Assign Common styles to local vars
local sty_h0s = eletome.common_styles.style_h0s
local sty_h0e = eletome.common_styles.style_h0e
local sty_h1s = eletome.common_styles.style_h1s
local sty_h1e = eletome.common_styles.style_h1e
local sty_h2s = eletome.common_styles.style_h2s
local sty_h2e = eletome.common_styles.style_h2e
local sty_h3s = eletome.common_styles.style_h3s
local sty_h3e = eletome.common_styles.style_h3e
local sty_h4s = eletome.common_styles.style_h4s
local sty_h4e = eletome.common_styles.style_h4e
-- Additional Info Table
local add_info = eletome.ai
local sort_by = add_info[machine_name:lower()].sort_by or nil
local instructions = add_info[machine_name:lower()].instruct or nil
-----------------------
-- Machine left page --
-----------------------
local heading_lp = "hypertext[0.5,0.70;8.5,1.1;ass_mach_lp_h;"..sty_h0s..mach_name..sty_h0e.."]"
local head_sub_lp_ov = "hypertext[0.5,1.4;8.5,1.0;mach_lp_sh_ov;"..sty_h1s.."Overview"..sty_h1e.."]"
local lp_txt_space = 0
local ov_lp_img = add_info[machine_name:lower()].img or ""
if ov_lp_img ~= "" then
if instructions then
ov_lp_img = "style_type[image_button;bgimg=elepower_tome_bgimg_1.png]"..
"image_button[2.25,6.6;5,3.75;"..add_info[machine_name:lower()].img..";instructions;]"..
"tooltip[2.25,6.6;5,3.75;Click for detailed\ninstructions;"..eletome.tooltip_color.."]"..
"hypertext[0.5,10.1;8,0.5;large_image;"..sty_h4s..
"<action name=machine-"..machine_name..">Larger Image</action>"..
sty_h4e.."]"
else
ov_lp_img = "image[2.25,6.6;5,3.75;"..add_info[machine_name:lower()].img.."]"
end
else
lp_txt_space = 3.75
end
local ov_lp_txt = "hypertext[0.75,2.1;8.0,"..(4.5+lp_txt_space)..";mach_lp_ov_text;"..sty_h4s..(add_info[machine_name:lower()].over or "")..sty_h4e.."]"
------------------------
-- Machine right page --
------------------------
-- Get list of nodes
local mach_nodes
local mach_sort = {}
local mach_key = {}
if mach_group then
mach_key, mach_sort = eletome.get_nodes_in_group(mach_group)
else
local mach_nodes = add_info[machine_name:lower()].part or {}
for k,node_name in pairs(mach_nodes) do
table.insert(mach_sort,minetest.registered_items[node_name].description)
mach_key[minetest.registered_items[node_name].description] = node_name
end
end
-- Sort the table
if sort_by ~= nil then
if sort_by ~= "no_sort" then
-- Sort values by any field avaliable in node registration
mach_sort, mach_key = eletome.sort_by(sort_by,mach_sort,mach_key)
end
else
-- default sort is by node.description which can work in
-- unexpected ways due to translation wrapper.
table.sort(mach_sort)
end
local y_off = 0
local recipe_cnt = 1
local machine_list_rdy = {}
-- Recipe output for each node that makes up machine
for k,name_des in pairs(mach_sort) do
local name_reg = mach_key[name_des]
local m_recipe = "style_type[item_image_button;bgimg=elepower_tome_bgimg_2.png]"
local recipe = minetest.get_craft_recipe(name_reg)
local x_cnt = 1
local x_off = 0
local no_items = 0
-- additional info variables
local lb_top_img = "unknown"
local lb_top_tt
local lb_mid_img
local lb_mid_tt
local lb_btm_img = tostring(minetest.registered_items[name_reg].ele_usage or 0)
if mach_name == "Powercells" then
lb_btm_img = minetest.registered_items[name_reg].ele_output or 0
end
local lb_btm_tt = " EpUs per second"
local mb_title_txt
local mb_recipe_items
local how_use
-- Check for custom values in additional info and set
if add_info.nodes[name_reg] then
lb_top_img = add_info.nodes[name_reg].lb_top_img or "unknown"
lb_top_tt = add_info.nodes[name_reg].lb_top_tt or nil
lb_mid_img = add_info.nodes[name_reg].lb_mid_img or nil
lb_mid_tt = add_info.nodes[name_reg].lb_mid_tt or nil
-- don't overwrite this value if additional info value dosent exist
-- ie retain ele_usage for node
if add_info.nodes[name_reg].lb_btm_img then
lb_btm_img = add_info.nodes[name_reg].lb_btm_img
end
lb_btm_tt = add_info.nodes[name_reg].lb_btm_tt or " EpUs per second"
mb_title_txt = add_info.nodes[name_reg].mb_title_txt or nil
mb_recipe_items = add_info.nodes[name_reg].mb_recipe_items or nil
how_use = add_info.nodes[name_reg].how_use_1 or nil
end
-- catch empty recipe.items and check new crafts
-- and if not there set flag to not crash.
if not recipe.items then
-- check elepower crafts
recipe = eletome.get_craft_recipe(name_reg)
-- final catch to prevent crash
if not recipe.craft_name then
-- check for additional information
if mb_recipe_items then
recipe.items = mb_recipe_items
recipe.craft_name = mb_title_txt
recipe.craft_des = mb_title_txt
else
no_items = 1
end
end
end
-- Layout output per node is 3 large squares
-- 1st square input summary /power usage summary (background)
-- 2nd square is items to craft (nil-background)
-- 3rd square large image of node (background)
-- 1st 2nd 3rd
-- --------- --------- ---------
-- | |_| | |__|_|__| || ||
-- | |_| | |__|_|__| || ||
-- | |_| | |__|_|__| ||_____||
-- --------- --------- ---------
-- background box's 1 and 3 and large node image
m_recipe = m_recipe.."image["..(9.25)..","..(1+y_off)..";2.4,2.4;elepower_tome_bgimg_2.png]"
m_recipe = m_recipe.."image["..(14.75)..","..(1+y_off)..";2.4,2.4;elepower_tome_bgimg_2.png]"
--3rd square item
m_recipe = m_recipe.."item_image_button["..(14.85)..","..(1+y_off+0.1)..";2.2,2.2;"..mach_key[name_des]..";"..mach_key[name_des]..";]"
if how_use then
m_recipe = m_recipe.."image["..(14.80)..","..(1+y_off+0.05)..";0.4,0.4;elepower_gui_icon_info.png]"
m_recipe = m_recipe.."tooltip["..(14.80)..","..(1+y_off+0.05)..";0.4,0.4; Click for\nHow to use;"..eletome.tooltip_color.."]"
end
-- 1st square items
-- Top Item
-- display reg craftitem or image
if eletome.is_image(lb_top_img) then
m_recipe = m_recipe.."image["..(10.15)..","..(1+y_off)..";0.75,0.75;"..lb_top_img.."]"
if lb_top_tt then
m_recipe = m_recipe.."tooltip["..(10.15)..","..(1+y_off)..";0.75,0.75;"..lb_top_tt..";"..eletome.tooltip_color.."]"
end
else
m_recipe = m_recipe.."item_image_button["..(10.15)..","..(1+y_off)..";0.75,0.75;"..lb_top_img..";"..lb_top_img..";]"
if lb_top_tt then
m_recipe = m_recipe.."tooltip["..lb_top_img..";"..lb_top_tt..";"..eletome.tooltip_color.."]"
end
end
-- Middle Item
-- display node created or image
if eletome.is_image(lb_mid_img) then
m_recipe = m_recipe.."image["..(10.10)..","..(1+y_off+0.9)..";0.85,0.85;"..lb_mid_img.."]"
if lb_mid_tt then
m_recipe = m_recipe.."tooltip["..(10.10)..","..(1+y_off+0.9)..";0.85,0.85;"..lb_mid_tt..";"..eletome.tooltip_color.."]"
end
else
m_recipe = m_recipe.."item_image_button["..(10.10)..","..(1+y_off+0.9)..";0.85,0.85;"..name_reg..";"..name_reg..";]"
if lb_mid_tt then
m_recipe = m_recipe.."tooltip["..name_reg..";"..lb_mid_tt..";"..eletome.tooltip_color.."]"
end
end
-- Bottom Item
-- Change power output value from num-text to equivalent
-- image value - images scale nicer than txt here
local i = 1
local x_of = 0
if eletome.is_image(lb_btm_img) then
m_recipe = m_recipe.."image["..(10.25+x_of)..","..(1+y_off+1.8)..";0.55,0.55;"..lb_btm_img.."]"
m_recipe = m_recipe.."tooltip["..(10.25+x_of)..","..(1+y_off+1.8)..";0.55,0.55;"..lb_btm_tt..";"..eletome.tooltip_color.."]"
else
local st_len = string.len(lb_btm_img)
if st_len <= 4 and tonumber(lb_btm_img) then
-- depending on txt length we have to offset
-- img char start more left
-- @ current img size 4 is max supported
if st_len == 2 then
x_of = -0.3
elseif st_len == 3 then
x_of = -0.6
elseif st_len == 4 then
x_of = -0.9
end
while i <= st_len do
local num = string.sub(tostring(lb_btm_img), i, i) or "0"
m_recipe = m_recipe.."image["..(10.25+x_of)..","..(1+y_off+1.9)..";0.45,0.45;elepower_tome_num_"..num..".png]"
x_of = x_of+0.35
i=i+1
end
m_recipe = m_recipe.."image["..(10.3+x_of)..","..(1+y_off+2.025)..";0.65,0.65;elepower_tome_num_epu.png]"
m_recipe = m_recipe.."tooltip["..(10.25+x_of+(-0.3*(st_len+1)))..","..(1+y_off+1.9)..";1.5,0.65;"..lb_btm_img..lb_btm_tt..";"..eletome.tooltip_color.."]"
else
minetest.log("info", "elepower_tome: "..lb_btm_img.." entered value must be 1-4 digits or a string ending in .png")
end
end
-- 2nd square items
-- Generate the recipe grid view - Middle box
local dis_rec,y_add = eletome.gen_craft_grid(recipe,y_off,no_items)
m_recipe = m_recipe..dis_rec
y_off = y_add
y_off = y_off+1.7
-- Insert record into table and increment counters
table.insert(machine_list_rdy,m_recipe)
recipe_cnt = recipe_cnt + 1
--reset y_off(set) as these will be on page 2/3 etc
if recipe_cnt > 3 then
y_off = 0
recipe_cnt = 1
end
end
-- Split machines across 2 or more pages if needed.
local max_recipe_pp = 3
local pg_num = tonumber(page_num) or 1
local recipe_rp = ""
local recipe_rp = eletome.p_nav_bwd_fwd(machine,machine_list_rdy,max_recipe_pp,pg_num,"mach_bwd_fwd")
---------------------------
-- Assemble Machine page --
---------------------------
local eletome_complex = heading_lp..head_sub_lp_ov..ov_lp_txt..ov_lp_img..recipe_rp
return eletome_complex
end