Files
MVP1/Assets/Scripts/WorldMap/ArmyBridge.cs
T
AlexanderandClaude Opus 5.5 d570fddbc8 Одна карта мира: удалена маленькая карта Meta/World
- удалены WorldSystem, WorldMapPanel, WorldData, WorldLine и окно Panel_World из сцены города
- кнопка «МИР» в городе открывает большую карту (сцена WorldMap) через UIPanelManager.Open("World")
- перенос сохранений: солдаты из походов старой карты возвращаются в город при загрузке
  (отправленные, а если отряд шёл назад — выжившие); добыча таких походов не переносится
- ArmyBridge.TroopsInMarches: панель «Войска» показывает воинов в походах большой карты
- HUDPanelsBuilder: кнопка «МИР» без отдельной панели
- документы World, Army, README обновлены

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

83 lines
3.6 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; } }
// Воинов сейчас в походах на карте мира
public static int TroopsInMarches
{
get
{
int n = 0;
foreach (var m in D.sashaMarchUnits) foreach (var u in m.units) n += u;
return n;
}
}
// Забрать 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);
}
}