示例#1
0
        public IMapFile WithMapProperties(IMapFileProperties mapFileProperties)
        {
            var newMap = MakeCopy(this);

            newMap.Properties = mapFileProperties;
            return(newMap);
        }
示例#2
0
        private byte[] CreateDataForMap(IMapFileProperties mapFileProperties, TileSpec spec, int gfx = 1)
        {
            var ret = new List <byte>();

            var serializer = new MapPropertiesSerializer(nes, ses);

            ret.AddRange(serializer.SerializeToByteArray(mapFileProperties));
            ret.AddRange(nes.EncodeNumber(0, 1)); //npc spawns
            ret.AddRange(nes.EncodeNumber(0, 1)); //unknowns
            ret.AddRange(nes.EncodeNumber(0, 1)); //chest spawns

            //tiles
            ret.AddRange(nes.EncodeNumber(1, 1));          //count
            ret.AddRange(nes.EncodeNumber(1, 1));          //y
            ret.AddRange(nes.EncodeNumber(1, 1));          //count
            ret.AddRange(nes.EncodeNumber(1, 1));          //x
            ret.AddRange(nes.EncodeNumber((byte)spec, 1)); //tilespec

            //warps
            ret.AddRange(nes.EncodeNumber(0, 1));

            //gfx
            foreach (var layer in (MapLayer[])Enum.GetValues(typeof(MapLayer)))
            {
                ret.AddRange(nes.EncodeNumber(1, 1));   //count
                ret.AddRange(nes.EncodeNumber(1, 1));   //y
                ret.AddRange(nes.EncodeNumber(1, 1));   //count
                ret.AddRange(nes.EncodeNumber(1, 1));   //x
                ret.AddRange(nes.EncodeNumber(gfx, 2)); //gfx value
            }

            ret.AddRange(nes.EncodeNumber(0, 1)); //signs

            return(ret.ToArray());
        }
        public void SetUp()
        {
            _props = new MapFileProperties();

            _mapPropertiesSerializer = new MapPropertiesSerializer(
                new NumberEncoderService(), new MapStringEncoderService());
        }
        private static byte[] CreateExpectedBytes(IMapFileProperties props)
        {
            var numberEncoderService    = new NumberEncoderService();
            var mapStringEncoderService = new MapStringEncoderService();
            var ret = new List <byte>();

            ret.AddRange(Encoding.ASCII.GetBytes(props.FileType));
            ret.AddRange(props.Checksum);

            var fullName    = Enumerable.Repeat((byte)0xFF, 24).ToArray();
            var encodedName = mapStringEncoderService.EncodeMapString(props.Name);

            Array.Copy(encodedName, 0, fullName, fullName.Length - encodedName.Length, encodedName.Length);
            ret.AddRange(fullName);

            ret.AddRange(numberEncoderService.EncodeNumber(props.PKAvailable ? 3 : 0, 1));
            ret.AddRange(numberEncoderService.EncodeNumber((byte)props.Effect, 1));
            ret.AddRange(numberEncoderService.EncodeNumber(props.Music, 1));
            ret.AddRange(numberEncoderService.EncodeNumber(props.MusicExtra, 1));
            ret.AddRange(numberEncoderService.EncodeNumber(props.AmbientNoise, 2));
            ret.AddRange(numberEncoderService.EncodeNumber(props.Width, 1));
            ret.AddRange(numberEncoderService.EncodeNumber(props.Height, 1));
            ret.AddRange(numberEncoderService.EncodeNumber(props.FillTile, 2));
            ret.AddRange(numberEncoderService.EncodeNumber(props.MapAvailable ? 1 : 0, 1));
            ret.AddRange(numberEncoderService.EncodeNumber(props.CanScroll ? 1 : 0, 1));
            ret.AddRange(numberEncoderService.EncodeNumber(props.RelogX, 1));
            ret.AddRange(numberEncoderService.EncodeNumber(props.RelogY, 1));
            ret.AddRange(numberEncoderService.EncodeNumber(props.Unknown2, 1));

            return(ret.ToArray());
        }
示例#5
0
        private Matrix <WarpMapEntity> ReadWarpTiles(MemoryStream ms, IMapFileProperties properties)
        {
            var warps = new Matrix <WarpMapEntity>(properties.Height + 1, properties.Width + 1, DEFAULT_WARP);

            var numberOfWarpRows = _numberEncoderService.DecodeNumber((byte)ms.ReadByte());

            for (int i = 0; i < numberOfWarpRows; ++i)
            {
                var y = _numberEncoderService.DecodeNumber((byte)ms.ReadByte());
                var numberOfWarpColumns = _numberEncoderService.DecodeNumber((byte)ms.ReadByte());

                for (int j = 0; j < numberOfWarpColumns; ++j)
                {
                    var rawWarpData = new byte[WarpMapEntity.DATA_SIZE];
                    ms.Read(rawWarpData, 0, rawWarpData.Length);

                    var warp = _warpMapEntitySerializer.DeserializeFromByteArray(rawWarpData).WithY(y);

                    if (warp.X <= properties.Width && warp.Y <= properties.Height)
                    {
                        warps[warp.Y, warp.X] = warp;
                    }
                }
            }

            return(warps);
        }
