public static byte[] CreateExePackedImage() { var egaCmn = Resource.Load("EGA.CMN"); var mcgaCod = Resource.Load("MCGA.COD"); var mcgaDif = Resource.Load("MCGA.DIF"); var mcgaHdr = Resource.Load("MCGA.HDR"); var bytesInLastPage = ReadUshortAt(mcgaHdr, 2); var pagesInExecutable = ReadUshortAt(mcgaHdr, 4); var paragraphsInHeader = ReadUshortAt(mcgaHdr, 8); int executableSize = pagesInExecutable << 9; if (bytesInLastPage > 0) { executableSize += bytesInLastPage - 0x1f0; } int headerSize = paragraphsInHeader << 4; var executableImage = new byte[executableSize]; mcgaHdr.CopyTo(executableImage, 0); egaCmn.CopyTo(executableImage, headerSize); mcgaCod.CopyTo(executableImage, headerSize + egaCmn.Length); var difStream = new ReadStream(mcgaDif); int writeOffset = headerSize - 1; while (true) { var jump = (ushort)difStream.ReadShort(); if (jump == 0) { break; } writeOffset += jump & 0x7fff; executableImage[writeOffset] = difStream.ReadByte(); executableImage[writeOffset + 1] = difStream.ReadByte(); if ((jump & 0x8000) != 0) { executableImage[writeOffset + 2] = difStream.ReadByte(); executableImage[writeOffset + 3] = difStream.ReadByte(); } } return(executableImage); }
public Primitive(int paintJobCount, ReadStream input) { var primitiveCode = input.ReadByte(); int indexCount = primitiveCode; switch (primitiveCode) { case 1: Type = PrimitiveType.Particle; break; case 2: Type = PrimitiveType.Line; break; case 11: Type = PrimitiveType.Sphere; indexCount = 2; break; case 12: Type = PrimitiveType.Wheel; indexCount = 6; break; default: if (3 <= primitiveCode && primitiveCode <= 10) { Type = PrimitiveType.Polygon; } else { Type = PrimitiveType.Ignored; indexCount = 0; } break; } var flags = input.ReadByte(); IsTwoSided = (flags & 1) != 0; HasZBias = (flags & 2) != 0; Materials = input.ReadByteArray(paintJobCount); Indices = input.ReadByteArray(indexCount); }
public Model(ReadStream input) { var vertexCount = input.ReadByte(); var primitiveCount = input.ReadByte(); PaintJobCount = input.ReadByte(); input.Skip(1); Vertices = new Vector3[vertexCount]; for (int i = 0; i < vertexCount; i++) { Vertices[i] = input.ReadVertex(); } input.Skip(8 * primitiveCount); Primitives = new Primitive[primitiveCount]; for (int i = 0; i < primitiveCount; i++) { Primitives[i] = new Primitive(PaintJobCount, input); } }