예제 #1
0
        static void Main(string[] args)
        {
            BinaryReader r = new BinaryReader(File.OpenRead(@"D:\GOG Games\Rayman 2\Rayman 2 Modded\Data\World\Levels\LEVELS0.DAT"));

            // ReadLEVELS0DAT_1

            LEVELS0DAT_Header header = new LEVELS0DAT_Header();

            header.field_0 = r.ReadInt32();
            header.field_4 = r.ReadInt32();
            header.field_8 = r.ReadInt32();
            header.field_C = r.ReadInt32();
            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            r.ReadInt32();

            int number = r.ReadInt32();
            int levels0DatValue_0 = header.field_4 ^ (number - header.field_0);
            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number = r.ReadInt32();
            int levels0DatValue_1 = (header.field_4 ^ (number - header.field_0)) >> 2;
            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number = r.ReadInt32();
            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number = r.ReadInt32();
            int levels0DatValue_2 = header.field_4 ^ (number - header.field_0);
            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number = r.ReadInt32();
            int levels0DatValue_3 = header.field_4 ^ (number - header.field_0);
            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number = r.ReadInt32();
            int levels0DatValue_4 = header.field_4 ^ (number - header.field_0);
            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number = r.ReadInt32();
            int levels0DatValue_5 = header.field_4 ^ (number - header.field_0);
            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            // ReadLEVELS0DAT_2

            // I don't get this - floating-point operations on file pointers!?
            double v9 = 1.06913;
            double v30 = 1.06913;
            int v8 = 4;
            int v10 = 0;
            do
            {
                int v11 = v10++;
                v9 = v9 - Math.Abs(Math.Sin(v11 * v11 * 1.69314)) * -0.69314 - -0.52658;
            }
            while (v10 < v8);
            v30 = v9;

            double v12 = v30 - Math.Floor(v30);
            double v13 = Math.Floor(v12 * 1000000.0);
            int v14 = (int)Math.Floor(levels0DatValue_0 * (v13 * 0.000001));

            r.BaseStream.Seek(levels0DatValue_4 + levels0DatValue_5 * v14, SeekOrigin.Begin);

            Console.WriteLine(levels0DatValue_4 + levels0DatValue_5 * v14); // It has to be 75835392

            var header2 = new LEVELS0DAT_Header();
            header2.field_0 = r.ReadInt32();
            header2.field_4 = r.ReadInt32();
            header2.field_8 = r.ReadInt32();
            header2.field_C = r.ReadInt32();

            // TODO: This part is not finished

            r.Close();

            // Encoded part
            r = new BinaryReader(new EncodedStream(File.ReadAllBytes(@"D:\GOG Games\Rayman 2\Rayman 2 Modded\Data\World\Levels\LEVELS0.DAT")));
            ////r.BaseStream.Seek(0x427B000, SeekOrigin.Begin);
            //r.BaseStream.Seek(0x03874800, SeekOrigin.Begin);
            ////int byte_5116F0 = 0x00030000;
            ////((EncodedStream)r.BaseStream).magic = (uint)(16807 * (byte_5116F0 ^ 0x75BD924) - 0x7FFFFFFF * ((byte_5116F0 ^ 0x75BD924u) / 0x1F31D));
            //// May be useful - magic value: FFF1EDA8, 7FF1EDA7, 6AB5CC79
            ((EncodedStream)r.BaseStream).magic = 964;
            File.WriteAllBytes("encoded", r.ReadBytes(1024 * 1024));

            for (int i = 0; i < 256*256*256; i++)
            {
                r.BaseStream.Seek(i, SeekOrigin.Begin);
                ((EncodedStream)r.BaseStream).magic = (uint)1790299257;

                var data = r.ReadBytes(1024);

                int zeros = 0;
                for (int j = 0; j < 1024; j++)
                {
                    if (data[j] == 0)
                        zeros ++;
                }

                if(zeros > 20)
                Console.WriteLine($"{zeros} - {i}");
            }

            Console.ReadKey();
        }
