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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
            }
        }