aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--advtrains_interlocking/routesetting.lua3
-rw-r--r--advtrains_interlocking/signal_api.lua120
-rw-r--r--advtrains_interlocking/tcb_ts_ui.lua15
3 files changed, 135 insertions, 3 deletions
diff --git a/advtrains_interlocking/routesetting.lua b/advtrains_interlocking/routesetting.lua
index f13fcea..1edc631 100644
--- a/advtrains_interlocking/routesetting.lua
+++ b/advtrains_interlocking/routesetting.lua
@@ -51,6 +51,7 @@ function ilrs.set_route(signal, route, try)
return false, trsn, cbts, cblk
end
end
+
-- we start at the tc designated by signal
local c_sigd = signal
@@ -122,7 +123,7 @@ function ilrs.set_route(signal, route, try)
}
if c_tcbs.signal then
c_tcbs.route_committed = true
- c_tcbs.aspect = asp_generic_free
+ c_tcbs.aspect = route.aspect or asp_generic_free
c_tcbs.route_origin = signal
advtrains.interlocking.update_signal_aspect(c_tcbs)
end
diff --git a/advtrains_interlocking/signal_api.lua b/advtrains_interlocking/signal_api.lua
index 8d78709..4d75f28 100644
--- a/advtrains_interlocking/signal_api.lua
+++ b/advtrains_interlocking/signal_api.lua
@@ -102,7 +102,6 @@ advtrains = {
},
shunt = {
free = <boolean/nil>,
- proceed_as_main = <boolean/nil>,
},
info = {
call_on = <boolean/nil>,
@@ -303,6 +302,18 @@ function advtrains.interlocking.signal_get_aspect(pos)
return nil
end
+-- Returns the "supported_aspects" of the signal at position, as returned by the nodedef.
+-- returns nil when there's no signal at the position
+function advtrains.interlocking.signal_get_supported_aspects(pos)
+ local node=advtrains.ndb.get_node(pos)
+ local ndef=minetest.registered_nodes[node.name]
+ if ndef and ndef.advtrains and ndef.advtrains.supported_aspects then
+ local asp = ndef.advtrains.supported_aspects
+ return asp
+ end
+ return nil
+end
+
local players_assign_ip = {}
-- shows small info form for signal IP state/assignment
@@ -413,3 +424,110 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
players_assign_ip[pname] = nil
end
end)
+
+
+--== aspect selector ==--
+
+local players_aspsel = {}
+
+--[[
+suppasp: "supported_aspects" table
+purpose: form title string
+callback: func(pname, aspect) called on form submit
+]]
+function advtrains.interlocking.show_signal_aspect_selector(pname, p_suppasp, p_purpose, callback, p_isasp)
+ local suppasp = p_suppasp or {
+ main = {}, dst = {}, shunt = {}, info = {},
+ }
+ local purpose = p_purpose or ""
+ local isasp = p_isasp and fillout_aspect(p_isasp)
+
+ local form = "size[7,5]label[0.5,0.5;Select Signal Aspect:]"
+ form = form.."label[0.5,1;"..purpose.."]"
+
+ form = form.."label[0.5,1.5;== Main Signal ==]"
+ if suppasp.main.free == nil then
+ local st = 2
+ if isasp and not isasp.main.free then st=1 end
+ form = form.."dropdown[0.5,2;2;main_free;danger,free;"..st.."]"
+ end
+ if suppasp.main.speed then
+ local selid = 1
+ if isasp and isasp.main.speed then
+ for idx, spv in ipairs(suppasp.main.speed) do
+ if spv == isasp.main.speed then
+ selid = idx
+ break
+ end
+ end
+ end
+ form = form.."label[2.3,1;Speed:]"
+ form = form.."dropdown[3,2;2;main_speed;"..table.concat(suppasp.main.speed, ",")..";"..selid.."]"
+ end
+
+ form = form.."label[0.5,3;== Shunting ==]"
+ if suppasp.shunt.free == nil then
+ local st = 1
+ if isasp and isasp.shunt.free then st=2 end
+ form = form.."dropdown[0.5,3.5;2;shunt_free;---,allowed;"..st.."]"
+ end
+
+ form = form.."button_exit[0.5,4.5; 5,1;save;OK]"
+
+ local token = advtrains.random_id()
+
+ minetest.show_formspec(pname, "at_il_sigaspdia_"..token, form)
+
+ minetest.after(1, function()
+ players_aspsel[pname] = {
+ suppasp = suppasp,
+ callback = callback,
+ token = token,
+ }
+ end)
+end
+
+local function usebool(sup, val, free)
+ if sup == nil then
+ return val==free
+ else
+ return sup
+ end
+end
+local function usespeed(sup, val)
+ if sup then
+ return tonumber(val)
+ else
+ return nil
+ end
+end
+
+-- TODO use non-hacky way to parse outputs
+
+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
+ if fields.save then
+ local asp = {
+ main = {
+ free = usebool(psl.suppasp.main.free, fields.main_free, "free"),
+ speed = usespeed(psl.suppasp.main.speed, fields.main_speed),
+ },
+ dst = {
+ free = true, speed = -1,
+ },
+ shunt = {
+ free = usebool(psl.suppasp.shunt.free, fields.shunt_free, "allowed"),
+ },
+ info = {}
+ }
+ psl.callback(pname, asp)
+ end
+ else
+ players_aspsel[pname] = nil
+ end
+ end
+
+end)
diff --git a/advtrains_interlocking/tcb_ts_ui.lua b/advtrains_interlocking/tcb_ts_ui.lua
index 203e0b1..c149a44 100644
--- a/advtrains_interlocking/tcb_ts_ui.lua
+++ b/advtrains_interlocking/tcb_ts_ui.lua
@@ -577,7 +577,8 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte)
form = form.."button[0.5,7;2,1;dsproute;Show]"
if hasprivs then
form = form.."button[2.5,7;1,1;delroute;Delete]"
- form = form.."button[3.5,7;2,1;editroute;Edit]"
+ form = form.."button[3.5,7;1,1;editroute;Rename]"
+ form = form.."button[4.5,7;1,1;asproute;Aspect]"
end
end
if hasprivs then
@@ -660,6 +661,18 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
minetest.show_formspec(pname, formname.."_renroute_"..sel_rte, "field[name;Enter new route name;"..rte.name.."]")
return
end
+ if fields.asproute and hasprivs then
+ local rte = tcbs.routes[sel_rte]
+ local suppasp = advtrains.interlocking.signal_get_supported_aspects(tcbs.signal)
+
+ local callback = function(pname, asp)
+ rte.aspect = asp
+ advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte)
+ end
+
+ advtrains.interlocking.show_signal_aspect_selector(pname, suppasp, rte.name, callback, rte.aspect)
+ return
+ end
if fields.delroute and hasprivs then
table.remove(tcbs.routes, sel_rte)
sel_rte = nil