Esempio n. 1
0
        public override Task StartAsync(CancellationToken cancellationToken)
        {
            SimulationSession simulationSession;

            try
            {
                var persistedSimulation = _citySaveStateController
                                          .LoadFile(WebCityFileName);
                simulationSession =
                    new SimulationSession(new SimulationOptions(persistedSimulation,
                                                                new ProcessOptions(() => false, () => false)));
            }
            catch (Exception ex)
            {
                Logger.Instance.LogException(ex, $"Loading file: '{new FileInfo(WebCityFileName).FullName}'", 100);

                simulationSession = new SimulationSession(
                    new SimulationOptions(new Func <TerraformingOptions>(() =>
                {
                    var t             = new TerraformingOptions();
                    t.HorizontalRiver = t.VerticalRiver = true;
                    t.SetWoodlands(80);
                    t.SetLakes(30);
                    t.SetZoneWidthAndHeight(120);
                    return(t);
                })(), new ProcessOptions(() => false, () => false)));
            }
            simulationSession.StartSimulation();
            _gameServer = new GameServer(simulationSession, "http://+:80/", true);
            _gameServer.StartServer();
            return(Task.CompletedTask);
        }
Esempio n. 2
0
        private void TestWithAmountOfHarbors(int numberOfHarbours)
        {
            var terraFormingOptions = new TerraformingOptions()
            {
                VerticalRiver   = true,
                HorizontalRiver = true
            };

            terraFormingOptions.SetZoneWidthAndHeight(TerraformingOptions.MinWidthAndHeight);
            var area           = new Area(new AreaOptions(() => new Mock <ILandValueCalculator>().Object, terraFormingOptions, new ProcessOptions(() => false, () => false), () => new Mock <ICityServiceStrengthLevels>().Object));
            var shipController = new ShipController(() => area.EnumerateZoneInfos().OfType <IZoneInfo>().ToHashSet(), TimeSpan.FromMilliseconds(1), 1);

            var harbourFactory = new Func <SeaPortZoneClusterConsumption>(
                () => new SeaPortZoneClusterConsumption(
                    () => new ZoneInfoFinder(x => QueryResult <IZoneInfo> .Create(area.EnumerateZoneInfos().SingleOrDefault(y => y.ConsumptionState.GetZoneConsumption() == x))),
                    new ElectricitySupplierBehaviour(10)));

            foreach (var iteration in Enumerable.Range(0, numberOfHarbours))
            {
                var result = area.EnumerateZoneInfos().FirstOrDefault(x => area.ConsumeZoneAt(x, harbourFactory()).Success);

                Assert.IsNotNull(result);
            }
            Assert.AreNotEqual(0, area.CalculatePowergridStatistics());

            var shipDict = new Dictionary <IShip, IZoneInfo>();

            IZoneInfo previousPosition = null;

            foreach (var attempt in Enumerable.Range(0, 10))
            {
                shipController.ForEachActiveVehicle(true, ship =>
                {
                    if (!shipDict.ContainsKey(ship))
                    {
                        shipDict.Add(ship, null);
                    }
                    previousPosition = ship.CurrentPosition;
                    shipDict[ship]   = previousPosition;
                });
                if ((numberOfHarbours * ShipController.AmountOfShipsPerHarbour == shipDict.Count) && shipDict.Values.All(x => x != null))
                {
                    break;
                }
                System.Threading.Thread.Sleep(100);
            }
            Assert.AreEqual(numberOfHarbours * ShipController.AmountOfShipsPerHarbour, shipDict.Count);

            foreach (var iteration in Enumerable.Range(0, 3))
            {
                System.Threading.Thread.Sleep(10);

                shipController.ForEachActiveVehicle(true, ship =>
                {
                    Assert.AreNotSame(previousPosition, ship.CurrentPosition);
                    previousPosition = ship.CurrentPosition;
                });
            }
        }
