89 lines
4.2 KiB
C#
89 lines
4.2 KiB
C#
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>();
|
||
|
||
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();
|
||
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 };
|
||
}
|
||
} |