# Segnale di blocco automatico (nuova versione) per il binario di sinistra di una
# linea ETCS L2, seguito da qualsiasi segnale. Da usare come segnale automatico
# (così com'è) o intermedio (marcare l'apposita opzione); spegnimento e riaccen-
# sione per l'inversione del blocco si propagano ai segnali successivi di questo
# tipo. Da spento è apribile sia normalmente che con Ctrl-click (guasto).
# Se si vuole simulare la giratura del blocco non può essere seguito da deviatoi.
#
# Aspetti: off (spento chiuso), disabled (spento aperto), fault (guasto),
#          R, S, GG, G, V (a diverse velocità), tutti uguali (è un cartello)

# Automatic block signal (new version) for the left track of an ETCS L2 line,
# folllowed by whatever signal. To be used as an automatic (as it is) or inter-
# mediate (mark the specific option) signal; when switched on or off for block
# reversal operations, the action will propagate to the signals of the same type
# that follow. When unlit it can be cleared both normally and with Ctrl-click
# (fault). When block reversing is simulated no switches can follow it.
#
# Aspects: off (unclear), disabled (clear), fault,
#          R, S, YY, Y, G (at various speeds), all the same (it's a panel)

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

Aspect: red
	IconE: AV_bln_Es.xpm
	IconW: AV_bln_Ws.xpm
	IconN: AV_bln_Ns.xpm
	IconS: AV_bln_Ss.xpm
	Action: stop

Aspect: shunt
	IconE: AV_bln_Es.xpm
	IconW: AV_bln_Ws.xpm
	IconN: AV_bln_Ns.xpm
	IconS: AV_bln_Ss.xpm
	Action: speedLimit 29

Aspect: yellow_yellow
	IconE: AV_bln_Es.xpm
	IconW: AV_bln_Ws.xpm
	IconN: AV_bln_Ns.xpm
	IconS: AV_bln_Ss.xpm
	Action: speedLimit 60

Aspect: yellow
	IconE: AV_bln_Es.xpm
	IconW: AV_bln_Ws.xpm
	IconN: AV_bln_Ns.xpm
	IconS: AV_bln_Ss.xpm
	Action: speedLimit 110

Aspect: green
	IconE: AV_bln_Es.xpm
	IconW: AV_bln_Ws.xpm
	IconN: AV_bln_Ns.xpm
	IconS: AV_bln_Ss.xpm
	Action: speedLimit 160

Aspect: green_220
	IconE: AV_bln_Es.xpm
	IconW: AV_bln_Ws.xpm
	IconN: AV_bln_Ns.xpm
	IconS: AV_bln_Ss.xpm
	Action: speedLimit 220

Aspect: green_300
	IconE: AV_bln_Es.xpm
	IconW: AV_bln_Ws.xpm
	IconN: AV_bln_Ns.xpm
	IconS: AV_bln_Ss.xpm
	Action: proceed

Aspect: off
	IconE: AV_bln_Es.xpm
	IconW: AV_bln_Ws.xpm
	IconN: AV_bln_Ns.xpm
	IconS: AV_bln_Ss.xpm
	Action: stop

Aspect: disabled
	IconE: AV_bln_Es.xpm
	IconW: AV_bln_Ws.xpm
	IconN: AV_bln_Ns.xpm
	IconS: AV_bln_Ss.xpm
	Action: speedLimit 30

Aspect: fault
	IconE: AV_bln_Es.xpm
	IconW: AV_bln_Ws.xpm
	IconN: AV_bln_Ns.xpm
	IconS: AV_bln_Ss.xpm
	Action: speedLimit 30

# initial aspect

