public void AddMap(int containerId, Point mapPos, MapWithPriority mapId) { if (!m_mapsByPoint.ContainsKey(containerId)) { m_mapsByPoint.Add(containerId, new Dictionary <Point, List <MapWithPriority> >()); } if (!m_mapsByPoint[containerId].ContainsKey(mapPos)) { m_mapsByPoint[containerId].Add(mapPos, new List <MapWithPriority>()); } m_mapsByPoint[containerId][mapPos].Add(mapId); }
public ProgressionCounter BeginGeneration() { var progression = new ProgressionCounter(); var maps = MapsManager.Instance.EnumerateMaps(); Task.Factory.StartNew(() => { // step 1 : load areas stuff progression.UpdateValue(0, "(1/4) Getting areas ..."); m_subAreas = ObjectDataManager.Instance.EnumerateObjects <SubArea>().ToDictionary(x => x.id); progression.UpdateValue(33); m_areas = ObjectDataManager.Instance.EnumerateObjects <Area>().ToDictionary(x => x.id); progression.UpdateValue(66); m_superAreas = ObjectDataManager.Instance.EnumerateObjects <SuperArea>().ToDictionary(x => x.id); progression.UpdateValue(100); // step 2 : bind to each map his parents areas progression.UpdateValue(0, "(2/4) Getting maps ..."); var mapsPosition = new List <MapPositionData>(); int counter = 0; progression.Total = MapsManager.Instance.MapsCount; foreach (var map in maps) { var pos = new Point(map.X, map.Y); var subArea = m_subAreas.ContainsKey(map.SubAreaId) ? m_subAreas[map.SubAreaId] : null; var area = subArea != null && m_areas.ContainsKey(subArea.areaId) ? m_areas[subArea.areaId] : null; var superArea = area != null && m_subAreas.ContainsKey(area.superAreaId) ? m_superAreas[area.superAreaId] : null; var mapWithPrority = new MapWithPriority(map); if (subArea != null) { m_subAreaMaps.AddRegion(subArea.id, map.Id); m_subAreaMaps.AddMap(subArea.id, pos, mapWithPrority); } if (area != null) { if (!m_areaChildrens.ContainsRegion(area.id, subArea.id)) { m_areaChildrens.AddRegion(area.id, subArea.id); } m_areaChildrens.AddMap(area.id, pos, mapWithPrority); } if (superArea != null) { if (!m_superAreaChildrens.ContainsRegion(superArea.id, area.id)) { m_superAreaChildrens.AddRegion(superArea.id, area.id); } m_superAreaChildrens.AddMap(superArea.id, pos, mapWithPrority); } int?worldmapId = superArea != null ? (int?)superArea.worldmapId : null; if (superArea != null) { if (!m_worldMapsChildrens.ContainsRegion(worldmapId.Value, superArea.id)) { m_worldMapsChildrens.AddRegion(worldmapId.Value, superArea.id); } m_worldMapsChildrens.AddMap(worldmapId.Value, pos, mapWithPrority); } mapsPosition.Add(new MapPositionData { MapId = map.Id, SubAreaId = subArea != null ? subArea.id : (int?)null, AreaId = area != null ? area.id : (int?)null, SuperAreaId = superArea != null ? superArea.id : (int?)null, WorldMapId = worldmapId, X = map.X, Y = map.Y }); progression.UpdateValue(counter++); } progression.UpdateValue(0, "(3/4) Finding neighbours ..."); progression.Total = mapsPosition.Count; // step 3 : found for each map his neighbours foreach (var map in mapsPosition) { var enumerator = FindMapNeighbours(map).GetEnumerator(); enumerator.MoveNext(); map.RightNeighbourId = enumerator.Current; enumerator.MoveNext(); map.TopNeighbourId = enumerator.Current; enumerator.MoveNext(); map.LeftNeighbourId = enumerator.Current; enumerator.MoveNext(); map.BottomNeighbourId = enumerator.Current; Debug.Assert(!enumerator.MoveNext()); progression.Value++; } progression.UpdateValue(0, "(4/4) Saving ..."); // step 4 : save all the datas and dispose the allocated lists using (var client = GetClient()) { var typed = client.As <MapPositionData>(); typed.SetRangeInHash(typed.GetHash <int>(REDIS_KEY), mapsPosition.ToDictionary(x => x.MapId)); client.Set(REDIS_VERSION, VERSION); } // dispose m_subAreaMaps.Dispose(); m_areaChildrens.Dispose(); m_superAreaChildrens.Dispose(); m_worldMapsChildrens.Dispose(); m_subAreas.Clear(); m_areas.Clear(); m_superAreas.Clear(); progression.NotifyEnded(); }); return(progression); }