/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Units/ArcherUnit.cs
73 строки
2 KB
Zakhar Romashov
Добавлен функционал для Демо 3
26 апр 2026, 18:46
26 апр 2026, 18:46
5bd1cee
Код
Авторство
О чём код?
using System; using System.Linq; namespace ArmyBattleGame { class ArcherUnit : BaseUnit, ISpecialAbility, ICanBeHealed, ICanBeCloned { public const int MinRange = 1; public const int MaxRange = 6; public const int MinPower = 15; public const int MaxPower = 50; public int Range { get; } public double Power { get; } public static double MinCost => 90 + 15 * 2 + 10 * 0.5 + 15 * 1.5 + 1 * 5; public static ArcherUnit CreateRandom(Random rnd) { int range = rnd.Next(MinRange, MaxRange + 1); double power = rnd.Next(MinPower, MaxPower + 1); return new ArcherUnit(range, power); } public ArcherUnit(int range, double power) { if (range < MinRange || range > MaxRange) throw new ArgumentOutOfRangeException(nameof(range), $"Range должен быть от {MinRange} до {MaxRange}"); if (power < MinPower || power > MaxPower) throw new ArgumentOutOfRangeException(nameof(power), $"Power должен быть от {MinPower} до {MaxPower}"); SetHealth(90); Damage = 15; Shield = 10; Range = range; Power = power; Cost = CalculateCost() + Power * 1.5 + Range * 5; } public IUnit Clone() { var clone = new ArcherUnit(Range, Power); clone.Health = Health; return clone; } public void UseSpecial(BattleContext ctx, UnitPosition attackerPos) { if (!IsAlive) return; if (!ctx.EnemyArmy.HasAliveUnits) return; var candidates = ctx.Strategy.GetEnemyTargets(ctx.OwnArmy, ctx.EnemyArmy, attackerPos, Range).ToList(); if (candidates.Count == 0) { ctx.Logger.LogOutOfRange(this, attackerPos.Row, Range); return; } var (target, targetPos) = candidates[0]; double effectiveDamage = Power * 100 / (100 + target.Shield); target.TakeDamage(effectiveDamage, ctx.Logger); ctx.Logger.LogArrowShot(this, attackerPos.Row, target, targetPos.Row, effectiveDamage); if (!target.IsAlive) ctx.Logger.LogDeath(target); } } }