/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Units/BuffedHeavyUnit.cs
88 строк
3 KB
Zakhar Romashov
Правки по третьему демо
28 май 2026, 23:16
28 май 2026, 23:16
b78d24c
Код
Авторство
О чём код?
using System; using System.Collections.Generic; namespace ArmyBattleGame { // Композиция декораторов снаряжения поверх HeavyUnit: базовые статы + сумма баффов. sealed class BuffedHeavyUnit : IUnit { public const double BuffStripChance = 0.50; private readonly HeavyUnit _core; private readonly List<SquireBuffKind> _buffs; public BuffedHeavyUnit(HeavyUnit core, SquireBuffKind first) { _core = core; _buffs = new List<SquireBuffKind> { first }; } public BuffedHeavyUnit(HeavyUnit core, IEnumerable<SquireBuffKind> buffs) { _core = core; _buffs = new List<SquireBuffKind>(buffs); } public HeavyUnit Core => _core; public IReadOnlyList<SquireBuffKind> Buffs => _buffs; private void RecomputeBonuses(out int sh, out double dmg) => SquireBuffDecorationFactory.SumBonuses(_buffs, out sh, out dmg); public double Damage { get { RecomputeBonuses(out _, out var dmg); return _core.Damage + dmg; } } public int Shield { get { RecomputeBonuses(out var sh, out _); return _core.Shield + sh; } } public double Health { get => _core.Health; set => _core.Health = value; } public double MaxHealth => _core.MaxHealth; public double Cost => _core.Cost; public int ArmyId { get => _core.ArmyId; set => _core.ArmyId = value; } public bool IsAlive => _core.IsAlive; public string DisplayName => _buffs.Count > 0 ? $"{((IUnit)_core).DisplayName}+" : ((IUnit)_core).DisplayName; public void Hit(IUnit target, IBattleLogger logger) => _core.Hit(target, logger); public void Heal(double amount) => _core.Heal(amount); public void TakeDamage(double effectiveDamage, IBattleLogger logger) { _core.TakeDamage(effectiveDamage, logger); if (_buffs.Count == 0 || Random.Shared.NextDouble() >= BuffStripChance) return; int i = Random.Shared.Next(_buffs.Count); var removed = _buffs[i]; _buffs.RemoveAt(i); logger.LogBuffStripped(this, removed); } public bool TryAddBuff(SquireBuffKind kind) { if (_buffs.Count >= 4 || _buffs.Contains(kind)) return false; _buffs.Add(kind); return true; } public static bool IsEligibleHeavy(IUnit u) => u is HeavyUnit || u is BuffedHeavyUnit; } }