Files
MVP1/Assets/Scripts/UI/MarchReturnPopup.cs
T
AlexanderandClaude Opus 5.5 b1a396e9a2 Лагеря разбойников (PvE) на карте мира
Модуль Мира (Bogatyri.World.Simulation, без Unity):
- 12 лагерей трёх уровней: Стан разбойников, Логово лиходеев, Становище Соловья-разбойника
  (гарнизон 6–9 / 14–17 / 26–29, добыча — еда, дерево, золото, металл)
- ставятся отдельным генератором после городов: замок, твой город и соседи остались на местах
- бой в поле (без стен), у разбойников нет осадных
- после победы лагерь разбит на 30 минут (CampRules.RespawnMs), напасть нельзя
- бои считаются по времени прихода: второе войско к разбитому лагерю — без боя, все домой, добычи нет
- секция сохранения world хранит разбитые лагеря (camps); сброс — все лагеря на месте
- MarchReturnedEvent.TargetEmpty, окно в городе пишет «лагерь уже был разбит»

Интерфейс карты:
- лагерь — фиолетовый круг с подписью «название, ур. N, гарнизон»; разбитый — серый с таймером
- окно атаки: уровень лагеря, «бой в поле» / «за стенами», прогноз с учётом стен
- окно «ЛАГЕРЬ ПУСТ», подсказка при нажатии на разбитый лагерь

Тесты: расстановка лагерей, бой в поле без осадных, разбит → второе войско находит пустым → сохранение → появляется снова.
Документы World, Battle, Save, Core, README обновлены. Числа требуют балансировки.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 16:46:54 +01:00

46 lines
2.1 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.TargetName}»";
string result = e.TargetEmpty ? "лагерь уже был разбит, боя не было"
: e.Victory ? "<color=#7CD67C>победа</color>" : "<color=#E06A5A>поражение</color>";
int lost = Mathf.Max(0, e.Sent - e.Survivors);
string text = $"{target}: {result}\n" +
$"Вернулись {e.Survivors} из {e.Sent} воинов" + (lost > 0 ? $" (погибли {lost})" : "") + "\n" +
$"Добыча: {e.LootText}";
UIKit.Message("ВОЙСКО ВЕРНУЛОСЬ", text, "ОК", ShowNext);
}
}