Editor/Road/ArchFenceManifest.cs

Editor manifest for fence parts in the architecture tool. It defines kind, slot, hosts, domain, label, icon, subtool, rank and stage, and implements normalization that converts legacy fence Path data into Nodes.

File Access
using System;
using System.Collections.Generic;
using System.Linq;
using Sandbox;

namespace Sunless.Architecture;

public sealed class ArchFenceManifest : ArchKindManifest<ArchFencePart>, IArchNormalizes
{
	public override ArchKind Kind => ArchKind.Fence;

	public override string Slot => "Fences";

	public override IEnumerable<Type> Hosts => new[] { typeof( ArchBuilding ) };

	// A fence rings a yard rather than a street, so it belongs to Buildings however much it reads as infrastructure.
	public override ArchLayerDomain Domain => ArchLayerDomain.Buildings;

	public override string Label => "Fence";

	public override string Glyph => ArchIcons.Get( "subtool_fence", "fence" );

	public override string Subtool => ArchSubtools.Fence;

	public override int DirectRank => 13;

	public override ArchLayerStage Stage( object payload ) => ArchLayerStage.Structure;

	// Plans saved before fences carried a curve - lift the old path onto nodes once.
	public void Normalize( ArchPlan plan )
	{
		if ( plan is null )
		{
			return;
		}

		foreach ( var building in plan.Buildings )
		{
			foreach ( var fence in building.Fences.Where( entry => entry.Path.Count >= 2 && entry.Nodes.Count == 0 ) )
			{
				fence.Nodes = fence.Path.Select( ArchCurveNode.At ).ToList();
				fence.Path = new List<Vector3>();
			}
		}
	}
}