# Segnale che simula il picchetto limite di manovra, protetto dai segnali di protezione.
# Non cambia aspetto, ma può essere messo a via libera (per i treni normali); quando è
# chiuso i segnali precedenti si aprono in shunt. Si consiglia di impostarlo come "Inter-
# mediate", e di usare il Ctrl-click per aprire i segnali precedenti solo fino ad esso.
#
# Aspetti (identici): off (chiuso: forza gli aspetti di manovra),
#                     yellow_yellow (forza G), green (forza V),
#                     shunt (forza GG; se a più di 600 m dal precedente anteporre
#                            l'avviso rfi_avv_tronc.tds che forza il corto)

# Special signal implementing the "Shunting limit marker", a post protected by the home
# signal. It's a real signal, so it must be "cleared" for normal trains to pass it (the
# aspect doesn't change); when it's not clear previuos signals show shunt. It's advisable
# to set it as "Intermediate", and to use Ctrl-click to clear previous signals just up to it.
#
# Aspetti (identical): off (unlclear: forces shunting aspects),
#                      yellow_yellow (forces G), green (forces V),
#                      shunt (forces GG; if more than 600 m away from the previous sig-
#                             nal, place an rfi_avv_tronc.tds in between, forcing short)

# P.Rosati  21/01/2021 (Versione 5.1)

Aspect: off
	IconE: LM_E.xpm
	IconW: LM_W.xpm
	IconN: LM_N.xpm
	IconS: LM_S.xpm
	Action: stop

Aspect: disabled
	IconE: PL_E.xpm
	IconW: PL_W.xpm
	IconN: PL_N.xpm
	IconS: PL_S.xpm
	Action: speedLimit 30

Aspect: shunt
	IconE: LM_E.xpm
	IconW: LM_W.xpm
	IconN: LM_N.xpm
	IconS: LM_S.xpm
	Action: proceed

Aspect: yellow_yellow
	IconE: LM_E.xpm
	IconW: LM_W.xpm
	IconN: LM_N.xpm
	IconS: LM_S.xpm
	Action: proceed

Aspect: yellow
	IconE: PL_E.xpm
	IconW: PL_W.xpm
	IconN: PL_N.xpm
	IconS: PL_S.xpm
	Action: proceed

Aspect: short_yellow
	IconE: LM_E.xpm
	IconW: LM_W.xpm
	IconN: LM_N.xpm
	IconS: LM_S.xpm
	Action: proceed

Aspect: green
	IconE: LM_E.xpm
	IconW: LM_W.xpm
	IconN: LM_N.xpm
	IconS: LM_S.xpm
	Action: proceed

# initial aspect

OnInit:
	.aspect = off
end

# the player or a script cleared the signal

OnCleared:
	# Se bloccato o seguito da un segnale guasto superabile, si apre solo con Ctrl-click
	# If blocked or followed by a passable faulty signal, clears only with Ctrl-click
	if next.aspect = fault or next.aspect = block
		return
	end
	# Se seguito da un segnale di partenza aperto, si apre solo con Ctrl-click
	# If followed by a clear exit signal, clears only with Ctrl-click
	if nextApproach.aspect = block or next.script > "rfi_part" and next.script < "rfi_paru" and next.aspect ! red and next.aspect ! off
		return
	end
	# Se seguito da un segnale di partenza (chiuso), lo blocca
	# If followed by an (unclear) exit signal, lock it
	if nextApproach.script = "rfi_avv_part.tds" or next.script > "rfi_part" and next.script < "rfi_paru"
		next.fixedred = 1
	end
	# Aspetto temporaneo: la OnUpdate imposterà quello giusto
	# Temporary aspect: the OnUpdate will set the right one
	.aspect = green
end

# the player or a script cleared the signal for shunting

OnShunt:
	.aspect = shunt
end

# this or another signal changed its aspect

