using System; using UnityEngine; // МОДУЛЬ ЭКОНОМИКИ: здание-рабочее место (этап 3). Висит на всех добывающих зданиях (префабы Лес, Еда, Камень...). // // Раньше это был кликер (тап -- забрать накопленное). Теперь ресурс производят люди: // здание только даёт места для рабочих и эффективность уровня, а добычу считает ProductionService. // Имя класса оставлено старым, чтобы не перенастраивать префабы. // // resourceType = Wood/Food/Stone/Iron/Gold -- рабочее место этой профессии; // resourceType = Population -- Дом: прибавляет места к пределу жилья; // resourceType = Gems -- Кристалл: рабочих нет (синий кристалл добывается в разломах на карте мира). // // Тап по зданию открывает окно рабочих -- его рисует слой приложения (подписка на Tapped в App/GameModules). public class ResourceCollector : MonoBehaviour, ILeveledBuilding { // Тап по зданию: интерфейс откроет окно "Рабочие" (модуль про интерфейс не знает) public static event Action Tapped; // Уровень здания для Поселения (оно сохраняет уровни, не зная, что это за здание) public int Level { get => level; set => level = Mathf.Max(1, value); } [Header("Что добывают рабочие этого здания")] public ResourceType resourceType; [Header("Уровень здания (больше мест и эффективность)")] public int level = 1; [Header("Устарело (этап 3): кликер убран, поля оставлены для старых префабов")] [HideInInspector] public float amountPerClick = 10f; [HideInInspector] public float maxCapacity = 100f; [HideInInspector] public float currentStock = 0f; [HideInInspector] public float perLevelMultiplier = 1.2f; public bool IsWorkplace => WorkJobs.TryFromResource(resourceType, out _); public bool IsHouse => resourceType == ResourceType.Population; // Для полоски над зданием (BuildingUI): рабочие этой профессии / места public float GetCurrentStock() { if (!WorkJobs.TryFromResource(resourceType, out WorkJob job)) return 0f; return GameServices.TryGet(out IPopulation population) ? population.GetWorkers(job) : 0f; } public float GetMaxCapacity() { if (!WorkJobs.TryFromResource(resourceType, out WorkJob job)) return 0f; return GameServices.TryGet(out IProduction production) ? production.Slots(job) : 0f; } Vector3 downPos; void OnMouseDown() { downPos = Input.mousePosition; } // Отпустил палец на здании, почти не сдвинув (а не тащил камеру) -- окно рабочих void OnMouseUpAsButton() { if (UIBlocker.IsPointerOverUI()) return; // клик по панели HUD не должен проходить на здание под ней if ((Input.mousePosition - downPos).magnitude > 25f) return; Tapped?.Invoke(this); } public void Upgrade() { level++; Debug.Log($"[ЗДАНИЕ] {name}: уровень {level}"); } }