diff --git a/Assets/Scripts/Modules/Tests/ModuleTests.cs b/Assets/Scripts/Modules/Tests/ModuleTests.cs index a29c310..89aa3cc 100644 --- a/Assets/Scripts/Modules/Tests/ModuleTests.cs +++ b/Assets/Scripts/Modules/Tests/ModuleTests.cs @@ -839,9 +839,11 @@ public class ModuleTests foreach (var p in world.ResourcePoints) if (p.active && p.kind == 3) activeGold++; Assert.AreEqual(world.PointRules.PointsPerResource, activeGold, "новая точка золота появилась в другом месте"); + string name = world.GetNode(gold.id).displayName; world.Advance(m.returnMs, new List()); Assert.IsNull(world.GetPoint(gold.id), "истощённая точка убрана, когда войско вернулось"); Assert.IsNull(world.GetNode(gold.id)); + Assert.AreEqual(name, world.TargetName(m), "название цели помнит сам поход -- для итогов после исчезновения точки"); } [Test] diff --git a/Assets/Scripts/Modules/World/MarchManager.cs b/Assets/Scripts/Modules/World/MarchManager.cs index aa6c792..4726cbc 100644 --- a/Assets/Scripts/Modules/World/MarchManager.cs +++ b/Assets/Scripts/Modules/World/MarchManager.cs @@ -101,7 +101,7 @@ public class MarchManager : MonoBehaviour, IWorld, ISaveParticipant else if (e.Type == WorldEventType.MarchReturned) HandleMarchReturned(e.March); else if (e.Type == WorldEventType.GatherStarted) HandleGatherStarted(e.March); else if (e.Type == WorldEventType.GatherFinished) - Debug.Log($"[СБОР] Сбор окончен: {e.March.cargo} ({World.GetNode(e.March.targetNodeId)?.displayName}), войско идёт домой"); + Debug.Log($"[СБОР] Сбор окончен: {e.March.cargo} ({World.TargetName(e.March)}), войско идёт домой"); } if (events.Count > 0 && GameServices.TryGet(out ISaveSystem save)) save.SaveNow(); @@ -204,9 +204,9 @@ public class MarchManager : MonoBehaviour, IWorld, ISaveParticipant void HandleGatherStarted(MarchData march) { - MapNode target = World.GetNode(march.targetNodeId); - if (march.targetEmpty) Debug.Log($"[СБОР] {target?.displayName}: точки уже нет или она занята -- войско возвращается"); - else Debug.Log($"[СБОР] {march.soldiers} воинов начали сбор: {target?.displayName}, унесут {march.cargo}"); + string target = World.TargetName(march); + if (march.targetEmpty) Debug.Log($"[СБОР] {target}: точки уже нет или она занята -- войско возвращается"); + else Debug.Log($"[СБОР] {march.soldiers} воинов начали сбор: {target}, унесут {march.cargo}"); OnGatherStarted?.Invoke(march); } @@ -245,7 +245,7 @@ public class MarchManager : MonoBehaviour, IWorld, ISaveParticipant Sent = march.soldiers, TargetEmpty = march.targetEmpty, IsGather = march.gather, - TargetName = World.GetNode(march.targetNodeId)?.displayName ?? "", + TargetName = World.TargetName(march), LootText = FormatLoot(march.loot) }); } diff --git a/Assets/Scripts/Modules/World/Simulation/WorldSimulation.cs b/Assets/Scripts/Modules/World/Simulation/WorldSimulation.cs index 43eb521..a0a5bf2 100644 --- a/Assets/Scripts/Modules/World/Simulation/WorldSimulation.cs +++ b/Assets/Scripts/Modules/World/Simulation/WorldSimulation.cs @@ -20,6 +20,7 @@ namespace Bogatyri.World public string ownerId; public string fromNodeId; public string targetNodeId; + public string targetName; // название цели на момент выступления: истощённая точка может исчезнуть с карты раньше, чем показан итог public int soldiers; // сколько ушло public int survivors; // сколько возвращается (известно после боя) @@ -250,7 +251,8 @@ namespace Bogatyri.World departMs = nowMs, arriveMs = nowMs + TravelTimeMs(from, target, null), // состав уточнит AssignUnits state = MarchState.Outbound, - gather = target.type == MapNodeType.ResourcePoint + gather = target.type == MapNodeType.ResourcePoint, + targetName = target.displayName }; // Номер боя -- из данных похода: тот же поход всегда даёт тот же бой. // В мультиплеере его выдаёт сервер, иначе клиент мог бы подбирать удачный. @@ -409,6 +411,13 @@ namespace Bogatyri.World } } + // Название цели похода: запомненное при выступлении (старые походы -- с карты) + public string TargetName(MarchData m) + { + if (!string.IsNullOrEmpty(m.targetName)) return m.targetName; + return GetNode(m.targetNodeId)?.displayName ?? ""; + } + // Номер боя из данных похода (FNV-1a) -- одинаков на любой платформе public static long BattleSeed(int marchId, long departMs, string targetId) { diff --git a/Assets/Scripts/WorldMap/WorldMapController.cs b/Assets/Scripts/WorldMap/WorldMapController.cs index a4e2e73..9e646dd 100644 --- a/Assets/Scripts/WorldMap/WorldMapController.cs +++ b/Assets/Scripts/WorldMap/WorldMapController.cs @@ -610,11 +610,11 @@ public class WorldMapController : MonoBehaviour void HandleGatherStarted(MarchData march) { - MapNode target = World.GetNode(march.targetNodeId); + string target = World.TargetName(march); if (march.targetEmpty) - EnqueuePopup("ТОЧКИ НЕТ", $"{target?.displayName ?? "Ресурсная точка"} исчезла или занята\nСбора не было, домой идут все {march.soldiers} воинов"); + EnqueuePopup("ТОЧКИ НЕТ", $"{target} исчезла или занята\nСбора не было, домой идут все {march.soldiers} воинов"); else - hintText.text = $"Войско начало сбор: {target?.displayName}, унесёт {march.cargo}"; + hintText.text = $"Войско начало сбор: {target}, унесёт {march.cargo}"; } void HandleMarchReturned(MarchData march)