Files
MVP1/Assets/Scripts/WorldMap/ArmyBridge.cs
T
AlexanderandClaude Opus 5.5 964cb23d9d Модульная система: игровое ядро + 6 модулей, документы Docs/Modules
- Ядро (Bogatyri.Core): контракты модулей, EventBus, GameServices, SaveRegistry
- Модули: Экономика, Поселение, Армия, Глобальный мир, Боевая система, Сохранения
  (каждый — отдельный asmdef, видит только ядро)
- App/GameModules: регистрация модулей и связь с GameProgress/Казармами
- Сохранения v2 по секциям модулей, перенос старого save.json и походов из progress.json
- Сброс сохранений: ISaveSystem.ResetAll, ResetState у модулей, меню Tools
- EditMode-тесты модулей, документы по каждому модулю с журналом изменений

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 18:39:28 +02:00

72 lines
3.3 KiB
C#

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