public CityBudgetState GenerateCityBudgetState(ISimulationSession session) { var statistics = session.GetAllCityStatisticsForCurrentYear(); return(new CityBudgetState { cityServiceStates = CityServiceDefinition .CityServiceDefinitions .Select(x => new CityServiceState { name = x.Name, projectedExpenses = x.GetProjectedExpenses(statistics), currentRate = x.CurrentRate(session.CityBudgetConfiguration).ToString("P") }) .ToArray(), taxStates = TaxDefinition .TaxDefinitions .Select(x => new CityTaxState { name = x.Name, projectedIncome = x.GetProjectedIncome(statistics), currentRate = x.CurrentRate(session.CityBudgetConfiguration).ToString("P") }) .ToArray() }); }
public DataMeterPublishStateManager(ISimulationSession session) { DataMeterPublishStates = DataMeterInstances .DataMeters .Select(x => new DataMeterPublishState(x, session.Area.EnumerateZoneInfos)) .ToList(); }
private async Task RunSimulationAsync(object notused) { if (null != session) { session.Updated -= OnSessionUpdated; session.Dispose(); session = null; return; } session = await simulation.RunAsync().ConfigureAwait(false); await dp.Dispatcher.ExecuteAsync(() => { session.Updated += OnSessionUpdated; Beehives.Clear(); foreach (var beehive in session.Beehives) { var model = new BeehiveViewModel { Number = beehive.Number, MaximumNumberOfBees = beehive.MaximumNumberOfBees, CurrentBeesCount = beehive.Bees.Count() }; beehive.Changed += OnBeehiveChanged; Beehives.Add(model); } }); }
public WebServerForm(ISimulationSession simulationSession) { InitializeComponent(); this.FormClosing += WebServerForm_FormClosing; _webServer = new GameServer(simulationSession, "http://*:80/", false); _webServer.StartServer(); }
Task ICleanupRequired.CleanupAsync() { if (null != session) { session.Dispose(); session = null; } optionsProvider.OptionsChanged -= OnOptionsChanged; return(Task.CompletedTask); }
public GameServer(ISimulationSession simulationSession, string url, bool controlVehicles) { if (string.IsNullOrWhiteSpace(url)) { throw new ArgumentException("", nameof(url)); } _simulationSession = simulationSession ?? throw new ArgumentNullException(nameof(simulationSession)); _url = url; _controlVehicles = controlVehicles; List <ClientZoneInfo> previous = null; _simulationSession.OnAreaMessage += SimulationSession_OnAreaMessage; _simulationSession.OnYearAndOrMonthChanged += SimulationSession_OnYearAndOrMonthChanged; _simulationSession.OnCityBudgetValueChanged += SimulationSession_OnCityBudgetValueChanged; _simulationSession.OnAreaHotMessage += SimulationSession_OnAreaHotMessage; var zoneInfoBatchLooper = new LoopBatchEnumerator <IReadOnlyZoneInfo>(_simulationSession.Area.EnumerateZoneInfos().ToList()); var dataMeterStateManager = new DataMeterPublishStateManager(simulationSession); _dataMeterStateLooper = new NeverEndingTask("Data meter state submission", async() => { foreach (var x in dataMeterStateManager.DataMeterPublishStates) { await Startup.WithSimulationHub(async hub => { foreach (var batch in x.GetChanged().GetBatched(100)) { await hub .Clients .Group(SimulationHub.GetDataMeterGroupName(x.DataMeter.WebId)) .SendAsync("submitDataMeterInfos", batch); } }); } }, _cancellationTokenSource.Token, 10); _looper = new NeverEndingTask("SignalR Game state submission", async() => { await Startup.WithSimulationHub(async simulationHub => { await simulationHub .Clients .All .SendAsync("submitZoneInfos", zoneInfoBatchLooper.GetBatch().Select(ClientZoneInfo.Create), _cancellationTokenSource.Token); var zoneInfos = _simulationSession.Area.EnumerateZoneInfos() .Select(ClientZoneInfo.Create) .ToList(); var toBeSubmitted = zoneInfos; if (previous != null) { var previousUids = previous.Select(x => x.GetIdentityString()).ToHashSet(); toBeSubmitted = zoneInfos.Where(z => !previousUids.Contains(z.GetIdentityString())).ToList(); } foreach (var toBeSubmittedBatch in toBeSubmitted.GetBatched(20)) { await simulationHub .Clients .All .SendAsync("submitZoneInfos", toBeSubmittedBatch); } previous = zoneInfos; try { var list = new List <ClientVehiclePositionInfo>(); foreach (var vehicleController in _simulationSession.Area.EnumerateVehicleControllers()) { vehicleController .ForEachActiveVehicle(_controlVehicles, vehicle => { list.AddRange(TilesetProvider .GetBitmapsAndPointsFor(vehicle) .Select(ClientVehiclePositionInfo.Create) ); }); } await simulationHub .Clients .All .SendAsync("submitVehicleStates", list); } catch (Exception ex) { Logger.Instance.WriteLine("Possible race condition-based exception:: " + ex); } }); }, _cancellationTokenSource.Token, 10); if (Instance == null) { Instance = this; } else { throw new InvalidOperationException(); } }