Esempio n. 3
0
        public static void Main()
        {
            Logger.Instance.OnLogMessage += Instance_OnLogMessage;

            HostFactory.Run(x =>
            {
                var citySaveStateController = new CitySaveStateController(z => { });

                SimulationSession simulationSession;

                try
                {
                    var persistedSimulation = citySaveStateController
                                              .LoadFile(WebCityFileName);
                    simulationSession =
                        new SimulationSession(new SimulationOptions(persistedSimulation,
                                                                    new ProcessOptions(() => false, () => false)));
                }
                catch (Exception ex)
                {
                    Logger.Instance.LogException(ex, $"Loading file: '{new FileInfo(WebCityFileName).FullName}'", 100);

                    simulationSession = new SimulationSession(
                        new SimulationOptions(new Func <TerraformingOptions>(() =>
                    {
                        var t             = new TerraformingOptions();
                        t.HorizontalRiver = t.VerticalRiver = true;
                        t.SetWoodlands(80);
                        t.SetLakes(30);
                        t.SetZoneWidthAndHeight(120);
                        return(t);
                    })(), new ProcessOptions(() => false, () => false)));
                }

                x.Service <GameServer>(s =>
                {
                    s.ConstructUsing(name => new GameServer(simulationSession, "http://+:80/", true));
                    s.WhenStarted(tc =>
                    {
                        tc.StartServer();
                        simulationSession.StartSimulation();
                    });
                    s.WhenStopped(tc =>
                    {
                        citySaveStateController.SaveFile(WebCityFileName, tc.SimulationSession.GeneratePersistedArea());
                        tc.Dispose();
                    });
                });
                x.RunAsLocalSystem();

                x.SetDescription("Hosts the Urbanization web server on TCP Port 80 on all network devices. (For more information, see: https://github.com/Miragecoder/Urbanization)");
                x.SetDisplayName("Urbanization Web Server");
                x.SetServiceName("Urbanization");
            });
        }
        public void VerifyAreaHasHundredZones()
        {
            var terraFormingOptions = new TerraformingOptions();

            terraFormingOptions.SetZoneWidthAndHeight(100);
            var options = new AreaOptions(() => FakeLandValueCalculator.Instance, terraFormingOptions, TestCity.ProcessOptions, () => MockRepository.GenerateMock <ICityServiceStrengthLevels>());

            var area = new Area(options);

            options.WithTerraformingOptions(x =>
            {
                Assert.AreEqual(x.ZoneWidthAndHeight, area.AmountOfZonesX);
                Assert.AreEqual(x.ZoneWidthAndHeight, area.AmountOfZonesY);
            });
        }
        public void VerifyClusterConsumption()
        {
            var terraFormingOptions = new TerraformingOptions();

            terraFormingOptions.SetZoneWidthAndHeight(100);
            var options = new AreaOptions(() => FakeLandValueCalculator.Instance, terraFormingOptions, TestCity.ProcessOptions, () => MockRepository.GenerateMock <ICityServiceStrengthLevels>());
            var area    = new Area(options);

            var predicate = new Func <IZoneInfo, bool>(x => x.Point.X == 2 && x.Point.Y == 4);
            var firstZone = area.EnumerateZoneInfos().Single(predicate);

            Assert.IsTrue(area.EnumerateZoneInfos().Single(predicate).ConsumptionState.GetZoneConsumption() is EmptyZoneConsumption);
            area.ConsumeZoneAt(firstZone, new ResidentialZoneClusterConsumption(() => new ZoneInfoFinder(null)));

            Assert.IsTrue(area.EnumerateZoneInfos().Single(predicate).ConsumptionState.GetZoneConsumption() is ZoneClusterMemberConsumption);
        }
Esempio n. 6
0
        public TerraformingOptions GetTerraformingOptions()
        {
            var options = new TerraformingOptions();

            options.SetZoneWidthAndHeight(sizeTrackBar.Value);
            options.SetWoodlands(treesTrackBar.Value);
            options.SetLakes(lakesTrackBar.Value);
            options.HorizontalRiver = checkBoxHorizontalRiver.Checked;
            options.VerticalRiver   = checkBoxVerticalRiver.Checked;

            options.NorthCoast = cbNorthCoast.Checked;
            options.SouthCoast = cbSouthCoast.Checked;
            options.EastCoast  = cbEastCoast.Checked;
            options.WestCoast  = cbWestCoast.Checked;

            return(options);
        }
        public void VerifyAreaInitiallyHasNoZoneConsumption()
        {
            var terraFormingOptions = new TerraformingOptions();

            terraFormingOptions.SetZoneWidthAndHeight(100);
            var options = new AreaOptions(() => FakeLandValueCalculator.Instance, terraFormingOptions, TestCity.ProcessOptions, () => MockRepository.GenerateMock <ICityServiceStrengthLevels>());

            var area = new Area(options);

            options.WithTerraformingOptions(x =>
            {
                Assert.AreEqual(
                    expected: x.ZoneWidthAndHeight * x.ZoneWidthAndHeight,
                    actual: area
                    .EnumerateZoneInfos()
                    .Count(y => y.ConsumptionState.GetZoneConsumption() is EmptyZoneConsumption)
                    );
            });
        }
