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); }
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; }); } }
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); }
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) ); }); }
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); }
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; }
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(); }