/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Units/HealerUnit.cs
83 строки
3 KB
Zakhar Romashov
Добавлен функционал для Демо 3
26 апр 2026, 18:46
26 апр 2026, 18:46
5bd1cee
Код
Авторство
О чём код?
using System; namespace ArmyBattleGame { class HealerUnit : BaseUnit, ISpecialAbility, ICanBeHealed { public const int MinRange = 1; public const int MaxRange = 6; public const int MinHealPower = 10; public const int MaxHealPower = 50; public int Range { get; } public double HealPower { get; } public static double MinCost => 70 + 10 * 2 + 30 * 0.5 + 10 * 1.5 + 1 * 5; public static HealerUnit CreateRandom(Random rnd) { int range = rnd.Next(MinRange, MaxRange + 1); double healPower = rnd.Next(MinHealPower, MaxHealPower + 1); return new HealerUnit(range, healPower); } public HealerUnit(int range, double healPower) { if (range < MinRange || range > MaxRange) throw new ArgumentOutOfRangeException(nameof(range), $"Range должен быть от {MinRange} до {MaxRange}"); if (healPower < MinHealPower || healPower > MaxHealPower) throw new ArgumentOutOfRangeException(nameof(healPower), $"HealPower должен быть от {MinHealPower} до {MaxHealPower}"); SetHealth(70); Damage = 10; Shield = 30; Range = range; HealPower = healPower; Cost = CalculateCost() + HealPower * 1.5 + Range * 5; } public void UseSpecial(BattleContext ctx, UnitPosition attackerPos) { if (!IsAlive) return; IUnit? bestTarget = null; UnitPosition bestPos = default; double worstRatio = double.MaxValue; foreach (var (candidate, pos) in ctx.Strategy.GetForwardAllies(ctx.OwnArmy, attackerPos, Range)) { if (candidate is not ICanBeHealed) continue; double ratio = candidate.Health / candidate.MaxHealth; if (ratio < worstRatio) { worstRatio = ratio; bestTarget = candidate; bestPos = pos; } } if (bestTarget == null) { ctx.Logger.LogNoHealTarget(this, attackerPos.Row); return; } double room = bestTarget.MaxHealth - bestTarget.Health; double healedAmount = Math.Min(HealPower, room); if (room <= 0 || healedAmount <= 0) { ctx.Logger.LogHealTargetAlreadyFull(this, attackerPos.Row, bestTarget, bestPos.Row); return; } ((ICanBeHealed)bestTarget).Heal(HealPower); ctx.Logger.LogHeal(this, attackerPos.Row, bestTarget, bestPos.Row, healedAmount); } } }