Editor/Walkway/ArchWalkwaySupportService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Sandbox;

namespace Sunless.Architecture;


sealed class ArchWalkwaySupportService {
	public const string PartName = "WalkwayPiers";

	readonly ArchPlan plan;
	readonly ArchBuilding building;
	readonly ArchRoom room;
	readonly ArchKit kit;

	public ArchWalkwaySupportService( ArchPlan plan, ArchBuilding building, ArchRoom room, ArchKit kit ) {
		this.plan = plan;
		this.building = building;
		this.room = room;
		this.kit = kit;
	}

	public void AddPiers( ArchPillarPart source, Vector2 min, Vector2 max, bool alongX ) {
		if ( source is null || !ArchWalkway.Raised( room, kit ) ) {
			return;
		}

		var part = source.Section();
		var grade = kit.GroundClearance - ArchAsks.Lift( plan, building, kit );
		var inset = MathF.Max( 3f, part.Seat );
		var run = MathF.Max( 1f, (alongX ? max.x - min.x : max.y - min.y) - inset * 2f );
		var across = alongX ? max.y - min.y : max.x - min.x;
		var bay = MathF.Max( 48f, alongX ? part.Spacing.x : part.Spacing.y );
		var rows = ArchDivide.AtMost( run, bay );
		var gauge = MathF.Max( inset, across - inset * 2f );

		part.Id = plan.AllocateId();
		part.Name = PartName;
		part.BaseHeight = grade;
		part.Height = ArchLap.Bury( kit, room.BaseHeight - kit.FloorThickness, -1f ) - grade;
		part.Placement = PillarPlacement.Grid;
		part.Origin = new Vector2( min.x + inset, min.y + inset );
		part.Yaw = 0f;
		part.Spacing = alongX ? new Vector2( rows.Step, gauge ) : new Vector2( gauge, rows.Step );
		part.CountX = alongX ? rows.Count + 1 : 2;
		part.CountY = alongX ? 2 : rows.Count + 1;
		part.SpanAlongX = true;
		part.SpanAlongY = true;
		part.PerimeterOnly = true;

		plan.File( ArchKind.Pillar, room, part );
	}
}