aboutsummaryrefslogtreecommitdiff
path: root/advtrains_interlocking/database.lua
diff options
context:
space:
mode:
Diffstat (limited to 'advtrains_interlocking/database.lua')
-rw-r--r--advtrains_interlocking/database.lua39
1 files changed, 37 insertions, 2 deletions
diff --git a/advtrains_interlocking/database.lua b/advtrains_interlocking/database.lua
index 12853c0..af20bea 100644
--- a/advtrains_interlocking/database.lua
+++ b/advtrains_interlocking/database.lua
@@ -304,6 +304,9 @@ local function merge_ts(root_id, merge_id)
if not mts then return end -- This may be the case when sync_tcb_neighbors
-- inserts the same id twice. do nothing.
+ if not ildb.may_modify_ts(rts) then return false end
+ if not ildb.may_modify_ts(mts) then return false end
+
-- cobble together the list of TCBs
for _, msigd in ipairs(mts.tc_breaks) do
local tcbs = ildb.get_tcbs(msigd)
@@ -384,12 +387,14 @@ end
function ildb.remove_from_interlocking(sigd)
local tcbs = ildb.get_tcbs(sigd)
+ if not ildb.may_modify_tcbs(tcbs) then return false end
+
if tcbs.ts_id then
local tsid = tcbs.ts_id
local ts = ildb.get_ts(tsid)
if not ts then
tcbs.ts_id = nil
- return
+ return true
end
-- remove entry from the list
@@ -411,24 +416,54 @@ function ildb.remove_from_interlocking(sigd)
end
end
advtrains.interlocking.show_tcb_marker(sigd.p)
+ return true
end
function ildb.remove_tcb(pos)
local pts = advtrains.roundfloorpts(pos)
if not track_circuit_breaks[pts] then return end
for connid=1,2 do
- ildb.remove_from_interlocking({p=pos, s=connid})
+ if not ildb.remove_from_interlocking({p=pos, s=connid}) then
+ return false
+ end
end
track_circuit_breaks[pts] = nil
+ return true
end
function ildb.dissolve_ts(ts_id)
local ts = ildb.get_ts(ts_id)
+ if not ildb.may_modify_ts(ts) then return false end
local tcbr = advtrains.merge_tables(ts.tc_breaks)
for _,sigd in ipairs(tcbr) do
ildb.remove_from_interlocking(sigd)
end
-- Note: ts gets removed in the moment of the removal of the last TCB.
+ return true
+end
+
+-- Returns true if it is allowed to modify any property of a track section, such as
+-- - removing TCBs
+-- - merging and dissolving sections
+-- As of now the action will be denied if a route is set or if a train is in the section.
+function ildb.may_modify_ts(ts)
+ if ts.route or ts.route_post or #ts.trains>0 then
+ return false
+ end
+ return true
+end
+
+
+function ildb.may_modify_tcbs(tcbs)
+ if tcbs.signal then
+ return false
+ elseif tcbs.ts_id then
+ local ts = ildb.get_ts(tcbs.ts_id)
+ if ts and not ildb.may_modify_ts(ts) then
+ return false
+ end
+ end
+ return true
end
-- Utilize the traverser to find the track section at the specified position