FORO Railsim.es

Versión completa: Dudas con los scripts de señales luminosas
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2 3 4 5 6 7 8 9
Hola a todos,

Hace unos días me metí a modificar el script de las luminosas para hacer un pequeño cambio (el estado de pre anuncio de amarillo en vez de ser verde y amarillo estaba marcado amarillo y blanco). Y ya que me puse, estoy intentando implementarle las 4 opciones que tienen las luminosas desde hace unas versiones con mis conocimientos básicos de RW.

[Imagen: D363oTp.png]

[Imagen: E9UZhDs.png] - Aquí se puede poner una letra o carácter para que este se envíe a paneles luminosos que muestren itinerario. Las señales alemanas ya tienen esta funcionalidad (aunque yo no he conseguido hacerla funcionar), según se aprecia en este vídeo : http://www.youtube.com/watch?v=8N3GOa4nQeg. Simplemente llamando a GetLinkFeatherChar se obtiene el carácter que está introducido en el editor, pero lo que no tengo ni idea es cómo se conectan la señal y el panel porque en el script alemán tampoco lo veo.
Hay un mensaje que se pasa entre señales Call( "SendSignalMessage", SIGNAL_ROUTE_INDICATION, newTheatreChar, -1, 1, 0 ) para que el panel reciba el carácter PERO la constante SIGNAL_ROUTE_INDICATION cuyo código es 21, comparte este código con otras constantes y sigo sin saber, luego el panel cuando recibe el mensaje cómo sabe que es de su señal "padre".

[Imagen: Ij9Dj8e.png] - Este ya funciona con las señales, para una determinada posición de las agujas, aplica la limitación de velocidad que aquí se especifique entre los dos marcadores de la señal.

[Imagen: N5Enm07.png] - Con este tengo algo más de duda, se supone que es para habilitar el control de aproximación que se usa en UK ante desvíos para poner la señal en rojo o amarillo has instantes antes que llegue el tren. Aquí lo explican de forma detallada, http://www.davros.org/rail/signalling/ar...tions.html. Esto por ejemplo creo que en España no se hace y no sé si tendría mucho sentido implementar. Igual se le podría dar otro uso.

[Imagen: mR0HWP3.png] - Este es el más fácil de todos y con un par de líneas de código ya lo he hecho. Si se activa esta casilla, este itinerario en lugar de darse en verde se dará en amarillo. Está muy bien para desviadas o vías muertas que hasta ahora se daban en verde.

Si alguno sabéis cómo hacer funcionar las señales alemanas para aunque sea corroborar que su script es correcto sería de gran ayuda.

Saludos y gracias!!
Buenas andertrains, sobre odificar el scrit, yo ni idea, pero sobre lo que comentas de que mostraban mal las indicaciones, reinstala la señales luminosas y se corrige el error.
Tenía las señales en la última versión aunque no sé si alguna ruta pudo haber modificado los colores del script. Volver a poner el anuncio de amarillo con verde y amarillo es una tontería pero ya que me metía con el script por eso comentaba si puede ser interesante meter las nuevas funcionalidades. Big Grin
AnderTrains escribió:Tenía las señales en la última versión aunque no sé si alguna ruta pudo haber modificado los colores del script. Volver a poner el anuncio de amarillo con verde y amarillo es una tontería pero ya que me metía con el script por eso comentaba si puede ser interesante meter las nuevas funcionalidades. Big Grin

Creo que no solo sería muy interesante, valdría la pena poder completar la señalización Renfe y añadirles nuevas.
Alguno ha conseguido alguna vez hacer funcionar los paneles de letras con las señales alemanas? Yo no consigo hacerlo :roll:
Igual te podría ayudar en lo de los scripts, si me dices que tienen que hacer los semáforos igual lo podemos hacer Big Grin
¿Que scripts son?¿Los que tenemos actualmente?
Os dejo esto por si os pudiera ayudar a definir todas las funciones de las luminosas

[attachment=3258]

[attachment=3259]
HANNIBAL SMITH escribió:Igual te podría ayudar en lo de los scripts, si me dices que tienen que hacer los semáforos igual lo podemos hacer Big Grin
¿Que scripts son?¿Los que tenemos actualmente?

Hola Hannibal y gracias Avetren Big Grin

Los scripts sin los actuales si, los que usan las señales de camber (y supongo que las sin mástil y de alta velocidad). Las nuevas funciones con las que sacar la info de las señales son las siguientes :

