private void ClearLargeTiles(MapState mapState, Random rng, int tileX, int tileY, int tileXLimit, int tileYLimit) { #if DEBUG Console.Out.WriteLine("ClearLargeTiles ({0},{1})-({2},{3})", tileX, tileY, tileXLimit, tileYLimit); #endif for (int layer = 0; layer < 4; layer++) { for (int y = tileYLimit - 1; y >= tileY; y--) { for (int x = tileXLimit - 1; x >= tileX; x--) { Tile t = mapState.GetTile(layer, x, y); if (t != null && t.IsLarge) { int baseX = x - t.XPosition; int baseY = y - t.YPosition; SelectTilesBase(mapState, rng, baseX, baseY, baseX + t.Width, baseY + t.Height); } } } } }
public void CopyFrom(MapState state) { Debug.Assert(state.squareKinds.Width == squareKinds.Width); Debug.Assert(state.squareKinds.Height == squareKinds.Height); for (int x = 0; x < squareKinds.Width; x++) { for (int y = 0; y < squareKinds.Height; y++) { squareKinds[x, y] = state.squareKinds[x, y]; } } for (int x = 0; x < squareKinds.Width + 1; x++) { for (int y = 0; y < squareKinds.Height + 1; y++) { for (int layer = 0; layer < 4; layer++) { layers[layer].Tiles[x, y] = state.layers[layer].Tiles[x, y]; } } } }
private void SelectLargeTiles(MapState mapState, Random rng, int tileX, int tileY, int tileXLimit, int tileYLimit) { if (rng == null) { return; } int width = mapState.Width; int height = mapState.Height; if (tileX < 0) { tileX = 0; } if (tileY < 0) { tileY = 0; } if (tileXLimit >= width) { tileXLimit = width - 1; } if (tileYLimit >= height) { tileYLimit = height - 1; } for (int layer = 0; layer < 4; layer++) { Grid <BorderKind> terrainId = new Grid <BorderKind>(width + 2, height + 2); for (int y = 0; y < terrainId.Height; y++) { for (int x = 0; x < terrainId.Width; x++) { terrainId[x, y] = mapState.GetSquareKind(x - 1, y - 1).LayerTerrainId[layer]; } } for (int x = 0; x < tileXLimit; x++) { for (int y = 0; y < tileYLimit; y++) { if (rng.NextDouble() < 0.5) { continue; } Tile oldTile = mapState.GetTile(layer, x, y); if (oldTile == null || oldTile.IsLarge) { continue; } Tile t = GetTile(rng, x, y, terrainId, true, null); if (t != null) { if (x + t.Width - 1 < tileX) { continue; } if (y + t.Height - 1 < tileY) { continue; } if (CanPlaceLargeTile(mapState, t, layer, x, y)) { PlaceLargeTile(mapState, t, layer, x, y); } } } } } }
public void SerializeTo(StreamWriter stream) { TileSet tileSet = this.tileSet; MapState state = this.state; Dictionary <TerrainKind, string> terrainIds = new Dictionary <TerrainKind, string>(); for (int i = 0; i < tileSet.TerrainByIndex.Length; i++) { terrainIds[tileSet.TerrainByIndex[i]] = i.ToString(); } Dictionary <Tile, string> tileIds = new Dictionary <Tile, string>(); for (int i = 0; i < tileSet.TileList.Count; i++) { tileIds[tileSet.TileList[i]] = i.ToString(); } XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; XmlWriter xml = XmlWriter.Create(stream, settings); xml.WriteStartElement("Map"); xml.WriteElementString("Tileset", "Linedraw"); xml.WriteElementString("Width", Width.ToString()); xml.WriteElementString("Height", Height.ToString()); xml.WriteStartElement("Terrain"); for (int y = 0; y < Height; y++) { for (int x = 0; x < Width; x++) { xml.WriteElementString("Square", terrainIds[this.state.GetSquareKind(x, y)]); } } xml.WriteEndElement(); /* Terrain */ xml.WriteStartElement("Tiles"); for (int layer = 0; layer < 4; layer++) { for (int y = 0; y < Height + 1; y++) { for (int x = 0; x < Width + 1; x++) { Tile tile = this.state.GetTile(layer, x, y); if (tile.IsLarge && (tile.XPosition > 0 || tile.YPosition > 0)) { continue; } if (tile.IsLarge) { tile = tile.SuperTile; } xml.WriteStartElement("Tile"); xml.WriteElementString("Layer", layer.ToString()); xml.WriteElementString("X", x.ToString()); xml.WriteElementString("Y", y.ToString()); xml.WriteElementString("Value", tileIds[tile]); xml.WriteEndElement(); /* Tile */ } } } xml.WriteEndElement(); /* Tiles */ xml.WriteEndElement(); /* Map */ xml.Flush(); }
public static Map DeserializeFrom(StreamReader stream) { XmlReader xml = XmlReader.Create(stream); xml.ReadStartElement("Map"); String tilesetName = xml.ReadElementString("Tileset"); if (tilesetName != "Linedraw") { throw new NotImplementedException(); } TileSet tileSet = TileSet.Load(@"Data\Simple.mdts"); int width = int.Parse(xml.ReadElementString("Width")); int height = int.Parse(xml.ReadElementString("Height")); Map map = new Map(tileSet, width, height); MapState state = map.state; xml.ReadStartElement("Terrain"); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int tileId = int.Parse(xml.ReadElementString("Square")); state.SetSquareKind(x, y, tileSet.TerrainByIndex[tileId]); } } xml.ReadEndElement(); /* Terrain */ xml.ReadStartElement("Tiles"); while (xml.IsStartElement("Tile")) { xml.ReadStartElement("Tile"); int layer = int.Parse(xml.ReadElementString("Layer")); int x = int.Parse(xml.ReadElementString("X")); int y = int.Parse(xml.ReadElementString("Y")); int value = int.Parse(xml.ReadElementString("Value")); Tile tile = tileSet.TileList[value]; if (tile.IsLarge) { for (int subX = 0; subX < tile.Width; subX++) { for (int subY = 0; subY < tile.Height; subY++) { state.SetTile(layer, x + subX, y + subY, tile.GetSubtile(subX, subY)); } } } else { state.SetTile(layer, x, y, tile); } xml.ReadEndElement(); /* Tile */ } xml.ReadEndElement(); /* Tiles */ xml.ReadEndElement(); /* Map */ // TODO: Verify that map is correct map.ClearHoverTerrain(); return(map); }
public bool NeedsDraw(MapState state, int squareX, int squareY) { return(state.GetSquareKind(squareX, squareY) != terrain); }
private static void SetTerrainBase(MapState mapState, int squareX, int squareY, TerrainKind terrain) { mapState.SetSquareKind(squareX, squareY, terrain); }