34 lines
1.6 KiB
C#
34 lines
1.6 KiB
C#
using UnityEngine;
|
|
|
|
// Защита ресурсов от грабежа (контракт IResourceProtection, 01.11, ТЕСТ).
|
|
// Часть запаса прячут Склады и Амбары: EconomyConfig, раздел "Защита ресурсов". Уровни зданий сообщает
|
|
// App/CitySync; на карте мира, где города нет, действуют последние известные уровни.
|
|
public sealed class ResourceProtection : IResourceProtection
|
|
{
|
|
public static int WarehouseLevels { get; private set; }
|
|
public static int GranaryLevels { get; private set; }
|
|
|
|
public static void SetLevels(int warehouseLevels, int granaryLevels)
|
|
{
|
|
WarehouseLevels = Mathf.Max(0, warehouseLevels);
|
|
GranaryLevels = Mathf.Max(0, granaryLevels);
|
|
}
|
|
|
|
public float Protected(ResourceType type)
|
|
{
|
|
return EconomyConfig.Load().GetProtected(type, WarehouseLevels, GranaryLevels);
|
|
}
|
|
|
|
public float Lootable(ResourceType type) => Lootable(type, false);
|
|
|
|
// Кристаллы: без «Грабежа» -- 0; с ним -- не больше доли запаса (EconomyConfig, ТЕСТ, точные ограничения -- позже)
|
|
public float Lootable(ResourceType type, bool attackerHasPlunder)
|
|
{
|
|
if (!GameServices.TryGet(out IEconomy economy)) return 0f;
|
|
float have = Mathf.Max(0f, economy.Get(type));
|
|
if (type == ResourceType.Gems)
|
|
return attackerHasPlunder ? Mathf.Floor(have * Mathf.Clamp01(EconomyConfig.Load().protection.plunderGemsShare)) : 0f;
|
|
return Mathf.Max(0f, have - Protected(type));
|
|
}
|
|
}
|