OnUpdate:
	if .aspect = off
		return
	end
	# Qui è aperto; se segue un segnale guasto superabile, si chiude
	# Here it's clear; if a passable faulty signal follows, unclears
	if next.aspect = fault
		.click = 1
		return
	end
	# Se qualcosa forza la manovra o segue un segnale spento superabile: forza S nel precedente
	# If something forces shunt or a passable or unmasked unlit signal follows: force S in the previous
	if next.script = "rfi_sam_i.tds" or next.script = "rfi_marm_i.tds" or next.script = "rfi_marm_id.tds" or .nextLimit < 30 or next.aspect = disabled or next.aspect = off
		.aspect = disabled
		return
	end
	# Non ci possono essere deviatoi a valle - prima controllo gli avvisi che richiedono G nel precedente: GG
	# No switches can follow this signal - first check the distants' aspects requiring Y in the previous: YY
	if nextApproach.aspect = yellow_yellow
		.aspect = yellow_yellow
		return
	end
	# Avvisi che richiedono Gx nel precedente: (G | GV | GxVx | Gx/Vx) vicini al successivo, anche forzati
	# Distants requiring Yx in the previous: (Y | YG | YxGx | Yx/Gx) near the next signal, even forced
	if nextApproach.aspect = flashing_thrown or nextApproach.aspect > short and nextApproach.aspect < shoru
		.aspect = short_yellow
		return
	end
	# Avvisi che richiedono V nel precedente: (G | GV | GxVx | Gx/Vx) a distanza normale o (Gx | V), anche forzati
	# Distants requiring G in the previous: (Y | YG | YxGx | Yx/Gx) at normal distance or (Yx | V), even forced
	if nextApproach.aspect = yellow_green or nextApproach.aspect = yellow_green_flashing or nextApproach.aspect = yellow_green_switching
		.aspect = green
		return
	end
	if nextApproach.aspect = yellow or nextApproach.aspect = yellow_flashing or nextApproach.aspect = green or nextApproach.aspect = green_thrown
		.aspect = green
		return
	end

	# Aspetti che richiedono GG (R | S | RGG se corti o forzati tali) o G (idem se normali) nel precedente:
	# Aspects requiring YY (R | S | RYY when short or forced so) or Y (the same when normal) in the previous:
	if next.aspect = red or next.aspect = shunt or next.aspect = red_yellow_yellow
		if nextApproach.aspect = red_short
			.aspect = shunt		# Blocco corto - Short block
		else
			.aspect = yellow_yellow
		end
		return
	end
	# Aspetti che richiedono G nel precedente: GG o il prossimo è deviato (segnale incompleto), anche forzato
	# Normal aspects requiring Y in the previous: YY or next is diverging (incomplete aspect), even forced
	if next.aspect = yellow_yellow or next.switchThrown = 1 or next.nextStation = K or next.nextApproach.script = "rfi_avv_dev.tds"
		.aspect = yellow_yellow
		return
	end		# Prossimo non deviato e non (R | S | RGG | GG) - Next is not diverging and not showing (R | S | RYY | YY)

	# Aspetti che richiedono Gx nel precedente: (G | GV | GxVx | Gx/Vx) se vicini al successivo
	# Aspects requiring Yx in the previous: (Y | YG | YxGx | Yx/Gx) if near the next signal
	if next.aspect > short and next.aspect < shoru
		.aspect = short_yellow
		return
	end
	# Ogni altro caso richiede V nel precedente (V | Gx | G | GV | GxVx | Gx/Vx o nessun altro segnale: uscita)
	# Any other case requires G in the previous (G | Yx | Y | YG | YxGx | Yx/Gx or no signal follows: exit point)
	.aspect = green
end

# a train passed the signal

OnCross:
	# Se seguito da un segnale di partenza (bloccato), lo sblocca
	# If followed by a (locked) exit signal, unlock it
	if nextApproach.script = "rfi_avv_part.tds" or next.script > "rfi_part" and next.script < "rfi_paru"
		next.fixedred = 0
	end
	.aspect = off
end

# the player or a script uncleared the signal

OnUncleared:
	# Se seguito da un segnale di partenza (bloccato), lo sblocca
	# If followed by a (locked) exit signal, unlock it
	if nextApproach.script = "rfi_avv_part.tds" or next.script > "rfi_part" and next.script < "rfi_paru"
		next.fixedred = 0
	end
	.aspect = off
end
