Ejemplo n.º 1
0
                public void Read(InputBuffer f)
                {
                    id = f.readInt();
                    int numChildren = f.readInt();

                    for (int childId = 0; childId < numChildren; childId++)
                    {
                        TagType childType = (TagType)f.readInt();
                        int     childSize = f.readInt();

                        if (childType == TagType.RemoveObject)
                        {
                            deletions.Add(new Deletion(f));
                        }
                        else if (childType == TagType.DoAction)
                        {
                            actions.Add(new Action(f));
                        }
                        else if (childType == TagType.PlaceObject)
                        {
                            placements.Add(new Placement(f));
                        }
                    }
                }
Ejemplo n.º 2
0
        public void Read(string filename)
        {
            InputBuffer f = new InputBuffer(filename);

            header.magic    = f.readInt();
            header.unk0     = f.readInt();
            header.unk1     = f.readInt();
            header.unk2     = f.readInt();
            header.unk3     = f.readInt();
            header.unk4     = f.readInt();
            header.unk5     = f.readInt();
            header.filesize = f.readInt();
            header.unk6     = f.readInt();
            header.unk7     = f.readInt();
            header.unk8     = f.readInt();
            header.unk9     = f.readInt();
            header.unk10    = f.readInt();
            header.unk11    = f.readInt();
            header.unk12    = f.readInt();
            header.unk13    = f.readInt();

            filePath = (Convert.ToString(Path.GetDirectoryName(filename)));
            File.WriteAllText(filePath + @"\Log.txt", String.Empty);


            using (StreamWriter outputFile = new StreamWriter(filePath + @"\Log.txt", true))
            {
                bool done = false;
                while (!done)
                {
                    uint    chunkOffset = f.ptr;
                    TagType chunkType   = (TagType)f.readInt();
                    int     chunkSize   = f.readInt(); // in dwords!
                    {
                        switch (chunkType)
                        {
                        case TagType.Invalid:
                            // uhhh. i think there's a specific exception for this
                            throw new Exception("Malformed file");

                        case TagType.Symbols:
                            int numSymbols = f.readInt();
                            outputFile.WriteLine("Symbols\n\t{");

                            while (symbols.Count < numSymbols)
                            {
                                int len = f.readInt();

                                symbols.Add(f.readString());
                                f.reverse((Convert.ToUInt32(len)));
                                outputFile.WriteLine("\t\t" + f.readString());
                                f.skip(4 - (f.ptr % 4));
                            }
                            outputFile.WriteLine("\t}\n");

                            break;

                        case TagType.Colors:
                            int numColors = f.readInt();

                            outputFile.WriteLine("Colors\n\t{");

                            for (int i = 0; i < numColors; i++)
                            {
                                var offs  = f.ptr;
                                var color = new Color(f.readShort(), f.readShort(), f.readShort(), f.readShort());
                                colors.Add(color);

                                outputFile.WriteLine($"\t\t0x{i:X4}: {color} # Offset = 0x{offs:X2}");
                            }

                            outputFile.WriteLine("\t\t}\n");
                            break;

                        case TagType.Unk000A:
                            unk000A = new UnhandledTag(chunkType, chunkSize, f);
                            break;

                        case TagType.UnkF00A:
                            unkF00A = new UnhandledTag(chunkType, chunkSize, f);
                            break;

                        case TagType.UnkF00B:
                            unkF00B = new UnhandledTag(chunkType, chunkSize, f);
                            break;

                        case TagType.UnkF008:
                            unkF008 = new UnhandledTag(chunkType, chunkSize, f);
                            break;

                        case TagType.UnkF009:
                            unkF009 = new UnhandledTag(chunkType, chunkSize, f);
                            break;

                        case TagType.UnkF00D:
                            unkF00D = new UnhandledTag(chunkType, chunkSize, f);
                            break;

                        case TagType.ActionScript:
                            actionscript = new UnhandledTag(chunkType, chunkSize, f);
                            break;

                        case TagType.End:
                            done = true;
                            break;

                        case TagType.Transforms:
                            int numTransforms = f.readInt();

                            outputFile.WriteLine("Transforms\n{");

                            for (int i = 0; i < numTransforms; i++)
                            {
                                var       offs  = f.ptr;
                                Transform xform = new Transform();
                                xform.M11 = f.readFloat();
                                xform.M12 = f.readFloat();
                                xform.M21 = f.readFloat();
                                xform.M22 = f.readFloat();
                                xform.M31 = f.readFloat();
                                xform.M32 = f.readFloat();

                                var scaleX = Math.Sign(xform.M11) * Math.Sqrt(xform.M11 * xform.M11 + xform.M21 * xform.M21);
                                var scaleY = Math.Sign(xform.M22) * Math.Sqrt(xform.M12 * xform.M12 + xform.M22 * xform.M22);

                                var angleRads = Math.Atan2(xform.M21, xform.M22);

                                outputFile.WriteLine($"\t0x{i:X4}: # Offset = 0x{offs:X2}");
                                outputFile.WriteLine($"\t\tposition: [{xform.M31}, {xform.M32}]");
                                outputFile.WriteLine($"\t\trotation: {angleRads * (180 / Math.PI)}°");
                                outputFile.WriteLine($"\t\tscale: [{scaleX}, {scaleY}]\n");

                                transforms.Add(xform);
                            }

                            outputFile.WriteLine("}\n");

                            break;

                        case TagType.Positions:
                            int numPositions = f.readInt();
                            outputFile.WriteLine("Positions\n{");

                            for (int i = 0; i < numPositions; i++)
                            {
                                var offs = f.ptr;
                                var pos  = new Vector2(f.readFloat(), f.readFloat());
                                outputFile.WriteLine($"\t0x{i:X4}: [{pos.X}, {pos.Y}] # Offset = 0x{offs:X2}");

                                positions.Add(pos);
                            }

                            outputFile.WriteLine("}\n");

                            break;

                        case TagType.Bounds:
                            int numBounds = f.readInt();

                            for (int i = 0; i < numBounds; i++)
                            {
                                bounds.Add(new ShapeBounds(f.readFloat(), f.readFloat(), f.readFloat(), f.readFloat()));
                            }
                            break;

                        case TagType.Properties:
                            properties = new UnhandledTag(chunkType, chunkSize, f);
                            break;

                        case TagType.TextureAtlases:
                            int numAtlases = f.readInt();
                            var offset     = f.ptr;

                            outputFile.WriteLine("Atlases\n{");

                            for (int i = 0; i < numAtlases; i++)
                            {
                                var          offs  = f.ptr;
                                TextureAtlas atlas = new TextureAtlas();
                                atlas.id     = f.readInt();
                                atlas.unk    = f.readInt();
                                atlas.width  = f.readFloat();
                                atlas.height = f.readFloat();
                                outputFile.Write("\t{ ");
                                outputFile.WriteLine($" # Offset = 0x{offs:X2}");
                                outputFile.WriteLine($"\t\tid = 0x{atlas.id:X2}");
                                outputFile.WriteLine($"\t\tunk = 0x{atlas.unk:X8}");
                                outputFile.WriteLine($"\t\twidth = {atlas.width}");
                                outputFile.WriteLine($"\t\theight = {atlas.height}");
                                outputFile.WriteLine("\t}\n");

                                textureAtlases.Add(atlas);
                            }

                            outputFile.WriteLine("}\n");

                            break;

                        case TagType.Shape:
                            var shapeOffset = f.ptr;
                            outputFile.WriteLine($"Shape # Offset = 0x{shapeOffset:X2}");
                            outputFile.WriteLine("{\n\t{");
                            Shape shape = new Shape
                            {
                                id            = f.readInt(),
                                unk1          = f.readInt(),
                                boundingBoxID = f.readInt(),
                                unk2          = f.readInt(),
                                numGraphics   = f.readInt(),
                            };
                            outputFile.WriteLine($"\t\tID: {shape.id}");
                            outputFile.WriteLine($"\t\tUnk1: 0x{shape.unk1:X8}");
                            outputFile.WriteLine($"\t\tBounding Box ID: {shape.boundingBoxID}");
                            outputFile.WriteLine($"\t\tUnk2: 0x{shape.unk2:X8}");
                            //outputFile.WriteLine($"\t\tNumGraphics: {shape.numGraphics}");
                            outputFile.WriteLine("\t}\n");
                            outputFile.WriteLine($"\tGraphics: {shape.numGraphics}");
                            outputFile.WriteLine("\t[");

                            break;

                        case TagType.Graphic:
                            var GraphicOffset = f.ptr;
                            outputFile.WriteLine($"\t\tGraphic # Offset = 0x{GraphicOffset:X2}");
                            outputFile.WriteLine("\t\t{");
                            Graphic graphic = new Graphic
                            {
                                atlasId    = f.readInt(),
                                unk1       = f.readShort(),
                                numVerts   = f.readShort(),
                                numIndices = f.readInt(),
                            };
                            Vertex[] verts   = new Vertex[graphic.numVerts];
                            short[]  indices = new short[graphic.numIndices];
                            outputFile.WriteLine($"\t\t\tatlasId: 0x{graphic.atlasId:X2}");
                            outputFile.WriteLine($"\t\t\tUnk1: 0x{graphic.unk1:X8}");
                            //outputFile.WriteLine($"\t\t\tnumVerts: {graphic.numVerts}");
                            //outputFile.WriteLine($"\t\t\tnumIndicies: {graphic.numIndices}");
                            outputFile.WriteLine("\t\t\tVerts:\n\t\t\t[");

                            for (int i = 0; i < graphic.numVerts; i++)
                            {
                                verts[i] = new Vertex();
                                outputFile.Write("\t\t\t\t{ ");
                                outputFile.Write($"pos: [" + (verts[i].x = f.readFloat()) + "," + (verts[i].y = f.readFloat()) + "], uv: [" + (verts[i].u = f.readFloat()) + "," + (verts[i].v = f.readFloat()) + "]");
                                outputFile.Write(" }");
                                if ((i + 1) != graphic.numVerts)
                                {
                                    outputFile.Write(",\n");
                                }
                            }
                            outputFile.Write("\n\t\t\t]\n\t\t\tindices: [");
                            for (int i = 0; i < graphic.numIndices; i++)
                            {
                                outputFile.Write((indices[i] = f.readShort()));
                                if ((i + 1) != graphic.numIndices)
                                {
                                    outputFile.Write(", ");
                                }
                            }
                            outputFile.Write("]\n\t\t}\n");

                            // indices are padded to word boundaries
                            if ((graphic.numIndices % 2) != 0)
                            {
                                f.skip(0x02);
                            }

                            if ((f.readInt() == 0xF024))
                            {
                                f.reverse(0x04);
                            }
                            else
                            {
                                outputFile.WriteLine("\t]\n}\n");
                                f.reverse(0x04);
                            }

                            break;

                        case TagType.DefineEditText:
                            texts.Add(new DynamicText(f));
                            break;

                        case TagType.DefineSprite:
                            sprites.Add(new Sprite(f));
                            break;

                        case TagType.FrameLabel:
                            break;

                        case TagType.Keyframe:
                            break;


                        default:
                            throw new NotImplementedException($"Unhandled chunk id: 0x{(uint)chunkType:X} @ 0x{chunkOffset:X}");
                        }
                    }
                }
            }
        }
