private void Initialize() { using (var reader = new FastBigEndianReader(File.ReadAllBytes(m_uri))) { var indexPos = reader.ReadInt(); reader.Seek(indexPos, SeekOrigin.Begin); var indexLen = reader.ReadInt(); int addOffset = 0; for (int i = 0; i < indexLen; i += 9) { var key = reader.ReadInt(); byte nbAdditionnalStrings = reader.ReadByte(); var dataPos = reader.ReadInt(); var pos = (int)reader.Position; reader.Seek(dataPos + addOffset, SeekOrigin.Begin); m_indexes.Add(key, reader.ReadUTF()); reader.Seek(pos, SeekOrigin.Begin); while (nbAdditionnalStrings-- > 0) { dataPos = reader.ReadInt(); pos = (int)reader.Position; reader.Seek(dataPos + addOffset, SeekOrigin.Begin); string unusedString = reader.ReadUTF(); // Well, no real use to read that, as we don't use 'em reader.Seek(pos, SeekOrigin.Begin); i += 4; } } int lastOffset = reader.ReadInt() + (int)reader.Position; int locpos = (int)reader.Position; while (locpos < lastOffset) { var key = reader.ReadUTF(); var dataPos = reader.ReadInt(); locpos = (int)reader.Position; reader.Seek(dataPos, SeekOrigin.Begin); m_textIndexes.Add(key, reader.ReadUTF()); reader.Seek(locpos, SeekOrigin.Begin); } } }
public static DlmMap ReadFromStream(IDataReader givenReader, DlmReader dlmReader) { var reader = givenReader; var map = new DlmMap(); map.Version = reader.ReadByte(); map.Id = reader.ReadInt(); 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 (int 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 >= 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 (int i = 0; i < map.BackgroudFixtures.Length; i++) { map.BackgroudFixtures[i] = DlmFixture.ReadFromStream(map, reader); } map.ForegroundFixtures = new DlmFixture[reader.ReadByte()]; for (int 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 (int 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; }