/
Yaroslav4444-bauer
/
ArmyFight
Обзор
Документация
Войти
/
Yaroslav4444-bauer
/
ArmyFight
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
UnitManager/ObserverManager.cs
121 строка
5 KB
Yaroslav4444-bauer
Добовлены комментарии summary
01 июн 2026, 12:38
01 июн 2026, 12:38
70196b7
Код
Авторство
О чём код?
using System; using System.IO; namespace ArmyFight { /// <summary> /// Записывает полученный урон юнитами в файл damage_log.txt. /// </summary> public class DamageLogger { private static readonly object _lock = new(); private const string LogFilePath = "damage_log.txt"; /// <summary> /// Обработчик события урона: дописывает строку в журнал, если логирование включено. /// </summary> /// <param name="unit">Пострадавший юнит.</param> /// <param name="damage">Величина урона.</param> public void OnDamageReceived(IUnitInfantry unit, double damage) { if (!GameSettings.LoggingEnabled) return; lock (_lock) { try { string name = unit.GetType().Name; string logEntry = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} | {name} получил {damage:F2} урона. Здоровье: {unit.Health:F2}"; if (unit.Health <= 0) logEntry += " - Погиб!"; File.AppendAllText(LogFilePath, logEntry + Environment.NewLine); } catch { /* игнорируем ошибки записи */ } } } /// <summary> /// Записывает произвольное текстовое событие в журнал урона. /// </summary> /// <param name="message">Текст сообщения.</param> public void LogEvent(string message) { if (!GameSettings.LoggingEnabled) return; lock (_lock) { try { string logEntry = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} | {message}"; File.AppendAllText(LogFilePath, logEntry + Environment.NewLine); } catch { /* игнорируем ошибки записи */ } } } } /// <summary> /// Воспроизводит звуковой сигнал при смерти юнита, если звук включён в настройках. /// </summary> public class DeathSoundPlayer { /// <summary> /// Обработчик смерти юнита: короткий звуковой сигнал в консоли. /// </summary> /// <param name="unit">Погибший юнит.</param> public void OnUnitDied(IUnitInfantry unit) { if (!GameSettings.SoundEnabled) return; try { Console.Beep(800, 500); // Альтернативный вариант это System.Media.SystemSounds.Hand.Play(); } catch { /* игнорируем ошибки звука */ } } } /// <summary> /// Управляет подпиской юнитов на наблюдателей (паттерн Observer): лог урона и звук смерти. /// </summary> public static class ObserverManager { private static readonly DamageLogger _logger = new(); private static readonly DeathSoundPlayer _soundPlayer = new(); /// <summary> /// Подписывает юнита на логирование урона и звук при смерти. /// </summary> /// <param name="unit">Юнит для подписки.</param> public static void Attach(IUnitInfantry unit) { // Отсоединяем на случай повторной подписки Detach(unit); unit.OnDamage += _logger.OnDamageReceived; unit.OnDeath += _soundPlayer.OnUnitDied; } /// <summary> /// Отписывает юнита от всех наблюдателей. /// </summary> /// <param name="unit">Юнит.</param> public static void Detach(IUnitInfantry unit) { unit.OnDamage -= _logger.OnDamageReceived; unit.OnDeath -= _soundPlayer.OnUnitDied; } /// <summary> /// Записывает служебное событие в журнал урона через общий логгер. /// </summary> /// <param name="message">Текст события.</param> public static void LogEvent(string message) { if (!GameSettings.LoggingEnabled) return; _logger.LogEvent(message); } } }