Ejemplo n.º 3
0
 public Sprite(InputBuffer f) : this()
 {
     Read(f);
 }
Ejemplo n.º 4
0
 public UnhandledTag(InputBuffer f)
 {
     type = (TagType)f.readInt();
     size = f.readInt();
     data = f.read(size * 4);
 }
Ejemplo n.º 5
0
 public Frame(InputBuffer f) : this()
 {
     Read(f);
 }
Ejemplo n.º 6
0
 public Action(InputBuffer f)
 {
     Read(f);
 }
Ejemplo n.º 7
0
 public void Read(InputBuffer f)
 {
     actionId = f.readInt();
     unk1     = f.readInt();
 }
Ejemplo n.º 8
0
 public void Read(InputBuffer f)
 {
     unk1       = f.readInt();
     mcObjectId = (short)f.readShort();
     unk2       = (short)f.readShort();
 }
Ejemplo n.º 9
0
 public UnhandledTag(TagType type, int size, InputBuffer f)
 {
     this.type = type;
     this.size = size;
     this.data = f.read(size * 4);
 }
Ejemplo n.º 10
0
 public Placement(InputBuffer f) : this()
 {
     Read(f);
 }
Ejemplo n.º 11
0
 public Deletion(InputBuffer f)
 {
     Read(f);
 }
Ejemplo n.º 12
0
 public Label(InputBuffer f)
 {
     Read(f);
 }
Ejemplo n.º 13
0
 public DynamicText(InputBuffer f) : this()
 {
     Read(f);
 }
Ejemplo n.º 14
0
 public Shape(InputBuffer f)
 {
     Read(f);
 }
Ejemplo n.º 15
0
 public Graphic(InputBuffer f)
 {
     Read(f);
 }
Ejemplo n.º 16
0
 public Metadata(InputBuffer f)
 {
     Read(f);
 }