61 lines
2.9 KiB
C#
61 lines
2.9 KiB
C#
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<Hospital> All = new List<Hospital>();
|
||
|
|
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);
|
||
|
|
}
|