/
expens1ve
/
project_war
Обзор
Документация
Войти
/
expens1ve
/
project_war
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
solid
Engine/Formations/WideBridgeFormation.cs
101 строка
3 KB
Vadim
fix abilities 3x3
21 май 2026, 23:57
21 май 2026, 23:57
b1f37d0
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using project_war.Engine.Interfaces; using project_war.Models.Interfaces; using project_war.Models.Utils; namespace project_war.Engine.Formations { /// <summary> /// Широкий мост: фронт из 3 колонн. /// Каждая колонна бьётся независимо друг от друга. /// SpecialAbility доступна только если перед юнитом нет живых юнитов ни в своей колонне, ни у противника напротив. /// </summary> public sealed class WideBridgeFormation : IBattleFormation { private const int Columns = 3; public string DisplayName => "Широкий мост (3 бойца)"; public IReadOnlyList<IUnit?> GetFrontUnits(IArmy army) { var fronts = new IUnit?[Columns]; if (army == null) return fronts; for (int column = 0; column < Columns; column++) { for (int i = column; i < army.Units.Count; i += Columns) { var unit = army.Units[i]; if (unit != null && unit.Health > 0) { fronts[column] = unit; break; } } } return fronts; } public IUnit? GetFrontUnit(IArmy army) { var fronts = GetFrontUnits(army); for (int i = 0; i < fronts.Count; i++) { if (fronts[i] != null) return fronts[i]; } return null; } public void OnUnitDied(IUnit deadUnit, IArmy army) { // Ничего не делаем. } public bool CanUseSpecialAbility(IUnit unit, IArmy ownArmy, IArmy enemyArmy) { if (unit == null || ownArmy == null || enemyArmy == null) return false; int index = IndexOfUnit(ownArmy, unit); if (index < 0) return false; int column = index % Columns; // Специальная способность доступна только если в этой же колонне перед данным юнитом // есть хотя бы один живой союзник (т.е. юнит находится не на передовой этой колонны). for (int i = column; i < index; i += Columns) { var current = ownArmy.Units[i]; if (current != null && current.Health > 0) return true; } return false; } private static int IndexOfUnit(IArmy army, IUnit unit) { var needle = unit.Unwrap(); for (int i = 0; i < army.Units.Count; i++) { var current = army.Units[i]; if (current == null) continue; if (ReferenceEquals(current.Unwrap(), needle)) return i; } return -1; } } }