示例#1
0
        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()
            });
        }
示例#2
0
 public DataMeterPublishStateManager(ISimulationSession session)
 {
     DataMeterPublishStates = DataMeterInstances
                              .DataMeters
                              .Select(x => new DataMeterPublishState(x, session.Area.EnumerateZoneInfos))
                              .ToList();
 }
示例#3
0
        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);
                }
            });
        }
示例#4
0
        public WebServerForm(ISimulationSession simulationSession)
        {
            InitializeComponent();
            this.FormClosing += WebServerForm_FormClosing;


            _webServer = new GameServer(simulationSession, "http://*:80/", false);
            _webServer.StartServer();
        }
示例#5
0
        Task ICleanupRequired.CleanupAsync()
        {
            if (null != session)
            {
                session.Dispose();
                session = null;
            }

            optionsProvider.OptionsChanged -= OnOptionsChanged;

            return(Task.CompletedTask);
        }
示例#6
0
        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();
            }
        }