# Segnale di blocco intermedio a una vela quadra con P sottostante, seguito da qualsiasi
# segnale. Da usare come permissivo automatico (così com'è) o intermedio (marcare l'ap-
# posita opzione); spegnimento e riaccensione per l'inversione del blocco si propagano
# ai segnali successivi di questo tipo. All'inizio della simulazione è spento se è con-
# trollato dall'indicatore di stato del blocco. Da spento è apribile sia normalmente che
# con Ctrl-click (guasto). Non può essere seguito da deviatoi, ed avendo una sola vela
# non mostra aspetti di deviata, neanche in modo incompleto.
#
# Aspetti: R, S, G, Gx, V, off (spento chiuso), disabled (spento aperto), fault (guasto)

# Intermediate block signal with 1 square head and a P underneath, followed by whatever
# signal. To be used as an automatic (as it is) or intermediate (mark the specific op-
# tion) permissive; when switched on or off for block reversal operations, the action
# will propagate to the signals of the same type that follow. 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). No switches can follow
# it, and having only one head it doesn't show diverging aspects, not even incomplete.
#
# Aspects: R, S, Y, Yx, G, off (unclear), disabled (clear), fault

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

Aspect: red
	IconE: PQ_r_E.xpm
	IconW: PQ_r_W.xpm
	IconN: PQ_r_N.xpm
	IconS: PQ_r_S.xpm
	Action: stop

Aspect: shunt
	IconE: PQ_r_E.xpm
	IconW: PQ_r_W.xpm
	IconN: PQ_r_N.xpm
	IconS: PQ_r_S.xpm
	Action: speedLimit 29

Aspect: green
	IconE: PQ_g_E.xpm
	IconW: PQ_g_W.xpm
	IconN: PQ_g_N.xpm
	IconS: PQ_g_S.xpm
	Action: proceed

Aspect: yellow
	IconE: PQ_y_E.xpm
	IconW: PQ_y_W.xpm
	IconN: PQ_y_N.xpm
	IconS: PQ_y_S.xpm
	Action: speedLimit 110

Aspect: short_yellow
	IconE: PQ_y_E.xpm
	IconW: PQ_y_W.xpm
	IconN: PQ_y_N.xpm
	IconS: PQ_y_S.xpm
	Action: speedLimit 110

Aspect: yellow_flashing
	IconE: PQ_y_E.xpm PQ_b_E.xpm
	IconW: PQ_y_W.xpm PQ_b_W.xpm
	IconN: PQ_y_N.xpm PQ_b_N.xpm
	IconS: PQ_y_S.xpm PQ_b_S.xpm
	Action: speedLimit 150

Aspect: off
	IconE: PQ_b_E.xpm
	IconW: PQ_b_W.xpm
	IconN: PQ_b_N.xpm
	IconS: PQ_b_S.xpm
	Action: stop

Aspect: disabled
	IconE: PQ_b_E.xpm
	IconW: PQ_b_W.xpm
	IconN: PQ_b_N.xpm
	IconS: PQ_b_S.xpm
	Action: speedLimit 30

Aspect: fault
	IconE: PQ_b_E.xpm
	IconW: PQ_b_W.xpm
	IconN: PQ_b_N.xpm
	IconS: PQ_b_S.xpm
	Action: speedLimit 30

# initial aspect

OnInit:
	.auto = 0
	.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
	.auto = 1
	.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 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
		return
	end
	# Prosecuzione itinerario: shunt se il segnale dopo è R o S
	# Route continuation: shunt if next signal is R or S
	if .nextStation = V and next.aspect = red or next.aspect = shunt
		.aspect = shunt
		return
	end

	# Non ci possono essere deviate qui - prima controllo gli avvisi
	# No diversions can be here - check distants first

	# Non potendo distinguerli, gli avvisi che richiedono (G | GG | RG o RGG)
	# (vedi segnali a 2 vele) ricadono nel caso (R | S | RGG | GG)
	# Being undistinguishable, distant aspects requiring (Y | YY | RY or RYY)
	# (see 2 headed signals) fall in the (R | S | RYY | YY) case

	# Avvisi che richiedono Gx: (G | GV | GxVx | Gx/Vx) vicini al successivo, anche forzati
	# Distants requiring Yx: (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 = yellow_flashing
		return
	end
	# Avvisi che richiedono V: (G | GV | GxVx | Gx/Vx) a distanza normale o (Gx | V), anche forzati
	# Distants requiring G: (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 G: (R | S | RGG | GG) o il prossimo è deviato (segnale incompleto), anche forzato
	# Normal aspects requiring Y: (R | S | RYY | YY) or next is diverging (incomplete aspect), even forced
	if next.aspect = yellow_yellow or next.aspect = red or next.aspect = shunt or next.aspect = red_yellow_yellow or next.switchThrown = 1 or next.nextStation = K or next.nextApproach.script = "rfi_avv_dev.tds"
		if .nextLength < 1200
			.aspect = short_yellow
		else
			.aspect = yellow
		end
	else
		# Aspetti che richiedono Gx: (G | GV | GxVx | Gx/Vx) se vicini al successivo
		# Aspects requiring Yx: (Y | YG | YxGx | Yx/Gx) if near the next signal
		if next.aspect > short and next.aspect < shoru
			.aspect = yellow_flashing
			return
		end
		# Ogni altro caso richiede V (V | Gx | G | GV | GxVx | Gx/Vx o nessun altro segnale: uscita)
		# Any other case requires G (G | Yx | Y | YG | YxGx | Yx/Gx or 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:
	# 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:
	.auto = 0
	.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
