예제 #1
0
        public SectorTemplate(DUNFile dun, TILFile til, byte[] solData)
        {
            Width    = dun.Width * 2;
            Height   = dun.Height * 2;
            data     = new int[Width * Height];
            passable = new byte[Width * Height];

            for (int j = 0; j < dun.Height; ++j)
            {
                for (int i = 0; i < dun.Width; ++i)
                {
                    int line0 = j * Width * 2 + i * 2;
                    int line1 = line0 + Width;

                    var bi = dun.GetTileIndex(i, j);
                    if (bi < 0)
                    {
                        data[line0 + 0]     = -1;
                        data[line0 + 1]     = -1;
                        data[line1 + 0]     = -1;
                        data[line1 + 1]     = -1;
                        passable[line0 + 0] = 0;
                        passable[line0 + 1] = 0;
                        passable[line1 + 0] = 0;
                        passable[line1 + 1] = 0;
                        continue;
                    }

                    var b = til.GetBlock(bi);
                    data[line0 + 0]     = b.Top;
                    data[line0 + 1]     = b.Right;
                    data[line1 + 0]     = b.Left;
                    data[line1 + 1]     = b.Bottom;
                    passable[line0 + 0] = (byte)((solData[b.Top] & 1) == 0 ? 1 : 0);
                    passable[line0 + 1] = (byte)((solData[b.Right] & 1) == 0 ? 1 : 0);
                    passable[line1 + 0] = (byte)((solData[b.Left] & 1) == 0 ? 1 : 0);
                    passable[line1 + 1] = (byte)((solData[b.Bottom] & 1) == 0 ? 1 : 0);
                }
            }
        }
예제 #2
0
        public static Level Load(MPQArchive mpq)
        {
            var palette = new byte[768];

            using (var f = mpq.Open("levels/towndata/town.pal")) {
                var len = f.Read(palette, 0, 768);
                Debug.Assert(len == palette.Length);
            }

            byte[] solData;
            using (var f = mpq.Open("levels/towndata/town.sol")) {
                solData = new byte[f.Length];
                var len = f.Read(solData, 0, (int)f.Length);
                Debug.Assert(len == f.Length);
            }

            var celFile = CELFile.Load(mpq, "levels/towndata/town.cel");
            var minFile = MINFile.Load(mpq, "levels/towndata/town.min");
            var tilFile = TILFile.Load(mpq, "levels/towndata/town.til");

            var dunNames = new string[] {
                "levels/towndata/sector1s.dun",
                "levels/towndata/sector2s.dun",
                "levels/towndata/sector3s.dun",
                "levels/towndata/sector4s.dun"
            };

            var sectors = new SectorTemplate[4];

            for (int i = 0; i < dunNames.Length; ++i)
            {
                var dunFile = DUNFile.Load(mpq, dunNames[i]);
                sectors[i] = new SectorTemplate(dunFile, tilFile, solData);
            }

            int mapWidth  = sectors[0].Width + sectors[3].Width;
            int mapHeight = sectors[0].Height + sectors[3].Height;
            var map       = new Map(mapWidth, mapHeight);

            map.PlaceSector(sectors[3], 0, 0);
            map.PlaceSector(sectors[2], 0, sectors[3].Height);
            map.PlaceSector(sectors[1], sectors[3].Width, 0);
            map.PlaceSector(sectors[0], sectors[3].Width, sectors[3].Height);

            var packer = new TextureAtlasPacker(2048);

            for (int i = 0; i < celFile.NumFrames; ++i)
            {
                var frame  = celFile.GetFrame(i, palette);
                int rectId = packer.Insert(frame.Data, frame.Width, frame.Height, true);
                if (rectId < 0)
                {
                    throw new Exception("atlas is full: " + i);
                }
            }

            var atlas = packer.CreateAtlas();

            return(new Level {
                Map = map,
                Tileset = atlas,
                PillarDefs = minFile
            });
        }