Danro/Assets/Scripts/Controls/Inputs/ComSystem/LightCycleDurations.cs
Danil Iarosh e8000ffdca
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
feat(vfx, ui, com): add custom vfx, polish ui and update backlight protocol
- Интегрирована система кастомных визуальных эффектов (VFX):
  - Добавлена новая утилита MvpVFXUtility и настройки MvpVFXSpawnSettings для спавна эффектов.
  - Реализован пул эффектов VFXPool с поддержкой отслеживания версий спавна, сброса оверрайдов и анимации масштаба по времени.
  - Добавлены эффекты прыжка и приземления в PlayerAnimationEvents.
  - Интегрирован эффект DeathVignetteController для плавного затемнения экрана при смерти игрока.
  - Добавлены частицы stompImpactVFX при уничтожении врагов прыжком сверху (EnemyController).
  - Реализован эффект конфетти finishVFX при успешном завершении уровня (LevelFinish).
  - Интегрированы эффекты искр при сборе монеток, кристаллов и других собираемых предметов (Collectible, EnvironmentalCollectibleBase).
- Улучшен и визуально доработан пользовательский интерфейс (UI):
  - Добавлен скрипт QRCodeTierHighlight для цветовой подсветки QR-кодов в зависимости от тира приза.
  - Реализована пульсация блока приза в баннере победы (WinBannerController).
  - Обновлено обозначение валюты в BalanceDisplay с "₽" на "руб.".
  - Добавлены новые префабы, сцены, ассеты тайлсетов и шейдеров для настройки визуального стиля.
- Обновлён протокол и инициализация подсветки COM-платы:
  - Изменен префикс команд подсветки с 85/86 на 8550, а диапазон эффектов обновлен с 40...52 на 10...22 (LightController, LightMode, LightCycleDurations).
  - Исправлена хардкод-команда сброса подсветки при инициализации в ComDeviceClient с устаревшей 8600 на новую 8550 для предотвращения рассинхронизации буфера обмена платы.
2026-07-07 16:52:05 +03:00

53 lines
2.4 KiB
C#

using System.Collections.Generic;
namespace RR.Common.Controls
{
/// <summary>
/// Таблица длительности одного цикла каждого светового эффекта (в миллисекундах).
/// Используется в <see cref="LightSequence"/> для пересчёта количества циклов в секунды.ё
/// Для запуска карусели использовать команду 855001
/// </summary>
public static class LightCycleDurations
{
private static readonly Dictionary<LightMode, int> CycleMs = new()
{
{ LightMode.HorizontalWave, 1000 }, // 10
{ LightMode.VerticalWave, 1000 }, // 11
{ LightMode.DiagonalWave, 3000 }, // 12
{ LightMode.Rainbow, 3000 }, // 13
{ LightMode.WaveUp, 3000 }, // 14
{ LightMode.VerticalWaveUp, 1000 }, // 15
{ LightMode.FinalWave, 1000 }, // 16
{ LightMode.BlueWave, 1000 }, // 17
{ LightMode.DiagonalWave2, 5000 }, // 18
{ LightMode.FallingRows, 6000 }, // 19
{ LightMode.OrangeWave, 3000 }, // 20
{ LightMode.SeaWave, 3000 }, // 21
{ LightMode.DiagonalWave3, 4000 }, // 22
};
/// <summary>Длительность одного цикла в миллисекундах. Для <see cref="LightMode.Off"/> возвращает 0.</summary>
public static int GetCycleMs(LightMode mode)
{
return CycleMs.TryGetValue(mode, out int ms) ? ms : 0;
}
/// <summary>Длительность одного цикла в секундах (float).</summary>
public static float GetCycleSeconds(LightMode mode)
{
return GetCycleMs(mode) / 1000f;
}
/// <summary>
/// Пересчитывает количество циклов в целые секунды для COM-команды.
/// Дробные циклы поддерживаются (0.5 = половина цикла).
/// </summary>
public static int CyclesToCommandSeconds(LightMode mode, float cycles)
{
float totalSeconds = GetCycleSeconds(mode) * cycles;
return (int)(totalSeconds + 0.5f); // округление до ближайшего целого
}
}
}