f085883e55
TA3 Terminal activated minor improvements
229 lines
6.6 KiB
Lua
229 lines
6.6 KiB
Lua
--[[
|
|
|
|
TechAge
|
|
=======
|
|
|
|
Copyright (C) 2019 Joachim Stolberg
|
|
|
|
GPL v3
|
|
See LICENSE.txt for more information
|
|
|
|
Construction Guide
|
|
|
|
]]--
|
|
|
|
local S = techage.S
|
|
|
|
local Categories = {} -- ordered list of chapters
|
|
local EntryOrders = {} -- ordered entry lists of categories
|
|
local HelpPages = {} -- help data as key/value table
|
|
local formspec_context = {}
|
|
|
|
local DUMMY = {
|
|
name = "unknown",
|
|
text = "unknown",
|
|
item_name = "-",
|
|
images = "none"
|
|
}
|
|
|
|
-- formspec list of entries
|
|
local function entries_as_string(player_name)
|
|
local category = formspec_context[player_name].category or Categories[1]
|
|
local tbl = {}
|
|
for _,cat in ipairs(Categories) do
|
|
if cat == category and not formspec_context[player_name].close_tree then
|
|
tbl[#tbl+1] = minetest.formspec_escape("V "..HelpPages[cat][cat].name)
|
|
for _,item in ipairs(EntryOrders[category]) do
|
|
if item ~= cat then
|
|
local name = item
|
|
if HelpPages[category][item] then
|
|
name = HelpPages[category][item].name
|
|
end
|
|
tbl[#tbl+1] = minetest.formspec_escape(" +- "..name)
|
|
end
|
|
end
|
|
else
|
|
tbl[#tbl+1] = minetest.formspec_escape("> "..HelpPages[cat][cat].name)
|
|
end
|
|
end
|
|
formspec_context[player_name].list_len = #tbl
|
|
return table.concat(tbl, ",") or ""
|
|
end
|
|
|
|
-- Translate given index into a HelpPage category and key
|
|
local function get_ref(player_name)
|
|
local category = formspec_context[player_name].category or Categories[1]
|
|
local index = formspec_context[player_name].index or 1
|
|
index = techage.range(index, 1, formspec_context[player_name].list_len or 1)
|
|
|
|
local offs = 0
|
|
for idx1,cat in ipairs(Categories) do
|
|
if idx1 + offs == index then
|
|
formspec_context[player_name].category = cat
|
|
formspec_context[player_name].index = idx1
|
|
return cat, cat -- category
|
|
end
|
|
if cat == category and not formspec_context[player_name].close_tree then
|
|
for idx2,item in ipairs(EntryOrders[category]) do
|
|
if idx1 + idx2 - 1 == index then
|
|
formspec_context[player_name].category = cat
|
|
formspec_context[player_name].index = index
|
|
return cat, item -- no category
|
|
end
|
|
end
|
|
offs = #EntryOrders[category] - 1
|
|
end
|
|
end
|
|
-- return any entry by default
|
|
formspec_context[player_name].category = Categories[1]
|
|
return Categories[1], Categories[1]
|
|
end
|
|
|
|
-- formspec images
|
|
local function plan(images)
|
|
local tbl = {}
|
|
if images == "none" then return "label[1,3;"..S("No plan available") end
|
|
for y=1,#images do
|
|
for x=1,#images[1] do
|
|
local img = images[y][x] or false
|
|
if img ~= false then
|
|
local x_offs, y_offs = (x-1) * 1, (y-1) * 1 + 0.8
|
|
tbl[#tbl+1] = "image["..x_offs..","..y_offs..";1,1;"..img.."]"
|
|
end
|
|
end
|
|
end
|
|
return table.concat(tbl)
|
|
end
|
|
|
|
local function formspec_help(player_name)
|
|
local bttn
|
|
local cat, key = get_ref(player_name)
|
|
local hdef = HelpPages[cat][key] or DUMMY
|
|
local index = formspec_context[player_name].index or 1
|
|
local box = "box[7.5,0.9;1,1.1;#BBBBBB]"
|
|
|
|
if hdef.item_name == "-" then
|
|
bttn = ""
|
|
elseif hdef.item_name == "plan" then
|
|
bttn = "button[7.6,1;1,1;plan;"..S("Plan").."]"
|
|
else
|
|
bttn = box.."item_image[7.6,1;1,1;"..hdef.item_name.."]"
|
|
end
|
|
return "size[9,9]"..
|
|
default.gui_bg..
|
|
default.gui_bg_img..
|
|
default.gui_slots..
|
|
"item_image[7.6,0;1,1;techage:construction_board]"..
|
|
bttn..
|
|
"table[0.1,0;7,4;page;"..entries_as_string(player_name)..";"..index.."]"..
|
|
"textarea[0.3,4.7;9,5.3;help;"..S("Help")..":;"..hdef.text.."]"..
|
|
"box[0,4.75;8.775,4.45;#000000]"
|
|
end
|
|
|
|
local function formspec_plan(player_name)
|
|
local cat, key = get_ref(player_name)
|
|
local hdef = HelpPages[cat][key] or DUMMY
|
|
return "size[9,9]"..
|
|
default.gui_bg..
|
|
default.gui_bg_img..
|
|
default.gui_slots..
|
|
"label[0,0;"..hdef.name..":]"..
|
|
"button[8,0;1,0.8;back;<<]"..
|
|
plan(hdef.images)
|
|
end
|
|
|
|
local board_box = {
|
|
type = "wallmounted",
|
|
--wall_top = {-8/16, 15/32, -6/16, 8/16, 8/16, 6/16},
|
|
--wall_bottom = {-8/16, 15/32, -6/16, 8/16, 8/16, 6/16},
|
|
wall_side = {-16/32, -11/32, -16/32, -15/32, 6/16, 8/16},
|
|
}
|
|
|
|
minetest.register_node("techage:construction_board", {
|
|
description = S("TA Construction Board"),
|
|
inventory_image = 'techage_constr_plan_inv.png',
|
|
tiles = {"techage_constr_plan.png"},
|
|
drawtype = "nodebox",
|
|
node_box = board_box,
|
|
selection_box = board_box,
|
|
|
|
after_place_node = function(pos, placer, itemstack)
|
|
local meta = minetest.get_meta(pos)
|
|
local player_name = placer:get_player_name()
|
|
formspec_context[player_name] = formspec_context[player_name] or {}
|
|
meta:set_string("formspec", formspec_help(player_name))
|
|
end,
|
|
|
|
on_receive_fields = function(pos, formname, fields, player)
|
|
local player_name = player:get_player_name()
|
|
if minetest.is_protected(pos, player_name) then
|
|
return
|
|
end
|
|
local meta = minetest.get_meta(pos)
|
|
formspec_context[player_name] = formspec_context[player_name] or {}
|
|
if fields.plan then
|
|
meta:set_string("formspec", formspec_plan(player_name))
|
|
elseif fields.back then
|
|
meta:set_string("formspec", formspec_help(player_name))
|
|
elseif fields.page then
|
|
local evt = minetest.explode_table_event(fields.page)
|
|
if evt.type == "CHG" then
|
|
local idx = tonumber(evt.row)
|
|
idx = techage.range(idx, 1, formspec_context[player_name].list_len or 1)
|
|
-- unfold/close the tree
|
|
if formspec_context[player_name].index == idx then
|
|
formspec_context[player_name].close_tree = not formspec_context[player_name].close_tree
|
|
end
|
|
formspec_context[player_name].index = idx
|
|
meta:set_string("formspec", formspec_help(player_name))
|
|
end
|
|
end
|
|
end,
|
|
|
|
paramtype2 = "wallmounted",
|
|
paramtype = "light",
|
|
sunlight_propagates = true,
|
|
is_ground_content = false,
|
|
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = "techage:construction_board",
|
|
recipe = {
|
|
{"default:stick", "default:stick", "default:stick"},
|
|
{"default:paper", "default:paper", "default:paper"},
|
|
{"default:paper", "default:paper", "default:paper"},
|
|
},
|
|
})
|
|
|
|
|
|
function techage.register_entry_page(category, entry, name, text, item_name, images)
|
|
if HelpPages[category] then
|
|
HelpPages[category][entry] = {
|
|
name = name,
|
|
text = text,
|
|
item_name = item_name or "plan",
|
|
images = images or "none"
|
|
}
|
|
else
|
|
minetest.log("error", "[techage] help category '"..category.."' does not exist!")
|
|
end
|
|
end
|
|
|
|
|
|
function techage.register_category_page(category, name, text, item_name, entry_order, images)
|
|
Categories[#Categories + 1] = category
|
|
HelpPages[category] = {}
|
|
techage.register_entry_page(category, category, name, text, item_name, images or "none")
|
|
|
|
table.insert(entry_order, 1, category)
|
|
EntryOrders[category] = entry_order
|
|
end
|
|
|
|
function techage.register_help_page(name, text, item_name, images)
|
|
end
|
|
|
|
function techage.register_chap_page(name, text, item_name)
|
|
end
|