- Ядро (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>
100 lines
3.2 KiB
C#
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}");
|
|
}
|
|
} |