diff --git a/Assets/Scripts/WorldMap/WorldMapController.cs b/Assets/Scripts/WorldMap/WorldMapController.cs index b81cb6e..f617487 100644 --- a/Assets/Scripts/WorldMap/WorldMapController.cs +++ b/Assets/Scripts/WorldMap/WorldMapController.cs @@ -67,6 +67,10 @@ public class WorldMapController : MonoBehaviour private readonly List<(MapNode node, SpriteRenderer sprite, TextMeshPro label)> campViews = new List<(MapNode, SpriteRenderer, TextMeshPro)>(); private float nextCampRefresh; + // Окно атаки: постоянная часть текста и состояние войска, с которым оно показано + private string attackInfoBase; + private BattleCondition shownConditions; + WorldSimulation World => MarchManager.Instance.World; void Start() @@ -115,6 +119,7 @@ public class WorldMapController : MonoBehaviour HandleMapTap(); SyncMarchViews(); RefreshCamps(); + RefreshOpenAttackPanel(); // Воины, а не отряды: "В походе: 1" читалось как один воин int inMarches = 0, garrison = 0; @@ -291,11 +296,11 @@ public class WorldMapController : MonoBehaviour attackInfoText.enableAutoSizing = true; // строка состава гарнизона длинная -- текст ужимается, а не вылезает attackInfoText.fontSizeMin = 18; attackInfoText.fontSizeMax = 32; - attackInfoText.text = $"Гарнизон: {target.garrison} ({UnitsText(WorldMapLayout.GarrisonUnits(target))})\n" + - $"Путь в одну сторону: {travelSeconds} сек" + - (WorldMapLayout.IsFortified(target) ? ", защитники за стенами\n" : ", бой в поле\n") + - $"Награда за победу: {MarchManager.FormatLoot(target.rewards)}" + - ConditionsWarning(MarchManager.PlayerConditions()); + attackInfoBase = $"Гарнизон: {target.garrison} ({UnitsText(WorldMapLayout.GarrisonUnits(target))})\n" + + $"Путь в одну сторону: {travelSeconds} сек" + + (WorldMapLayout.IsFortified(target) ? ", защитники за стенами\n" : ", бой в поле\n") + + $"Награда за победу: {MarchManager.FormatLoot(target.rewards)}"; + RefreshAttackConditions(); soldiersSlider.minValue = available > 0 ? 1 : 0; soldiersSlider.maxValue = available; @@ -308,6 +313,22 @@ public class WorldMapController : MonoBehaviour attackPanel.SetActive(true); } + // Голод может начаться или кончиться, пока окно атаки открыто: предупреждение и прогноз + // пересчитываются, как только состояние войска изменилось (проверка -- в Update) + void RefreshAttackConditions() + { + shownConditions = MarchManager.PlayerConditions(); + attackInfoText.text = attackInfoBase + ConditionsWarning(shownConditions); + } + + void RefreshOpenAttackPanel() + { + if (!attackPanel.activeSelf || selectedTarget == null) return; + if (MarchManager.PlayerConditions() == shownConditions) return; + RefreshAttackConditions(); + UpdateSoldiersToSendText(); + } + void UpdateSoldiersToSendText() { int available = GetSoldiersAtHome(); diff --git a/Docs/Modules/World.md b/Docs/Modules/World.md index f5a305b..15d99f4 100644 --- a/Docs/Modules/World.md +++ b/Docs/Modules/World.md @@ -75,7 +75,7 @@ **Номер боя:** при выступлении поход получает `battleSeed` (из номера похода, времени выступления и цели) и хранит его в сохранении. Тот же поход всегда даёт тот же бой. После боя в походе запоминаются силы сторон и выпавшая случайность (`attackerPower`, `defenderPower`, `attackerLuck`, `defenderLuck`). Окно итога боя на карте показывает «Сила 356 : 160, удача −3,1% / +3,2%» (твоя / врага); текст окна ужимается, чтобы не уходить под кнопку OK. Окно атаки показывает прогноз риска и диапазоны силы и потерь. -**Голод в бою:** перед боем мир спрашивает состояние войска нападающего (`WorldSimulation.AttackerConditions`). `MarchManager` отвечает по модулю Населения: город голодает — войско бьётся на 50% силы. Мир сам голод не считает. Если бой прошёл, пока игра была закрыта, берётся голод на момент входа (истории голода нет). Окно атаки предупреждает: «Голод: войско слабее, сила 50%. Накормите город до боя», прогноз учитывает голод. Окно итога боя пишет «голод: сила 50%». В походе запоминается `attackerConditions` и `attackerConditionPercent`. +**Голод в бою:** перед боем мир спрашивает состояние войска нападающего (`WorldSimulation.AttackerConditions`). `MarchManager` отвечает по модулю Населения: город голодает — войско бьётся на 50% силы. Мир сам голод не считает. Если бой прошёл, пока игра была закрыта, берётся голод на момент входа (истории голода нет). Окно атаки предупреждает: «Голод: войско слабее, сила 50%. Накормите город до боя», прогноз учитывает голод. Если голод начался или кончился, пока окно атаки открыто, предупреждение и прогноз обновляются сами. Окно итога боя пишет «голод: сила 50%». В походе запоминается `attackerConditions` и `attackerConditionPercent`. **Время** походов — по `GameClock`: кнопки «+1 час» / «+10 часов» в отладочной панели проматывают и походы.