Стройка не висит на 00:00 после «Сбросить перемотку»: расчёт сообщает текущее время и при часах назад (без начисления)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Alexander
2026-11-05 17:45:12 +01:00
co-authored by Claude Opus 5.5
parent 65f5039f74
commit 422f55f22e
3 changed files with 26 additions and 0 deletions
@@ -243,6 +243,10 @@ public sealed class PopulationService : IPopulation, ISaveParticipant
{
// Часы ушли назад (сброс отладочной перемотки, перевод часов на телефоне). Метку НЕ двигаем назад:
// это время уже посчитано, и когда часы снова дойдут до него, оно не начислится второй раз (04.11).
// Но сообщить «расчёт дошёл до сейчас» нужно: время до сейчас тоже уже посчитано, и стройки, у которых оно
// вышло, завершаются. Иначе после «Сбросить перемотку» все стройки висели на 00:00, пока реальное время
// не догонит перемотку (05.11). Ресурсы здесь не начисляются
SimulatedUntil(unixNow);
return;
}
if (elapsed == 0) { SimulatedUntil(unixNow); return; }
@@ -292,6 +292,27 @@ public class ProductionTests
Assert.AreEqual(130 / 60f * 60 + 110 / 60f * 66, wood, 0.01f, "с ближайшего шага расчёта после конца стройки");
}
[Test]
public void Tick_ClockWentBack_StillReportsSimulatedTime_NoResources()
{
// «+1 час», потом «Сбросить перемотку»: часы ушли назад. Стройка, у которой время вышло, должна завершиться
// (событие о расчёте приходит), а ресурсы за уже посчитанный час второй раз не начисляются (05.11)
economy.Set(ResourceType.Food, 100000);
economy.Set(ResourceType.Wood, 0);
production.SetBuildings(Buildings((WorkJob.Woodcutter, 1)));
population.SetWorkers(WorkJob.Woodcutter, 30);
population.Tick(T0);
population.Tick(T0 + Hour);
float wood = economy.Get(ResourceType.Wood);
long reported = 0;
EventBus.Subscribe<GameTimeSimulatedEvent>(e => reported = e.UnixNow);
population.Tick(T0 + 60);
Assert.AreEqual(T0 + 60, reported, "расчёт сообщает, до какого момента дошло время -- стройки завершаются");
Assert.AreEqual(wood, economy.Get(ResourceType.Wood), 0.01f, "за уже посчитанное время ресурсов не прибавилось");
}
[Test]
public void Tick_SameMomentTwice_NoExtraResources()
{