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 );
}
}