コード例 #1
0
            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);
            }
コード例 #2
0
        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);
        }