Ejemplo n.º 1
0
        public void HighLevelSectorAdjustedRecalculate(MultiLevelSector sector)
        {
            WorldArea area = Manager.WorldData.WorldAreas[sector.WorldAreaIndex];

            MultiLevelSectorManager.RemoveAllConnectionsWithinSector(sector);
            ReCalculateDistancesHigherSectorNodes(sector, area);

            // visual
            sector.SearchConnections();
        }
Ejemplo n.º 2
0
        public void InputChanges()
        {
            if (WorldData.Pathfinder.maxLevelAmount != 0)
            {
                _sectorChanges.Clear();
                _sectorEdgeChangesLowLevel.Clear();
                _sectorEdgeChangesHighLevel.Clear();
                WorldArea         area;
                IntVector2        key             = new IntVector2();
                IntVector3        sectorsAreaKey  = new IntVector3();
                List <IntVector3> sectorsAreaRedo = new List <IntVector3>();

                foreach (var tile in TilesBlockedAdjusted)
                {
                    var tileOnEdge = false;

                    if (TilesCostAdjusted.Contains(tile))
                    {
                        TilesCostAdjusted.Remove(tile);
                    }

                    var tilePosKey = tile.GridPos;
                    key.X = tile.WorldAreaIndex;
                    key.Y = tile.SectorIndex;

                    if (!_sectorEdgeChangesLowLevel.ContainsKey(key))
                    {
                        _sectorEdgeChangesLowLevel.Add(key, new List <int>());
                    }

                    area = WorldData.WorldAreas[tile.WorldAreaIndex];
                    var sector = area.SectorGrid[0][tile.SectorIndex];

                    if (tile.GridPos.Y == sector.Top && sector.Top != 0) //top
                    {
                        tileOnEdge = true;
                        if (!_sectorEdgeChangesLowLevel[key].Contains(0))
                        {
                            AddChange(key, tile, area, 0);
                        }
                    }

                    if (tile.GridPos.Y == sector.Bottom && sector.GridY <
                        WorldData.MultiLevelSectorManager.GetSectorGridHeightAtLevel(area, 0) - 1
                        ) //sector.bottom != worldData.tileManager.gridHeight - 1) //bot
                    {
                        tileOnEdge = true;
                        if (!_sectorEdgeChangesLowLevel[key].Contains(1))
                        {
                            AddChange(key, tile, area, 1);
                        }
                    }

                    if (tile.GridPos.X == sector.Left && sector.Left != 0) //left
                    {
                        tileOnEdge = true;
                        if (!_sectorEdgeChangesLowLevel[key].Contains(2))
                        {
                            AddChange(key, tile, area, 2);
                        }
                    }

                    if (tile.GridPos.X == sector.Right && sector.GridX <
                        WorldData.MultiLevelSectorManager.GetSectorGridWidthAtLevel(area, 0) - 1) //right
                    {
                        tileOnEdge = true;
                        if (!_sectorEdgeChangesLowLevel[key].Contains(3))
                        {
                            AddChange(key, tile, area, 3);
                        }
                    }

                    if (!tileOnEdge)
                    {
                        if (!_sectorChanges.Contains(key))
                        {
                            _sectorChanges.Add(key);
                        }
                    }

                    // store tiles that will change how world areas connect
                    if (area.WorldAreaTileConnections.ContainsKey(tilePosKey))
                    {
                        sectorsAreaKey.Z = area.TileGrid[tilePosKey.X][tilePosKey.Y].SectorIndex;
                        foreach (IntVector3 value in area.WorldAreaTileConnections[tilePosKey])
                        {
                            sectorsAreaKey.Y = value.Z;

                            WorldArea tempArea;
                            if (area.Index < sectorsAreaKey.X) // change nothing
                            {
                                tempArea = area;
                            }
                            else // we only generate these connections from the world area with the lowest index
                            {
                                tempArea = WorldData.WorldAreas[value.Z];

                                sectorsAreaKey.Y = area.Index;
                                sectorsAreaKey.Z = tempArea.TileGrid[value.X][value.Y].SectorIndex;
                            }

                            sectorsAreaKey.X = tempArea.Index;

                            if (!sectorsAreaRedo.Contains(sectorsAreaKey))
                            {
                                RemoveWorldAreaNodes(sectorsAreaKey);
                                sectorsAreaRedo.Add(sectorsAreaKey);
                            }
                        }
                    }
                }

                List <MultiLevelSector> higherSectors = new List <MultiLevelSector>();

                // rebuild sector edges
                List <IntVector2> keys = new List <IntVector2>(_sectorEdgeChangesLowLevel.Keys);
                IntVector2        indexKey;
                foreach (var t in keys)
                {
                    indexKey = t;

                    area = WorldData.WorldAreas[indexKey.X];
                    WorldData.MultiLevelSectorManager.LowLevel.RebuildNodesOnSectorEdges(
                        _sectorEdgeChangesLowLevel[indexKey], indexKey.Y, area);
                    MultiLevelSectorManager.RemoveAllConnectionsWithinSector(area.SectorGrid[0][indexKey.Y]);
                    // get all sectors that have to recalculate
                    if (!_sectorChanges.Contains(indexKey))
                    {
                        _sectorChanges.Add(indexKey);
                    }
                }

                foreach (var t in TilesCostAdjusted)
                {
                    key.X = t.WorldAreaIndex;
                    key.Y = t.SectorIndex;

                    if (!_sectorChanges.Contains(key))
                    {
                        _sectorChanges.Add(key);
                    }
                }

                // now we must recalculate connections on sector edges
                foreach (var t in _sectorChanges)
                {
                    indexKey = t;

                    area = WorldData.WorldAreas[indexKey.X];
                    WorldData.MultiLevelSectorManager.LowLevel.ReCalculateDistancesSectorNodes(
                        area.SectorGrid[0][indexKey.Y], area);

                    if (WorldData.Pathfinder.maxLevelAmount > 1)
                    {
                        MultiLevelSector highSector =
                            WorldData.MultiLevelSectorManager.GetHigherSectorFromLower(1,
                                                                                       area.SectorGrid[0][indexKey.Y], area);

                        if (!higherSectors.Contains(highSector))
                        {
                            higherSectors.Add(highSector);
                        }
                    }
                }

                List <IntVector3> sectorEdgeChangesHighLevel = new List <IntVector3>(_sectorEdgeChangesHighLevel.Keys);
                foreach (var t in sectorEdgeChangesHighLevel)
                {
                    WorldData.MultiLevelSectorManager.HighLevel.RebuildNodesOnHighSectorEdges(
                        t, _sectorEdgeChangesHighLevel[t]);
                }

                foreach (var t in higherSectors)
                {
                    WorldData.MultiLevelSectorManager.HighLevel.HighLevelSectorAdjustedRecalculate(t);
                }

                //visual
                foreach (var t in _sectorChanges)
                {
                    indexKey = t;
                    WorldData.WorldAreas[indexKey.X].SectorGrid[0][indexKey.Y].SearchConnections();
                }

                // all sector connections fixed & correct world area nodes removed
                // rebuild world area nodes were we removed them
                for (int i = 0; i < sectorsAreaRedo.Count; i++)
                {
                    area = WorldData.WorldAreas[sectorsAreaRedo[i].X];
                    IntVector2 newKey = new IntVector2(sectorsAreaRedo[i].Y, sectorsAreaRedo[i].Z);

                    foreach (List <IntVector2> group in area.GroupsInSectors[newKey])
                    {
                        WorldData.WorldBuilder.GenerateWordConnectingNodesPerGroup(area, group, newKey);
                    }
                }
            }

            TilesCostAdjusted.Clear();
            TilesBlockedAdjusted.Clear();
            //WorldData.Pathfinder.WorldHasBeenChanged(_sectorChanges);
        }