kskit/init.lua
2022-06-15 22:21:59 +00:00

222 lines
5.7 KiB
Lua

-- Versionsnummer. Diese dient vor allem zu Diagnosezwecken.
-- Ich weiss jetzt noch nicht, wie viele verschiedene Versionen von dem Script spaeter herumfliegen werden.
KsKitVer=0
-- Grundsätzliche Typen von Signalbildern
FAHRT=1
HALT=2
RANGIERFAHRT=3
ERSATZFAHRT=4
AUS=5
-- Signalbilder des Hv-Signalsystems
Hp0={HALT}
Hp1={FAHRT}
Hp2={FAHRT, V_max=40}
Vr0={FAHRT, H_erwarten=true}
Vr1={FAHRT}
Vr2={FAHRT, V_erwarten=40}
-- Signalbilder OSJD/EZMG/Hl-Signale des Ostblocks
-- V_erwarten=60 wird durch V_erwarten=40 signalisiert
Hl1={FAHRT}
Hl2={FAHRT, V_max=100}
Hl3a={FAHRT, V_max=40}
Hl3b={FAHRT, V_max=60}
Hl4={FAHRT, V_erwarten=100}
Hl5={FAHRT, V_max=100, V_erwarten=100}
Hl6a={FAHRT, V_max=40, V_erwarten=100}
Hl6b={FAHRT, V_max=60, V_erwarten=100}
Hl7={FAHRT, V_erwarten=40}
Hl8={FAHRT, V_max=100, V_erwarten=40}
Hl9a={FAHRT, V_max=40, V_erwarten=40}
Hl9b={FAHRT, V_max=60, V_erwarten=40}
Hl10={FAHRT, H_erwarten=true}
Hl11={FAHRT, V_max=100, H_erwarten=true}
Hl12a={FAHRT, V_max=40, H_erwarten=true}
Hl12b={FAHRT, V_max=60, H_erwarten=true}
Hl13={HALT}
-- Zusatzsignale (DS 301 Namen)
Zs1={ERSATZFAHRT}
Sh1={RANGIERFAHRT} -- war Ra12 bei DR
-- Signalebilder der jeweiligen Signalmodelle
Signalmodelle={
-- V11NHK10024 HL-Signale der DR *V40* - Grundset
["Hl_Signal_Ausfahrt_V40_HK1"]={ Hl13,Hl1,Hl3a,Zs1,Sh1,Hl13 },
["Hl_Signal_Ausfahrt_Vmax_HK1"]={ Hl13,Hl1,Zs1,Sh1,Hl13 },
["Hl_Signal_Block_HK1"]={ Hl13,Hl1,Zs1,Hl13 },
["Hl_Signal_Einfahrt_V40_HK1"]={ Hl13,Hl1,Hl7,Hl10,Hl3a,Hl9a,Hl12a,Zs1,Hl13 },
["Hl_Signal_Selbstblock_HK1"]={ Hl13,Hl1,Hl10,Hl13 },
["Hl_Signal_Vorsignal_V40_HK1"]={ Hl10,Hl7,Hl1 },
["Hl_Signal_Vorsignalwiederholer_V40_HK1"]={ Hl10,Hl7,Hl1 },
-- V11NHK10025 HL-Signale der DR *V60* - Erweiterungsset
["Hl_Signal_Ausfahrt_V60_HK1"]={ Hl13,Hl1,Hl3b,Hl3a,Zs1,Sh1,Hl13 },
["Hl_Signal_Einfahrt_V60_HK1"]={ Hl13,Hl1,Hl4,Hl7,Hl10,Hl3b,Hl6b,Hl9b,Hl12b,Hl3a,Hl6a,Hl9a,Hl12a,Zs1,Hl13 },
["Hl_Signal_Vorsignalwiederholer_V60_HK1"]={ Hl10,Hl7,Hl1 }
}
--
Signalmeta = {}
Signalmeta.__call= function(table, data)
local sigobj = {}
local mt = {}
mt.__index = table
setmetatable(sigobj, mt)
for k, v in pairs(data) do
local setter = "set_"..tostring(k)
if type(sigobj[setter]) == "function" then
sigobj[setter](sigobj, v)
else
error("Invalid signal property "..tostring(k))
end
end
return sigobj
end
-- Basisklasse fuer alle Signale
-- Entspricht den Signalen von vor EEP 6: Stellung 1 ist Fahrt, Stellung 2 ist Halt
Basissignal = {
Begriffe = { Hp1, Hp0 }
}
setmetatable(Basissignal, Signalmeta)
function Basissignal:set_1(v)
if type(v) ~= "number" then
error("Signal ID must be number")
end
self.ID = v
end
USignal = {}
setmetatable(USignal, Signalmeta)
-- Datenbank fuer Tabelle
KsFahrstrassen = {}
-- Fahrstrasse in Datenbank aufnehmen
function FS(Tabelle)
KsFahrstrassen[Tabelle[1]] = Tabelle
end
-- Datenbank fuer Signale
KsSignale = {}
-- KsSignale von GK3 sind sehr systematisch benannt, die moeglichen Stellungen lassen sich aus dem Namen herleiten
function GK3KsBegriffe(Modell)
local Teile = {}
for str in string.gmatch(Modell, "([^_ ]+)") do
Teile[str]=true
end
local Stellungen = {}
-- Halt am Hauptsignal
if Teile["A"] or Teile["B"] then
table.insert(Stellungen, {"Hp0"})
end
-- Halt erwarten
-- ... am Wiederholer
if Teile["VSigWdh"] then
table.insert(Stellungen, {"Ks2","Kl"})
end
-- ... An MAS oder Vorsignalen
if Teile["MAS"] or Teile["VSig"] then
if Teile["verkuerzt"] then
table.insert(Stellungen, {"Ks2","Kl"})
end
table.insert(Stellungen, {"Ks2"})
if Teile["Kl"] then
table.insert(Stellungen, {"Ks2","Kl"})
end
end
-- Fahrt/Fahrt erwarten
table.insert(Stellungen, {"Ks1"})
-- Langsamfahrt erwarten
-- ... am Wiederholer
if Teile["VSigWdh"] then
table.insert(Stellungen, {"Ks1bl","Kl"})
end
-- ... am MAS oder Vorsignalen
if Teile["MAS"] or Teile["VSig"] or Teile["VSigWdh"] then
if Teile["verkuerzt"] then
table.insert(Stellungen, {"Ks1bl","Kl"})
end
table.insert(Stellungen, {"Ks1bl"})
if Teile["Kl"] then
table.insert(Stellungen, {"Ks1bl","Kl"})
end
end
-- Rangierfahrt an Ausfahrsignalen
if Teile["A"] then
table.insert(Stellungen, {"Sh1"})
end
-- Ersatzsignal an Ausfahrsignalen und Blocksignalen ohne Vorsichtssignal
if Teile["A"] or (Teile["B"] and not Teile["V"]) then
table.insert(Stellungen, {"Zs1"})
end
-- Vorsichtssignal an Hauptsignalen
if Teile["V"] then
table.insert(Stellungen, {"Zs7"})
end
-- Kennlicht
if Teile["Kl"] or Teile["VSigWdh"] or Teile["verkuerzt"] then
table.insert(Stellungen, {"Kl"})
end
-- Dunkel geschaltet
table.insert(Stellungen, {})
return Stellungen
end
local GK3KsBauarten={
"Ks_Sig_A",
"Ks_Sig_A_MAS",
"Ks_Sig_A_MAS_Kl",
"Ks_Sig_A_V",
"Ks_Sig_A_V_MAS",
"Ks_Sig_A_V_MAS_Kl",
"Ks_Sig_B",
"Ks_Sig_B_MAS",
"Ks_Sig_B_V",
"Ks_Sig_B_V_MAS",
"Ks_Sig_B_V_MAS_Kl",
"Ks_Sig_VSig",
"Ks_Sig_VSigWdh",
"Ks_Sig_VSig_verkuerzt"
}
for cnt=1, #GK3KsBauarten do
_G[GK3KsBauarten[cnt]]=function(Meta)
Signal=Meta[1]
Meta[1] = nil
-- Falls kein name gegeben, einen generieren
if Meta.Name == nil then
Meta.Name = string.format("%d", Signal)
end
if type(Meta.Schild) == "number" then
Meta.Schild="#"..tostring(Meta.Schild)
end
Meta.Kennzahl = Kennzahl
Meta.Begriffe = GK3KsBegriffe(GK3KsBauarten[cnt])
KsSignale[Signal] = Meta
end
end
function KsKitInit()
for Signal, Meta in pairs(KsSignale) do
if Meta.Schild ~= nil then
EEPStructureSetTextureText(Meta.Schild, 1, Meta.Kennzahl)
EEPStructureSetTextureText(Meta.Schild, 2, Meta.Name)
end
end
end