/
expens1ve
/
project_war
Обзор
Документация
Войти
/
expens1ve
/
project_war
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
observer
Engine/GameService.cs
104 строки
4 KB
Vadim
fix conflict
29 апр 2026, 03:02
29 апр 2026, 03:02
78be3e5
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using project_war.Engine.Formations; using project_war.Engine.Interfaces; using project_war.Models; using project_war.Models.Interfaces; using project_war.Persistence.Interfaces; using project_war.Models.Observers; namespace project_war.Engine { public class GameService : IGameService { private readonly IArmyFactory _armyFactory; private readonly IGameSaveManager _saveManager; private readonly IGameEngine _engine; public GameService(IArmyFactory armyFactory, IGameSaveManager saveManager, IGameEngine engine) { _armyFactory = armyFactory ?? throw new ArgumentNullException(nameof(armyFactory)); _saveManager = saveManager ?? throw new ArgumentNullException(nameof(saveManager)); _engine = engine ?? throw new ArgumentNullException(nameof(engine)); } public IArmy CreateRandomArmy(int budget, string name) { var baseArmy = _armyFactory.CreateRandomArmy(budget); var renamedArmy = new Army(name); foreach (var unit in baseArmy.Units) { renamedArmy.AddUnit(unit); } return renamedArmy; } public IArmy CreateManualArmy(int budget, string name, Dictionary<Type, int> config) { var baseArmy = _armyFactory.CreateManualArmy(config, budget); var namedArmy = new Army(name); foreach (var unit in baseArmy.Units) { namedArmy.AddUnit(unit); } return namedArmy; } public (IArmy army1, IArmy army2, int roundNumber, string formationType) LoadGame(string path) { return _saveManager.LoadGameState(path); } public void SaveGame(IArmy army1, IArmy army2, int round, string formationType, string path) { _saveManager.SaveGameState(army1, army2, round, formationType, path); } public IBattlefield StartBattle(IArmy army1, IArmy army2, string? formationType = null) { _engine.StartGame(army1, army2); var battlefield = _engine.GetBattlefield(); if (battlefield == null) { throw new InvalidOperationException("Поле боя не инициализировано. Убедитесь, что StartGame отработал корректно."); } if (ConfigurationManager.Instance.IsDamageLoggingEnabled) { // Логгер урона подписывается на события самого поля боя и держит ссылки на армии _ = new DamageLoggerObserver(army1, army2, battlefield); } if (ConfigurationManager.Instance.IsDeathBeepEnabled) { // Наблюдатель звука смерти тоже работает от глобального события Battlefield _ = new DeathSoundObserver(battlefield); } if (battlefield is Battlefield concreteBattlefield) { concreteBattlefield.SetFormation(CreateFormation(formationType)); } return battlefield; } private static IBattleFormation CreateFormation(string? formationType) { if (string.IsNullOrWhiteSpace(formationType)) { return new BridgeFormation(); } return formationType.Trim() switch { nameof(BridgeFormation) or "Узкий мост" => new BridgeFormation(), nameof(WideBridgeFormation) or "Широкий мост (3 бойца)" => new WideBridgeFormation(), nameof(WallFormation) or "Стенка на стенку" => new WallFormation(), _ => new BridgeFormation() }; } } }