Beispiel #1
0
        private void LoadInlineResources(int layerIndex, EntityResource rsrc)
        {
            if (layerIndex > rsrc.InlineResourceLayers.Length)
            {
                throw new InvalidDataException("More inline resource layers than entity resource layers");
            }
            int version = Int();

            // HACK: Allows reading codemonkey_rbn.rbsong
            if (version == 1)
            {
                Int();
                Int();
                Int();
                version = Int();
            }
            int count = Int();
            var layer = rsrc.InlineResourceLayers[layerIndex] = new Resource[count];

            for (int i = 0; i < count; i++)
            {
                var type   = String();
                var inline = layer[i] = Resource.Create(type);
                inline.Path = String();
                LoadResource(inline);
            }
        }
Beispiel #2
0
 private void LoadEntityLayer(int layerIndex, EntityResource rsrc, Entity ent)
 {
     ent.Layers[layerIndex] = ReadEntityLayer(layerIndex, ent.Version);
     if (ent.Version >= 0xC)
     {
         LoadInlineResources(layerIndex, rsrc);
     }
 }
 public void WriteInlineResources(EntityResource er, int layerIndex)
 {
     Write(er.Version);
     Write(er.InlineResourceLayers[layerIndex].Length);
     for (int i = 0; i < er.InlineResourceLayers[layerIndex].Length; i++)
     {
         var resource = er.InlineResourceLayers[layerIndex][i];
         Write(resource.Type);
         Write(resource.Path);
         WriteEntityResource(er.InlineResourceLayers[layerIndex][i] as EntityResource);
     }
 }
 public void WriteEntity(EntityResource rsrc)
 {
     if (rsrc.Version > 0xE)
     {
         Write(0);
     }
     Write(rsrc.Entity.Version);
     Write(rsrc.Entity.Layers.Length);
     for (int i = 0; i < rsrc.Entity.Layers.Length; i++)
     {
         WriteEntityLayer(rsrc.Entity.Layers[i]);
         WriteInlineResources(rsrc, i);
     }
 }
 public void WriteEntityResource(EntityResource v)
 {
     Write(v.Version);
     Write(v.InlineLayerNames, Write);
     WriteEntity(v);
 }
Beispiel #6
0
        private Entity ReadEntity(EntityResource rsrc)
        {
            var ent = new Entity();

            ent.Version = Int();
            if (ent.Version > Entity.MaxVersion)
            {
                throw new Exception("Can't handle entity version " + ent.Version);
            }
            if (ent.Version <= 1)
            {
                throw new InvalidDataException("Entity version must be > 1");
            }
            if (ent.Version <= 4)
            {
                String();
            }
            int numLayers = 1;

            if (ent.Version >= 9)
            {
                numLayers = Int();
            }
            else
            {
                int rootId = Int();
                if (ent.Version > 6)
                {
                    numLayers = Int();
                }
                else
                {
                    short arraySize = Short();
                }
            }
            for (int li = 0; li < numLayers; li++)
            {
                if (ent.Version < 8)
                {
                    if (ent.Version >= 7)
                    {
                        Short(); // layer_field_28
                    }
                    if (numLayers != 1)
                    {
                        throw new Exception("Num layers should be 1 for version <8");
                    }
                    var propArrayBaseSize = Int();
                    if (propArrayBaseSize > 0)
                    {
                        throw new NotImplementedException("Version < 8 should load objs here");
                    }
                }
                else if (ent.Version <= 11)
                {
                    String(); // layer_name
                }
            }
            if (ent.Version < 8)
            {
                throw new NotImplementedException("Version < 8 not implemented");
            }
            ent.Layers = new EntityLayer[numLayers];
            LoadEntityLayer(0, rsrc, ent);
            for (int i = 1; i < numLayers; i++)
            {
                LoadEntityLayer(i, rsrc, ent);
            }
            return(ent);
        }