Files
AlexanderandClaude Opus 5.5 964cb23d9d Модульная система: игровое ядро + 6 модулей, документы Docs/Modules
- Ядро (Bogatyri.Core): контракты модулей, EventBus, GameServices, SaveRegistry
- Модули: Экономика, Поселение, Армия, Глобальный мир, Боевая система, Сохранения
  (каждый — отдельный asmdef, видит только ядро)
- App/GameModules: регистрация модулей и связь с GameProgress/Казармами
- Сохранения v2 по секциям модулей, перенос старого save.json и походов из progress.json
- Сброс сохранений: ISaveSystem.ResetAll, ResetState у модулей, меню Tools
- EditMode-тесты модулей, документы по каждому модулю с журналом изменений

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:39:28 +02:00

100 lines
3.2 KiB
C#

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