Example #1
0
        public async Task Setup()
        {
            // Load Settings
            System.Console.WriteLine("Running in directory: " + Directory.GetCurrentDirectory());
            FilePath settingsPath = "../../../../TestingSettings.xml";

            System.Console.WriteLine("Settings path: " + settingsPath);
            Settings = JsonConvert.DeserializeObject <TestingSettings>(File.ReadAllText(settingsPath.Path));
            System.Console.WriteLine("Target settings: " + Settings.ToString());

            var passthroughSettings = new PassthroughTestParams()
            {
                NicknameSuffix      = null,
                PassthroughSettings = Settings.PassthroughSettings,
                GameRelease         = GameRelease.Oblivion,
                Target = new Target()
                {
                    Path = $"Oblivion.esm",
                    Do   = true,
                },
            };

            var passthrough = new OblivionPassthroughTest(passthroughSettings);

            (TempFolder TempFolder, Test Test) = passthrough.SetupProcessedFiles();
            using var tmp = TempFolder;
            await Test.Start();

            using (var stream = new BinaryReadStream(passthrough.ProcessedPath(ProcessedFilesFolder)))
            {
                stream.Position = 0xCF614B;
                PathGridBytes   = stream.ReadBytes(0x14C7);
            }
            PathGridReader = new MutagenMemoryReadStream(PathGridBytes, new ParsingBundle(GameRelease.Oblivion, masterReferences: null));
        }
Example #2
0
        public void FixVMADFormIDs(
            MajorRecordFrame frame,
            long fileOffset,
            out int?vmadPos,
            out ushort objectFormat,
            out int processed)
        {
            vmadPos = UtilityTranslation.FindFirstSubrecord(frame.Content, Meta, RecordTypes.VMAD);
            if (vmadPos == null)
            {
                processed    = 0;
                objectFormat = 0;
                return;
            }
            var stream = new MutagenMemoryReadStream(frame.HeaderAndContentData, Bundle)
            {
                Position = vmadPos.Value + frame.HeaderLength
            };

            stream.Position += Meta.SubConstants.HeaderLength;
            // Skip version
            stream.Position += 2;
            objectFormat     = stream.ReadUInt16();
            var scriptCt = stream.ReadUInt16();

            for (int i = 0; i < scriptCt; i++)
            {
                FixVMADScriptIDs(stream, fileOffset, objectFormat);
            }
            processed = (int)(stream.Position - vmadPos.Value - frame.HeaderLength);
        }
Example #3
0
        public void Setup()
        {
            // Load Settings
            System.Console.WriteLine("Running in directory: " + Directory.GetCurrentDirectory());
            FilePath settingsPath = "../../../../TestingSettings.xml";

            System.Console.WriteLine("Settings path: " + settingsPath);
            var settings = JsonConvert.DeserializeObject <TestingSettings>(File.ReadAllText(settingsPath.Path));

            System.Console.WriteLine("Target settings: " + settings.ToString());
            var dataPath = Path.Combine(settings.DataFolderLocations.Oblivion, "Oblivion.esm");

            data   = File.ReadAllBytes(dataPath);
            stream = new MutagenMemoryReadStream(data, new ParsingBundle(GameConstants.Oblivion, masterReferences: null !));
        }
Example #4
0
        private void ProcessQuests(
            MajorRecordFrame majorFrame,
            long fileOffset)
        {
            if (majorFrame.TryLocateSubrecordFrame(RecordTypes.ANAM, out var anamRec, out var anamIndex))
            {
                var next    = anamRec.AsUInt32();
                var targets = new RecordType[]
                {
                    RecordTypes.ALST,
                    RecordTypes.ALLS
                };
                var locs = UtilityTranslation.FindAllOfSubrecords(
                    majorFrame.Content,
                    majorFrame.Meta,
                    targets.ToGetter(),
                    navigateToContent: true);
                uint actualNext = 0;
                if (locs.Length > 0)
                {
                    actualNext = locs
                                 .Select(l =>
                    {
                        return(BinaryPrimitives.ReadUInt32LittleEndian(majorFrame.Content.Slice(l)));
                    })
                                 .Max();
                    actualNext++;
                }
                if (actualNext != next)
                {
                    byte[] sub = new byte[4];
                    BinaryPrimitives.WriteUInt32LittleEndian(sub, actualNext);
                    _Instructions.SetSubstitution(
                        fileOffset + anamIndex + anamRec.HeaderLength,
                        sub);
                }
            }

            var sizeChange = FixMissingCounters(
                majorFrame,
                fileOffset,
                new RecordType("COCT"),
                new RecordType("CNTO"));

            ProcessLengths(
                majorFrame,
                sizeChange,
                fileOffset);

            FixVMADFormIDs(
                majorFrame,
                fileOffset,
                out var vmadPos,
                out var objectFormat,
                out var processedLen);
            if (vmadPos != null)
            {
                var vmadFrame = Meta.SubrecordFrame(majorFrame.Content.Slice(vmadPos.Value));
                var stream    = new MutagenMemoryReadStream(vmadFrame.Content, Bundle)
                {
                    Position = processedLen - vmadFrame.HeaderLength
                };
                if (stream.Complete)
                {
                    return;
                }
                // skip unknown
                stream.Position += 1;
                var fragCount = stream.ReadUInt16();
                // skip name
                var len = stream.ReadUInt16();
                stream.Position += len;
                for (int i = 0; i < fragCount; i++)
                {
                    stream.Position += 9;
                    // skip name
                    len              = stream.ReadUInt16();
                    stream.Position += len;
                    // skip name
                    len              = stream.ReadUInt16();
                    stream.Position += len;
                }
                var aliasCount = stream.ReadUInt16();
                for (int i = 0; i < aliasCount; i++)
                {
                    FixObjectPropertyIDs(stream, fileOffset, objectFormat);
                    // skip version
                    stream.Position += 2;
                    objectFormat     = stream.ReadUInt16();
                    var numScripts = stream.ReadUInt16();
                    for (int j = 0; j < numScripts; j++)
                    {
                        FixVMADScriptIDs(stream, fileOffset, objectFormat);
                    }
                }
            }
        }