public static Formats.Rendering.Nrpd ParseNrpd(this SsbhParser parser) { var result = new Formats.Rendering.Nrpd(); result.Magic = parser.ReadUInt32(); result.MajorVersion = parser.ReadUInt16(); result.MinorVersion = parser.ReadUInt16(); { // TODO: Extract this code to a method? long absoluteOffset = parser.ReadRelativeGetAbsoluteOffset(); long elementCount = parser.ReadInt64(); long previousPosition = parser.Position; parser.Seek(absoluteOffset); result.FrameBufferContainers = new Formats.Rendering.NrpdFrameBufferContainer[elementCount]; for (int i = 0; i < elementCount; i++) { result.FrameBufferContainers[i] = parser.ParseNrpdFrameBufferContainer(); } parser.Seek(previousPosition); } { // TODO: Extract this code to a method? long absoluteOffset = parser.ReadRelativeGetAbsoluteOffset(); long elementCount = parser.ReadInt64(); long previousPosition = parser.Position; parser.Seek(absoluteOffset); result.StateContainers = new Formats.Rendering.NrpdStateContainer[elementCount]; for (int i = 0; i < elementCount; i++) { result.StateContainers[i] = parser.ParseNrpdStateContainer(); } parser.Seek(previousPosition); } { // TODO: Extract this code to a method? long absoluteOffset = parser.ReadRelativeGetAbsoluteOffset(); long elementCount = parser.ReadInt64(); long previousPosition = parser.Position; parser.Seek(absoluteOffset); result.RenderPasses = new Formats.Rendering.NrpdRenderPass[elementCount]; for (int i = 0; i < elementCount; i++) { result.RenderPasses[i] = parser.ParseNrpdRenderPass(); } parser.Seek(previousPosition); } return(result); }