using System.Collections.Generic; using UnityEngine; // ГОСПИТАЛЬ -- здание для лечения раненых (регламент 31.10; решения по 8 вопросам Саши от 31.10, п. 7). // - Даёт места для лечения: уровни I-V, 20-60 мест (таблица HospitalConfig, ТЕСТ). // - Считаются самые прокачанные госпитали: второй госпиталь мест не добавляет (регламент про несколько не говорит). // - Раненых хранит и лечит модуль Армии; здание только сообщает число мест через контракт IHospital (HospitalBeds). // - Тап открывает окно госпиталя (App/BuildingWindow): места, кто лечится и ждёт, улучшение. // - Уровень сохраняет модуль Поселения (ILeveledBuilding). // Вешается на копию обычного здания (HospitalBootstrap). public class Hospital : MonoBehaviour, ILeveledBuilding { public static readonly List All = new List(); public static int Count => All.Count; public int level = 1; public int Level { get => level; set => level = Mathf.Clamp(value, 1, MaxBuildLevel); } // Уровней у госпиталя столько, сколько строк мест в таблице (регламент: I-V) public static int MaxBuildLevel => Mathf.Max(1, HospitalConfig.Load().bedsByLevel.Length); // Уровень самого прокачанного госпиталя (0 -- госпиталя нет) public static int MaxLevel { get { int m = 0; foreach (var h in All) if (h != null && h.level > m) m = h.level; return m; } } // Мест на уровне (1..5) по таблице public static int BedsAt(int lvl) { var beds = HospitalConfig.Load().bedsByLevel; if (lvl <= 0 || beds == null || beds.Length == 0) return 0; return Mathf.Max(0, beds[Mathf.Min(lvl, beds.Length) - 1]); } void OnEnable() { if (!All.Contains(this)) All.Add(this); } void OnDisable() { All.Remove(this); } Vector3 downPos; void OnMouseDown() { downPos = Input.mousePosition; } // Тап (а не перетаскивание камеры) -- окно госпиталя void OnMouseUpAsButton() { if (UIBlocker.IsPointerOverUI()) return; if ((Input.mousePosition - downPos).magnitude > 25f) return; BuildingWindow.Open(gameObject); } } // Места госпиталя для модуля Армии (контракт IHospital). Регистрирует App/GameModules. // Госпиталя нет -- 0 мест: Армия берёт HospitalConfig.temporaryBeds. public sealed class HospitalBeds : IHospital { public int Beds => Hospital.BedsAt(Hospital.MaxLevel); }