public static DlmCellData ReadFromStream(short id, byte version, IDataReader reader) { var cell = new DlmCellData(id); cell.m_rawFloor = reader.ReadSByte(); if (cell.m_rawFloor == -128) { return(cell); } if (version >= 9) { var data = reader.ReadShort(); // invert first bit data = data.FlipBit(0); data = data.FlipBit(3); if (version < 10) { // havenbag bit (8th) not used data = data.ShiftBitsLeft(8, 1); } cell.m_data = data; } else { var data = reader.ReadByte(); data = data.ShiftBitsLeft(1, 1); data = data.SwapBits(7, 1); data = data.SwapBits(2, 3); data = data.SwapBits(4, 5); cell.m_data = data; } cell.m_speed = reader.ReadByte(); cell.m_mapChangeData = reader.ReadByte(); if (version > 5) { cell.m_moveZone = reader.ReadByte(); } if (version > 7 && version < 9) { cell.m_data |= (byte)(0xF & reader.ReadByte() << 9); } return(cell); }
public static DlmCellData ReadFromStream(short id, byte version, IDataReader reader) { var cell = new DlmCellData(id); cell.m_rawFloor = reader.ReadSByte(); if (cell.m_rawFloor == -128) { return(cell); } cell.m_losMov = reader.ReadByte(); cell.m_speed = reader.ReadByte(); cell.m_mapChangeData = reader.ReadByte(); if (version > 5) { cell.m_moveZone = reader.ReadByte(); } return(cell); }
public static DlmMap ReadFromStream(IDataReader givenReader, DlmReader dlmReader) { DlmMap map = null; try { var reader = givenReader; map = new DlmMap { Version = reader.ReadByte(), Id = reader.ReadInt() }; if (map.Version > DlmReader.VERSION) { throw new Exception(string.Format("Reader outdated for this map (old version:{0} new version:{1})", DlmReader.VERSION, map.Version)); } if (map.Version >= 7) { map.Encrypted = reader.ReadBoolean(); map.EncryptionVersion = reader.ReadByte(); var len = reader.ReadInt(); if (map.Encrypted) { var key = dlmReader.DecryptionKey; if (key == null && dlmReader.DecryptionKeyProvider != null) { key = dlmReader.DecryptionKeyProvider(map.Id); } if (key == null) { throw new InvalidOperationException(string.Format("Cannot decrypt the map {0} without decryption key", map.Id)); } var data = reader.ReadBytes(len); var encodedKey = Encoding.Default.GetBytes(key); if (key.Length > 0) { for (var i = 0; i < data.Length; i++) { data[i] = (byte)(data[i] ^ encodedKey[i % key.Length]); } reader = new FastBigEndianReader(data); } } } map.RelativeId = reader.ReadUInt(); map.MapType = reader.ReadByte(); // temp, just to know if the result is coherent if (map.MapType < 0 || map.MapType > 1) { throw new Exception("Invalid decryption key"); } map.SubAreaId = reader.ReadInt(); map.TopNeighbourId = reader.ReadInt(); map.BottomNeighbourId = reader.ReadInt(); map.LeftNeighbourId = reader.ReadInt(); map.RightNeighbourId = reader.ReadInt(); map.ShadowBonusOnEntities = reader.ReadInt(); if (map.Version >= 9) { map.BackgroundColor = Color.FromArgb(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), reader.ReadByte()); map.GridColor = Color.FromArgb(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), reader.ReadByte()); } else if (map.Version >= 3) { map.BackgroundColor = Color.FromArgb(reader.ReadByte(), reader.ReadByte(), reader.ReadByte()); } if (map.Version >= 4) { map.ZoomScale = reader.ReadUShort(); map.ZoomOffsetX = reader.ReadShort(); map.ZoomOffsetY = reader.ReadShort(); } map.UseLowPassFilter = reader.ReadByte() == 1; map.UseReverb = reader.ReadByte() == 1; if (map.UseReverb) { map.PresetId = reader.ReadInt(); } { map.PresetId = -1; } map.BackgroudFixtures = new DlmFixture[reader.ReadByte()]; for (var i = 0; i < map.BackgroudFixtures.Length; i++) { map.BackgroudFixtures[i] = DlmFixture.ReadFromStream(map, reader); } map.ForegroundFixtures = new DlmFixture[reader.ReadByte()]; for (var i = 0; i < map.ForegroundFixtures.Length; i++) { map.ForegroundFixtures[i] = DlmFixture.ReadFromStream(map, reader); } reader.ReadInt(); map.GroundCRC = reader.ReadInt(); map.Layers = new DlmLayer[reader.ReadByte()]; for (var i = 0; i < map.Layers.Length; i++) { map.Layers[i] = DlmLayer.ReadFromStream(map, reader); } map.Cells = new DlmCellData[CellCount]; int?lastMoveZone = null; for (short i = 0; i < map.Cells.Length; i++) { map.Cells[i] = DlmCellData.ReadFromStream(i, map.Version, reader); if (!lastMoveZone.HasValue) { lastMoveZone = map.Cells[i].MoveZone; } else if (lastMoveZone != map.Cells[i].MoveZone) // if a cell is different the new system is used { map.UsingNewMovementSystem = true; } } return(map); } catch (Exception ex) { throw new BadEncodedMapException(ex, map); } }