Editor/Road/ArchRoadAttachmentService.cs

Editor-side service for an ArchRoadPart that queries attached bridge and tunnel parts. Provides methods to find a bridge or tunnel covering a given distance and to enumerate the station positions (From and To) of valid bridges and tunnels.

using System;
using System.Collections.Generic;
using Sandbox;

namespace Sunless.Architecture;

public sealed class ArchRoadAttachmentService
{
	readonly ArchRoadPart road;

	public ArchRoadAttachmentService( ArchRoadPart road )
	{
		this.road = road;
	}

	public ArchBridgePart BridgeAt( float distance )
	{
		foreach ( var bridge in road.Bridges )
		{
			if ( bridge.Length >= ArchBridge.ShortestSpan && bridge.Carries( distance ) )
			{
				return bridge;
			}
		}

		return null;
	}

	public ArchTunnelPart TunnelAt( float distance )
	{
		foreach ( var tunnel in road.Tunnels )
		{
			if ( tunnel.Length >= ArchTunnel.ShortestBore && tunnel.Carries( distance ) )
			{
				return tunnel;
			}
		}

		return null;
	}

	public IEnumerable<float> BridgeStations()
	{
		foreach ( var bridge in road.Bridges )
		{
			if ( bridge.Length < ArchBridge.ShortestSpan )
			{
				continue;
			}

			yield return bridge.From;
			yield return bridge.To;
		}
	}

	public IEnumerable<float> TunnelStations()
	{
		foreach ( var tunnel in road.Tunnels )
		{
			if ( tunnel.Length < ArchTunnel.ShortestBore )
			{
				continue;
			}

			yield return tunnel.From;
			yield return tunnel.To;
		}
	}
}