Подробный список изменений: - Перенесены эффекты частиц из C#-кода в готовые префабы-ассеты (Vfx Prefabs) в папке Assets/Resources/Vfx/ с автоматической генерацией материалов в Editor. - Исправлены ошибки duration на играющих системах частиц и розовые текстуры в GameVfxService.cs. - Исправлена навигация и фокус кнопок на оверлеях ContinueGameOverlay и PrizeResultOverlay с автоматическим подсвечиванием кнопок лимонно-зеленым цветом при фокусе и проигрыванием звука. - Добавлена проверка настроек в GameplayHudController.cs для скрытия ContinueGameOverlay, если продолжение игры отключено. - Расширен сбор статистики: создана структура GameplaySessionRecord, добавлена история до 50 раундов в PrizeSessionStateService и JsonPrizeSessionStateRepository, выведен расчет средних показателей и список 5 последних раундов в сервисной статистике. - Повышена надежность COM-транспорта: добавлен sleep (80мс) в Dispose для graceful shutdown потоков, реализован цикл переподключения до 10 попыток при обрыве связи. - Интегрированы настройки громкости с микшером: изменен шаг изменения громкости на 5% (0.05) для удобства, добавлен статус-чек и логи в ApplyServiceVolumes, расширены юнит-тесты на GetFloat параметры. - Созданы новые архитектурные гайды по аппаратному COM-транспорту и призовой экономике автомата в папке GUIDES/architecture/. - Оптимизирован и обновлен RAG-индекс проекта.
66 lines
2.9 KiB
C#
66 lines
2.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace DanroJump.Prizes
|
|
{
|
|
/// <summary>
|
|
/// Снимок призового состояния для persistent recovery между перезапусками.
|
|
/// </summary>
|
|
public sealed class PrizeSessionStateSnapshot
|
|
{
|
|
public PrizeSessionStateSnapshot(
|
|
IReadOnlyList<PrizeSessionRecord> history,
|
|
IReadOnlyCollection<string> issuedSessionIds,
|
|
string activeSessionId,
|
|
int startedCount,
|
|
int completedCount,
|
|
int failedCount,
|
|
int duplicateBlockedCount,
|
|
int fallbackSessionCounter,
|
|
IReadOnlyList<GameplaySessionRecord> gameplayHistory = null,
|
|
int totalGamesPlayed = 0,
|
|
int totalScore = 0,
|
|
int totalCoins = 0,
|
|
int qrShows = 0,
|
|
int physicalDispenses = 0,
|
|
int physicalDispenseFailures = 0,
|
|
int comErrors = 0)
|
|
{
|
|
History = history?.Where(static record => record != null).ToArray() ?? Array.Empty<PrizeSessionRecord>();
|
|
IssuedSessionIds = issuedSessionIds?.Where(static sessionId => !string.IsNullOrWhiteSpace(sessionId)).ToArray() ?? Array.Empty<string>();
|
|
ActiveSessionId = activeSessionId ?? string.Empty;
|
|
StartedCount = Math.Max(0, startedCount);
|
|
CompletedCount = Math.Max(0, completedCount);
|
|
FailedCount = Math.Max(0, failedCount);
|
|
DuplicateBlockedCount = Math.Max(0, duplicateBlockedCount);
|
|
FallbackSessionCounter = Math.Max(0, fallbackSessionCounter);
|
|
GameplayHistory = gameplayHistory?.Where(static record => record != null).ToArray() ?? Array.Empty<GameplaySessionRecord>();
|
|
TotalGamesPlayed = Math.Max(0, totalGamesPlayed);
|
|
TotalScore = Math.Max(0, totalScore);
|
|
TotalCoins = Math.Max(0, totalCoins);
|
|
QrShows = Math.Max(0, qrShows);
|
|
PhysicalDispenses = Math.Max(0, physicalDispenses);
|
|
PhysicalDispenseFailures = Math.Max(0, physicalDispenseFailures);
|
|
ComErrors = Math.Max(0, comErrors);
|
|
}
|
|
|
|
public IReadOnlyList<PrizeSessionRecord> History { get; }
|
|
public IReadOnlyList<GameplaySessionRecord> GameplayHistory { get; }
|
|
public IReadOnlyCollection<string> IssuedSessionIds { get; }
|
|
public string ActiveSessionId { get; }
|
|
public int StartedCount { get; }
|
|
public int CompletedCount { get; }
|
|
public int FailedCount { get; }
|
|
public int DuplicateBlockedCount { get; }
|
|
public int FallbackSessionCounter { get; }
|
|
public int TotalGamesPlayed { get; }
|
|
public int TotalScore { get; }
|
|
public int TotalCoins { get; }
|
|
public int QrShows { get; }
|
|
public int PhysicalDispenses { get; }
|
|
public int PhysicalDispenseFailures { get; }
|
|
public int ComErrors { get; }
|
|
}
|
|
}
|