Бой делит выбывших на погибших и раненых по соотношению сил стороны (70/45/30/20%), версия правил 6. Раненые идут домой с войском; Армия кладёт их в госпиталь, лечит 4/4/6/8 игровых часов, лишние ждут места. Места -- от IHospital (здания пока нет -- HospitalConfig.temporaryBeds), цена -- через Экономику (не утверждена). Население считает раненых людьми. Здание госпиталя -- следующий шаг. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
2.7 KiB
C#
52 lines
2.7 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
// Окно "ВОЙСКО ВЕРНУЛОСЬ" в городе (слой приложения): куда ходили, итог, сколько вернулось, добыча.
|
|
// Показывается по событию MarchReturnedEvent модуля Мира -- в том числе за походы, закончившиеся,
|
|
// пока игра была закрыта. Несколько возвращений -- окна по очереди. На карте мира своё окно (WorldMapController).
|
|
// Подключается в App/GameModules. Документ: Docs/Modules/World.md
|
|
public static class MarchReturnPopup
|
|
{
|
|
static readonly Queue<MarchReturnedEvent> queue = new Queue<MarchReturnedEvent>();
|
|
static bool showing;
|
|
|
|
public static void Reset()
|
|
{
|
|
queue.Clear();
|
|
showing = false;
|
|
}
|
|
|
|
public static void OnMarchReturned(MarchReturnedEvent e)
|
|
{
|
|
// Только в городе: на карте мира возвращение уже показывает её собственное окно
|
|
if (!GameServices.TryGet(out ISettlement settlement) || !settlement.IsCityLoaded) return;
|
|
|
|
queue.Enqueue(e);
|
|
if (!showing) ShowNext();
|
|
}
|
|
|
|
static void ShowNext()
|
|
{
|
|
if (queue.Count == 0) { showing = false; return; }
|
|
showing = true;
|
|
|
|
MarchReturnedEvent e = queue.Dequeue();
|
|
string target = string.IsNullOrEmpty(e.TargetName) ? "поход"
|
|
: (e.IsScout ? "Разведка" : e.IsGather ? "Сбор" : "Поход на") + $" «{e.TargetName}»";
|
|
string result = e.IsScout
|
|
? (e.TargetEmpty ? "цели уже не было" : "<color=#7CD67C>цель разведана</color>")
|
|
: e.IsGather
|
|
? (e.TargetEmpty ? "точки уже не было или её заняли, сбора не было" : "<color=#7CD67C>ресурсы собраны</color>")
|
|
: e.TargetEmpty ? "лагерь уже был разбит, боя не было"
|
|
: e.Victory ? "<color=#7CD67C>победа</color>" : "<color=#E06A5A>поражение</color>";
|
|
int dead = Mathf.Max(0, e.Sent - e.Survivors - e.Wounded);
|
|
|
|
string text = $"{target}: {result}\n" +
|
|
$"Вернулись {e.Survivors} из {e.Sent} воинов" + (dead > 0 ? $" (погибли {dead})" : "") + "\n" +
|
|
(e.Wounded > 0 ? $"Раненых {e.Wounded} -- в госпитале (окно «Войска»)\n" : "") +
|
|
$"Добыча: {e.LootText}";
|
|
|
|
UIKit.Message("ВОЙСКО ВЕРНУЛОСЬ", text, "ОК", ShowNext);
|
|
}
|
|
}
|