require("BetterContacts_BH2"){printErrors=true, deprecatedUseGlobal=true} require("Begriffe") -- Tabelle in einen String umwandeln, rekursiv -- Funktionswerte werden ignoriert function __tostring(self) local t=type(self) if t=="table" then local r="" -- load and sort table keys local tkeys={} for k in pairs(self) do table.insert(tkeys, k) end table.sort(tkeys, function(a,b) return tostring(a) 0 then Startwert = AnzahlFahrzeuge Endwert = 1 Schritt = -1 end for i=Startwert,Endwert,Schritt do local Fahrzeug = EEPGetRollingstockItemName(Zug, i-1) local ok, Vorwaerts = EEPRollingstockGetOrientation(Fahrzeug) if ok and not Vorwaerts then if AnimiereFahrzeugStromabnehmer(Fahrzeug, -1 * Richtung) then Richtung = 0 end else if AnimiereFahrzeugStromabnehmer(Fahrzeug, Richtung) then Richtung = 0 end end end end function leseSignal(Signal) if EEPGetSignal(Signal) == 1 then return {FAHRT} else return {HALT} end end local GefundeneSignale={} local Zugaktionen=ladeTabelle(1) local SignalChanged={} setmetatable(Zugaktionen, { __index=function(table, key) table[key]={} return table[key] end }) function KsKitInit() GefundeneSignale={} for Signal=1,1000 do if EEPGetSignal(Signal) > 0 and EEPGetSignal(Signal+1000) > 0 then table.insert(GefundeneSignale, Signal) end end for i=1,#GefundeneSignale do local Signal = GefundeneSignale[i] local FSignal = Signal + 1000 EEPRegisterSignal(Signal) _G["EEPOnSignal_"..tostring(Signal)]=function(Stellung) SignalChanged[Signal]=true end EEPRegisterSignal(FSignal) _G["EEPOnSignal_"..tostring(FSignal)]=function(FStellung) SignalChanged[FSignal]=true if FStellung > 1 then print("Fahrstrasse ",string.format("%04d-%02d", FSignal, FStellung-1)," geschalten") end end end end function KsKitMain() -- Signale abfragen, ob vielleicht ein Zug vor ihnen steht for i=1,#GefundeneSignale do local Signal = GefundeneSignale[i] if EEPGetSignalTrainsCount(Signal) > 0 then Zugname = EEPGetSignalTrainName(Signal, 1) if not Zugaktionen[Zugname].S then Zugaktionen[Zugname].S = Signal end end end -- Signalstellauftraege local Schaltauftraege = {} local SignalHaltegruende = {} for Zugname, Data in pairs(Zugaktionen) do local ok, V_ist = EEPGetTrainSpeed(Zugname) if not ok or next(Zugaktionen[Zugname]) == nil then Zugaktionen[Zugname] = nil end end for Zugname, Data in pairs(Zugaktionen) do local Haltegrund = "Kein Plan" local ok, V_ist = EEPGetTrainSpeed(Zugname) -- Wenn wir stehen, merken wir uns unsere Ankunftszeit if V_ist == 0 then if Zugaktionen[Zugname].A == nil then Zugaktionen[Zugname].A = EEPTime if Zugaktionen[Zugname].V then EEPSetTrainSpeed(Zugname, 0) if Zugaktionen[Zugname].R then AnimiereZugStromabnehmer(Zugname, 0) end end end -- Ankunftszeit loeschen falls wir unterwegs sind elseif Zugaktionen[Zugname].A then Zugaktionen[Zugname].A = nil Zugaktionen[Zugname].S = nil Zugaktionen[Zugname].R = nil Zugaktionen[Zugname].V = nil end if Zugaktionen[Zugname].W then Haltegrund = "Planhalt" end -- Wartezeit loeschen falls abgesessen if Zugaktionen[Zugname].W and Zugaktionen[Zugname].A then local Wartedauer = EEPTime - Zugaktionen[Zugname].A if Wartedauer < 0 then Wartedauer = Wartedauer + 24*60*60 end if Wartedauer > Zugaktionen[Zugname].W then Zugaktionen[Zugname].W = nil end end -- Fahrstrasse schalten if not Zugaktionen[Zugname].W and Zugaktionen[Zugname].S then local ZSignal = Zugaktionen[Zugname].S local FSignal = ZSignal + 1000 local Fahrstrassen = {} if Zugaktionen[Zugname].FS then Fahrstrassen = Zugaktionen[Zugname].FS elseif Selbstblock_Default then Fahrstrassen = {1} end if #Fahrstrassen > 0 then if EEPGetSignal(FSignal) == 1 then Schaltauftraege[FSignal] = 1+Fahrstrassen[math.random(#Fahrstrassen)] end Haltegrund = "FS angefordert" end end -- Haltegrund merken, das wir ihn spaeter im Signal-Tooltip darstellen koennen if Zugaktionen[Zugname].S then SignalHaltegruende[Zugaktionen[Zugname].S] = Haltegrund end if Zugaktionen[Zugname].S then local Begriff = leseSignal(Zugaktionen[Zugname].S) if Begriff[1] ~= HALT then if Zugaktionen[Zugname].V then if Zugaktionen[Zugname].B and Zugaktionen[Zugname].B + 5 < EEPTime then EEPSetTrainSpeed(Zugname, Zugaktionen[Zugname].V) Zugaktionen[Zugname].V = nil Zugaktionen[Zugname].B = nil elseif not Zugaktionen[Zugname].B then AnimiereZugStromabnehmer(Zugname, Zugaktionen[Zugname].V>0 and 1 or -1) Zugaktionen[Zugname].B = EEPTime Zugaktionen[Zugname].R = nil end else Zugaktionen[Zugname].S = nil end end end end speicherTabelle(1, Zugaktionen) EEPChangeInfoSignal(1, __tostring(Zugaktionen)) for k,v in pairs(Schaltauftraege) do EEPSetSignal(k,v,1) end for i=1,#GefundeneSignale do local Signal = GefundeneSignale[i] if Aktiviere_Tooltips then local name = string.format("%04d", Signal) if Name and Name[Signal] then name=Name[Signal] end local txt = "Signal "..name local Begriff = leseSignal(Signal) local Farbe = "" if Begriff[1] == AUS then Farbe = "" elseif Begriff[1] ~= HALT then if Begriff.H_erwarten or Begriff.V_max then Farbe = "" else Farbe = "" end end txt = txt.."\n"..Farbe..BegriffErklaeren(Begriff).."" txt = txt.."" local FStellung = EEPGetSignal(Signal+1000) if FStellung > 1 then txt = txt.."\n".. string.format("FS #%02d", FStellung-1) end if SignalHaltegruende[Signal] then txt = txt.."\n"..SignalHaltegruende[Signal] end EEPChangeInfoSignal(Signal, txt) EEPShowInfoSignal(Signal, 1) else EEPShowInfoSignal(Signal, 0) end end end function FS(...) Zugaktionen[Zugname].FS = {...} speicherTabelle(1, Zugaktionen) end function W(Dauer) Zugaktionen[Zugname].W = Dauer speicherTabelle(1, Zugaktionen) end function S(Signal) Zugaktionen[Zugname].S = Signal speicherTabelle(1, Zugaktionen) end function V(V_soll) local _, V_ist = EEPGetTrainSpeed(Zugname) -- Negieren, falls Zug rueckwarts faehrt if V_ist < 0 then V_soll = -V_soll end -- Mit dieser Division teste ich, ob beide Geschwindigkeiten das selbe Vorzeichen haben -- Falls Vorzeichen ungleich, beim naechsten Halt Fahrtrichtungswechsel if V_soll/V_ist < 0 then Zugaktionen[Zugname].R = 1 end Zugaktionen[Zugname].V = V_soll speicherTabelle(1, Zugaktionen) end