/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Core/Strategies/FormationStrategyBase.cs
58 строк
3 KB
Zakhar Romashov
Добавили логику с бафами
29 апр 2026, 13:06
29 апр 2026, 13:06
7623dfb
Код
Авторство
О чём код?
using System.Collections.Generic; namespace ArmyBattleGame { // Общая база для стратегий: типичная реализация Rebuild и applyDamageWave. abstract class FormationStrategyBase : IFormationStrategy { public abstract string Name { get; } public abstract string DisplayName { get; } public abstract int ColumnCountFor(int unitCount); public virtual void Rebuild(Army army) { var flat = army.Flatten(); int cols = ColumnCountFor(flat.Count); army.RebuildFromFlat(flat, cols); } public abstract void ExecuteMeleePhase(BattleField field, IBattleLogger logger); public abstract void ExecuteSpecialsPhase(BattleField field, IBattleLogger logger); public abstract bool CanUseSpecial(Army own, UnitPosition attackerPos); public abstract IEnumerable<(IUnit unit, UnitPosition pos)> GetEnemyTargets( Army own, Army enemy, UnitPosition attackerPos, int range); public abstract IEnumerable<(IUnit unit, UnitPosition pos)> GetForwardAllies( Army own, UnitPosition attackerPos, int range); public abstract UnitPosition? PlaceClone(Army own, UnitPosition wizardPos, IUnit clone); // SA доступна только если юнит не на передовой своей колонны: // передовая — первый живой ряд (GetFrontRow). Один ряд в колонне — SA нет. protected static bool CanUseSpecialIfNotFrontLine(Army own, UnitPosition attackerPos) { int frontRow = own.GetFrontRow(attackerPos.Col); if (frontRow < 0) return false; return attackerPos.Row > frontRow; } // Применить волну урона "одновременно": // сначала все TakeDamage (события Damaged/Died сработают тут), // потом отдельно все логи атаки и смерти (для читаемого вывода). protected static void ApplyDamageWave( IList<(IUnit attacker, IUnit target, double damage)> wave, IBattleLogger logger) { foreach (var (_, target, damage) in wave) target.TakeDamage(damage, logger); foreach (var (attacker, target, damage) in wave) { logger.LogAttack(attacker, target, damage); if (!target.IsAlive) logger.LogDeath(target); } } } }