Example #1
0
        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();
        }
Example #2
0
        /// <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
        }