- Ядро (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>
72 lines
3.3 KiB
C#
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);
|
|
}
|
|
}
|