protected DateTime ProcessFileData(YamlFileData fileData, bool dontRun = false) { DateTime currentTime; //-- Header if (!string.IsNullOrWhiteSpace(fileData.Type)) { World.Type = fileData.Type; } if (!string.IsNullOrWhiteSpace(fileData.Version)) { World.Version = fileData.Version; } if (!fileData.ModDate.Equals(new DateTime(0))) { World.ModDate = fileData.ModDate; } World.Author = fileData.Author; //-- Background foreach (var u in fileData.Units) { if (u != null) { if (string.IsNullOrWhiteSpace(u.Id)) { throw new Exception("Unit must have an id"); } World.Units.Add(u.Id, World.CreateUnit(u.Id, u.Name, u.Description, u.Symbol)); } } foreach (var r in fileData.Resources) { if (string.IsNullOrWhiteSpace(r.Id)) { throw new Exception("Resource must have an id"); } World.Resources.Add(r.Id, World.CreateResource(r.Id, r.Name, r.Description, r.Type, string.IsNullOrWhiteSpace(r.Unit_Id) ? null : World.Units[r.Unit_Id], r.Distribution, r.Range, r.Attenuation)); } foreach (var k in fileData.Kpis) { World.Kpis.Add(World.CreateKpi(k.Name, k.Description, k.Formula, !string.IsNullOrEmpty(k.Unit_Id) ? World.Units[k.Unit_Id] : null)); } World.Time.StepUnit = fileData.Time.StepUnit switch { "month" => TimeStep.month, "day" => TimeStep.day, _ => TimeStep.year }; World.Time.StepValue = fileData.Time.StepValue; World.Time.Start = fileData.Time.Start; World.Time.End = fileData.Time.End; World.CreateMap(fileData.Map.SizeX, fileData.Map.SizeY); foreach (var cell in fileData.Map.Cells) { if (cell.Stocks != null) { foreach (var stock in cell.Stocks) { World.Map.Cells[cell.X, cell.Y].SetInitialStock(stock.Key, stock.Value); } } if (!string.IsNullOrWhiteSpace(cell.Jm2_Id)) { var jm2 = World.CreateJM2(cell.Jm2_Id, DataDictionary.ConvertGenericData(cell.Jm2_Init)); World.Map.Cells[cell.X, cell.Y].Jm2 = jm2; } } //-- Current Simulation State var stopWatch = new Stopwatch(); stopWatch.Start(); currentTime = World.Time.Current; if (fileData.CurrentTime.Ticks != DateTime.MinValue.Ticks) { currentTime = fileData.CurrentTime; if (!dontRun) { World.Time.Current = fileData.CurrentTime; } } stopWatch.Stop(); CurrentStateDelay = stopWatch.Elapsed; //-- Done return(currentTime); } }