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); }
protected override void Handle(MapUpdateGrid message) { App.QueueOnMainThread(() => { gridRequests.Remove(message.Coord); Map.AddGrid(message); }); }
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)); } } } } }
protected virtual void Handle(MapUpdateGrid message) { }
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); }