/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Core/Strategies/NarrowBridgeStrategy.cs
135 строк
5 KB
Zakhar Romashov
Добавили логику с бафами
29 апр 2026, 13:06
29 апр 2026, 13:06
7623dfb
Код
Авторство
О чём код?
using System; using System.Collections.Generic; namespace ArmyBattleGame { // Узкий мост (1 колонка) — поведение, эквивалентное исходной игре. class NarrowBridgeStrategy : FormationStrategyBase { public const string StrategyName = "NarrowBridge"; public override string Name => StrategyName; public override string DisplayName => "Узкий мост (колонна по одному)"; public override int ColumnCountFor(int unitCount) => 1; public override void ExecuteMeleePhase(BattleField field, IBattleLogger logger) { var attackerArmy = field.IsArmy1Turn ? field.Army1 : field.Army2; var defenderArmy = field.IsArmy1Turn ? field.Army2 : field.Army1; var attacker = attackerArmy.GetFront(0); var defender = defenderArmy.GetFront(0); if (attacker != null && defender != null) { attacker.Hit(defender, logger); defenderArmy.Compact(); } if (attackerArmy.HasAliveUnits && defenderArmy.HasAliveUnits) { var counter = defenderArmy.GetFront(0); var counterTarget = attackerArmy.GetFront(0); if (counter != null && counterTarget != null) { counter.Hit(counterTarget, logger); attackerArmy.Compact(); } } } public override void ExecuteSpecialsPhase(BattleField field, IBattleLogger logger) { var ctx1 = new BattleContext(field.Army1, field.Army2, this, logger); var ctx2 = new BattleContext(field.Army2, field.Army1, this, logger); int max = Math.Max(field.Army1.RowCount, field.Army2.RowCount); for (int row = 0; row < max; row++) { TryUseSpecial(ctx1, row); TryUseSpecial(ctx2, row); } field.Army1.Compact(); field.Army2.Compact(); } private static void TryUseSpecial(BattleContext ctx, int row) { var unit = ctx.OwnArmy.GetAt(row, 0); if (unit is ISpecialAbility special && unit.IsAlive) special.UseSpecial(ctx, new UnitPosition(row, 0)); } public override bool CanUseSpecial(Army own, UnitPosition attackerPos) => CanUseSpecialIfNotFrontLine(own, attackerPos); public override IEnumerable<(IUnit unit, UnitPosition pos)> GetEnemyTargets( Army own, Army enemy, UnitPosition attackerPos, int range) { int targetRow = range - attackerPos.Row; if (targetRow < 0) yield break; var direct = enemy.GetAt(targetRow, 0); if (direct != null && direct.IsAlive) { yield return (direct, new UnitPosition(targetRow, 0)); yield break; } for (int r = enemy.RowCount - 1; r >= 0; r--) { var u = enemy.GetAt(r, 0); if (u != null && u.IsAlive) { yield return (u, new UnitPosition(r, 0)); yield break; } } } public override IEnumerable<(IUnit unit, UnitPosition pos)> GetForwardAllies( Army own, UnitPosition attackerPos, int range) { int rangeStart = Math.Max(0, attackerPos.Row - range); int rangeEnd = attackerPos.Row - 1; var self = own.GetAt(attackerPos.Row, attackerPos.Col); for (int r = rangeStart; r <= rangeEnd; r++) { var u = own.GetAt(r, 0); if (u != null && u.IsAlive && !ReferenceEquals(u, self)) yield return (u, new UnitPosition(r, 0)); } } public override UnitPosition? PlaceClone(Army own, UnitPosition wizardPos, IUnit clone) { // Клон на позицию мага - маг сдвигается назад. var flat = own.Flatten(); int wizardIndex = -1; var wizard = own.GetAt(wizardPos.Row, wizardPos.Col); for (int i = 0; i < flat.Count; i++) { if (ReferenceEquals(flat[i], wizard)) { wizardIndex = i; break; } } if (wizardIndex < 0) return null; flat.Insert(wizardIndex, clone); own.RebuildFromFlat(flat, 1); // Уведомляем подписчиков, что клон добавлен. // (RebuildFromFlat не вызывает UnitAdded — это функция реструктуризации.) own.NotifyUnitAdded(clone); return new UnitPosition(wizardPos.Row, 0); } } }