NHSE/NHSE.Core/Structures/Map/Managers/RoomManager.cs
Kurt b88c518d5c
Update FieldItemEditor for 3.0.0 (#716)
Updates the Field Item Editor to render layers based on the entire map, and the per-patch positioning of each layer.
Import/export will gracefully handle upgrade/downgrade, and viewport import/export will gracefully update tiles rather than a per-acre basis.

Performance has also been slightly improved; no allocation is done anymore when updating the image.
2026-01-25 16:55:38 -06:00

61 lines
1.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace NHSE.Core;
public sealed class RoomManager
{
public readonly LayerRoomItem[] Layers;
public readonly IPlayerRoom Room;
/// <summary>
/// <see cref="RoomLayerSurface"/>
/// </summary>
private const int LayerCount = 8;
public RoomManager(IPlayerRoom room)
{
Layers = room.GetItemLayers();
Room = room;
Debug.Assert(Layers.Length == LayerCount);
}
public void Save() => Room.SetItemLayers(Layers);
public bool IsOccupied(RoomLayerSurface layer, int x, int y)
{
if ((uint)layer >= LayerCount)
throw new ArgumentOutOfRangeException(nameof(layer));
var l = Layers[(int)layer];
var tile = l.GetTile(x, y);
return !tile.IsNone || (layer == RoomLayerSurface.FloorSupported && IsOccupied(RoomLayerSurface.Floor, x, y));
}
public List<string> GetUnsupportedTiles()
{
var lBase = Layers[(int)RoomLayerSurface.Floor];
var lSupport = Layers[(int)RoomLayerSurface.FloorSupported];
var result = new List<string>();
var (width, height) = lBase.TileInfo.DimTotal;
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
var tile = lSupport.GetTile(x, y);
if (tile.IsNone)
continue;
var support = lBase.GetTile(x, y);
if (!support.IsNone)
continue; // dunno how to check if the tile can actually have an item put on top of it...
result.Add($"{x:000},{y:000}");
}
}
return result;
}
}