Editor/Wall/ArchWallManifest.cs

Editor manifest class that describes the Wall archetype for the editor. It specifies metadata like kind, slot, host types, label, icon glyph, subtool, available children kinds, ordering rank, layer stage, and provides name and display name formatting for ArchWall instances.

Reflection
using System;
using System.Collections.Generic;

namespace Sunless.Architecture;

public sealed class ArchWallManifest : ArchKindManifest<ArchWall>
{
	public override ArchKind Kind => ArchKind.Wall;

	public override string Slot => "Walls";

	// A partition stands on a floor and a parapet stands on a deck, so one wall has two homes and every
	// lookup has to try both - which is the whole reason ArchPlan.AllWalls exists.
	public override IEnumerable<Type> Hosts => new[] { typeof( ArchRoom ), typeof( ArchRoofPart ) };

	public override string Label => "Wall";

	public override string Glyph => ArchIcons.Get( "subtool_wall", "wallpaper" );

	public override string Subtool => ArchSubtools.Wall;

	public override string HostOutput => "Wall run and faces";

	public override IEnumerable<ArchKind> Children => new[] { ArchKind.Opening, ArchKind.WallMod };

	public override int IndirectRank => 100;

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

	public override string NameOf( object payload, int id )
	{
		return payload is ArchWall wall ? $"Wall {wall.Id}" : base.NameOf( payload, id );
	}

	// Named by the face it turns outward, because a room's four walls are otherwise four identical rows.
	public override string DisplayName( object payload )
	{
		if ( payload is not ArchWall wall )
		{
			return null;
		}

		var outward = -wall.Normal;
		var side = MathF.Abs( outward.x ) > MathF.Abs( outward.y )
			? outward.x > 0f ? "East" : "West"
			: outward.y > 0f ? "North" : "South";

		return $"{side} Wall {wall.Id}";
	}
}