# Segnale imperativo di blocco a una vela quadra, seguito da qualsiasi segnale. È un
# segnale automatico e dovrebbe essere impostato come "Intermediate"; all'inizio
# della simulazione è spento se è controllato dall'indicatore di stato del blocco.
# Da spento è apribile sia normalmente che con Ctrl-click (guasto). Non deve essere
# seguito da segnali permissivi, e se lo è diventa un segnale spento ininfluente.
#
# Aspetti: R, V, S, off (spento chiuso), disabled (spento aperto),
#                   fault (guasto), nothing (ininfluente)

# Main block protection signal with 1 square head, followed by whatever signal. It's
# an automatic signal and should be set as "Intermediate"; at the beginning of the
# simulation it's unlit if it's controlled by the Block Status indicator. When unlit
# it can be cleared both normally and with Ctrl-click (fault). It shouldn't be fol-
# lowed by any permissive signal, and if so it becomes an ininfluent unlit signal.
#
# Aspects: R, G, S, off (unclear), disabled (clear) fault, nothing (ininfluent)

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

Aspect: red
	IconE: NQ_r_E.xpm
	IconW: NQ_r_W.xpm
	IconN: NQ_r_N.xpm
	IconS: NQ_r_S.xpm
	Action: stop

Aspect: shunt
	IconE: NQ_r_E.xpm
	IconW: NQ_r_W.xpm
	IconN: NQ_r_N.xpm
	IconS: NQ_r_S.xpm
	Action: speedLimit 29

Aspect: green
	IconE: NQ_g_E.xpm
	IconW: NQ_g_W.xpm
	IconN: NQ_g_N.xpm
	IconS: NQ_g_S.xpm
	Action: proceed

Aspect: off
	IconE: NQ_b_E.xpm
	IconW: NQ_b_W.xpm
	IconN: NQ_b_N.xpm
	IconS: NQ_b_S.xpm
	Action: stop

Aspect: disabled
	IconE: NQ_b_E.xpm
	IconW: NQ_b_W.xpm
	IconN: NQ_b_N.xpm
	IconS: NQ_b_S.xpm
	Action: speedLimit 30

Aspect: fault
	IconE: NQ_b_E.xpm
	IconW: NQ_b_W.xpm
	IconN: NQ_b_N.xpm
	IconS: NQ_b_S.xpm
	Action: speedLimit 30

Aspect: nothing
	IconE: NQ_b_E.xpm
	IconW: NQ_b_W.xpm
	IconN: NQ_b_N.xpm
	IconS: NQ_b_S.xpm
	Action: none

# initial aspect

OnInit:
	# Se il successivo è un permissivo, diventa ininfluente
	# If followed by a permissive, becomes ininfluent
	if next.script > "rfi_perm" and next.script < "rfi_pern"
		.aspect = nothing
	else
		.auto = 0
		.noclickpenalty = 1
		.aspect = red
	end
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
	# Qui si apre: attiva l'automatismo - Here it clears: enable automation
	.auto = 1
	.enabled = 1
	# Permissivi e imperativi di blocco si aprono anche da spenti
	# Permissive and main block signals can be cleared also when unlit
	if .aspect = off
		.aspect = disabled
		return
	end
	# Aspetto temporaneo: la OnUpdate imposterà quello giusto
	# Temporary aspect: the OnUpdate will set the right one
	.aspect = green
end

# this or another signal changed its aspect

OnUpdate:
	# Se il successivo è un permissivo, diventa ininfluente
	# If followed by a permissive, becomes ininfluent
	if next.script > "rfi_perm" and next.script < "rfi_pern"
		.aspect = nothing
		return
	end
	# Se chiuso o guasto non cambia - If unclear or faulty no change
	if .aspect = red or .aspect = off or .aspect = fault
		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 aperto ma spento non cambia - If clear but unlit no change
	if .aspect = disabled
		return
	end
	# Se qualcosa forza la manovra o segue un segnale spento superabile o non mascherato: S
	# If something forces shunt or a passable or unmasked unlit signal follows: S
	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 .color = white or next.aspect = disabled or next.aspect = off
		.aspect = shunt
	else
		# Ogni altro caso, compreso nessun altro segnale (uscita)
		# Any other case, including no signal follows (exit point)
		.aspect = green
	end
end

# the player or a script cleared the signal for shunting

OnShunt:
	if .aspect = off
		.aspect = fault
	else
		.aspect = shunt
	end
end

# a train passed the signal

OnCross:
	if .aspect = nothing
		return
	end
	if .aspect = fault or .aspect = disabled
		.aspect = off
	else
		.aspect = red
	end
end

# the player or a script uncleared the signal

OnUncleared:
	.auto = 0
	.enabled = 0
	if .aspect = fault or .aspect = disabled
		.aspect = off
	else
		.aspect = red
	end
end
