Example #1
0
        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;
        }
Example #2
0
 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()));
     }
 }
Example #3
0
        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);
            }
        }
Example #4
0
 public void AddShape(Shape s)
 {
     m_vShapes.Add(s);
 }