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); } }
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); }
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); }