aboutsummaryrefslogtreecommitdiff
path: root/advtrains_interlocking/tcb_ts_ui.lua
diff options
context:
space:
mode:
authororwell <orwell@bleipb.de>2024-11-14 00:03:38 +0100
committerorwell <orwell@bleipb.de>2024-11-14 00:03:38 +0100
commitfe57e7dd089653e2361a4ebb0b34137a3261e198 (patch)
tree0bc1be5e530f6a7af857b8cefe29c1da5ae29b8b /advtrains_interlocking/tcb_ts_ui.lua
parentd42f1bcf1a7ec18d392671be54636e7cad8b788b (diff)
downloadadvtrains-fe57e7dd089653e2361a4ebb0b34137a3261e198.tar.gz
advtrains-fe57e7dd089653e2361a4ebb0b34137a3261e198.tar.bz2
advtrains-fe57e7dd089653e2361a4ebb0b34137a3261e198.zip
Add Blocksignal mode for signals to autocreate simple block route
Diffstat (limited to 'advtrains_interlocking/tcb_ts_ui.lua')
-rwxr-xr-xadvtrains_interlocking/tcb_ts_ui.lua177
1 files changed, 121 insertions, 56 deletions
diff --git a/advtrains_interlocking/tcb_ts_ui.lua b/advtrains_interlocking/tcb_ts_ui.lua
index e7ff685..1cdbb29 100755
--- a/advtrains_interlocking/tcb_ts_ui.lua
+++ b/advtrains_interlocking/tcb_ts_ui.lua
@@ -618,48 +618,78 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle
form = form.."button[0.5,6; 5,1;cancelroute;Cancel Route]"
else
if not tcbs.route_origin then
- local strtab = {}
- for idx, route in ipairs(tcbs.routes) do
- local clr = ""
- if route.smartroute_generated then
- clr = "#FFFF55"
- end
- if route.ars then
- clr = "#FF5555"
- if route.ars.default then
- clr = "#55FF55"
+ if #tcbs.routes > 0 then
+ -- at least one route is defined, show normal dialog
+ local strtab = {}
+ for idx, route in ipairs(tcbs.routes) do
+ local clr = ""
+ if route.smartroute_generated then
+ clr = "#FFFF55"
+ end
+ if route.ars then
+ clr = "#FF5555"
+ if route.ars.default then
+ clr = "#55FF55"
+ end
end
+ strtab[#strtab+1] = clr .. minetest.formspec_escape(route.name)
end
- strtab[#strtab+1] = clr .. minetest.formspec_escape(route.name)
- end
- form = form.."label[0.5,2.5;Routes:]"
- form = form.."textlist[0.5,3;5,3;rtelist;"..table.concat(strtab, ",")
- if sel_rte then
- form = form .. ";" .. sel_rte .."]"
- form = form.."button[0.5,6; 5,1;setroute;Set Route]"
- form = form.."button[0.5,7;2,1;dsproute;Show]"
- if hasprivs then
- form = form.."button[3.5,7;2,1;editroute;Edit]"
- if sel_rte > 1 then
- form = form .. "button[5.5,4;0.5,0.3;moveup;↑]"
+ form = form.."label[0.5,2.5;Routes:]"
+ form = form.."textlist[0.5,3;5,3;rtelist;"..table.concat(strtab, ",")
+ if sel_rte then
+ form = form .. ";" .. sel_rte .."]"
+ form = form.."button[0.5,6; 5,1;setroute;Set Route]"
+ form = form.."button[0.5,7;2,1;dsproute;Show]"
+ if hasprivs then
+ form = form.."button[3.5,7;2,1;editroute;Edit]"
+ if sel_rte > 1 then
+ form = form .. "button[5.5,4;0.5,0.3;moveup;↑]"
+ end
+ if sel_rte < #strtab then
+ form = form .. "button[5.5,4.7;0.5,0.3;movedown;↓]"
+ end
end
- if sel_rte < #strtab then
- form = form .. "button[5.5,4.7;0.5,0.3;movedown;↓]"
+ else
+ form = form .. "]"
+ if tcbs.ars_disabled then
+ form = form.."label[0.5,6 ;NOTE: ARS is disabled.]"
+ form = form.."label[0.5,6.5;Routes are not automatically set.]"
end
end
+ if hasprivs then
+ form = form.."button[0.5,8;2.5,1;smartroute;Smart Route]"
+ form = form.."button[ 3,8;2.5,1;newroute;New (Manual)]"
+ form = form..string.format("checkbox[0.5,8.75;ars;Automatic routesetting;%s]", not tcbs.ars_disabled)
+ form = form..string.format("checkbox[0.5,9.25;dstarstrig;Distant signal triggers ARS;%s]", not tcbs.no_dst_ars_trig)
+ end
else
- form = form .. "]"
- if tcbs.ars_disabled then
- form = form.."label[0.5,6 ;NOTE: ARS is disabled.]"
- form = form.."label[0.5,6.5;Routes are not automatically set.]"
+ -- no route is active, and no route is so far defined
+ if not tcbs.signal then atwarn("signalling form missing signal?!", pos) return end -- safeguard, nothing else in this function checks tcbs.signal
+ local caps = advtrains.interlocking.signal.get_signal_cap_level(tcbs.signal)
+ if caps >= 3 then
+ -- offer user the "block signal mode"
+ form = form.."label[0.5,2.5;No routes are yet defined.]"
+ if hasprivs then
+ form = form.."button[0.5,4;2.5,1;smartroute;Smart Route]"
+ form = form.."button[ 3,4;2.5,1;newroute;New (Manual)]"
+
+ form = form.."label[0.5,5.5;Setup block signal route (up to following signal):]"
+ form = form.."button[0.5,6;2.5,1;setupblocklong;Long (No Dst)]"
+ form = form.."tooltip[setupblocklong;Following track section must have no turnouts and end at another signal.\n"
+ .."Sets a route into the section ahead with auto-working set on\n"
+ .."Long block: This signal does not become distant signal.]"
+ form = form.."button[ 3,6;2.5,1;setupblockshort;Short (With Dst)]"
+ form = form.."tooltip[setupblockshort;Following track section must have no turnouts and end at another signal.\n"
+ .."Sets a route into the section ahead with auto-working set on\n"
+ .."Short block: This signal becomes distant signal for next signal.]"
+ end
+ else
+ -- signal caps say it cannot be route start/end
+ form = form.."label[0.5,2.5;This is a Non-Halt signal (e.g. pure distant signal)\n"
+ .."No route is currently set through.]"
end
end
- if hasprivs then
- form = form.."button[0.5,8;2.5,1;smartroute;Smart Route]"
- form = form.."button[ 3,8;2.5,1;newroute;New (Manual)]"
- form = form..string.format("checkbox[0.5,8.75;ars;Automatic routesetting;%s]", not tcbs.ars_disabled)
- form = form..string.format("checkbox[0.5,9.25;dstarstrig;Distant signal triggers ARS;%s]", not tcbs.no_dst_ars_trig)
- end
+
elseif sigd_equal(tcbs.route_origin, sigd) then
-- something has gone wrong: tcbs.routeset should have been set...
form = form.."label[0.5,2.5;Inconsistent state: route_origin is same TCBS but no route set. Try again.]"
@@ -753,6 +783,63 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
tcbs.ars_ignore_next = nil
return
end
+ if (fields.setupblocklong or fields.setupblockshort) and hasprivs then
+ -- check adjacent section
+ if not tcbs.ts_id then
+ minetest.chat_send_player(pname, "Block route not possible: No track section ahead")
+ return
+ end
+ local ts = ildb.get_ts(tcbs.ts_id)
+ if #ts.tc_breaks ~= 2 then
+ minetest.chat_send_player(pname, "Block route not possible: Section "..(ts.name or "-").." ("..tcbs.ts_id..") has "..#ts.tc_breaks.." ends, must be 2")
+ return
+ end
+ local e_sigd
+ if vector.equals(ts.tc_breaks[1].p, pos) then
+ e_sigd = { p = ts.tc_breaks[2].p,
+ s = ts.tc_breaks[2].s==1 and 2 or 1}
+ elseif vector.equals(ts.tc_breaks[2].p, pos) then
+ e_sigd = { p = ts.tc_breaks[1].p,
+ s = ts.tc_breaks[1].s==1 and 2 or 1}
+ else
+ minetest.chat_send_player(pname, "Block route not possible: Section "..(ts.name or "-").." ("..tcbs.ts_id..") TCBs are inconsistent, check section!")
+ return
+ end
+ local e_tcbs = ildb.get_tcbs(e_sigd)
+ if not e_tcbs then
+ minetest.chat_send_player(pname, "Block route not possible: Adjacent TCB not found, check section!")
+ return
+ end
+ -- now we have the TCB at the end of the following section. check that signal is set
+ if not e_tcbs.signal then
+ minetest.chat_send_player(pname, "Block route not possible: Adjacent TCB has no signal assigned!")
+ return
+ end
+ local caps = advtrains.interlocking.signal.get_signal_cap_level(e_tcbs.signal)
+ if caps < 3 then
+ minetest.chat_send_player(pname, "Block route not possible: Following signal is not capable of displaying a Halt aspect (caplevel "..caps..")")
+ return
+ end
+ -- all preconditions checked! go ahead and create route
+ local route = {
+ name = "BS",
+ [1] = {
+ next = e_sigd, -- of the next (note: next) TCB on the route
+ locks = {} -- route locks of this route segment
+ },
+ terminal = e_sigd,
+ use_rscache = true,
+ -- main_aspect = <use default>
+ assign_dst = fields.setupblockshort and true, -- assign dst, if short block was selected
+ default_autoworking = true,
+ }
+ local rid = #tcbs.routes + 1 -- typically 1
+ tcbs.routes[rid] = route
+ -- directly set our newly created route
+ ilrs.update_route(sigd, tcbs, rid)
+ advtrains.interlocking.show_signalling_form(sigd, pname, nil, true)
+ return
+ end
if sel_rte and tcbs.routes[sel_rte] then
if fields.setroute then
ilrs.update_route(sigd, tcbs, sel_rte)
@@ -764,8 +851,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
if fields.editroute and hasprivs then
advtrains.interlocking.show_route_edit_form(pname, sigd, sel_rte)
- --local rte = tcbs.routes[sel_rte]
- --minetest.show_formspec(pname, formname.."_renroute_"..sel_rte, "field[name;Enter new route name;"..rte.name.."]")
return
end
end
@@ -803,24 +888,4 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, true)
return
end
-
-
- if not hasprivs then return end
- -- rename route
- local rind, rte_id
- pts, connids, rind = string.match(formname, "^at_il_signalling_([^_]+)_(%d)_renroute_(%d+)$")
- if pts then
- pos = minetest.string_to_pos(pts)
- connid = tonumber(connids)
- rte_id = tonumber(rind)
- if not connid or connid<1 or connid>2 then return end
- end
- if pos and connid and rind and fields.name then
- local sigd = {p=pos, s=connid}
- local tcbs = ildb.get_tcbs(sigd)
- if tcbs.routes[rte_id] then
- tcbs.routes[rte_id].name = fields.name
- advtrains.interlocking.show_signalling_form(sigd, pname)
- end
- end
end)