Fahrstrassenmodul mit Mehrabschnittsfähigkeit
This commit is contained in:
parent
a8ba38d65d
commit
35a14314cb
137
Fahrstrassen.lua
Normal file
137
Fahrstrassen.lua
Normal file
@ -0,0 +1,137 @@
|
||||
require("kskit\\Serializer")
|
||||
require("kskit\\On")
|
||||
|
||||
local Anmeldungen={}
|
||||
local Dirty=false
|
||||
|
||||
local function IstIn(Tabelle, Wert)
|
||||
for _, v in ipairs(Tabelle) do
|
||||
if v == Wert then return true end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function FahrstrassenMelden(...)
|
||||
|
||||
end
|
||||
|
||||
function FahrstrassenInit(Slot)
|
||||
Anmeldungen = ladeTabelle(Slot) or {}
|
||||
Main(function()
|
||||
-- Anmeldungen abarbeiten
|
||||
for Zugname, Anmeldung in pairs(Anmeldungen) do
|
||||
-- Freigefahrene Fahrstrassen aus Belegtliste entfernen
|
||||
while Anmeldung[3][1] and EEPGetSignal(Anmeldung[3][1]) == 1 do
|
||||
table.remove(Anmeldung[3], 1)
|
||||
Dirty=true
|
||||
end
|
||||
|
||||
-- Haben wir es im letzten Zyklus zu schalten versucht und ist jetzt etwas eingestellt?
|
||||
if Anmeldung[2] > 0 and EEPGetSignal(Anmeldung[2]) > 1 then
|
||||
local FStartIst=Anmeldung[2]
|
||||
local FZielIst=EEPGetSignal(FStartIst)-1
|
||||
local FStartSoll=table.remove(Anmeldung[1], 1)
|
||||
local FZielSoll=table.remove(Anmeldung[1], 1)
|
||||
-- Erfolg vermelden!
|
||||
FahrstrassenMelden("Fahrt ",Zugname," ueber ",serialize{FStartIst,FZielIst})
|
||||
if FStartIst ~= FStartSoll or FZielIst ~= FZielSoll then
|
||||
-- Was ist hier passiert. Wir haben gerade eine Fahrstrasse geschaltet, die nicht gefordert war.
|
||||
-- Das kann passieren, wenn eine wiederholte Anmeldung kurz vor uns das Fahrstrassenziel umgestellt hat
|
||||
FahrstrassenMelden("Fehlschlag Schalten ",Zugname," an ",serialize(Anmeldung[1]),": alternative Fahrstrasse bereits geschaltet")
|
||||
-- Die Anmeldung passt jetzt nicht mehr, weil wir fahren ja schon woanders hin
|
||||
Anmeldung[1]={}
|
||||
end
|
||||
Anmeldung[2]=0
|
||||
-- Fahrstrassen Startsignal als belegt (durch uns) markieren
|
||||
table.insert(Anmeldung[3], FStartIst)
|
||||
Dirty=true
|
||||
end
|
||||
|
||||
-- Prüfung, das es den Zug überhaupt noch gibt
|
||||
-- Das passiert nachdem wir das Fahrstrassensignal auf erfolgreiche Schaltung geprüft haben
|
||||
-- War sie erfolgreich und der Zug ist jetzt weg, ist sie in der Belegtliste schon drin
|
||||
local ok, Speed = EEPGetTrainSpeed(Zugname)
|
||||
if not ok then
|
||||
Anmeldungen[Zugname]=nil
|
||||
Dirty=true
|
||||
-- Durch den Zug belegte Fahrstrassen auflösen
|
||||
for _, FStart in ipairs(Anmeldung[3]) do
|
||||
if EEPGetSignal(FStart) > 1 then
|
||||
EEPSetSignal(FStart, 1, 1)
|
||||
FahrstrassenMelden("FS ",FStart," hilfsweise aufgeloest, ",Zugname," verschollen")
|
||||
end
|
||||
end
|
||||
-- Abbrechen, wir brauchen für den Zug nix mehr zu schalten
|
||||
break
|
||||
end
|
||||
|
||||
-- Wenn noch eine Anmeldung vorhanden und FS-Signal aufgelöst ist, dann versuchen wir zu schalten
|
||||
local FSignal = 0
|
||||
if Anmeldung[1][1] and EEPGetSignal(Anmeldung[1][1]) == 1 then
|
||||
FSignal=Anmeldung[1][1]
|
||||
EEPSetSignal(FSignal, Anmeldung[1][2] + 1, 1)
|
||||
end
|
||||
-- Und uns merken, das wir einen Schaltversuch unternommen haben
|
||||
-- In FSignal steht noch eine 0 drin, falls die FS noch durch anderen Zug geschaltet ist
|
||||
if Anmeldung[2] ~= FSignal then Dirty = true end
|
||||
Anmeldung[2]=FSignal
|
||||
|
||||
-- Wenn wir alles abgearbeitet haben, können wir den Zug auch vergessen
|
||||
if #Anmeldung[1]==0 and #Anmeldung[3]==0 then
|
||||
Anmeldungen[Zugname]=nil
|
||||
Dirty=true
|
||||
end
|
||||
end
|
||||
|
||||
-- Hat sich was geändert? Anmeldungen wegspeichern!
|
||||
if Dirty then
|
||||
speicherTabelle(Slot, Anmeldungen)
|
||||
Dirty=false
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function FahrstrassenDebug()
|
||||
r=""
|
||||
for Zugname, Anmeldung in pairs(Anmeldungen) do
|
||||
r=r..Zugname..":Angemeldet="..serialize(Anmeldung[1])..",InArbeit="..serialize(Anmeldung[2])..",Geschaltet="..serialize(Anmeldung[3]).."\n"
|
||||
end
|
||||
return r
|
||||
end
|
||||
|
||||
function FS(Zugname, ...)
|
||||
local Route = {...}
|
||||
if #Route % 2 ~= 0 then
|
||||
error("FS() hat immer eine ungerade Anzahl von Argumenten")
|
||||
end
|
||||
if Anmeldungen[Zugname] == nil then
|
||||
Anmeldungen[Zugname] = {{},0,{}}
|
||||
end
|
||||
local Anmeldung = Anmeldungen[Zugname]
|
||||
while Route[1] do
|
||||
-- Ist die Anmeldung noch nicht Teil unserer belegtliste, alles ok und weitermachen
|
||||
if not IstIn(Anmeldung[3], Route[1]) then
|
||||
break
|
||||
end
|
||||
-- Die Fahrstrasse ist bereits geschalten, mist!
|
||||
-- Ist sie in der richtigen Stellung?
|
||||
if Route[2] == EEPGetSignal(Route[1]) - 1 then
|
||||
-- Ja! Alles gut. Dieser Teil der Anmeldung wird ignoriert
|
||||
FahrstrassenMelden("Anmeldung ",Zugname," an ",serialize{Route[1],Route[2]}," wiederholt")
|
||||
table.remove(Route, 1)
|
||||
table.remove(Route, 1)
|
||||
else
|
||||
-- Wenn das Ziel auch noch falsch ist, komplette Anmeldung verwerfen, wir fahren jetzt schon woanders hin
|
||||
FahrstrassenMelden("Fehlschlag ",Zugname," an ",serialize(Route),": alternative Fahrstrasse bereits geschaltet")
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- Wenn von unserer Anmeldung jetzt nix mehr übrig ist, brauchen wir auch nichts zu machen
|
||||
if #Route == 0 then return end
|
||||
|
||||
-- Anmeldung durchführen
|
||||
FahrstrassenMelden("Anmeldung ",Zugname," an ",serialize(Route))
|
||||
Anmeldung[1]=Route
|
||||
Dirty = true
|
||||
end
|
Loading…
Reference in New Issue
Block a user