public IMapFile WithMapProperties(IMapFileProperties mapFileProperties) { var newMap = MakeCopy(this); newMap.Properties = mapFileProperties; return(newMap); }
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()); }
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); }
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)); }
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); } } }
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); }