72 lines
3.6 KiB
C#
72 lines
3.6 KiB
C#
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}");
|
|
}
|
|
}
|