Esempio n. 8
0
        private ZoneInfoGrid InitializeZoneInfoGrid(bool withHorizontalRiver, bool withVerticalRiver, bool withWoodlands)
        {
            var r = new RandomTerraformer(
                () => new WaterZoneConsumption(new ZoneInfoFinder(x => QueryResult <IZoneInfo> .Create())),
                () => new WoodlandZoneConsumption(new ZoneInfoFinder(x => QueryResult <IZoneInfo> .Create())));
            var zoneInfoGrid = new ZoneInfoGrid(100, MockRepository.GenerateMock <ILandValueCalculator>());

            var options = new TerraformingOptions()
            {
                HorizontalRiver = withHorizontalRiver,
                VerticalRiver   = withVerticalRiver
            };

            options.SetWoodlands(withWoodlands ? 10 : 0);
            options.SetLakes(0);

            r.ApplyWith(zoneInfoGrid, options);

            return(zoneInfoGrid);
        }
Esempio n. 9
0
        private static Area CreateTestArea(PersistedArea persistedArea = null)
        {
            var terraFormingOptions = new TerraformingOptions
            {
                HorizontalRiver = false,
                VerticalRiver   = false
            };

            terraFormingOptions.SetWoodlands(0);
            terraFormingOptions.SetLakes(0);

            return(persistedArea != null ?
                   new Area(new AreaOptions(() => FakeLandValueCalculator.Instance, persistedArea, ProcessOptions, () => new Mock <ICityServiceStrengthLevels>().Object))
                : new Area(
                       options: new AreaOptions(
                           getLandValueCalculator: () => FakeLandValueCalculator.Instance,
                           terraformingOptions: terraFormingOptions,
                           processOptions: ProcessOptions,
                           getCityServiceStrengthLevels: () => new Mock <ICityServiceStrengthLevels>().Object
                           )
                       ));
        }
 public SimulationOptions(TerraformingOptions terraformingOptions, ProcessOptions processOptions)
 {
     _terraformingOptions = terraformingOptions;
     ProcessOptions       = processOptions;
 }
Esempio n. 11
0
        private void RegisterAreaRenderHelper(TerraformingOptions terraformingOptions = null, PersistedSimulation persistedSimulation = null)
        {
            _gamePanel.Controls.Clear();

            var areaOptions = terraformingOptions != null
                ? new SimulationOptions(terraformingOptions,
                                        new ProcessOptions(() => showGrowthPathFinding.Checked, () => enableMoneyCheatToolStripMenuItem.Checked))
                : new SimulationOptions(persistedSimulation,
                                        new ProcessOptions(() => showGrowthPathFinding.Checked, () => enableMoneyCheatToolStripMenuItem.Checked));

            if (_areaRenderHelper != null)
            {
                _areaRenderHelper.Stop();
                ReloadGamePanel();
            }

            _areaRenderHelper = new SimulationRenderHelper(
                gamePanel: _gamePanel,
                renderZoneOptions: new RenderZoneOptions(
                    showDebugGrowthPathFinding: () => showGrowthPathFinding.Checked,
                    selectedGraphicsManagerFunc: () => _graphicsManagerSelection.GetCurrentOption(),
                    getCurrentOverlayOptionFunc: () => _overlaySelection.GetCurrentOption()
                    ),
                options: areaOptions
                );

            _areaRenderHelper.SimulationSession.OnAreaMessage +=
                (_sender, _e) =>
                statusStrip1.BeginInvoke(new MethodInvoker(() => { toolStripStatusLabel1.Text = _e.Message; }));

            _areaRenderHelper.SimulationSession.OnAreaHotMessage +=
                (_sender, _e) =>
            {
                if (_webserverForm == null)
                {
                    MessageBox.Show(_e.Message, _e.Title, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    statusStrip1.BeginInvoke(new MethodInvoker(() => { toolStripStatusLabel1.Text = _e.Message; }));
                }
            };

            _areaRenderHelper.SimulationSession.OnCityBudgetValueChanged +=
                (_sender, _e) =>
                statusStrip1.BeginInvoke(new MethodInvoker(() =>
            {
                foreach (var x in new[]
                {
                    new
                    {
                        LabelControl = cityBudgetLabel,
                        Text = _e.EventData.CurrentAmountDescription,
                        Amount = _e.EventData.CurrentAmount
                    },
                    new
                    {
                        LabelControl = projectedIncomeLabel,
                        Text = _e.EventData.ProjectedIncomeDescription,
                        Amount = _e.EventData.ProjectedIncome
                    }
                })
                {
                    x.LabelControl.Text      = x.Text;
                    x.LabelControl.ForeColor = x.Amount >= 0
                                ? SystemColors.ControlText
                                : Color.Red;
                }
            }));

            _areaRenderHelper.SimulationSession.OnYearAndOrMonthChanged +=
                (_sender, _e) =>
            {
                if (statusStrip1.IsHandleCreated)
                {
                    statusStrip1.BeginInvoke(new MethodInvoker(
                                                 () => { monthAndYearLabel.Text = _e.EventData.GetCurrentDescription(); }));
                }
            };

            _areaRenderHelper.Start();
            _citySaveStateController.ToggleSaveFunctionalityAvailable();
        }