예제 #2
0
        static void Main(string[] args)
        {
            BinaryReader r = new BinaryReader(File.OpenRead(@"D:\GOG Games\Rayman 2\Rayman 2 Modded\Data\World\Levels\LEVELS0.DAT"));

            // ReadLEVELS0DAT_1

            LEVELS0DAT_Header header = new LEVELS0DAT_Header();

            header.field_0  = r.ReadInt32();
            header.field_4  = r.ReadInt32();
            header.field_8  = r.ReadInt32();
            header.field_C  = r.ReadInt32();
            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            r.ReadInt32();

            int number            = r.ReadInt32();
            int levels0DatValue_0 = header.field_4 ^ (number - header.field_0);

            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number = r.ReadInt32();
            int levels0DatValue_1 = (header.field_4 ^ (number - header.field_0)) >> 2;

            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number          = r.ReadInt32();
            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number = r.ReadInt32();
            int levels0DatValue_2 = header.field_4 ^ (number - header.field_0);

            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number = r.ReadInt32();
            int levels0DatValue_3 = header.field_4 ^ (number - header.field_0);

            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number = r.ReadInt32();
            int levels0DatValue_4 = header.field_4 ^ (number - header.field_0);

            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            number = r.ReadInt32();
            int levels0DatValue_5 = header.field_4 ^ (number - header.field_0);

            header.field_0 += header.field_8;
            header.field_4 += header.field_C;

            // ReadLEVELS0DAT_2

            // I don't get this - floating-point operations on file pointers!?
            double v9  = 1.06913;
            double v30 = 1.06913;
            int    v8  = 4;
            int    v10 = 0;

            do
            {
                int v11 = v10++;
                v9 = v9 - Math.Abs(Math.Sin(v11 * v11 * 1.69314)) * -0.69314 - -0.52658;
            }while (v10 < v8);
            v30 = v9;

            double v12 = v30 - Math.Floor(v30);
            double v13 = Math.Floor(v12 * 1000000.0);
            int    v14 = (int)Math.Floor(levels0DatValue_0 * (v13 * 0.000001));

            r.BaseStream.Seek(levels0DatValue_4 + levels0DatValue_5 * v14, SeekOrigin.Begin);

            Console.WriteLine(levels0DatValue_4 + levels0DatValue_5 * v14); // It has to be 75835392

            var header2 = new LEVELS0DAT_Header();

            header2.field_0 = r.ReadInt32();
            header2.field_4 = r.ReadInt32();
            header2.field_8 = r.ReadInt32();
            header2.field_C = r.ReadInt32();

            // TODO: This part is not finished

            r.Close();

            // Encoded part
            r = new BinaryReader(new EncodedStream(File.ReadAllBytes(@"D:\GOG Games\Rayman 2\Rayman 2 Modded\Data\World\Levels\LEVELS0.DAT")));
            ////r.BaseStream.Seek(0x427B000, SeekOrigin.Begin);
            //r.BaseStream.Seek(0x03874800, SeekOrigin.Begin);
            ////int byte_5116F0 = 0x00030000;
            ////((EncodedStream)r.BaseStream).magic = (uint)(16807 * (byte_5116F0 ^ 0x75BD924) - 0x7FFFFFFF * ((byte_5116F0 ^ 0x75BD924u) / 0x1F31D));
            //// May be useful - magic value: FFF1EDA8, 7FF1EDA7, 6AB5CC79
            ((EncodedStream)r.BaseStream).magic = 964;
            File.WriteAllBytes("encoded", r.ReadBytes(1024 * 1024));

            for (int i = 0; i < 256 * 256 * 256; i++)
            {
                r.BaseStream.Seek(i, SeekOrigin.Begin);
                ((EncodedStream)r.BaseStream).magic = (uint)1790299257;

                var data = r.ReadBytes(1024);

                int zeros = 0;
                for (int j = 0; j < 1024; j++)
                {
                    if (data[j] == 0)
                    {
                        zeros++;
                    }
                }

                if (zeros > 20)
                {
                    Console.WriteLine($"{zeros} - {i}");
                }
            }

            Console.ReadKey();
        }