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 Rooms = new List(); public readonly Dictionary Depth = new Dictionary(); public Room Start; // стартовая комната (вход с предыдущего этажа) public Room Lift; // комната с лифтом (выход на следующий этаж) // ---------- Выборки ---------- public IEnumerable Corridors => Rooms.Where(r => r.rt == RoomType.Corridor); // Всё, кроме коридоров (старт, лифт и обычные комнаты) public IEnumerable PlayableRooms => Rooms.Where(r => r.rt != RoomType.Corridor); // Комнаты, которым ещё не назначена роль public IEnumerable UnassignedRooms => Rooms.Where(r => r.rt == RoomType.Undefined); public IEnumerable 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(); 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 }; } }