Esempio n. 1
0
        public static MapUpdateGrid ReadMapUpdateEvent(this BinaryDataReader reader)
        {
            var msg = new MapUpdateGrid
            {
                Coord       = reader.ReadInt32Coord(),
                MinimapName = reader.ReadCString(),
                Overlays    = new int[100 * 100]
            };

            var pfl = new byte[256];

            while (true)
            {
                int pidx = reader.ReadByte();
                if (pidx == 255)
                {
                    break;
                }
                pfl[pidx] = reader.ReadByte();
            }

            reader    = new BinaryDataReader(Unpack(reader.ReadRemaining()));
            msg.Tiles = reader.ReadBytes(100 * 100);
            while (true)
            {
                int pidx = reader.ReadByte();
                if (pidx == 255)
                {
                    break;
                }
                int fl   = pfl[pidx];
                int type = reader.ReadByte();
                var c1   = new Point2D(reader.ReadByte(), reader.ReadByte());
                var c2   = new Point2D(reader.ReadByte(), reader.ReadByte());

                int ol;
                if (type == 0)
                {
                    ol = ((fl & 1) == 1) ? 2 : 1;
                }
                else if (type == 1)
                {
                    ol = ((fl & 1) == 1) ? 8 : 4;
                }
                else
                {
                    continue;
                }

                for (int y = c1.Y; y <= c2.Y; y++)
                {
                    for (int x = c1.X; x <= c2.X; x++)
                    {
                        msg.Overlays[y * 100 + x] |= ol;
                    }
                }
            }

            return(msg);
        }
Esempio n. 2
0
 protected override void Handle(MapUpdateGrid message)
 {
     App.QueueOnMainThread(() =>
     {
         gridRequests.Remove(message.Coord);
         Map.AddGrid(message);
     });
 }
Esempio n. 3
0
        public void AddGrid(MapUpdateGrid message)
        {
            var random = new Random(RandomUtils.GetSeed(message.Coord));
            var gc     = message.Coord;
            var tiles  = new MapTile[message.Tiles.Length];

            for (int i = 0; i < message.Tiles.Length; i++)
            {
                var tile    = message.Tiles[i];
                var overlay = message.Overlays[i];
                var tileset = tilesets[tile];
                if (tileset == null)
                {
                    throw new Exception($"Unknown tileset ({tile})");
                }
                tiles[i] = new MapTile(this, GetAbsoluteTileCoord(gc, i), tile, overlay, tileset.GroundTiles.PickRandom(random));
            }
            var grid = new MapGrid(gc, message.MinimapName, tiles);

            grids[gc] = grid;

            // generate flavor
            int ox = gc.X * Geometry.GridWidth;
            int oy = gc.Y * Geometry.GridHeight;

            for (int y = 0; y < Geometry.GridHeight; y++)
            {
                for (int x = 0; x < Geometry.GridWidth; x++)
                {
                    var set = GetTileset(grid[x, y].Type);
                    if (set.FlavorDensity != 0 && set.FlavorObjects.Count > 0)
                    {
                        if (random.Next(set.FlavorDensity) == 0)
                        {
                            var fo = set.FlavorObjects.PickRandom(random);
                            flavorObjects.Add(Tuple.Create(new Point2D(
                                                               (x + ox) * Geometry.TileWidth,
                                                               (y + oy) * Geometry.TileHeight), fo));
                        }
                    }
                }
            }
        }
Esempio n. 4
0
 protected virtual void Handle(MapUpdateGrid message)
 {
 }
Esempio n. 5
0
        public static MapUpdateGrid ReadMapUpdateEvent(this BinaryDataReader reader)
        {
            var ev = new MapUpdateGrid {
                Coord       = reader.ReadInt32Coord(),
                MinimapName = reader.ReadCString(),
                Overlays    = new int[100 * 100],
                Z           = new short[100 * 100]
            };

            var pfl = new byte[256];

            while (true)
            {
                int pidx = reader.ReadByte();
                if (pidx == 255)
                {
                    break;
                }
                pfl[pidx] = reader.ReadByte();
            }

            var blob = Unpack(reader.ReadRemaining());

            reader = new BinaryDataReader(blob);
            ev.Id  = reader.ReadInt64();
            var tilesets = new List <TilesetBinding>();

            while (true)
            {
                var tilesetId = reader.ReadByte();
                if (tilesetId == 255)
                {
                    break;
                }
                var name    = reader.ReadCString();
                var version = reader.ReadUInt16();
                tilesets.Add(new TilesetBinding {
                    Id = tilesetId, Name = name, Version = version
                });
            }
            ev.Tilesets = tilesets.ToArray();
            ev.Tiles    = reader.ReadBytes(100 * 100);
            for (int i = 0; i < ev.Z.Length; i++)
            {
                ev.Z[i] = reader.ReadInt16();
            }
            while (true)
            {
                int pidx = reader.ReadByte();
                if (pidx == 255)
                {
                    break;
                }
                int fl   = pfl[pidx];
                int type = reader.ReadByte();
                var c1   = new Point2D(reader.ReadByte(), reader.ReadByte());
                var c2   = new Point2D(reader.ReadByte(), reader.ReadByte());

                int ol;
                if (type == 0)
                {
                    ol = ((fl & 1) == 1) ? 2 : 1;
                }
                else if (type == 1)
                {
                    ol = ((fl & 1) == 1) ? 8 : 4;
                }
                else if (type == 2)
                {
                    ol = ((fl & 1) == 1) ? 32 : 16;
                }
                else
                {
                    throw new Exception("Unknown plot type: " + type);
                }

                for (int y = c1.Y; y <= c2.Y; y++)
                {
                    for (int x = c1.X; x <= c2.X; x++)
                    {
                        ev.Overlays[y * 100 + x] |= ol;
                    }
                }
            }
            return(ev);
        }