66 lines
3.5 KiB
C#
66 lines
3.5 KiB
C#
using UnityEngine;
|
|||
|
|
|
||
|
|
// Добавляет «Госпиталь» в список стройки САМ при запуске сцены (как Казармы -- BarracksBootstrap).
|
||
|
|
// Срабатывает до восстановления зданий из сохранения (SettlementRestoringEvent), поэтому построенный
|
||
|
|
// госпиталь и его уровень корректно восстанавливаются из save.json.
|
||
|
|
public static class HospitalBootstrap
|
||
|
|
{
|
||
|
|
public const string HospitalName = "Госпиталь";
|
||
|
|
static GameObject runtimeTemplate;
|
||
|
|
|
||
|
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
|
||
|
|
static void Init()
|
||
|
|
{
|
||
|
|
Ensure();
|
||
|
|
// при каждом новом входе в город (например, возврат с карты мира) -- снова добавить в новый BuildManager
|
||
|
|
UnityEngine.SceneManagement.SceneManager.sceneLoaded += (s, m) => Ensure();
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void Ensure()
|
||
|
|
{
|
||
|
|
var bm = BuildManager.Instance != null ? BuildManager.Instance : Object.FindAnyObjectByType<BuildManager>();
|
||
|
|
if (bm == null || bm.allBuildings == null) return;
|
||
|
|
|
||
|
|
BuildingData template = null;
|
||
|
|
foreach (var b in bm.allBuildings)
|
||
|
|
{
|
||
|
|
if (b == null) continue;
|
||
|
|
if (b.buildingName == HospitalName) return; // уже есть
|
||
|
|
if (template == null && b.prefab != null) template = b;
|
||
|
|
}
|
||
|
|
if (template == null) { Debug.LogWarning("[ГОСПИТАЛЬ] Нет ни одного здания-шаблона в BuildManager"); return; }
|
||
|
|
|
||
|
|
// Префаб-шаблон в памяти: копия обычного здания без сбора ресурсов, с компонентом Hospital
|
||
|
|
if (runtimeTemplate == null)
|
||
|
|
{
|
||
|
|
runtimeTemplate = Object.Instantiate(template.prefab);
|
||
|
|
runtimeTemplate.name = "Hospital";
|
||
|
|
runtimeTemplate.SetActive(false);
|
||
|
|
Object.DontDestroyOnLoad(runtimeTemplate);
|
||
|
|
foreach (var c in runtimeTemplate.GetComponents<ResourceCollector>()) Object.DestroyImmediate(c);
|
||
|
|
foreach (var c in runtimeTemplate.GetComponents<ResourceProducer>()) Object.DestroyImmediate(c);
|
||
|
|
foreach (var c in runtimeTemplate.GetComponents<BuildingUI>()) Object.DestroyImmediate(c);
|
||
|
|
for (int i = runtimeTemplate.transform.childCount - 1; i >= 0; i--)
|
||
|
|
Object.DestroyImmediate(runtimeTemplate.transform.GetChild(i).gameObject); // полоска запаса ресурса
|
||
|
|
var sr = runtimeTemplate.GetComponent<SpriteRenderer>();
|
||
|
|
if (sr != null) sr.color = new Color(0.85f, 0.95f, 1f); // пока нет арта -- отличаем цветом (светло-голубой)
|
||
|
|
runtimeTemplate.AddComponent<Hospital>();
|
||
|
|
}
|
||
|
|
|
||
|
|
var config = HospitalConfig.Load();
|
||
|
|
var data = ScriptableObject.CreateInstance<BuildingData>();
|
||
|
|
data.name = "Data_Hospital_Runtime";
|
||
|
|
data.buildingName = HospitalName;
|
||
|
|
data.icon = template.icon;
|
||
|
|
data.prefab = runtimeTemplate;
|
||
|
|
data.requiredTownHallLevel = Mathf.Max(1, config.requiredTownHallLevel);
|
||
|
|
data.cost = new[]
|
||
|
|
{
|
||
|
|
new ResourceCost { type = ResourceType.Wood, amount = config.buildWood },
|
||
|
|
new ResourceCost { type = ResourceType.Stone, amount = config.buildStone },
|
||
|
|
};
|
||
|
|
bm.allBuildings.Add(data);
|
||
|
|
Debug.Log("[ГОСПИТАЛЬ] Добавлен в список стройки");
|
||
|
|
}
|
||
|
|
}
|