Армия: заказы, сроки по часам игры, завершение один раз (TroopsTrainedEvent), сохранение train=. Население отдаёт жителей и принимает новобранцев через свой контракт. GameProgress (код Вальдемара, с разрешения команды): только цена, Казармы, окна и статистика; старая очередь из progress.json переносится один раз с тем же оставшимся временем. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
47 lines
2.4 KiB
C#
47 lines
2.4 KiB
C#
using System;
|
||
|
||
// ЧАСЫ ИГРЫ: единственный источник "сейчас" для игровых правил (население, а дальше -- производство).
|
||
//
|
||
// Время игры = реальное время UTC + сдвиг. Сдвиг нужен только отладочной панели ("+1 час"):
|
||
// перемотка идёт через те же правила, что и офлайн-прогресс, отдельной логики у неё нет.
|
||
// Сдвиг НЕ сохраняется -- после перезапуска игры время снова реальное.
|
||
//
|
||
// Модули берут время только отсюда: GameClock.UnixNow, а не DateTime.UtcNow.
|
||
public static class GameClock
|
||
{
|
||
static long offsetSeconds;
|
||
|
||
// Для тестов: подменить "реальное" время. null -- настоящие часы устройства.
|
||
public static Func<long> RealUnixSource;
|
||
|
||
public static long OffsetSeconds => offsetSeconds;
|
||
|
||
// Текущее время игры, секунды Unix
|
||
public static long UnixNow => RealUnix() + offsetSeconds;
|
||
|
||
public static DateTime UtcNow => DateTimeOffset.FromUnixTimeSeconds(UnixNow).UtcDateTime;
|
||
|
||
// То же в миллисекундах -- для таймеров, которые идут плавно (обучение войск, марши)
|
||
public static long UnixNowMs => (RealUnixSource != null ? RealUnixSource() * 1000 : DateTimeOffset.UtcNow.ToUnixTimeMilliseconds())
|
||
+ offsetSeconds * 1000;
|
||
|
||
// Промотать время вперёд (отладка). Модули узнают об этом из GameTimeAdvancedEvent и досчитываются.
|
||
public static void Advance(long seconds)
|
||
{
|
||
if (seconds <= 0) return;
|
||
offsetSeconds += seconds;
|
||
EventBus.Publish(new GameTimeAdvancedEvent { Seconds = seconds, UnixNow = UnixNow });
|
||
}
|
||
|
||
// Вернуть реальное время (сдвиг = 0). Модули воспримут это как "часы ушли назад" и просто продолжат с этого момента.
|
||
public static void ResetOffset()
|
||
{
|
||
offsetSeconds = 0;
|
||
}
|
||
|
||
static long RealUnix()
|
||
{
|
||
return RealUnixSource != null ? RealUnixSource() : DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
||
}
|
||
}
|