public void HighLevelSectorAdjustedRecalculate(MultiLevelSector sector) { WorldArea area = Manager.WorldData.WorldAreas[sector.WorldAreaIndex]; MultiLevelSectorManager.RemoveAllConnectionsWithinSector(sector); ReCalculateDistancesHigherSectorNodes(sector, area); // visual sector.SearchConnections(); }
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); }