Danro-Jump/Assets/Scripts/Runtime/Prizes/PrizeSessionStateSnapshot.cs
Danil Iarosh 839a68aef1 Improve VFX, UI overlays, session statistics, COM reliability, audio mixer, and expand architecture guides
Подробный список изменений:
- Перенесены эффекты частиц из 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-индекс проекта.
2026-07-03 15:04:08 +03:00

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; }
}
}