Souljack/Assets/_Project/Scripts/LevelGenerating/FloorData.cs

93 lines
4.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using System.Linq;
namespace _Project.Scripts.LevelGenerating
{
public enum FloorKind
{
Generated, // обычный этаж: раскладка -> роли -> стены -> наполнение
Special // готовая локация (крыша с боссом), собрана вручную, генератор не нужен
}
// =====================================================================
// Данные ОДНОГО этажа. Заменяет статический LevelManager.Rooms.
// Все координаты и размеры комнат - в МОДУЛЯХ (1 модуль = 0.5 м), см. LevelGrid.
//
// НЕ ЗАБЫТЬ:
// - Для сохранения в файл этот класс НЕ годится напрямую: Room использует свойства,
// которые JsonUtility не сериализует. Для диска нужны отдельные структуры (FloorSave)
// с публичными полями, а FloorData остаётся рабочим объектом генерации.
// - Parent / CorridorOf живут в WallsGenerator (нужны только при генерации раскладки).
// =====================================================================
public class FloorData
{
public int Index; // номер этажа (0-based)
public FloorKind Kind;
public int Seed; // пока не используется (сид "пох"), поле на будущее
public string SpecialId; // для Special: id префаба локации, например "BossRoof"
public int SizeModules; // сторона карты этажа в модулях (для Generated)
public readonly List<Room> Rooms = new List<Room>();
public readonly Dictionary<Room, int> Depth = new Dictionary<Room, int>();
// Отрезки стен (заполняет ShellBuilder.Build)
public readonly List<WallRun> Walls = new List<WallRun>();
public Room Start; // стартовая комната (вход с предыдущего этажа)
public Room Lift; // комната с лифтом (выход на следующий этаж)
// ---------- Выборки ----------
public IEnumerable<Room> Corridors => Rooms.Where(r => r.rt == RoomType.Corridor);
// Всё, кроме коридоров (старт, лифт и обычные комнаты)
public IEnumerable<Room> PlayableRooms => Rooms.Where(r => r.rt != RoomType.Corridor);
// Комнаты, которым ещё не назначена роль
public IEnumerable<Room> UnassignedRooms => Rooms.Where(r => r.rt == RoomType.Undefined);
public IEnumerable<Room> OfType(RoomType type) => Rooms.Where(r => r.rt == type);
public int GetDepth(Room room) => Depth.TryGetValue(room, out int d) ? d : -1;
// ---------- Изменение ----------
// Добавить комнату (не коридор) вместе с глубиной
public void AddRoom(Room room, int depth)
{
Rooms.Add(room);
Depth[room] = depth;
if (room.rt == RoomType.Start) Start = room;
else if (room.rt == RoomType.Lift) Lift = room;
}
// Коридоры глубины не имеют
public void AddCorridor(Room corridor) => Rooms.Add(corridor);
public void Remove(Room room)
{
Rooms.Remove(room);
Depth.Remove(room);
if (Start == room) Start = null;
if (Lift == room) Lift = null;
}
public void Clear()
{
Rooms.Clear();
Depth.Clear();
Walls.Clear();
Start = null;
Lift = null;
}
// ---------- Фабрики ----------
public static FloorData CreateGenerated(int index, int sizeModules) =>
new FloorData { Index = index, Kind = FloorKind.Generated, SizeModules = sizeModules };
public static FloorData CreateSpecial(int index, string specialId) =>
new FloorData { Index = index, Kind = FloorKind.Special, SpecialId = specialId };
}
}