示例#6
0
        private Matrix <TileSpec> ReadTileSpecs(MemoryStream ms, IMapFileProperties properties)
        {
            var tiles = new Matrix <TileSpec>(properties.Height + 1, properties.Width + 1, DEFAULT_TILE);

            var numberOfTileRows = _numberEncoderService.DecodeNumber((byte)ms.ReadByte());

            for (int i = 0; i < numberOfTileRows; ++i)
            {
                var y = _numberEncoderService.DecodeNumber((byte)ms.ReadByte());
                var numberOfTileColumns = _numberEncoderService.DecodeNumber((byte)ms.ReadByte());

                for (int j = 0; j < numberOfTileColumns; ++j)
                {
                    var x    = _numberEncoderService.DecodeNumber((byte)ms.ReadByte());
                    var spec = (TileSpec)_numberEncoderService.DecodeNumber((byte)ms.ReadByte());

                    if (x <= properties.Width && y <= properties.Height)
                    {
                        tiles[y, x] = spec;
                    }
                }
            }

            return(tiles);
        }
        public void MapFileProperties_SerializeToByteArray_HasExpectedFormat()
        {
            _props = CreateMapPropertiesWithSomeTestData(_props);

            var expectedBytes = CreateExpectedBytes(_props);
            var actualBytes   = _mapPropertiesSerializer.SerializeToByteArray(_props);

            CollectionAssert.AreEqual(expectedBytes, actualBytes);
        }
        public void MapFileProperties_CustomProperties_NotChangedWhenDeserialized()
        {
            var expected = CreateMapPropertiesWithSomeTestData(_props);
            var bytes    = CreateExpectedBytes(expected);

            _props = _mapPropertiesSerializer.DeserializeFromByteArray(bytes);

            Assert.AreEqual(new MapFileProperties().MapID, _props.MapID);
            Assert.AreEqual(new MapFileProperties().FileSize, _props.FileSize);
            Assert.AreEqual(new MapFileProperties().HasTimedSpikes, _props.HasTimedSpikes);
        }
 private static IMapFileProperties CreateMapPropertiesWithSomeTestData(IMapFileProperties props)
 {
     return(props.WithChecksum(new byte[] { 1, 2, 3, 4 })
            .WithName("Some test name")
            .WithWidth(200)
            .WithHeight(100)
            .WithEffect(MapEffect.Quake)
            .WithMusic(123)
            .WithMusicExtra(98)
            .WithAmbientNoise(4567)
            .WithFillTile(6969)
            .WithRelogX(33)
            .WithRelogY(22)
            .WithUnknown2(100)
            .WithMapAvailable(true)
            .WithScrollAvailable(false)
            .WithPKAvailable(true));
 }
示例#10
0
 private MapFile(IMapFileProperties properties,
                 Matrix <TileSpec> tiles,
                 Matrix <WarpMapEntity> warps,
                 Dictionary <MapLayer, Matrix <int> > gfx,
                 List <NPCSpawnMapEntity> npcSpawns,
                 List <UnknownMapEntity> unknowns,
                 List <ChestSpawnMapEntity> chests,
                 List <SignMapEntity> signs)
 {
     Properties    = properties;
     _mutableTiles = tiles;
     _mutableWarps = warps;
     _mutableGFX   = gfx;
     SetReadOnlyGFX();
     _mutableNPCSpawns   = npcSpawns;
     _mutableUnknowns    = unknowns;
     _mutableChestSpawns = chests;
     _mutableSigns       = signs;
 }
        public void MapFileProperties_DeserializeFromByteArray_HasExpectedValues()
        {
            var expected = CreateMapPropertiesWithSomeTestData(_props);
            var bytes    = CreateExpectedBytes(expected);

            _props = _mapPropertiesSerializer.DeserializeFromByteArray(bytes);

            foreach (var property in expected.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                var expectedValue = property.GetValue(expected);
                var actualValue   = property.GetValue(_props);

                if (expectedValue is ICollection && actualValue is ICollection)
                {
                    CollectionAssert.AreEqual((ICollection)expectedValue, (ICollection)actualValue);
                }
                else
                {
                    Assert.AreEqual(expectedValue, actualValue, "Property {0} is not equal!", property.Name);
                }
            }
        }
示例#12
0
        private Dictionary <MapLayer, Matrix <int> > ReadGFXLayers(MemoryStream ms, IMapFileProperties properties)
        {
            var gfx = new Dictionary <MapLayer, Matrix <int> >();

            var layers        = (MapLayer[])Enum.GetValues(typeof(MapLayer));
            var twoByteBuffer = new byte[2];

            foreach (var layer in layers)
            {
                if (ms.Position == ms.Length)
                {
                    break;
                }

                gfx.Add(layer, new Matrix <int>(properties.Height + 1, properties.Width + 1, DEFAULT_GFX));

                var numberOfRowsThisLayer = _numberEncoderService.DecodeNumber((byte)ms.ReadByte());
                for (int i = 0; i < numberOfRowsThisLayer; ++i)
                {
                    var y = _numberEncoderService.DecodeNumber((byte)ms.ReadByte());
                    var numberOfColsThisLayer = _numberEncoderService.DecodeNumber((byte)ms.ReadByte());

                    for (int j = 0; j < numberOfColsThisLayer; ++j)
                    {
                        var x = _numberEncoderService.DecodeNumber((byte)ms.ReadByte());

                        ms.Read(twoByteBuffer, 0, twoByteBuffer.Length);
                        var gfxID = (ushort)_numberEncoderService.DecodeNumber(twoByteBuffer);

                        if (x <= properties.Width && y <= properties.Height)
                        {
                            gfx[layer][y, x] = gfxID;
                        }
                    }
                }
            }

            return(gfx);
        }