# Segnale fittizio da collegare a un elemento di binario nascosto per rappresentare lo stato di occu-
# pazione di un blocco in una direzione (un'altra copia servirà per l'altra).
# Quando l'aspetto non è occupato o bloccato il segnale è cliccabile per disattivare / riattivare il
# blocco nella direzione di questo segnale, che per questo va adattato ad ogni blocco (vedi sotto).
#
# Se la tratta contiene segnali permissivi sostituire questi segnaposti con quanto indicato:
# S1 - Sn: Nome o coordinate dei segnali permissivi del blocco, dal più a monte (S1) in avanti.
# IN - Ingresso: primo elemento del tratto di binario senza deviatoi o segnali che precede il blocco.
# IB - Inizio Blocco: ultimo elemento di binario prima del primo segnale permissivo del blocco.
#
# Se IB non ha la direzione di questo segnale, correggere la direzione dopo '.pathdir = '
# A IN va assegnato lo script rfi_sig_up_on_enter.tds, mentre all'ultimo elemento di binario prima
# del primo segnale imperativo dopo il blocco (FB) va assegnato lo script rfi_sig_up_on_exit.tds.
#
# Se la tratta è protetta dal solo segnale imperativo di blocco, sarà S1; non occorre impostare IN e IB.
#
# Aspetti: spento (nero), libero (grigio), orientato (bianco), bloccato (bianco), occupato (rosso).

# Fake signal do be linked to a hidden track element to show the occupancy status of a block in one
# direction (another copy will be needed for the other one).
# When the aspect is neither busy nor locked the signal can be clicked to disabled / enable the block
# in the direction of this signal, which therefore must be adapted to each block (see below).
#
# If the block contains permissive signals, replace these placeholders with the following:
# S1 .. Sn: Name or coordinates af the permissive signals of the block, from the first (S1) onwards.
# IN - Block entrance: first element of the track part free of switches or signals preceding the block.
# IB - Block beginning: last track element before the first permissive signal of the block.
#
# If IB is not in the direction of this signal, correct it after '.pathdir = '
# Assign the rfi_sig_up_on_enter.tds script to IN and the rfi_sig_up_on_exit.tds script
# to the last track element before the first permissive signal of the block (FB).
#
# If the block is protected just by the main block signal, it will be S1; no need to set IN and IB.
#
# Aspects: disabled (black), free (grey), oriented (white), locked (white), busy (red).

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

Aspect: disabled
	IconE: BL_b_E.xpm
	IconW: BL_b_W.xpm
	IconN: BL_b_N.xpm
	IconS: BL_b_S.xpm
	Action: stop

Aspect: free
	IconE: BL_d_E.xpm
	IconW: BL_d_W.xpm
	IconN: BL_d_N.xpm
	IconS: BL_d_S.xpm
	Action: stop

Aspect: oriented
	IconE: BL_w_E.xpm
	IconW: BL_w_W.xpm
	IconN: BL_w_N.xpm
	IconS: BL_w_S.xpm
	Action: stop

Aspect: locked
	IconE: BL_w_E.xpm
	IconW: BL_w_W.xpm
	IconN: BL_w_N.xpm
	IconS: BL_w_S.xpm
	Action: none

Aspect: busy
	IconE: BL_r_E.xpm
	IconW: BL_r_W.xpm
	IconN: BL_r_N.xpm
	IconS: BL_r_S.xpm
	Action: none

# initial aspect

OnInit:
	.noclickpenalty = 1
	if Signal(S1).aspect = disabled or Signal(S1).aspect = off
		.aspect = disabled
	else
		.aspect = free
	end
end

# the player or a script cleared the signal

OnCleared:
	# Il blocco si può accendere se non è occupato, ma per essere spento deve anche non essere bloccato.
	# The block can be switched on if it's not busy, but it can be disabled only when it's also not locked.
	if .aspect ! busy
		if Signal(S1).aspect = off
			Signal(S1).aspect = red
			if Signal(S1).color = black and Signal(S1).locked = 0
				Signal(S1).click = 1
			end
			if Signal(S1).aspect = red
				do update
			end
			return
		end
		if Signal(S1).aspect = disabled
			Signal(S1).aspect = green
			do update
			return
		end
		if .aspect = free or .aspect = oriented
			if Signal(S1).aspect = red
				Signal(S1).aspect = off
				do update
				return
			end
			if Signal(S1).aspect ! fault and Signal(S1).aspect ! nothing
				Signal(S1).aspect = disabled
				Signal(S1).click = 1
				if Signal(S1).aspect = disabled
					do update
				end
				return
			end
		end
	end
end

# this or another signal changed its aspect

OnUpdate:
	# Se un segnale è rosso è l'automatismo è acceso, ha un treno nella sua sezione: il blocco è occupato
	# If a signal is red and the automation is enabled, there's a train in its section: the block is busy
	if Signal(S1).aspect = red and Signal(S1).enabled = 1
		.aspect = busy
		return
	end
	# Ripetere o cancellare il blocco qui sotto in base al numero di segnali permissivi del blocco
	# Repeat or delete the block below, depending on the number of permissive signals in the block
	if Signal(S2).aspect = red and Signal(S2).enabled = 1
		.aspect = busy
		return
	end
	# Solo nel caso di segnali permissivi - Only in case of permissive signal
	# Qui non ci sono treni nel blocco, ma se un segnale che porta al blocco è aperto...
	# Here there are no trains in the block, but if a signal leading to the block is clear...
	if Signal(S1).script > "rfi_perl" and Signal(S1).script < "rfi_pern"
		# Se IB non ha la direzione di S1, inserirla al posto di Signal(S1).direction
		# If the direction of IB is not the same as S1's, replace Signal(S1).direction with it
		if Track(IB).color ! black and Track(IB).pathdir = Signal(S1).direction		# 0 = W, 1 = E, 16 = S, 17 = N
			if 	Track(IN).color = black or Track(IN).color = orange
				.aspect = busy		# Treno in arrivo: occupato - Train arriving: busy
			else
				.aspect = locked	# Train non in arrivo: bloccato - Train not arriving: locked
			end
			return
		end
	end
	# Nessun treno in vista: se un segnale del blocco è superabile, il blocco è orientato
	# No trains around: if a signal of the block is passable, the block is oriented
	if Signal(S1).aspect ! off and Signal(S1).aspect ! red
		.aspect = oriented
		return
	end
	# Ripetere o cancellare il blocco qui sotto in base al numero di segnali permissivi del blocco
	# Repeat or delete the block below, depending on the number of permissive signals in the block
	if Signal(S2).aspect ! off and Signal(S2).aspect ! red
		.aspect = oriented
		return
	end
	# Qui non ci sono treni nel blocco e tutti i segnali sono rossi (blocco libero) o spenti (blocco spento)
	# Here there are no trains in the block and all the signals are red (block is free) or disabled (block is off)
	if Signal(S1).aspect = off
		.aspect = disabled
	else
		.aspect = free
	end
end
