Files
MVP1/Assets/Scripts/Modules/Economy/ResourceCollector.cs
T

72 lines
3.6 KiB
C#
Raw Normal View History

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<ResourceCollector> 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}");
}
}