/
puma
/
ppa
Обзор
Документация
Войти
/
puma
/
ppa
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Models/Units/UnitBase.cs
162 строки
5 KB
Margarita
vse
28 май 2026, 22:57
28 май 2026, 22:57
75da34e
Код
Авторство
О чём код?
using Game.Models.Units.Adapters; using System.Collections.Generic; public class UnitBase : IUnit { private readonly ISpecialAbility? _specialAbility; private readonly List<IUnitEventObserver> _observers = new List<IUnitEventObserver>(); public int Id { get; private set; } = 0; public int ArmyOrder { get; private set; } = 0; public string Name { get; } public virtual int Attack { get; } public virtual int Defense { get; } public int MaxHealth { get; } public int CurrentHealth { get; private set; } public int Cost { get; } public bool IsClone { get; private set; } = false; public virtual ISpecialAbility? SpecialAbility => _specialAbility; public bool IsAlive => CurrentHealth > 0; public UnitBase(string name, int attack, int defense, int health, int cost, ISpecialAbility? specialAbility = null) { Name = name; Attack = attack; Defense = defense; MaxHealth = health; CurrentHealth = health; Cost = cost; _specialAbility = specialAbility; } public void SetId(int id) => Id = id; public void SetArmyOrder(int order) => ArmyOrder = order; public void MarkAsClone() => IsClone = true; public virtual IUnit Clone() { var clone = new UnitBase(Name, Attack, Defense, MaxHealth, Cost, CopySpecialAbility()); clone.SetCurrentHealth(CurrentHealth); clone.MarkAsClone(); return clone; } public virtual IUnit Duplicate() => new UnitBase(Name, Attack, Defense, MaxHealth, Cost, CopySpecialAbility()); protected ISpecialAbility? CopySpecialAbility() => SpecialAbility switch { ArrowAbility a => new ArrowAbility(a.Range, a.Power), HealAbility h => new HealAbility(h.Range, h.HealPower), CloneAbility c => new CloneAbility(c.Range, c.CloneProbability), SquireAbility s => new SquireAbility(s.ActivationProbability), _ => null }; public virtual int CalculateDamage() { return Attack; } public virtual void TakeDamage(int incomingDamage) { bool wasAlive = IsAlive; int healthBefore = CurrentHealth; CurrentHealth -= incomingDamage; if (CurrentHealth < 0) CurrentHealth = 0; int healthAfter = CurrentHealth; int damageTaken = healthBefore - healthAfter; // Уведомляем наблюдателей о получении урона NotifyDamageTaken(new DamageTakenEventArgs(this, damageTaken, healthBefore, healthAfter)); // Уведомляем наблюдателей о смерти (если только что произошла) if (wasAlive && !IsAlive) { NotifyUnitDeath(new UnitDeathEventArgs(this)); } } /// <summary> /// Восстановить HP юнита (для лечения) /// </summary> public virtual void Heal(int healAmount) { int newHealth = CurrentHealth + healAmount; CurrentHealth = Math.Min(newHealth, MaxHealth); } /// <summary> /// Установить текущее здоровье (для клонирования) /// </summary> public virtual void SetCurrentHealth(int newHealth) { CurrentHealth = Math.Max(0, Math.Min(newHealth, MaxHealth)); } /// <summary> /// Получить символ для визуализации армии /// </summary> public virtual char GetDisplaySymbol() => SpecialAbility switch { ArrowAbility => 'A', CloneAbility => 'W', HealAbility => 'H', _ => '?' }; public virtual string GetShortDisplayName() => SpecialAbility switch { ArrowAbility => "Archer", CloneAbility => "Wizard", HealAbility => "Healer", _ => Name }; /// <summary> /// Подписать наблюдателя на события юнита /// </summary> public void Subscribe(IUnitEventObserver observer) { if (observer != null && !_observers.Any(o => o.GetType() == observer.GetType())) _observers.Add(observer); } /// <summary> /// Отписать наблюдателя от событий юнита /// </summary> public void Unsubscribe(IUnitEventObserver observer) { if (observer != null) { _observers.Remove(observer); } } /// <summary> /// Уведомить наблюдателей о получении урона /// </summary> private void NotifyDamageTaken(DamageTakenEventArgs args) { foreach (var observer in _observers) { observer.OnDamageTaken(args); } } /// <summary> /// Уведомить наблюдателей о смерти /// </summary> private void NotifyUnitDeath(UnitDeathEventArgs args) { foreach (var observer in _observers) { observer.OnUnitDeath(args); } } }