Exemple #1
0
        /// <summary>
        /// Resizes the current Map.
        /// </summary>
        /// <param name="rows">total rows in the new Map</param>
        /// <param name="cols">total columns in the new Map</param>
        /// <param name="levs">total levels in the new Map</param>
        /// <param name="ceiling">true to add extra levels above the top level,
        /// false to add extra levels below the ground level - but only if a
        /// height difference is found for either case</param>
        public override void MapResize(
            int rows,
            int cols,
            int levs,
            bool ceiling)
        {
            var tileList = MapResizeService.ResizeMapDimensions(
                rows, cols, levs,
                MapSize,
                MapTiles,
                ceiling);

            if (tileList != null)
            {
                MapChanged = true;

                if (levs != MapSize.Levs && ceiling)                 // adjust route-nodes ->
                {
                    int delta = levs - MapSize.Levs;                 // NOTE: map levels are reversed
                    foreach (RouteNode node in Routes)               // so adding levels to the ceiling needs to push the existing nodes down.
                    {
                        node.Lev += delta;
                    }
                }

                if (cols < MapSize.Cols ||                 // check for and ask if user wants to delete any route-nodes outside the new bounds
                    rows < MapSize.Rows ||
                    levs < MapSize.Levs)
                {
                    RouteCheckService.CheckNodeBounds(this);
                }

                MapTiles = tileList;
                MapSize  = new MapSize(rows, cols, levs);

                Level = 0;                 // fires a LevelChangedEvent.
            }
        }
Exemple #2
0
		private void readMap(Stream s, List<ITile> tiles)
		{
			BufferedStream input = new BufferedStream(s);
			int rows = input.ReadByte();
			int cols = input.ReadByte();
			int height = input.ReadByte();

			mapSize = new MapSize(rows, cols, height);

			//map = new MapTile[rows,cols,height];
			mapData = new XCMapTile[rows * cols * height];

			for (int h = 0; h < height; h++)
				for (int r = 0; r < rows; r++)
					for (int c = 0; c < cols; c++)
					{
						int q1 = input.ReadByte();
						int q2 = input.ReadByte();
						int q3 = input.ReadByte();
						int q4 = input.ReadByte();

						this[r, c, h] = createTile(tiles, q1, q2, q3, q4);
					}
			input.Close();
		}
 public bool Equals(MapSize other)
 {
     return(other._rows == _rows &&
            other._cols == _cols &&
            other._levs == _levs);
 }
        /// <summary>
        /// Resizes the current Map.
        /// </summary>
        /// <param name="rows">total rows in the new Map</param>
        /// <param name="cols">total columns in the new Map</param>
        /// <param name="levs">total levels in the new Map</param>
        /// <param name="zType">MRZT_TOP to add or subtract delta-levels
        /// starting at the top level, MRZT_BOT to add or subtract delta-levels
        /// starting at the ground level - but only if a height difference is
        /// found for either case</param>
        /// <returns>a bitwise int of changes
        ///          0x0 - no changes
        ///          0x1 - Map changed
        ///          0x2 - Routes changed</returns>
        public override int MapResize(
            int rows,
            int cols,
            int levs,
            MapResizeService.MapResizeZtype zType)
        {
            int bit = 0x0;

            var tileList = MapResizeService.GetResizedTileList(
                rows, cols, levs,
                MapSize,
                MapTiles,
                zType);

            if (tileList != null)
            {
                bit |= 0x1;

                int
                    preRows = MapSize.Rows,
                    preCols = MapSize.Cols,
                    preLevs = MapSize.Levs;

                if (zType == MapResizeService.MapResizeZtype.MRZT_TOP &&              // adjust route-nodes ->
                    Routes.Any())
                {
                    bit |= 0x2;

                    int delta = (levs - preLevs);                       // NOTE: map levels are inverted so adding or subtracting levels
                    // to the top needs to push any existing node-levels down or up.
                    foreach (RouteNode node in Routes)
                    {
                        if (node.Lev < 128)                         // allow nodes that are OoB to come back into view
                        {
                            if ((node.Lev += delta) < 0)            // NOTE: node x/y/z are stored as bytes.
                            {
                                node.Lev += 256;                    // -> ie. level -1 = level 255
                            }
                        }
                        else
                        {
                            if ((node.Lev += delta - 256) < 0)                                  // nodes above the highest Maplevel maintain
                            {
                                node.Lev += 256;                                                // their relative z-level
                            }
                        }
                    }
                }

                MapSize  = new MapSize(rows, cols, levs);
                MapTiles = tileList;

                if (RouteCheckService.CheckNodeBounds(this))
                {
                    bit |= 0x2;
                }

                ClearRouteNodes();
                SetupRouteNodes();

                Level = 0;                 // fires a LevelChangedEvent.
            }
            return(bit);
        }