OnInit:
	.auto = 1
	.noclickpenalty = 1
	.aspect = red
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
	# Qui si apre: attiva l'automatismo - Here it clears: enable automation
	.enabled = 1
	# 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
	# 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 non è l'ultimo permissivo prima di un altro segnale
	# (escluso rfi_OB_*.tds), propaga lo stato di accensione/spegnimento
	# If next is not the last permissive before another signal
	# (rfi_OB_*.tds excluded), propagate the on or off status
	if next.script > "rfi_perm" and next.script < "rfi_pern"
		if next.next.script ! "rfi_OB_new.tds" and next.next.script ! "rfi_OB_small.tds" and next.next.script < "rfi_perm" or next.next.script > "rfi_perma"
			.departure = 0		# Operazione fittizia - Fake operation
		else
			if .aspect = off or .aspect = disabled
				if next.aspect = red
					next.aspect = off
				end
				if next.aspect ! off and next.aspect ! disabled and next.aspect ! fault
					next.aspect = disabled
				end
			end
			if .aspect ! fault and .aspect ! off and .aspect ! disabled
				if next.aspect = off
					next.aspect = red
				end
				if next.aspect = disabled
					next.aspect = green
				end
			end
		end
	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 .nextLimit < 31 or .color = white or next.aspect = disabled or next.aspect = off or .redDistance < 600 and next.aspect = red
		.aspect = shunt
		return
	end
	# Se segue un segnale non ETCS: controllo gli avvisi.
	# If a non ETCS signal follows: check the distants.
	if next.script < "rfi_perm_A" or next.script > "rfi_prot_AW" or next.script > "rfi_perm_AW" and next.script < "rfi_prot_A"
		# Avvisi che richiedono G_110: GG - Distants aspects requiring Y_110: YY
		if nextApproach.aspect = yellow_yellow
			.aspect = yellow
			return
		end
		# Avvisi che richiedono V_160: (G | GV | GxVx), anche vicini al successivo
		# Distant aspects requiring G_160: (Y | YG | YxGx), also near the next signal
		if nextApproach.aspect = yellow or nextApproach.aspect = yellow_green or nextApproach.aspect = yellow_green_flashing
			.aspect = green
			return
		end
		if nextApproach.aspect = short_yellow or nextApproach.aspect = short_yellow_green_30 or nextApproach.aspect = short_yellow_green_60
			.aspect = green
			return
		end
		# Avvisi che richiedono V_220: (Gx/Vx | Gx | V) - Distant aspects requiring G: (Yx/Gx | Yx | G)
		if nextApproach.aspect = yellow_flashing or nextApproach.aspect = green or nextApproach.aspect = yellow_green_switching or nextApproach.aspect = short_yellow_green_100
			.aspect = green_220
			return
		end
	end
	# Qui non segue un avviso normale, o va ignorato - No normal distant follows, or is to be ignored

	# Aspetti che richiedono GG_60: S | RGG o limite < 31 km/h dopo il prossimo (non R), o distanza dal rosso < 1001
	# Aspects requiring YY_60: S | RYY or speed limit < 31 km/h after next signal (not R), or red distance < 1001
	if next.aspect = shunt or next.aspect = red_yellow_yellow or .redDistance < 1001 or next.nextLimit < 31 and next.aspect ! red
		.aspect = yellow_yellow
		return
	end
	# Aspetti che richiedono G_110: GG o limite < 61 km/h dopo il prossimo (non R), o distanza dal rosso < 2001
	# Aspects requiring Y_110: YY or speed limit < 61 km/h after next signal (not R), or red distance < 2001
	if next.aspect = yellow_yellow or .redDistance < 2001 or next.nextLimit < 61 and next.aspect ! red
		.aspect = yellow
		return
	end
	# Aspetti che richiedono V_160: G o limite < 101 km/h dopo il prossimo (non R), o distanza dal rosso < 3001
	# Aspects requiring G_160: Y or speed limit < 101 km/h after next signal (not R), or red distance < 3001
	if next.aspect = yellow or .redDistance < 3001 or next.nextLimit < 101 and next.aspect ! red
		.aspect = green
		return
	end
	# Aspetti che richiedono V_220: G o limite < 161 km/h dopo il prossimo (non R), o distanza dal rosso < 4001
	# Aspects requiring G_220: Y or speed limit < 161 km/h after next signal (not R), or red distance < 4001
	if next.aspect = green or .redDistance < 4001 or next.nextLimit < 161 and next.aspect ! red
		.aspect = green_220
		return
	end
	# Ogni altro caso, compreso nessun altro segnale (uscita)
	# Any other case, including no signal follows (exit point)
	.aspect = green_300
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:
	# 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
	if .aspect = fault or .aspect = disabled
		.aspect = off
	else
		.aspect = red
	end
end

# the player or a script uncleared the signal

OnUncleared:
	.enabled = 0
	# 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
	if .aspect = fault or .aspect = disabled
		.aspect = off
	else
		.aspect = red
	end
end
