aboutsummaryrefslogtreecommitdiff
path: root/advtrains_interlocking
diff options
context:
space:
mode:
Diffstat (limited to 'advtrains_interlocking')
-rw-r--r--advtrains_interlocking/init.lua2
-rw-r--r--advtrains_interlocking/signal_api.lua13
-rw-r--r--advtrains_interlocking/signal_aspect_ui.lua51
-rw-r--r--advtrains_interlocking/signal_aspects.lua102
4 files changed, 158 insertions, 10 deletions
diff --git a/advtrains_interlocking/init.lua b/advtrains_interlocking/init.lua
index a5bf41e..d0b75a8 100644
--- a/advtrains_interlocking/init.lua
+++ b/advtrains_interlocking/init.lua
@@ -12,6 +12,8 @@ end
local modpath = minetest.get_modpath(minetest.get_current_modname()) .. DIR_DELIM
+advtrains.interlocking.aspects = dofile(modpath.."signal_aspects.lua")
+
dofile(modpath.."database.lua")
dofile(modpath.."signal_api.lua")
dofile(modpath.."signal_aspect_ui.lua")
diff --git a/advtrains_interlocking/signal_api.lua b/advtrains_interlocking/signal_api.lua
index 78acc0a..e4b2993 100644
--- a/advtrains_interlocking/signal_api.lua
+++ b/advtrains_interlocking/signal_api.lua
@@ -220,6 +220,10 @@ function advtrains.interlocking.signal_set_aspect(pos, asp)
local node=advtrains.ndb.get_node(pos)
local ndef=minetest.registered_nodes[node.name]
if ndef and ndef.advtrains and ndef.advtrains.set_aspect then
+ local suppasp = advtrains.interlocking.signal_get_supported_aspects(pos)
+ if suppasp.type == 2 then
+ asp = advtrains.interlocking.aspects.type1_to_type2main(asp, suppasp.group)
+ end
ndef.advtrains.set_aspect(pos, node, asp)
advtrains.interlocking.signal_on_aspect_changed(pos)
end
@@ -252,7 +256,7 @@ function advtrains.interlocking.signal_rc_handler(pos, node, player, itemstack,
local function callback(pname, aspect)
advtrains.interlocking.signal_set_aspect(pos, aspect)
end
- local isasp = ndef.advtrains.get_aspect(pos, node)
+ local isasp = advtrains.interlocking.signal_get_aspect(pos, node)
advtrains.interlocking.show_signal_aspect_selector(
pname,
@@ -285,8 +289,13 @@ function advtrains.interlocking.signal_get_aspect(pos)
local ndef=minetest.registered_nodes[node.name]
if ndef and ndef.advtrains and ndef.advtrains.get_aspect then
local asp = ndef.advtrains.get_aspect(pos, node)
+ local suppasp = advtrains.interlocking.signal_get_supported_aspects(pos)
+ if suppasp.type == 2 then
+ asp = advtrains.interlocking.aspects.type2main_to_type1(suppasp.group, asp)
+ end
if not asp then asp = DANGER end
- return convert_aspect_if_necessary(asp)
+ asp = convert_aspect_if_necessary(asp)
+ return asp
end
return nil
end
diff --git a/advtrains_interlocking/signal_aspect_ui.lua b/advtrains_interlocking/signal_aspect_ui.lua
index d5a7543..472155a 100644
--- a/advtrains_interlocking/signal_aspect_ui.lua
+++ b/advtrains_interlocking/signal_aspect_ui.lua
@@ -2,7 +2,7 @@ local F = advtrains.formspec
local players_aspsel = {}
local function make_signal_aspect_selector_t1(suppasp, purpose, isasp)
- local form = {"size[7,7]"}
+ local form = {"size[7,7.5]"}
form[#form+1] = F.S_label(0.5, 0.5, "Select signal aspect")
form[#form+1] = F.label(0.5, 1, purpose)
@@ -59,7 +59,29 @@ local function make_signal_aspect_selector_t1(suppasp, purpose, isasp)
end
form[#form+1] = F.dropdown(0.5, 5, 6, "dst", entries, selid, true)
- form[#form+1] = F.S_button_exit(0.5, 6, 5, 1, "save", "Save signal aspect")
+ form[#form+1] = F.S_button_exit(0.5, 6, 6, 1, "save", "Save signal aspect")
+ return table.concat(form)
+end
+
+local function make_signal_aspect_selector_t2(suppasp, purpose, isasp)
+ local form = {"size[7,4]"}
+ local def = advtrains.interlocking.aspects.get_type2_definition(suppasp.group)
+ if not def then
+ return nil
+ end
+ form[#form+1] = F.S_label(0.5, 0.5, "Select signal aspect")
+ form[#form+1] = F.label(0.5, 1, purpose)
+
+ local entries = {}
+ local selid = 1
+ for idx, spv in ipairs(def.main) do
+ if isasp and isasp.type2name == spv.name then
+ selid = idx
+ end
+ entries[idx] = spv.label
+ end
+ form[#form+1] = F.dropdown(0.5, 1.5, 6, "asp", entries, selid, true)
+ form[#form+1] = F.S_button_exit(0.5, 2.5, 6, 1, "save", "Save signal aspect")
return table.concat(form)
end
@@ -73,9 +95,14 @@ function advtrains.interlocking.show_signal_aspect_selector(pname, p_suppasp, p_
local purpose = p_purpose or ""
local form
- if true then
+ if suppasp.type == 2 then
+ form = make_signal_aspect_selector_t2(suppasp, purpose, isasp)
+ else
form = make_signal_aspect_selector_t1(suppasp, purpose, isasp)
end
+ if not form then
+ return
+ end
local token = advtrains.random_id()
minetest.show_formspec(pname, "at_il_sigaspdia_"..token, form)
@@ -107,18 +134,26 @@ local function get_aspect_from_formspec_t1(suppasp, fields)
}
end
+local function get_aspect_from_formspec_t2(suppasp, fields)
+ local asp = advtrains.interlocking.aspects.type2main_to_type1(suppasp.group, tonumber(fields.asp))
+ return asp
+end
+
minetest.register_on_player_receive_fields(function(player, formname, fields)
local pname = player:get_player_name()
local psl = players_aspsel[pname]
if psl then
if formname == "at_il_sigaspdia_"..psl.token then
+ local suppasp = psl.suppasp
if fields.save then
local asp
- if true then
- asp = get_aspect_from_formspec_t1(psl.suppasp, fields)
- if asp then
- psl.callback(pname, asp)
- end
+ if suppasp.type == 2 then
+ asp = get_aspect_from_formspec_t2(suppasp, fields)
+ else
+ asp = get_aspect_from_formspec_t1(suppasp, fields)
+ end
+ if asp then
+ psl.callback(pname, asp)
end
end
else
diff --git a/advtrains_interlocking/signal_aspects.lua b/advtrains_interlocking/signal_aspects.lua
new file mode 100644
index 0000000..e604f9b
--- /dev/null
+++ b/advtrains_interlocking/signal_aspects.lua
@@ -0,0 +1,102 @@
+type2defs = {}
+
+local function register_type2(def)
+ local t = {type = 2}
+ local name = def.name
+ if type2defs[name] then
+ return error("Name " .. name .. " already used")
+ elseif type(name) ~= "string" then
+ return error("Name is not a string")
+ end
+ t.name = name
+
+ local label = def.label or name
+ if type(label) ~= "string" then
+ return error("Label is not a string")
+ end
+ t.label = label
+
+ local mainasps = {}
+ for idx, asp in ipairs(def.main) do
+ local t = {}
+ local name = asp.name
+ if type(name) ~= "string" then
+ return error("Aspect name is not a string")
+ end
+ t.name = name
+
+ local label = asp.label or name
+ if type(label) ~= "string" then
+ return error("Aspect label is not a string")
+ end
+ t.label = label
+
+ t.main = asp.main
+ mainasps[idx] = t
+ mainasps[name] = idx
+ end
+ t.main = mainasps
+
+ type2defs[name] = t
+end
+
+local function get_type2_definition(name)
+ return type2defs[name]
+end
+
+local function type2main_to_type1(name, asp)
+ local def = type2defs[name]
+ if not def then
+ return nil
+ end
+ local aspidx
+ if type(asp) == "number" then
+ aspidx = asp
+ else
+ aspidx = def.main[asp]
+ end
+ local asptbl = def.main[aspidx]
+ if not asptbl then
+ return nil
+ end
+ if type(asp) == "number" then
+ asp = asptbl.name
+ end
+
+ local t = {
+ main = asptbl.main,
+ type2name = asp,
+ type2group = name,
+ }
+ if aspidx ~= 1 and aspidx ~= #asptbl then
+ t.dst = def.main[aspidx+1].main
+ end
+ return t
+end
+
+local function type1_to_type2main(asp, group)
+ local def = type2defs[group]
+ if not def then
+ return nil
+ end
+ if group == asp.type2group and def.main[asp.type2name] then
+ return asp.type2name
+ end
+ local t_main = def.main
+ local idx
+ if not asp.main or asp.main == -1 then
+ idx = 1
+ elseif asp.main == 0 then
+ idx = #t_main
+ else
+ idx = math.max(#t_main-1, 1)
+ end
+ return t_main[idx].name
+end
+
+return {
+ register_type2 = register_type2,
+ get_type2_definition = get_type2_definition,
+ type2main_to_type1 = type2main_to_type1,
+ type1_to_type2main = type1_to_type2main,
+}