Esempio n. 1
0
 /// <inheritdoc />
 public virtual void Unserialize(UndertaleReader reader)
 {
     if (reader.ReadBoolean())
     {
         // The curve data is embedded in this sequence, right here
         IsCurveEmbedded = true;
         if (reader.ReadInt32() != -1)
         {
             throw new IOException("Expected -1");
         }
         EmbeddedAnimCurve = new UndertaleAnimationCurve();
         EmbeddedAnimCurve.Unserialize(reader, false);
     }
     else
     {
         // The curve data is an asset in the project
         IsCurveEmbedded = false;
         AssetAnimCurve  = new UndertaleResourceById <UndertaleAnimationCurve, UndertaleChunkACRV>();
         AssetAnimCurve.Unserialize(reader);
     }
 }
Esempio n. 2
0
        /// <inheritdoc />
        public void Unserialize(UndertaleReader reader)
        {
            // This reads the string content immediately, if necessary (which it should be)
            UndertaleString ForceReadString()
            {
                UndertaleString res      = reader.ReadUndertaleString();
                uint            returnTo = reader.Position;

                reader.Position = reader.GetOffsetMapRev()[res];
                reader.ReadUndertaleObject <UndertaleString>();
                reader.Position = returnTo;
                return(res);
            }

            ModelName       = ForceReadString();
            Name            = reader.ReadUndertaleString();
            BuiltinName     = reader.ReadInt32();
            Traits          = reader.ReadInt32();
            IsCreationTrack = reader.ReadBoolean();

            int tagCount      = reader.ReadInt32();
            int ownedResCount = reader.ReadInt32();
            int trackCount    = reader.ReadInt32();

            Tags = new List <int>();
            for (int i = 0; i < tagCount; i++)
            {
                Tags.Add(reader.ReadInt32());
            }

            OwnedResources = new List <UndertaleResource>();
            for (int i = 0; i < ownedResCount; i++)
            {
                GMAnimCurveString = ForceReadString();
                if (GMAnimCurveString.Content != "GMAnimCurve")
                {
                    throw new IOException("Expected GMAnimCurve");
                }
                UndertaleAnimationCurve res = new UndertaleAnimationCurve();
                res.Unserialize(reader);
                OwnedResources.Add(res);
            }

            Tracks = new List <Track>();
            for (int i = 0; i < trackCount; i++)
            {
                Tracks.Add(reader.ReadUndertaleObject <Track>());
            }

            // Now, handle specific keyframe/etc. data
            switch (ModelName.Content)
            {
            case "GMAudioTrack":
                Keyframes = reader.ReadUndertaleObject <AudioKeyframes>();
                break;

            case "GMInstanceTrack":
                Keyframes = reader.ReadUndertaleObject <InstanceKeyframes>();
                break;

            case "GMGraphicTrack":
                Keyframes = reader.ReadUndertaleObject <GraphicKeyframes>();
                break;

            case "GMSequenceTrack":
                Keyframes = reader.ReadUndertaleObject <SequenceKeyframes>();
                break;

            case "GMSpriteFramesTrack":
                Keyframes = reader.ReadUndertaleObject <SpriteFramesKeyframes>();
                break;

            case "GMAssetTrack":     // TODO?
                throw new NotImplementedException("GMAssetTrack not implemented, report this");

            case "GMBoolTrack":
                Keyframes = reader.ReadUndertaleObject <BoolKeyframes>();
                break;

            case "GMStringTrack":
                Keyframes = reader.ReadUndertaleObject <StringKeyframes>();
                break;

            // TODO?
            //case "GMIntTrack":
            //  Keyframes = reader.ReadUndertaleObject<IntKeyframes>();
            //  break;
            case "GMRealTrack":
            case "GMColourTrack":
                Keyframes = reader.ReadUndertaleObject <RealKeyframes>();
                break;
            }
        }