public static EleGraphicalData ReadFromStream(EleInstance instance, BigEndianReader reader) { var id = reader.ReadInt(); var type = (EleGraphicalElementTypes)reader.ReadByte(); switch (type) { case EleGraphicalElementTypes.ANIMATED: return AnimatedGraphicalElementData.ReadFromStream(instance, id, reader); case EleGraphicalElementTypes.BLENDED: return BlendedGraphicalElementData.ReadFromStream(instance, id, reader); case EleGraphicalElementTypes.BOUNDING_BOX: return BoundingBoxGraphicalElementData.ReadFromStream(instance, id, reader); case EleGraphicalElementTypes.ENTITY: return EntityGraphicalElementData.ReadFromStream(instance, id, reader); case EleGraphicalElementTypes.NORMAL: return NormalGraphicalElementData.ReadFromStream(instance, id, reader); case EleGraphicalElementTypes.PARTICLES: return ParticlesGraphicalElementData.ReadFromStream(instance, id, reader); default: throw new Exception("Unknown graphical data of type " + type); } }
public static EleInstance ReadFromStream(BigEndianReader reader) { var instance = new EleInstance(); instance.Version = reader.ReadByte(); var count = reader.ReadUInt(); for (int i = 0; i < count; i++) { var elem = EleGraphicalData.ReadFromStream(instance, reader); instance.GraphicalDatas.Add(elem.Id, elem); } if (instance.Version >= 8) { var gfxCount = reader.ReadInt(); for (int i = 0; i < gfxCount; i++) { instance.GfxJpgMap.Add(reader.ReadInt(), true); } } return instance; }
public static new DlmGraphicalElement ReadFromStream(DlmCell cell, BigEndianReader reader) { var element = new DlmGraphicalElement(cell); element.m_elementId = reader.ReadUInt(); element.m_hue = new ColorMultiplicator(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), false); element.m_shadow = new ColorMultiplicator(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), false); if (cell.Layer.Map.Version <= 4) { element.m_offset.X = reader.ReadByte(); element.m_offset.Y = reader.ReadByte(); element.m_pixelOffset.X = (int) (element.m_offset.X * CELL_HALF_WIDTH); element.m_pixelOffset.Y = (int) (element.m_offset.Y * CELL_HALF_HEIGHT); } else { element.m_pixelOffset.X = reader.ReadShort(); element.m_pixelOffset.Y = reader.ReadShort(); element.m_offset.X = (int)( element.m_pixelOffset.X / CELL_HALF_WIDTH ); element.m_offset.Y = (int)( element.m_pixelOffset.Y / CELL_HALF_HEIGHT ); } element.m_altitude = reader.ReadByte(); element.m_identifier = reader.ReadUInt(); element.CalculateFinalTeint(); return element; }
/// <summary> /// Build or continue building the message. Returns true if the resulted message is valid and ready to be parsed /// </summary> public bool Build(BigEndianReader reader) { if (IsValid) return true; if (reader.BytesAvailable >= 2 && !Header.HasValue) { Header = reader.ReadShort(); } if (LengthBytesCount.HasValue && reader.BytesAvailable >= LengthBytesCount && !Length.HasValue) { if (LengthBytesCount < 0 || LengthBytesCount > 3) throw new Exception("Malformated Message Header, invalid bytes number to read message length (inferior to 0 or superior to 3)"); Length = 0; // 3..0 or 2..0 or 1..0 for (int i = LengthBytesCount.Value - 1; i >= 0; i--) { Length |= reader.ReadByte() << (i * 8); } } // first case : no data read if (Data == null && Length.HasValue) { if (Length == 0) Data = new byte[0]; // enough bytes in the buffer to build a complete message if (reader.BytesAvailable >= Length) { Data = reader.ReadBytes(Length.Value); } // not enough bytes, so we read what we can else if (Length > reader.BytesAvailable) { Data = reader.ReadBytes((int) reader.BytesAvailable); } } //second case : the message was split and it missed some bytes if (Data != null && Length.HasValue && Data.Length < Length) { int bytesToRead = 0; // still miss some bytes ... if (Data.Length + reader.BytesAvailable < Length) bytesToRead = (int)reader.BytesAvailable; // there is enough bytes in the buffer to complete the message :) else if(Data.Length + reader.BytesAvailable >= Length) bytesToRead = Length.Value - Data.Length; if(bytesToRead != 0) { int oldLength = Data.Length; Array.Resize(ref m_data, (int)( Data.Length + bytesToRead )); Array.Copy(reader.ReadBytes(bytesToRead), 0, Data, oldLength, bytesToRead); } } return IsValid; }
public static DlmFixture ReadFromStream(DlmMap map, BigEndianReader reader) { var fixture = new DlmFixture(map); fixture.FixtureId = reader.ReadInt(); fixture.Offset = new System.Drawing.Point(reader.ReadShort(), reader.ReadShort()); fixture.Rotation = reader.ReadShort(); fixture.ScaleX = reader.ReadShort(); fixture.ScaleY = reader.ReadShort(); fixture.Hue = reader.ReadByte() << 16 | reader.ReadByte() << 8 | reader.ReadByte(); fixture.Alpha = reader.ReadByte(); return fixture; }
public static DlmCellData ReadFromStream(DlmMap map, short id, BigEndianReader reader) { var cell = new DlmCellData(map, id); cell.Floor = (short) (reader.ReadByte()*10); if (cell.Floor == -1280) { return cell; } cell.LosMov = reader.ReadByte(); cell.Speed = reader.ReadByte(); cell.MapChangeData = reader.ReadByte(); if (map.Version > 5) { cell.MoveZone = reader.ReadByte(); } return cell; }