/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Units/WizardUnit.cs
87 строк
3 KB
Zakhar Romashov
Добавлен функционал для Демо 3
26 апр 2026, 18:46
26 апр 2026, 18:46
5bd1cee
Код
Авторство
О чём код?
using System; namespace ArmyBattleGame { class WizardUnit : BaseUnit, ISpecialAbility { public const int MinRange = 1; public const int MaxRange = 6; public const double MinCloneChance = 0.10; public const double MaxCloneChance = 0.40; public int Range { get; } public double CloneChance { get; } private readonly Random _rnd = new Random(); public static double MinCost => 60 + 8 * 2 + 20 * 0.5 + 0.10 * 200 + 1 * 5; public static WizardUnit CreateRandom(Random rnd) { int range = rnd.Next(MinRange, MaxRange + 1); double cloneChance = Math.Round(rnd.NextDouble() * (MaxCloneChance - MinCloneChance) + MinCloneChance, 2); return new WizardUnit(range, cloneChance); } public WizardUnit(int range, double cloneChance) { if (range < MinRange || range > MaxRange) throw new ArgumentOutOfRangeException(nameof(range), $"Range должен быть от {MinRange} до {MaxRange}"); if (cloneChance < MinCloneChance || cloneChance > MaxCloneChance) throw new ArgumentOutOfRangeException(nameof(cloneChance), $"CloneChance должен быть от {MinCloneChance} до {MaxCloneChance}"); SetHealth(60); Damage = 8; Shield = 20; Range = range; CloneChance = cloneChance; Cost = CalculateCost() + CloneChance * 200 + Range * 5; } public void UseSpecial(BattleContext ctx, UnitPosition attackerPos) { if (!IsAlive) return; IUnit? source = null; UnitPosition sourcePos = default; foreach (var (candidate, pos) in ctx.Strategy.GetForwardAllies(ctx.OwnArmy, attackerPos, Range)) { if (candidate is ICanBeCloned) { source = candidate; sourcePos = pos; break; } } if (source == null) { ctx.Logger.LogCloneNone(this, attackerPos.Row); return; } if (_rnd.NextDouble() >= CloneChance) { ctx.Logger.LogCloneFailed(this, attackerPos.Row, source, sourcePos.Row); return; } IUnit cloned = ((ICanBeCloned)source).Clone(); cloned.ArmyId = ArmyId; var placed = ctx.Strategy.PlaceClone(ctx.OwnArmy, attackerPos, cloned); if (placed == null) { ctx.Logger.LogCloneNone(this, attackerPos.Row); return; } ctx.Logger.LogClone(this, attackerPos.Row, source, sourcePos.Row, cloned); } } }