using System; using UnityEngine; // МОСТ между модулем Армии и данными войск, которые пока хранятся в GameProgress (4 типа войск). // Реализует контракт IArmy: модуль Мира берёт и возвращает воинов только через него. // Документ: Docs/Modules/Army.md // // - "Солдаты дома" = все наши воины в городе. // - При отправке похода берём воинов из всех типов пропорционально и запоминаем состав похода. // - При возвращении выживших раздаём обратно по тем же типам в той же пропорции. // Сами правила деления -- в ArmyMath (модуль Армии, без Unity). // // Решение команды от 19.10.2026: не удалять этот мост, пока войска не переедут в модуль Армии // вместе с миграцией сохранений (поле sashaMarchUnits в progress.json). public static class ArmyBridge { [Serializable] public class MarchUnits { public int marchId; public int[] units = new int[4]; } // Реализация контракта, регистрирует её App/GameModules public static readonly IArmy Service = new ArmyService(); static ProgressData D { get { return GameProgress.Instance.Data; } } public static int SoldiersAtHome { get { return GameProgress.Instance.TotalTroops; } } // Забрать count воинов из города в поход marchId public static bool Take(int marchId, int count) { var troops = D.troops; int[] taken = ArmyMath.TakeProportional(troops, count); if (taken == null) return false; for (int i = 0; i < troops.Length; i++) troops[i] -= taken[i]; var entry = new MarchUnits { marchId = marchId }; for (int i = 0; i < 4 && i < taken.Length; i++) entry.units[i] = taken[i]; D.sashaMarchUnits.RemoveAll(e => e.marchId == marchId); D.sashaMarchUnits.Add(entry); GameProgress.Instance.MarkChanged(); return true; } // Вернуть survivors выживших из похода marchId по типам войск public static void Return(int marchId, int survivors) { var entry = D.sashaMarchUnits.Find(e => e.marchId == marchId); var troops = D.troops; if (entry == null) { troops[0] += Mathf.Max(0, survivors); // состав неизвестен (старое сохранение) -- считаем пехотой } else { int[] back = ArmyMath.SplitSurvivors(entry.units, survivors); for (int i = 0; i < back.Length && i < troops.Length; i++) troops[i] += back[i]; D.sashaMarchUnits.Remove(entry); } GameProgress.Instance.MarkChanged(); } class ArmyService : IArmy { public int SoldiersAtHome => ArmyBridge.SoldiersAtHome; public bool TakeForMarch(int marchId, int count) => Take(marchId, count); public void ReturnFromMarch(int marchId, int survivors) => Return(marchId, survivors); } }