public MovieClip(MovieClip mv) { m_vStorageObject = mv.GetStorageObject(); m_vDataType = mv.GetMovieClipDataType(); m_vShapes = new List<ScObject>(); this.SetOffset(-Math.Abs(mv.GetOffset())); //Duplicate MovieClip using (FileStream input = new FileStream(m_vStorageObject.GetFileName(), FileMode.Open)) { input.Seek(Math.Abs(mv.GetOffset()) + 5, SeekOrigin.Begin); using (var br = new BinaryReader(input)) { this.ParseData(br); } } //Set new clip id short maxMovieClipId = this.GetId(); foreach(MovieClip clip in m_vStorageObject.GetMovieClips()) { if (clip.GetId() > maxMovieClipId) maxMovieClipId = clip.GetId(); } maxMovieClipId++; this.SetId(maxMovieClipId); //Get max shape id short maxShapeId = 20000;//avoid collision with other objects in MovieClips foreach(Shape shape in m_vStorageObject.GetShapes()) { if (shape.GetId() > maxShapeId) maxShapeId = shape.GetId(); } maxShapeId++; //Duplicate shapes associated to clip List<ScObject> newShapes = new List<ScObject>(); foreach(Shape s in m_vShapes) { Shape newShape = new Shape(s); newShape.SetId(maxShapeId); maxShapeId++; newShapes.Add(newShape); m_vStorageObject.AddShape(newShape);//Add to global shapelist m_vStorageObject.AddChange(newShape); } this.m_vShapes = newShapes; }
public Shape(Shape s) { m_vStorageObject = s.GetStorageObject(); m_vChunks = new List<ScObject>(); this.SetOffset(-Math.Abs(s.GetOffset())); //Duplicate Shape using (FileStream input = new FileStream(m_vStorageObject.GetFileName(), FileMode.Open)) { input.Seek(Math.Abs(s.GetOffset()) + 5, SeekOrigin.Begin); using (var br = new BinaryReader(input)) { this.ParseData(br); } } foreach(ShapeChunk chunk in this.m_vChunks) { chunk.SetOffset(-Math.Abs(chunk.GetOffset())); } }
public void Decode() { using (var br = new BinaryReader(File.Open(m_vFileName, FileMode.Open))) { ushort m_vShapeCount = br.ReadUInt16();//a1 + 8 ushort m_vMovieClipCount = br.ReadUInt16();//a1 + 12 ushort m_vTextureCount = br.ReadUInt16();//a1 + 16 ushort m_vTextFieldCount = br.ReadUInt16();//a1 + 24 ushort m_vMatrix2x3Count = br.ReadUInt16();//a1 + 28 ushort m_vColorTransformCount = br.ReadUInt16();//a1 + 32 Debug.WriteLine("ShapeCount: " + m_vShapeCount); Debug.WriteLine("MovieClipCount: " + m_vMovieClipCount); Debug.WriteLine("TextureCount: " + m_vTextureCount); Debug.WriteLine("TextFieldCount: " + m_vTextFieldCount); Debug.WriteLine("Matrix2x3Count: " + m_vMatrix2x3Count); Debug.WriteLine("ColorTransformCount: " + m_vColorTransformCount); //5 useless bytes, not even used by Supercell br.ReadByte();//1 octet br.ReadUInt16();//2 octets br.ReadUInt16();//2 octets m_vStartExportsOffset = br.BaseStream.Position; m_vExportCount = br.ReadUInt16();//a1 + 20 Debug.WriteLine("ExportCount: " + m_vExportCount); for (int i = 0; i < m_vExportCount; i++) { var sce = new Export(this); sce.SetId(br.ReadInt16()); m_vExports.Add(sce); } //m_vExportNames = new string[m_vExportCount]; for (int i = 0; i < m_vExportCount; i++) { //((Export)m_vExports[i]).SetOffset(br.BaseStream.Position); byte nameLength = br.ReadByte(); ((Export)m_vExports[i]).SetExportName(Encoding.UTF8.GetString(br.ReadBytes(nameLength))); } do { long offset = br.BaseStream.Position; byte dataType = br.ReadByte(); int dataLength = br.ReadInt32(); switch (dataType) { case 1: case 16: case 19: { var texture = new Texture(this); texture.SetOffset(offset); texture.ParseData(br); m_vTextures.Add(texture); continue; } case 2: case 18: { var shape = new Shape(this); shape.SetOffset(offset); m_vShapes.Add(shape); shape.ParseData(br); continue; } case 3: case 10: case 12: case 14: { var movieClip = new MovieClip(this, dataType); movieClip.SetOffset(offset); movieClip.ParseData(br); m_vMovieClips.Add(movieClip); continue; } case 7: case 15: case 20: { //textFields break; } case 8: { //matrix2x3 break; } case 9: { //colorTransform break; } case 13: { break; } default: { Debug.WriteLine("Unkown data type " + dataType.ToString()); break; } case 0: { m_vEofOffset = offset; for (int i = 0; i < m_vExports.Count; i++) { int index = m_vMovieClips.FindIndex(movie => movie.GetId() == m_vExports[i].GetId()); if (index != -1) ((Export)m_vExports[i]).SetDataObject((MovieClip)m_vMovieClips[index]); } return; } } if (dataLength >= 1) { br.ReadBytes(dataLength); } } while (true); } }
public void AddShape(Shape s) { m_vShapes.Add(s); }