# Segnale di partenza con triangolo a una vela quadra, seguito da qualsiasi segnale.
# I segnali precedenti non si aprono se questo è aperto, e viceversa questo si richiude
# se il segnale precedente è aperto verso di esso. Da spento è apribile solo con Ctrl-click.
# Serie ND: ignora la posizione dei deviatoi per le deviate, e considera la presenza di una
# stazione fittizia K o dello script rfi_avv_dev.tds.
#
# Aspetti:             R, S, G, Gx, V, O, F
# da considerare come: R, S, RG, RGx, RV, off (spento), fault (guasto)

# Exit signal with 1 square head and a triangle below, followed by whatever signal.
# Previous signals cannot be cleared if this is clear, and this will unclear if the
# previuos signal is clear towards it. When unlit it can be cleared only with Ctrl-click.
# ND series: ignore the switches position to show diverging aspects, considering the
# presence of a fake K station or of the rfi_avv_dev script.
#
# Aspects:                       R, S, Y, Yx, G, O, F
# to be "seen" by the driver as: R, S, RY, RYx, RG, off, fault

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

Aspect: red
	IconE: TQ_r_E.xpm
	IconW: TQ_r_W.xpm
	IconN: TQ_r_N.xpm
	IconS: TQ_r_S.xpm
	Action: stop

Aspect: shunt
	IconE: TQ_r_E.xpm
	IconW: TQ_r_W.xpm
	IconN: TQ_r_N.xpm
	IconS: TQ_r_S.xpm
	Action: speedLimit 29

Aspect: red_yellow_30
	IconE: TQ_y_E.xpm
	IconW: TQ_y_W.xpm
	IconN: TQ_y_N.xpm
	IconS: TQ_y_S.xpm
	Action: speedLimit 30

Aspect: red_yellow_flashing_30
	IconE: TQ_y_E.xpm TQ_b_E.xpm
	IconW: TQ_y_W.xpm TQ_b_W.xpm
	IconN: TQ_y_N.xpm TQ_b_N.xpm
	IconS: TQ_y_S.xpm TQ_b_S.xpm
	Action: speedLimit 30

Aspect: red_green_30
	IconE: TQ_g_E.xpm
	IconW: TQ_g_W.xpm
	IconN: TQ_g_N.xpm
	IconS: TQ_g_S.xpm
	Action: speedLimit 30

Aspect: red_yellow_60
	IconE: TQ_y_E.xpm
	IconW: TQ_y_W.xpm
	IconN: TQ_y_N.xpm
	IconS: TQ_y_S.xpm
	Action: speedLimit 60

Aspect: red_yellow_flashing_60
	IconE: TQ_y_E.xpm TQ_b_E.xpm
	IconW: TQ_y_W.xpm TQ_b_W.xpm
	IconN: TQ_y_N.xpm TQ_b_N.xpm
	IconS: TQ_y_S.xpm TQ_b_S.xpm
	Action: speedLimit 60

Aspect: red_green_60
	IconE: TQ_g_E.xpm
	IconW: TQ_g_W.xpm
	IconN: TQ_g_N.xpm
	IconS: TQ_g_S.xpm
	Action: speedLimit 60

Aspect: off
	IconE: TQ_b_E.xpm
	IconW: TQ_b_W.xpm
	IconN: TQ_b_N.xpm
	IconS: TQ_b_S.xpm
	Action: stop

Aspect: fault
	IconE: TQ_b_E.xpm
	IconW: TQ_b_W.xpm
	IconN: TQ_b_N.xpm
	IconS: TQ_b_S.xpm
	Action: speedLimit 30

# initial aspect

OnInit:
	.departure = 1
	.aspect = red
end

# the player or a script cleared the signal

OnCleared:
	# Se bloccato, spento o seguito da un segnale guasto superabile, si apre solo con Ctrl-click
	# If blocked, unlit or followed by a passable faulty signal, clears only with Ctrl-click
	if .aspect = off or 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 = red_green_30
end

# this or another signal changed its aspect

OnUpdate:
	# 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 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

	# Il segnale ha solo aspetti deviati, ma l'avviso che li forza può
	# esserci comunque, per altri binari - prima controllo gli avvisi
	# This signal shows only diverging aspects, but the distant forcing
	# them can follow anyway, for other tracks : check distants first

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

	# Avvisi che richiedono (R)Gx: (G | GV | GxVx | Gx/Vx) vicini al successivo, anche forzati
	# Distants requiring (R)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
		if .nextLimit < 60
			.aspect = red_yellow_flashing_30
		else
			.aspect = red_yellow_flashing_60
		end
		return
	end
	# Avvisi che richiedono (R)V: (G | GV | GxVx | Gx/Vx) a distanza normale o (Gx | V), anche forzati
	# Distants requiring (R)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
		if .nextLimit < 60
			.aspect = red_green_30
		else
			.aspect = red_green_60
		end
		return
	end
	if nextApproach.aspect = yellow or nextApproach.aspect = yellow_flashing or nextApproach.aspect = green or nextApproach.aspect = green_thrown
		if .nextLimit < 60
			.aspect = red_green_30
		else
			.aspect = red_green_60
		end
		return
	end

	# Aspetti che richiedono (R)G: (R | S | RGG | GG) o anche il prossimo è deviato (segnale incompleto), anche forzato
	# Normal aspects requiring (R)Y: (R | S | RYY | YY) or next is also 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.nextStation = K or next.nextApproach.script = "rfi_avv_dev.tds"
		if .nextLength < 600 or nextApproach.aspect = red_short or .nextLimit < 60
			.aspect = red_yellow_30
		else
			.aspect = red_yellow_60
		end
		return
	end
	# Prossimo non deviato e non (R | S | RGG | GG) - Next is not diverging and not showing (R | S | RYY | GG)

	# Aspetti che richiedono (R)Gx: (G | GV | GxVx | Gx/Vx) se vicini al successivo
	# Aspects requiring (R)Yx: (Y | YG | YxGx | Yx/Gx) if near the next signal
	if next.aspect > short and next.aspect < shoru
		if .nextLimit < 60
			.aspect = red_yellow_flashing_30
		else
			.aspect = red_yellow_flashing_60
		end
		return
	end
	# Ogni altro caso richiede (R)V (V | Gx | G | GV | GxVx | Gx/Vx), compreso nessun altro segnale (uscita)
	# Any other case requires (R)G (G | Yx | Y | YG | YxGx | Yx/Gx), including no signal follows (exit point)
	if .nextLimit < 60
		.aspect = red_green_30
	else
		.aspect = red_green_60
	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
		.aspect = off
	else
		.aspect = red
	end
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
	if .aspect = fault
		.aspect = off
	else
		.aspect = red
	end
end
