2026-09-03 00:49:31 +03:00
|
|
|
using UnityEngine;
|
|
|
|
|
|
2026-10-19 18:39:28 +02:00
|
|
|
// Модуль Экономики: временная добыча по клику (уйдёт в этапе 3 -- производство через рабочих).
|
|
|
|
|
public class ResourceCollector : MonoBehaviour, ILeveledBuilding
|
2026-09-03 00:49:31 +03:00
|
|
|
{
|
2026-10-19 18:39:28 +02:00
|
|
|
// Уровень здания для Поселения (оно сохраняет уровни, не зная, что это за здание)
|
|
|
|
|
public int Level { get => level; set => level = value; }
|
|
|
|
|
|
2026-09-03 00:49:31 +03:00
|
|
|
[Header("Что производит это здание")]
|
|
|
|
|
public ResourceType resourceType;
|
2026-09-05 16:39:40 +03:00
|
|
|
|
2026-09-03 00:49:31 +03:00
|
|
|
[Tooltip("База награды за клик (используется для расчета множителя уровня)")]
|
|
|
|
|
public float amountPerClick = 10f;
|
|
|
|
|
|
|
|
|
|
[Header("Параметры хранилища")]
|
|
|
|
|
[Tooltip("Максимальная вместимость")]
|
|
|
|
|
public float maxCapacity = 100f;
|
2026-09-05 16:39:40 +03:00
|
|
|
|
2026-09-03 00:49:31 +03:00
|
|
|
[Tooltip("Текущий запас (меняется автоматически)")]
|
|
|
|
|
public float currentStock = 0f;
|
|
|
|
|
|
|
|
|
|
[Header("Уровень здания")]
|
|
|
|
|
public int level = 1;
|
|
|
|
|
public float perLevelMultiplier = 1.2f;
|
|
|
|
|
|
|
|
|
|
private ResourceManager _manager;
|
|
|
|
|
private bool isRecharging = false;
|
|
|
|
|
|
|
|
|
|
void Awake()
|
|
|
|
|
{
|
|
|
|
|
_manager = ResourceManager.Instance;
|
|
|
|
|
if (_manager == null)
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError($"{gameObject.name}: ResourceManager не найден!");
|
|
|
|
|
enabled = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
2026-09-05 16:39:40 +03:00
|
|
|
currentStock = 0f;
|
2026-09-03 00:49:31 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public float GetCurrentStock()
|
|
|
|
|
{
|
|
|
|
|
return currentStock;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public float GetMaxCapacity()
|
|
|
|
|
{
|
|
|
|
|
return maxCapacity;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OnMouseDown()
|
|
|
|
|
{
|
2026-10-12 23:54:03 +03:00
|
|
|
if (UIBlocker.IsPointerOverUI()) return; // клик по панели HUD не должен собирать ресурс под ней
|
2026-09-05 16:39:40 +03:00
|
|
|
if (isRecharging)
|
2026-09-03 00:49:31 +03:00
|
|
|
{
|
2026-09-05 16:39:40 +03:00
|
|
|
Debug.Log($"[КЛИК] {gameObject.name}: уже идёт восстановление, ждём.");
|
2026-09-03 00:49:31 +03:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2026-09-05 16:39:40 +03:00
|
|
|
if (currentStock > 0)
|
2026-09-03 00:49:31 +03:00
|
|
|
{
|
2026-09-05 16:39:40 +03:00
|
|
|
float reward = currentStock; // берём всё, что накопилось
|
|
|
|
|
_manager.AddResource(resourceType, reward);
|
|
|
|
|
|
|
|
|
|
currentStock = 0f;
|
|
|
|
|
Debug.Log($"[СБОР] Получено {reward:F1} {resourceType}. Запас сброшен в 0.");
|
|
|
|
|
|
|
|
|
|
StartCoroutine(RechargeRoutine());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Debug.Log($"[КЛИК] {gameObject.name} пуст, запускаем восстановление.");
|
2026-09-03 00:49:31 +03:00
|
|
|
StartCoroutine(RechargeRoutine());
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-09-03 00:49:31 +03:00
|
|
|
|
|
|
|
|
System.Collections.IEnumerator RechargeRoutine()
|
|
|
|
|
{
|
|
|
|
|
if (isRecharging) yield break;
|
|
|
|
|
isRecharging = true;
|
|
|
|
|
|
2026-09-05 16:39:40 +03:00
|
|
|
float rechargeRate = 5f; // единиц в секунду
|
|
|
|
|
|
2026-09-03 00:49:31 +03:00
|
|
|
while (currentStock < maxCapacity)
|
|
|
|
|
{
|
|
|
|
|
currentStock += rechargeRate * Time.deltaTime;
|
|
|
|
|
if (currentStock > maxCapacity) currentStock = maxCapacity;
|
|
|
|
|
yield return null;
|
|
|
|
|
}
|
2026-09-05 16:39:40 +03:00
|
|
|
|
2026-09-03 00:49:31 +03:00
|
|
|
isRecharging = false;
|
|
|
|
|
Debug.Log($"[ГОТОВО] {gameObject.name} полностью заполнен!");
|
|
|
|
|
}
|
2026-09-05 14:10:05 +03:00
|
|
|
|
2026-09-03 00:49:31 +03:00
|
|
|
public void Upgrade()
|
|
|
|
|
{
|
|
|
|
|
level++;
|
|
|
|
|
Debug.Log($"[АПГРЕЙД] Уровень {level}");
|
|
|
|
|
}
|
|
|
|
|
}
|