Call ( "GetLinkApproachControl", link ) devuelve 0 o 1
Call ( "GetLinkLimitedToYellow", link ) devuelve 0 o 1
Call ( "GetLinkFeatherChar", link ) devuelve el caracter
Call ( "GetLinkSpeedLimit", link ) devuelve la velocidad
Call ( "SetText", "TEXT", # ) este entiendo que da valor a los dos campos ID que tienen las señales. Otra cosa es si el creador ha preparado para que ese ID sea la letra de un panel, el nombre de una señal, etc... (# = 0 para el texto primario y 1 para el secundario)
Call ( "GetId" ) devuelve los dos campos ID creo que concatenados sin forma de saber cual es cada uno...

Entonces un poco a raíz de esto te cuento lo que estoy haciendo:

[Imagen: E9UZhDs.png] Call("GetLinkFeatherChar", gConnectedLink ) - Para los paneles con letras (los DE Zs2 alemanes) estoy mirando porque se supone que las señales alemanas (por ejemplo en el HP_Mod_Home 3Asp 4 Entry 1.lua) tienen ya implementada la parte que envía al panel la información de qué mostrar.

La parte gorda del código para mostrar las letras es esta:

Código:
-- ACTIVATE ROUTE INDICATOR
-- Switches speed indicators on and off depending on connected link
--
function ActivateRouteIndicator ( connectedLink )
    local newTheatreChar = Call("GetLinkFeatherChar", connectedLink)
    -- KJM 18-Mar-2010 turn off indicators when signal red
    if newTheatreChar == nil  or gSignalState == BLOCKED then
        newTheatreChar = ""
    else
        newTheatreChar = string.char(newTheatreChar)
    end
    DebugPrint ( ("DEBUG: " .. gId .. " ActivateRouteIndicator() - GetLinkFeatherChar ( " .. connectedLink .. " ) returns '" .. newTheatreChar .. "'" ) )
    if newTheatreChar ~= gCurrentTheatreChar then
        DebugPrint ( ("DEBUG: " .. gId .. " ActivateRouteIndicator() - SendSignalMessage( " .. SIGNAL_ROUTE_INDICATION .. ", " ..newTheatreChar .. ", -1, 1, 0 )" ) )
        Call( "SendSignalMessage", SIGNAL_ROUTE_INDICATION, newTheatreChar, -1, 1, 0 )
        gCurrentTheatreChar = newTheatreChar
    end
end


Y para velocidad esta:

Código:
-- ACTIVATE SPEED INDICATOR
-- Switches speed indicators on and off depending on connected link
--
function ActivateSpeedIndicator ( connectedLink )
    
    local newIndicator = ""
    local newSpeedLimit = -1

    -- If we're connected to a valid link and the signal we're attached to isn't red
    if connectedLink >= 0 and gSignalState ~= BLOCKED and gPreparedness ~= SIGNAL_UNPREPARED then

        -- Check what speed limit indicators (if any) are applicable to that route
        newSpeedLimit = Call("GetLinkSpeedLimit", connectedLink)
        
        DebugPrint(("DEBUG: " .. gId .. " ActivateSpeedIndicator() - switch speed limit on connected link " .. connectedLink .. " is " .. newSpeedLimit ))


        -- If route has a valid switch speed limit, turn it into a character to activate the appropriate indicator
        -- KJM Shouldn't display anything if more than 100
        -- if newSpeedLimit[i] > 0 and newSpeedLimit[i] < 130 then
        if newSpeedLimit > 0 and newSpeedLimit < 110 then

            newIndicator = "" .. math.floor(newSpeedLimit / 10)
    
            -- Speed limits higher than 100km/h ("10") are triggered using a letter
            if        newIndicator == "10" then newIndicator = "a"
            elseif    newIndicator == "11" then newIndicator = "b"
            elseif    newIndicator == "12" then newIndicator = "c"
            end

            DebugPrint(("DEBUG: " .. gId .. " ActivateSpeedIndicator() - switch speed limit to character " .. newIndicator ))
            
        -- Otherwise, treat as unlimited speed
        else
            newSpeedLimit = -1
        end
    end

    -- If we have a Zs3 head and the switch speed limit at this signal has changed...
    if gCurrentIndicator ~= newIndicator then
        if ZS3_SIGNAL_HEAD_NAME ~= nil then
            -- Switch new texture on - this should get rid of the old texture too
            Call( ZS3_SIGNAL_HEAD_NAME .. "SetText", newIndicator, PRIMARY_TEXT )
        end
        DebugPrint(("DEBUG: " .. gId .. " ActivateSpeedIndicator() - MAIN switch speed indicator switching from " .. gCurrentIndicator .. " to " .. newIndicator))
        DebugPrint( ( "SEND: " .. gId .. " ActivateSpeedIndicator() - SIGNAL_ROUTE_SPEED_LIMIT" ) )
        Call( "SendSignalMessage", SIGNAL_ROUTE_SPEED_LIMIT, "" .. newSpeedLimit, -1, 1, 0 )

        -- Remember which indicator we just switched on
        gCurrentIndicator = newIndicator
    end
end


Mirando el código para las letras, no me queda nada claro cómo sabe a qué panel tiene que mandarla. De hecho si miramos el otro código para el dígito de velocidad, este es más completo y hace Call( ZS3_SIGNAL_HEAD_NAME .. "SetText", newIndicator, PRIMARY_TEXT ) lo cual tiene más lógica. Por eso preguntaba si alguien con este código han conseguido hacerlas funcionar.

(Rebuscando ahora he encontrado este otro código en el que por lo menos hay un SetText. Pero sigue sin quedarme nada claro cómo está conectada con el panel luminoso.)

Código:
-- ACTIVATE ROUTE INDICATOR
-- Switches route indicators on and off depending on connected link
function ActivateRouteIndicator()
DebugPrint( ("DEBUG: " .. gId .. " ActivateRouteIndicator(" .. gConnectedLink .. "  ,  " .. newTheatreChar ..  ")") )
       if switchedOff then
          Call( "SetText", "", PRIMARY_TEXT )
       else
          Call( "SetText", newTheatreChar, PRIMARY_TEXT )
       end
    end


[Imagen: Ij9Dj8e.png] - Limitar la velocidad a los trenes funciona en todas. Entre los dos marcadores de la señal por los que vaya a pasar el tren, este aplicará esta limitación de velocidad. Lo que no he hecho aún es meter el código para mostrar el dígito en un panel luminoso, primero quería probar si la letra aparecía.

[Imagen: N5Enm07.png] Call("GetLinkApproachControl", gConnectedLink ) - Con el tema de la aproximación, aunque en España creo que no se hace, mi intención es mirar si alguna señal ya lo tienen hecho (se comenta que las UKPro LED lo tienen) y que funcione como en UK, es decir, que la señal cambie cuando el tren está próximo. Le daría juego el ver como algunas señales en puntos críticos se abren cuando te acercas.

[Imagen: mR0HWP3.png] Call ( "GetLinkLimitedToYellow", gConnectedLink ) - Este ya lo tengo hecho con un par de if/else a la hora de determinar el color.

Muchas gracias por todo. Si esto es un poco denso para tratar por aquí, podemos hablarlo por privado y te mando el script o lo que quieras. Como os digo, si de verdad los scripts alemanes funcionan, al final con mirar cómo lo han hecho ellos y rebuscar un poco ya está hecho. Pero tengo mis dudas de que funcionen... :lol:
Por lo que yo entiendo lo que haces con SetText es activar una textura, en este caso la primaria y por otro lado newIndicator es una variable que recoge el texto a poner donde sea, lo puede poner en una señal o en otra, donde se quiera.
Ahora bien, parece como que hay unas texturas predefinidas con las letras que se van a poner en los paneles y se activan a demanda.

Yo lo que entiendo aquí es:

if ZS3_SIGNAL_HEAD_NAME ~= nil then
Call( ZS3_SIGNAL_HEAD_NAME .. "SetText", newIndicator, PRIMARY_TEXT )

Si ZS3_SIGNAL_HEAD_NAME es diferente a nada, si el indicador no está vacío, entonces cambia de textura primaria (SetText) con lo que hay en newIndicator, que puede ser a, b ó c, la velocidad establecida.
Ahora hay que ver que es ZS3_SIGNAL_HEAD_NAME, me imagino que será el nombre del objeto donde sale el numero y la letra.

¿Que ruta es? que me la miro, de todas formas si tienes skype o similar igual mejor, así ponemos en común todo a ver si sacamos algo en claro. :lol:
Ya que estais puestos, os pongo estos GIFs animados, a ver si os sirven.

[attachment=3270]

[attachment=3271]
Páginas: 1 2 3 4 5 6 7 8 9