un script c'est cà
--Script RailWorks 3 de Bernard Villetard
--------------------------------------------------------------------------------------
-- Script signal de type A
--------------------------------------------------------------------------------------
-- Fréquence de clignotement 0.48 Sec
LIGHT_FLASH_OFF_SECS = 0.48
LIGHT_FLASH_ON_SECS = 0.48
gTimeSinceLastFlash = 0
gLightFlashOn = false
gFirstFlashLight = true
gFlashingLightActive = false
gFlashingLight = {}
--------------------------------------------------------------------------------------
-- INITIALISE
--
function Initialise ( )
DefaultInitialise()
gInitialised = false
gSignalState = SIGNAL_VOIELIBRE
Croco = 1
Call( "BeginUpdate" )
local number = Call ("GetId")
Call ("SNCF_PlaqueID_Km:SetText", number, 0)
end
--------------------------------------------------------------------------------------
-- DEFAULT INITIALISE
--
function DefaultInitialise()
gLinkCount = Call( "GetLinkCount" )
gOccupationTable = {}
for i=0, gLinkCount - 1 do
gOccupationTable = 0
end
gLinkState = {}
for link = 0, gLinkCount - 1 do
gLinkState[link] = SIGNAL_VOIELIBRE
end
end
--------------------------------------------------------------------------------------
-- UPDATE
--
function Update (time)
if gFlashingLightActive then
if gFirstLightFlash then
gTimeSinceLastFlash = 0
gFirstLightFlash = false
gLightFlashOn = false
else
gTimeSinceLastFlash = gTimeSinceLastFlash + time
if (not gLightFlashOn) and gTimeSinceLastFlash >= LIGHT_FLASH_OFF_SECS then
for i, v in ipairs(gFlashingLight) do
Call ("SNCF_A:ActivateNode", v, 1)
end
gLightFlashOn = true
gTimeSinceLastFlash = 0
end
if gLightFlashOn and gTimeSinceLastFlash >= LIGHT_FLASH_ON_SECS then
for i, v in ipairs(gFlashingLight) do
Call ("SNCF_A:ActivateNode", v, 0)
end
gLightFlashOn = false
gTimeSinceLastFlash = 0
end
end
end
DefaultUpdate()
end
--------------------------------------------------------------------------------------
-- DEFAULT UPDATE
--
function DefaultUpdate( time )
gInitialised = true
OnJunctionStateChange( 0, "", 1, 0 )
if gSignalState == SIGNAL_VOIELIBRE then
SetState(SIGNAL_VOIELIBRE)
end
end
--------------------------------------------------------------------------------------
-- RESET SIGNAL STATE
--
function ResetSignalState ( )
Initialise()
end
--------------------------------------------------------------------------------------
-- GLOBALS
CLEAR = 0
WARNING = 1
BLOCKED = 2
RESET_SIGNAL_STATE = 0
INITIALISE_SIGNAL_TO_BLOCKED = 1
JUNCTION_STATE_CHANGE = 2
INITIALISE_TO_PREPARED = 3
OCCUPATION_INCREMENT = 10
OCCUPATION_DECREMENT = 11
OUVERT = 12
FERME = 13
SIGNAL_CARRE = 14
SIGNAL_VOIELIBRE = 15
SIGNAL_AVERTISSEMENT = 16
SIGNAL_JAUNEcli = 17
SIGNAL_ROUGEcli = 18
SIGNAL_SEMAPHORE = 19
SIGNAL_VERTcli = 20
SIGNAL_R30 = 21
SIGNAL_R60 = 22
SIGNAL_R60JAUNEcli = 23
SIGNAL_RR30 = 24
SIGNAL_RR60 = 25
SIGNAL_RR30AVERTISSEMENT = 26
SIGNAL_RR30JAUNEcli = 27
SIGNAL_RR60AVERTISSEMENT = 28
SIGNAL_RR60JAUNEcli = 29
SIGNAL_AVERTISSEMENTBJ = 30
SIGNAL_ARR30BJ = 31
SIGNAL_DISQUE = 32
SIGNAL_MANOEUVRE = 33
SIGNAL_BLANCcli = 34
SIGNAL_ETEINT = 35
SIGNAL_GASAM = 36
SIGNAL_MESSAGE1 = 37
SIGNAL_MESSAGE2 = 38
SIGNAL_MESSAGE3 = 39
SIGNAL_MESSAGE4 = 40
SIGNAL_MESSAGE5 = 41
PN1_Arrive = 42
PN1_Depart = 43
PN2_Arrive = 44
PN2_Depart = 45
PN3_Arrive = 46
PN3_Depart = 47
TIV_Ouvert = 48
TIV_Ferme = 49
PASS_OFFSET = 50
PASS_RESET_SIGNAL_STATE = PASS_OFFSET + RESET_SIGNAL_STATE -- Never used!
PASS_JUNCTION_STATE_CHANGE = PASS_OFFSET + JUNCTION_STATE_CHANGE
PASS_INITIALISE_SIGNAL_TO_BLOCKED = PASS_OFFSET + INITIALISE_SIGNAL_TO_BLOCKED
PASS_INITIALISE_TO_PREPARED = PASS_OFFSET + INITIALISE_TO_PREPARED
PASS_OCCUPATION_INCREMENT = PASS_OFFSET + OCCUPATION_INCREMENT
PASS_OCCUPATION_DECREMENT = PASS_OFFSET + OCCUPATION_DECREMENT
PASS_SIGNAL_CARRE = PASS_OFFSET + SIGNAL_CARRE
PASS_SIGNAL_VOIELIBRE = PASS_OFFSET + SIGNAL_VOIELIBRE
PASS_SIGNAL_AVERTISSEMENT = PASS_OFFSET + SIGNAL_AVERTISSEMENT
PASS_SIGNAL_JAUNEcli = PASS_OFFSET + SIGNAL_JAUNEcli
PASS_SIGNAL_ROUGEcli = PASS_OFFSET + SIGNAL_ROUGEcli
PASS_SIGNAL_SEMAPHORE = PASS_OFFSET + SIGNAL_SEMAPHORE
PASS_SIGNAL_VERTcli = PASS_OFFSET + SIGNAL_VERTcli
PASS_SIGNAL_R30 = PASS_OFFSET + SIGNAL_R30
PASS_SIGNAL_R60 = PASS_OFFSET + SIGNAL_R60
PASS_SIGNAL_R60JAUNEcli = PASS_OFFSET + SIGNAL_R60JAUNEcli
PASS_SIGNAL_RR30 = PASS_OFFSET + SIGNAL_RR30
PASS_SIGNAL_RR60 = PASS_OFFSET + SIGNAL_RR60
PASS_SIGNAL_RR30AVERTISSEMENT = PASS_OFFSET + SIGNAL_RR30AVERTISSEMENT
PASS_SIGNAL_RR30JAUNEcli = PASS_OFFSET + SIGNAL_RR30JAUNEcli
PASS_SIGNAL_RR60AVERTISSEMENT = PASS_OFFSET + SIGNAL_RR60AVERTISSEMENT
PASS_SIGNAL_RR60JAUNEcli = PASS_OFFSET + SIGNAL_RR60JAUNEcli
PASS_SIGNAL_AVERTISSEMENTBJ = PASS_OFFSET + SIGNAL_AVERTISSEMENTBJ
PASS_SIGNAL_ARR30BJ = PASS_OFFSET + SIGNAL_ARR30BJ
PASS_SIGNAL_DISQUE = PASS_OFFSET + SIGNAL_DISQUE
PASS_SIGNAL_MANOEUVRE = PASS_OFFSET + SIGNAL_MANOEUVRE
PASS_SIGNAL_BLANCcli = PASS_OFFSET + SIGNAL_BLANCcli
PASS_SIGNAL_ETEINT = PASS_OFFSET + SIGNAL_ETEINT
PASS_SIGNAL_GASAM = PASS_OFFSET + SIGNAL_GASAM
gConnectedLink = 0
gUpdating = 0
SIGMSG_CUSTOM = 15
AWS_MESSAGE = 11
TPWS_MESSAGE = 12
SPAD_MESSAGE = 13
CROCO_MESSAGE = 14
--------------------------------------------------------------------------------------
-- JUNCTION STATE CHANGE
---
function OnJunctionStateChange( junction_state, parameter, direction, linkIndex )
if (gOccupationTable[0] == 0) then
CheckSignalState( )
else
Occupe( gConnectedLink )
end
end
--------------------------------------------------------------------------------------
-- ON CONSIST PASS
--
function OnConsistPass ( prevFrontDist, prevBackDist, frontDist, backDist, linkIndex )
local crossingStart = 0
local crossingEnd = 0
if ( frontDist > 0 and backDist < 0 ) or ( frontDist < 0 and backDist > 0 ) then
if ( prevFrontDist < 0 and prevBackDist < 0 ) or ( prevFrontDist > 0 and prevBackDist > 0 ) then
crossingStart = 1
end
else
if ( prevFrontDist < 0 and prevBackDist > 0 ) or ( prevFrontDist > 0 and prevBackDist < 0 ) then
crossingEnd = 1
end
end
if (crossingStart == 1) then
--------------------------------------------------------------------------------------
if (prevFrontDist > 0 and prevBackDist > 0) then
if (linkIndex == 0) then
if (gSignalState == SIGNAL_SEMAPHORE) or (gSignalState == SIGNAL_ROUGEcli) then
Call( "SendConsistMessage", SIGMSG_CUSTOM , "KVBe000" )
local consistSpeed = Call( "GetConsistSpeed" )
local speedLimit = 4.2
if ( consistSpeed > speedLimit ) then
Call( "SendConsistMessage", SPAD_MESSAGE, "" )
end
elseif (gSignalState == SIGNAL_AVERTISSEMENT) then
Call( "SendConsistMessage", SIGMSG_CUSTOM , "KVBa000" )
local consistSpeed = Call( "GetConsistSpeed" )
local speedLimit = 44.44
if ( consistSpeed > speedLimit ) then
Call( "SendConsistMessage", SPAD_MESSAGE, "" )
end
elseif (gSignalState == SIGNAL_JAUNEcli) then
Call( "SendConsistMessage", SIGMSG_CUSTOM , "KVBa888" )
local consistSpeed = Call( "GetConsistSpeed" )
local speedLimit = 44.44
if ( consistSpeed > speedLimit ) then
Call( "SendConsistMessage", SPAD_MESSAGE, "" )
end
elseif (gSignalState == SIGNAL_VERTcli) then
Call( "SendConsistMessage", SIGMSG_CUSTOM , "KVBa160" )
elseif (gSignalState == SIGNAL_VOIELIBRE) then
Call( "SendConsistMessage", SIGMSG_CUSTOM , "KVBv000" )
end
Occupe( 0 )
gOccupationTable[0] = gOccupationTable[0] + 1
end
--------------------------------------------------------------------------------------
elseif (prevFrontDist < 0 and prevBackDist < 0) then
if (linkIndex == 0) then
if gOccupationTable[0] == 1 and gConnectedLink ~= -1 then
local signalStateMessage = gLinkState[gConnectedLink]
Call( "SendSignalMessage", signalStateMessage, "", -1,1, 0 )
end
Call( "SendSignalMessage", OCCUPATION_INCREMENT, "", -1, 1, 0 )
end
end
elseif (crossingEnd == 1) then
--------------------------------------------------------------------------------------
if (frontDist > 0 and backDist > 0) then
if (linkIndex == 0) then
if gOccupationTable[0] > 0 then
gOccupationTable[0] = gOccupationTable[0] - 1
else
end
if (gOccupationTable[0] == 0 and gConnectedLink ~= -1 and gOccupationTable[gConnectedLink] == 0) then
CheckSignalState( )
end
end
--------------------------------------------------------------------------------------
elseif (frontDist < 0 and backDist < 0) then
if (linkIndex == 0) then
Call( "SendSignalMessage", OCCUPATION_DECREMENT, "", -1, 1, 0 )
end
end
end
end
--------------------------------------------------------------------------------------
-- NONOCCUPE
--
function NonOccupe( linkIndex )
if (linkIndex == 0 and gConnectedLink > 0) then
linkIndex = gConnectedLink
end
if (gConnectedLink == linkIndex) then
if (gOccupationTable[linkIndex] ~= nil) and
(gOccupationTable[linkIndex] == 0) and
(gOccupationTable[0] == 0) then
if gSignalState ~= SIGNAL_VOIELIBRE then
SetState( SIGNAL_VOIELIBRE )
Call( "SendSignalMessage", SIGNAL_VOIELIBRE, "", -1, 1, 0 )
end
end
end
gLinkState[linkIndex] = SIGNAL_VOIELIBRE
end
--------------------------------------------------------------------------------------
-- OCCUPE
--
function Occupe( linkIndex )
if Croco == 1 or Croco == 3 or Croco == 5 or Croco == 7 then
if gSignalState ~= SIGNAL_SEMAPHORE then
SetState( SIGNAL_SEMAPHORE )
Call( "SendSignalMessage", SIGNAL_SEMAPHORE, "", -1, 1, 0 )
end
else
if gSignalState ~= SIGNAL_ROUGEcli then
SetState( SIGNAL_ROUGEcli )
Call( "SendSignalMessage", SIGNAL_ROUGEcli, "", -1, 1, 0 )
end
end
end
--------------------------------------------------------------------------------------
-- AVERTISSEMENT
--
function Avertissement( linkIndex )
if (linkIndex == 0 and gConnectedLink > 0) then
linkIndex = gConnectedLink
end
if (gConnectedLink == linkIndex) then
if (gOccupationTable[linkIndex] ~= nil) and
(gOccupationTable[linkIndex] == 0) and
(gOccupationTable[0] == 0) then
if gSignalState ~= SIGNAL_AVERTISSEMENT then
SetState( SIGNAL_AVERTISSEMENT )
Call( "SendSignalMessage", SIGNAL_AVERTISSEMENT, "", -1, 1, 0 )
end
end
end
gLinkState[linkIndex] = SIGNAL_AVERTISSEMENT
end
-----------------------------------------------------------------------------------
-- JAUNEcli
--
function Jaunecli( linkIndex )
if (linkIndex == 0 and gConnectedLink > 0) then
linkIndex = gConnectedLink
end
if (gConnectedLink == linkIndex) then
if (gOccupationTable[linkIndex] ~= nil) and
(gOccupationTable[linkIndex] == 0) and
(gOccupationTable[0] == 0) then
if gSignalState ~= SIGNAL_JAUNEcli then
SetState( SIGNAL_JAUNEcli )
Call( "SendSignalMessage", SIGNAL_JAUNEcli, "", -1, 1, 0 )
end
end
end
gLinkState[linkIndex] = SIGNAL_JAUNEcli
end
-------------------------------------------------------------------------------------
-- VERTcli
--
function Vertcli( linkIndex )
if (linkIndex == 0 and gConnectedLink > 0) then
linkIndex = gConnectedLink
end
if (gConnectedLink == linkIndex) then
if (gOccupationTable[linkIndex] ~= nil) and
(gOccupationTable[linkIndex] == 0) and
(gOccupationTable[0] == 0) then
if gSignalState ~= SIGNAL_VERTcli then
SetState( SIGNAL_VERTcli )
Call( "SendSignalMessage", SIGNAL_VERTcli, "", -1, 1, 0 )
end
end
end
gLinkState[linkIndex] = SIGNAL_VERTcli
end
-------------------------------------------------------------------------------------
-- SET STATE
--
function SetState( newState )
if (newState == SIGNAL_VOIELIBRE) then
Call ("Set2DMapSignalState", CLEAR)
SetLights(SIGNAL_VOIELIBRE)
elseif (newState == SIGNAL_SEMAPHORE) then
Call ("Set2DMapSignalState", BLOCKED)
SetLights(SIGNAL_SEMAPHORE)
elseif (newState == SIGNAL_ROUGEcli) then
Call ("Set2DMapSignalState", BLOCKED)
SetLights(SIGNAL_ROUGEcli)
elseif (newState == SIGNAL_AVERTISSEMENT) then
Call ("Set2DMapSignalState", WARNING)
SetLights(SIGNAL_AVERTISSEMENT)
elseif (newState == SIGNAL_JAUNEcli) then
Call ("Set2DMapSignalState", WARNING)
SetLights(SIGNAL_JAUNEcli)
elseif (newState == SIGNAL_VERTcli) then
Call ("Set2DMapSignalState", CLEAR)
SetLights(SIGNAL_VERTcli)
end
gSignalState = newState
end
--------------------------------------------------------------------------------------
-- SET LIGHTS
--
function SetLights ( newState )
if (newState == SIGNAL_VOIELIBRE) then
Call ( "SNCF_A:ActivateNode", "mod_voie_libre", 1 )
Call ( "SNCF_A:ActivateNode", "mod_avertissement", 0 )
Call ( "SNCF_A:ActivateNode", "mod_semaphore", 0 )
gFlashingLightActive = false
elseif (newState == SIGNAL_SEMAPHORE) then
Call ( "SNCF_A:ActivateNode", "mod_voie_libre", 0 )
Call ( "SNCF_A:ActivateNode", "mod_avertissement", 0 )
Call ( "SNCF_A:ActivateNode", "mod_semaphore", 1 )
gFlashingLightActive = false
elseif (newState == SIGNAL_ROUGEcli) then
Call ( "SNCF_A:ActivateNode", "mod_voie_libre", 0 )
Call ( "SNCF_A:ActivateNode", "mod_avertissement", 0 )
Call ( "SNCF_A:ActivateNode", "mod_semaphore", 1 )
gFlashingLightActive = true
gFlashingLight = { "mod_semaphore" }
gFirstLightFlash = true
elseif (newState == SIGNAL_AVERTISSEMENT) then
Call ( "SNCF_A:ActivateNode", "mod_voie_libre", 0 )
Call ( "SNCF_A:ActivateNode", "mod_avertissement", 1 )
Call ( "SNCF_A:ActivateNode", "mod_semaphore", 0 )
gFlashingLightActive = false
elseif (newState == SIGNAL_JAUNEcli) then
Call ( "SNCF_A:ActivateNode", "mod_voie_libre", 0 )
Call ( "SNCF_A:ActivateNode", "mod_avertissement", 1 )
Call ( "SNCF_A:ActivateNode", "mod_semaphore", 0 )
gFlashingLightActive = true
gFlashingLight = { "mod_avertissement" }
gFirstLightFlash = true
elseif (newState == SIGNAL_VERTcli) then
Call ( "SNCF_A:ActivateNode", "mod_voie_libre", 1 )
Call ( "SNCF_A:ActivateNode", "mod_avertissement", 0 )
Call ( "SNCF_A:ActivateNode", "mod_semaphore", 0 )
gFlashingLightActive = true
gFlashingLight = { "mod_voie_libre" }
gFirstLightFlash = true
else
end
end
--------------------------------------------------------------------------------------
-- GET SIGNAL STATE
--
function GetSignalState( )
local signalState = -1
if (gSignalState == SIGNAL_VOIELIBRE) or
(gSignalState == SIGNAL_VERTcli) then
signalState = CLEAR
elseif (gSignalState == SIGNAL_SEMAPHORE)
or (gSignalState == SIGNAL_ROUGEcli)
or (gSignalState == SIGNAL_AVERTISSEMENT)
or (gSignalState == SIGNAL_JAUNEcli) then
signalState = BLOCKED
else
end
return signalState
end
--------------------------------------------------------------------------------------
-- CHECK SIGNAL STATE
--
function CheckSignalState( )
if gConnectedLink < 0 then
elseif gLinkState[gConnectedLink] == SIGNAL_VOIELIBRE then
NonOccupe( gConnectedLink )
elseif gLinkState[gConnectedLink] == SIGNAL_AVERTISSEMENT then
Avertissement( gConnectedLink )
elseif gLinkState[gConnectedLink] == SIGNAL_JAUNEcli then
Jaunecli( gConnectedLink )
elseif gLinkState[gConnectedLink] == SIGNAL_VERTcli then
Vertcli( gConnectedLink )
else
end
end
-------------------------------------------------------------------------------------
-- ON SIGNAL MESSAGE
--
function OnSignalMessage( message, parameter, direction, linkIndex )
if (linkIndex > 0) then
if message > PASS_OFFSET then
Call( "SendSignalMessage", message, parameter, -direction, 1, linkIndex )
elseif message ~= RESET_SIGNAL_STATE and message ~= JUNCTION_STATE_CHANGE and parameter ~= "DoNotForward" then
Call( "SendSignalMessage", message + PASS_OFFSET, parameter, -direction, 1, linkIndex )
end
end
if (linkIndex >= 0) then
if message >= PASS_INITIALISE_SIGNAL_TO_BLOCKED then
if linkIndex > 0 then
ReactToSignalMessage( message - PASS_OFFSET, parameter, direction, linkIndex )
end
else
ReactToSignalMessage( message, parameter, direction, linkIndex )
end
end
end
-------------------------------------------------------------------------------------
-- REACT TO SIGNAL MESSAGE
function ReactToSignalMessage( message, parameter, direction, linkIndex )
if (message == RESET_SIGNAL_STATE) then
ResetSignalState()
elseif (message == INITIALISE_SIGNAL_TO_BLOCKED) then
gOccupationTable[linkIndex] = gOccupationTable[linkIndex] + 1
elseif (direction == 1) then
if ( message == SIGNAL_CARRE
or message == SIGNAL_SEMAPHORE
or message == SIGNAL_ROUGEcli
or message == SIGNAL_MANOEUVRE
or message == SIGNAL_BLANCcli
or message == SIGNAL_GASAM ) then
Avertissement( linkIndex )
elseif ( message == SIGNAL_AVERTISSEMENT
or message == SIGNAL_R30) then
if Croco == 1 or Croco == 2 then
NonOccupe( linkIndex )
elseif Croco == 3 or Croco == 4 or Croco == 7 or Croco == 8 then
Jaunecli( linkIndex )
elseif Croco == 5 or Croco == 6 then
Vertcli( linkIndex )
end
elseif ( message == SIGNAL_JAUNEcli
or message == SIGNAL_R60
or message == SIGNAL_R60JAUNEcli) then
if Croco == 1 or Croco == 2 or Croco == 3 or Croco == 4 then
NonOccupe( linkIndex )
elseif Croco == 5 or Croco == 6 or Croco == 7 or Croco == 8 then
Vertcli( linkIndex )
end
elseif (message == SIGNAL_AVERTISSEMENTBJ
or message == SIGNAL_VERTcli
or message == SIGNAL_VOIELIBRE ) then
NonOccupe( linkIndex )
elseif (message == OCCUPATION_DECREMENT) then
if gOccupationTable[linkIndex] > 0 then
gOccupationTable[linkIndex] = gOccupationTable[linkIndex] - 1
else
end
Avertissement( linkIndex )
elseif (message == OCCUPATION_INCREMENT) then
gOccupationTable[linkIndex] = gOccupationTable[linkIndex] + 1
if (gConnectedLink == linkIndex) then
Occupe( linkIndex )
end
else
Call( "SendSignalMessage", message, parameter, -1, 1, 0 )
end
elseif (direction == -1) then
if message == SIGNAL_MESSAGE5 then
if parameter == "2" then
Croco = 2
elseif parameter == "3" then
Croco = 3
elseif parameter == "4" then
Croco = 4
elseif parameter == "5" then
Croco = 5
elseif parameter == "6" then
Croco = 6
elseif parameter == "7" then
Croco = 7
elseif parameter == "8" then
Croco = 8
end
else
Call( "SendSignalMessage", message, parameter, 1, 1, 0 )
end
end
end
Cà c'est un script des signaux de TerTor c'est ce qui permet au signal de changer d'état
Ceux de DTG sont codés et ne sont donc pas compatible avec ceux de TerLor
JP