kskit/init.lua

185 lines
4.6 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
Kennzahl=34
local Callbacks = {}
function On(Name, Funktion)
-- Erlaube es, Signal und Weichen via Nummer zu referenzieren
if type(Name) == "number" then
if EEPGetSwitch(Name) > 0 then
Name = "EEPOnSwitch_"..tostring(Name)
elseif EEPGetSignal(Name) > 0 then
Name = "EEPOnSignal_"..tostring(Name)
end
end
if type(Name) == "table" then
for _, Newname in pairs(Name) do
On(Newname, Funktion)
end
return
end
if type(Name) ~= "string" or string.match(Name, "EEP.+") == nil then
print("Verweigere Callback von "..type(Name).." "..tostring(Name))
return
end
if not Callbacks[Name] then
Callbacks[Name] = {}
if _G[Name] ~= nil then
print("Warnung: "..Name.."() von KsKit adoptiert")
table.insert(Callbacks[Name], _G[Name])
end
_G[Name] = function(...)
for cnt = 1, #Callbacks[Name] do
Callbacks[Name][cnt](...)
end
-- Nur EEPMain braucht dies, aber dringends
return 1
end
-- Bei Weichen und Signalen muss EEP vorher informiert werden
-- Item ist normal "Switch" oder "Signal"
local Item, Number = string.match(Name, 'EEPOn(.+)_(%d+)')
if Number ~= nil then
_G["EEPRegister"..Item](Number)
end
end
table.insert(Callbacks[Name], Funktion)
end
-- EEPMain-Callback registrieren
function Main(Funktion)
On("EEPMain", Funktion)
end
-- Signal-Callback registrieren
function OnSignal(Signal, Funktion)
On("EEPOnSignal_"..tostring(Signal), Funktion)
end
-- Weichen-Callbacks registrieren
function OnSwitch(Switch, Funktion)
On("EEPOnSwitch_"..tostring(Switch), Funktion)
end
-- Referenz-Datenbank mit Signalen, Fahrstrassen & Weichen
-- Geordnet nach Signal-ID
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 KsSignalBezeichner()
for Signal, Meta in ipairs(KsSignale) do
if Meta.Schild ~= nil then
EEPStructureSetTextureText(Meta.Schild, 1, Meta.Kennzahl)
EEPStructureSetTextureText(Meta.Schild, 2, Meta.Name)
end
end
end