Files
MVP1/Assets/Scripts/WorldMap/ArmyBridge.cs
T

72 lines
3.3 KiB
C#
Raw Normal View History

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);
}
}