static unsafe void Main(string[] args) { //MapSectionRasterTilePackZero tileZero = new MapSectionRasterTilePackZero(); //byte* addr = (byte*)&tileZero; //Console.WriteLine("Size: {0}", sizeof(MapSectionRasterTilePackZero)); //Console.WriteLine("Status Offset: {0}", &tileZero.Status - addr); //Console.WriteLine("ParentX Offset: {0}", (byte*)&tileZero.ParentX - addr); //Console.WriteLine("ParentY Offset: {0}", (byte*)&tileZero.ParentY - addr); //Console.WriteLine("Sum Offset: {0}", (byte*)&tileZero.Sum - addr); //Console.WriteLine("Gone Offset: {0}", (byte*)&tileZero.Gone - addr); Console.WriteLine(); MapSectionRasterTile tile = new MapSectionRasterTile(); byte *addr = (byte *)&tile; Console.WriteLine("Size: {0}", sizeof(MapSectionRasterTile)); Console.WriteLine("Status Offset: {0}", &tile.Status - addr); Console.WriteLine("ParentX Offset: {0}", (byte *)&tile.ParentX - addr); Console.WriteLine("ParentY Offset: {0}", (byte *)&tile.ParentY - addr); Console.WriteLine("Sum Offset: {0}", (byte *)&tile.Sum - addr); Console.WriteLine("Gone Offset: {0}", (byte *)&tile.Gone - addr); //var tileZeroArray = new MapSectionRasterTilePackZero[ushort.MaxValue * 2]; var tileArray = new MapSectionRasterTile[ushort.MaxValue * 2]; //for (int i = 0; i < 5; i++) //{ // Stopwatch sw = Stopwatch.StartNew(); // int count = 0; // for (int a = 0; a < 1_000_000; a++) // for (int x = 0; x < tileZeroArray.Length; x++) // { // count += tileZeroArray[x].Sum++; // } // Console.WriteLine("Pack=0 Time: " + sw.Elapsed); // sw.Restart(); // count = 0; // for (int a = 0; a < 1_000_000; a++) // for (int x = 0; x < tileArray.Length; x++) // { // count += tileArray[x].Sum++; // } // Console.WriteLine("Pack=1 Time: " + sw.Elapsed); //} //Console.WriteLine("128 elements Pack=0: " + tileZeroArray.Length * sizeof(MapSectionRasterTilePackZero)); //Connection connection = ConnectionManager.Connect("*****@*****.**", "flattiverse=1337"); //Flattiverse.UniverseGroup universeGroup = connection.UniverseGroups["Time Master"]; //UniverseSession session = connection.Join(universeGroup, "dannyd", universeGroup.Teams["None"]); //System.Threading.ThreadPool.QueueUserWorkItem(worker, session); //connection.MessageManager.ReadMessages(); Console.ReadKey(); }
/// <summary> /// /// </summary> public LinkedList <MoveCommand> Pathfind(Vector from, Vector to) { #if DEBUG try { #endif //if (isDisposed) // return null; float size = (currentSectionCount / 2f) * Map.SectionSize; Transformator transformator = new Transformator(-size, size, 0, currentSectionCount); int fromIndex = getMapSectionIndex(transformator, from.X, from.Y); int toIndex = getMapSectionIndex(transformator, to.X, to.Y); if (fromIndex == toIndex) { MapSectionRaster raster = rasters[fromIndex]; Transformator rasterX = new Transformator(raster.MapSection.Left, raster.MapSection.Right, 0, raster.Size); Transformator rasterY = new Transformator(raster.MapSection.Top, raster.MapSection.Bottom, 0, raster.Size); int x = (int)rasterX[from.X]; int y = (int)rasterY[from.Y]; MapSectionRasterTile fromTile = raster.Tiles[x + y * raster.Size]; fromTile.Status |= MapSectionRasterTileStatus.Start; x = (int)rasterX[to.X]; y = (int)rasterY[to.Y]; MapSectionRasterTile toTile = raster.Tiles[x + y * raster.Size]; toTile.Status |= MapSectionRasterTileStatus.Finish; PriorityQueue priorityQueue = new PriorityQueue(raster.Tiles.Length); priorityQueue.Enqueue(fromTile, 0f); MapSectionRasterTile currentTile = null; float step = 0f; while (priorityQueue.Count > 0) { currentTile = priorityQueue.Dequeue(); if ((currentTile.Status & MapSectionRasterTileStatus.Finish) == MapSectionRasterTileStatus.Finish) { Console.WriteLine("Found path to the desired tile"); break; } // TODO: Check if this part is optimizable since we could maybe do some checks beforehand // Check top tile x = (int)rasterX[currentTile.X]; y = (int)rasterY[currentTile.Y - raster.TileSize]; if (x >= 0 && x < raster.Size && y >= 0 && y < raster.Size) { MapSectionRasterTile topTile = raster.Tiles[x + y * raster.Size]; if ((topTile.Status & MapSectionRasterTileStatus.Blocked) != MapSectionRasterTileStatus.Blocked && (topTile.Status & MapSectionRasterTileStatus.Checked) != MapSectionRasterTileStatus.Checked) { topTile.ParentX = currentTile.X; topTile.ParentY = currentTile.Y; priorityQueue.Enqueue(topTile, step /*+ 2f * (Math.Abs(topTile.X - toTile.X) + Math.Abs(topTile.Y - toTile.Y))*/); } } // Check right tile x = (int)rasterX[currentTile.X + raster.TileSize]; y = (int)rasterY[currentTile.Y]; if (x >= 0 && x < raster.Size && y >= 0 && y < raster.Size) { MapSectionRasterTile rightTile = raster.Tiles[x + y * raster.Size]; if ((rightTile.Status & MapSectionRasterTileStatus.Blocked) != MapSectionRasterTileStatus.Blocked && (rightTile.Status & MapSectionRasterTileStatus.Checked) != MapSectionRasterTileStatus.Checked) { rightTile.ParentX = currentTile.X; rightTile.ParentY = currentTile.Y; priorityQueue.Enqueue(rightTile, step /*+ 2f * (Math.Abs(rightTile.X - toTile.X) + Math.Abs(rightTile.Y - toTile.Y))*/); } } // Check bottom tile x = (int)rasterX[currentTile.X]; y = (int)rasterY[currentTile.Y + raster.TileSize]; if (x >= 0 && x < raster.Size && y >= 0 && y < raster.Size) { MapSectionRasterTile bottomTile = raster.Tiles[x + y * raster.Size]; if ((bottomTile.Status & MapSectionRasterTileStatus.Blocked) != MapSectionRasterTileStatus.Blocked && (bottomTile.Status & MapSectionRasterTileStatus.Checked) != MapSectionRasterTileStatus.Checked) { bottomTile.ParentX = currentTile.X; bottomTile.ParentY = currentTile.Y; priorityQueue.Enqueue(bottomTile, step /*+ 2f * (Math.Abs(bottomTile.X - toTile.X) + Math.Abs(bottomTile.Y - toTile.Y))*/); } } // Check left tile x = (int)rasterX[currentTile.X - raster.TileSize]; y = (int)rasterY[currentTile.Y]; if (x >= 0 && x < raster.Size && y >= 0 && y < raster.Size) { MapSectionRasterTile leftTile = raster.Tiles[x + y * raster.Size]; if ((leftTile.Status & MapSectionRasterTileStatus.Blocked) != MapSectionRasterTileStatus.Blocked && (leftTile.Status & MapSectionRasterTileStatus.Checked) != MapSectionRasterTileStatus.Checked) { leftTile.ParentX = currentTile.X; leftTile.ParentY = currentTile.Y; priorityQueue.Enqueue(leftTile, step /*+ 2f * (Math.Abs(leftTile.X - toTile.X) + Math.Abs(leftTile.Y - toTile.Y))*/); } } step++; } LinkedList <MoveCommand> linkedList = new LinkedList <MoveCommand>(); linkedList.AddFirst(new MoveCommand(to.X, to.Y)); while ((currentTile.Status & MapSectionRasterTileStatus.Start) != MapSectionRasterTileStatus.Start) { //Console.WriteLine("Current tile: (" + currentTile.X + " / " + currentTile.Y + ")"); x = (int)rasterX[currentTile.ParentX]; y = (int)rasterY[currentTile.ParentY]; currentTile = raster.Tiles[x + y * raster.Size]; linkedList.AddFirst(new MoveCommand(currentTile.X, currentTile.Y)); } return(linkedList); } else { return(new LinkedList <MoveCommand>(new MoveCommand[] { new MoveCommand(to.X, to.Y) })); // Wut wat is pathfinding Lul } #if DEBUG } catch (Exception ex) { Console.WriteLine("MapPathfinder.Pathfind: "); Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); return(null); } #endif }